1998-03-28 02:44:41 +00:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
|
|
*
|
|
|
|
* The contents of this file are subject to the Netscape Public License
|
|
|
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
|
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
|
|
* http://www.mozilla.org/NPL/
|
|
|
|
*
|
|
|
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
|
|
* for the specific language governing rights and limitations under the
|
|
|
|
* NPL.
|
|
|
|
*
|
|
|
|
* The Initial Developer of this code under the NPL is Netscape
|
|
|
|
* Communications Corporation. Portions created by Netscape are
|
|
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
|
|
* Reserved.
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
#include "CIncludeView.h"
|
|
|
|
|
|
|
|
//-----------------------------------
|
|
|
|
CIncludeView::CIncludeView(LStream* inStream)
|
|
|
|
//-----------------------------------
|
|
|
|
: LPane(inStream)
|
|
|
|
{
|
|
|
|
*inStream >> mInstalledViewID;
|
|
|
|
|
|
|
|
if ( mInstalledViewID == 0 ) { // No view to install.
|
|
|
|
//Assert_(mInstalledViewID != 0);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// We need to create the pane immediately so that it is added to the superview in the order
|
|
|
|
// specified in Constructor.
|
|
|
|
|
|
|
|
// If the installed view ID is negative, we take the absolute value of it and install
|
|
|
|
// the created view directly. Otherwise, we install the first subpane of the created
|
|
|
|
// view.
|
|
|
|
|
|
|
|
const Boolean installViewDirectly = (mInstalledViewID < 0);
|
|
|
|
|
|
|
|
// Store default commander and view, do we need to do this?
|
|
|
|
LCommander *defaultCommander = LCommander::GetDefaultCommander();
|
|
|
|
LView *defaultView = LPane::GetDefaultView();
|
|
|
|
|
|
|
|
//
|
|
|
|
// Because of the way that the new stream classes work in CWPro1 PP, we had
|
|
|
|
// to make a change to how we read in the included object. Previously, we
|
|
|
|
// could just call UReanimator::ReadObjects to do this. However, the new
|
|
|
|
// classes change the way things work to use a static counter variable to assign
|
|
|
|
// a key for each object in an internal hash table. This would normally be ok, but
|
|
|
|
// this class forces a reset of that counter (using ReadObjects() does that) and
|
|
|
|
// that messes up all the internal bookkeeping for the reanimator.
|
|
|
|
//
|
|
|
|
// To get around that, we have duplicated the code in UReanimator::ReadObjects
|
|
|
|
// with the exception of the line that resets the counter. (mcmullen & pinkerton)
|
|
|
|
//
|
|
|
|
LView *newView = nil;
|
|
|
|
{
|
|
|
|
StResource objectRes('PPob', installViewDirectly ?
|
|
|
|
-mInstalledViewID : mInstalledViewID);
|
|
|
|
HLockHi(objectRes.mResourceH);
|
|
|
|
|
|
|
|
LDataStream objectStream(*objectRes.mResourceH,
|
|
|
|
GetHandleSize(objectRes.mResourceH));
|
|
|
|
|
|
|
|
// sObjectCount = 0; // THIS IS THE BAD THING WE DON'T WANT TO HAPPEN
|
|
|
|
|
|
|
|
Int16 ppobVersion;
|
|
|
|
objectStream.ReadBlock(&ppobVersion, sizeof(Int16));
|
|
|
|
|
|
|
|
SignalIf_(ppobVersion != 2);
|
|
|
|
|
|
|
|
newView = (LView *) UReanimator::ObjectsFromStream(&objectStream);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Restore default commander and view, do we need to do this?
|
|
|
|
LCommander::SetDefaultCommander(defaultCommander);
|
|
|
|
LPane::SetDefaultView(defaultView);
|
|
|
|
|
|
|
|
Assert_(newView != nil);
|
|
|
|
if ( newView == nil ) {
|
|
|
|
mInstalledViewID = 0; // So that we don't delete ourselves in FinishCreateSelf()
|
|
|
|
return; // Get outta here!
|
|
|
|
}
|
|
|
|
|
|
|
|
Try_ {
|
|
|
|
|
|
|
|
if ( installViewDirectly ) {
|
|
|
|
|
|
|
|
InstallPane(newView);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
// The pane we want should be the lone sibling of the root of the installed view's
|
|
|
|
// hierarchy. Why? Because constructor will only allow the root of the
|
|
|
|
// hierarchy to be an LView or an LWindow, and we want to allow all types of
|
|
|
|
// panes. So here we dig out the real pane that we want to install.
|
|
|
|
|
|
|
|
LPane *subPane = nil;
|
|
|
|
newView->GetSubPanes().FetchItemAt(1, subPane);
|
|
|
|
Assert_(subPane != nil);
|
|
|
|
|
|
|
|
if ( subPane != nil ) {
|
|
|
|
|
|
|
|
InstallPane(subPane);
|
|
|
|
//subPane->FinishCreate();
|
|
|
|
// NOT! Superview will call this, because it's added to the iterator.
|
|
|
|
}
|
|
|
|
|
|
|
|
delete newView; // old parent of the installed view. An empty shell, now.
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
Catch_(inErr) {
|
|
|
|
delete newView; // Make sure we delete the view!
|
|
|
|
Throw_(inErr);
|
|
|
|
}
|
|
|
|
EndCatch_
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------
|
|
|
|
CIncludeView::~CIncludeView()
|
|
|
|
//-----------------------------------
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------
|
|
|
|
void CIncludeView::InstallPane(LPane* inPane)
|
|
|
|
// This matches LPane::InitPane. Unfortunately, this may go out of date
|
|
|
|
// when InitPane changes.
|
|
|
|
//-----------------------------------
|
|
|
|
{
|
|
|
|
inPane->SetPaneID(mPaneID);
|
|
|
|
mPaneID = 0; // Set our id to 0 so that we are not confused with the installed pane
|
|
|
|
|
|
|
|
inPane->SetUserCon(mUserCon);
|
|
|
|
|
|
|
|
if ( mVisible == triState_Off ) {
|
|
|
|
inPane->Hide();
|
|
|
|
} else {
|
|
|
|
inPane->Show();
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( mEnabled == triState_Off ) {
|
|
|
|
inPane->Disable();
|
|
|
|
} else {
|
|
|
|
inPane->Enable();
|
|
|
|
}
|
|
|
|
|
|
|
|
SDimension16 frameSize;
|
|
|
|
GetFrameSize(frameSize);
|
|
|
|
inPane->ResizeFrameTo(frameSize.width, frameSize.height, false);
|
|
|
|
SPoint32 location;
|
|
|
|
inPane->GetFrameLocation(location);
|
|
|
|
inPane->MoveBy(mFrameLocation.h - location.h, mFrameLocation.v - location.v, false);
|
|
|
|
|
|
|
|
SBooleanRect frameBinding;
|
|
|
|
GetFrameBinding(frameBinding);
|
|
|
|
inPane->SetFrameBinding(frameBinding);
|
|
|
|
|
|
|
|
// Associate Pane with its SuperView
|
|
|
|
LView *theSuperView = mSuperView;
|
|
|
|
Assert_(theSuperView);
|
|
|
|
inPane->PutInside(theSuperView, false);
|
|
|
|
|
|
|
|
// Negative width and/or height means to expand the
|
|
|
|
// Pane to the size of the SuperView
|
|
|
|
|
|
|
|
if (theSuperView != nil)
|
|
|
|
{
|
|
|
|
Boolean expandHoriz = (mFrameSize.width < 0);
|
|
|
|
Boolean expandVert = (mFrameSize.height < 0);
|
|
|
|
if (expandHoriz || expandVert)
|
|
|
|
theSuperView->ExpandSubPane(inPane, expandHoriz, expandVert);
|
|
|
|
}
|
|
|
|
} // CIncludeView::InstallPane
|
|
|
|
|
|
|
|
//-----------------------------------
|
|
|
|
void CIncludeView::FinishCreateSelf()
|
|
|
|
//-----------------------------------
|
|
|
|
{
|
1998-06-23 01:36:59 +00:00
|
|
|
Inherited::FinishCreateSelf();
|
1998-03-28 02:44:41 +00:00
|
|
|
|
|
|
|
if ( mInstalledViewID != 0 ) {
|
|
|
|
delete this; // removes this from superview in ~LPane
|
|
|
|
}
|
|
|
|
|
|
|
|
} // CIncludeView::FinishCreateSelf
|