gecko-dev/cmd/macfe/gui/CSwatchBrokerView.cp
1998-06-23 01:36:59 +00:00

221 lines
5.7 KiB
C++

/* -*- 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.
*/
// ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ
// CSwatchBrokerView.cp
// ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ
#include "CSwatchBrokerView.h"
#include "CBevelView.h"
CBrokeredView::CBrokeredView(LStream* inStream)
: LView(inStream)
{
}
void CBrokeredView::GetPendingFrameSize(SDimension16& outSize) const
{
outSize = mPendingSize;
}
void CBrokeredView::GetPendingFrameLocation(SPoint32& outLocation) const
{
outLocation = mPendingLocation;
}
void CBrokeredView::ResizeFrameBy(
Int16 inWidthDelta,
Int16 inHeightDelta,
Boolean inRefresh)
{
if (inRefresh)
{
GetFrameSize(mPendingSize);
mPendingSize.width += inWidthDelta;
mPendingSize.height += inHeightDelta;
BroadcastMessage(msg_BrokeredViewAboutToChangeSize, this);
}
LView::ResizeFrameBy(inWidthDelta, inHeightDelta, inRefresh);
if (!inRefresh)
BroadcastMessage(msg_BrokeredViewChangeSize, this);
}
void CBrokeredView::MoveBy(
Int32 inHorizDelta,
Int32 inVertDelta,
Boolean inRefresh)
{
if (inRefresh)
{
GetFrameLocation(mPendingLocation);
mPendingLocation.h += inHorizDelta;
mPendingLocation.v += inVertDelta;
BroadcastMessage(msg_BrokeredViewAboutToMove, this);
}
LView::MoveBy(inHorizDelta, inVertDelta, inRefresh);
if (!inRefresh)
BroadcastMessage(msg_BrokeredViewMoved, this);
}
CSwatchBrokerView::CSwatchBrokerView(LStream* inStream)
: LView(inStream)
{
*inStream >> mDynamicPaneID;
*inStream >> mBalancePaneID;
SetRefreshAllWhenResized(false);
}
void CSwatchBrokerView::FinishCreateSelf(void)
{
LView::FinishCreateSelf();
mBalancePane = FindPaneByID(mBalancePaneID);
Assert_(mBalancePane != NULL);
mDynamicPane = dynamic_cast<CBrokeredView*>(FindPaneByID(mDynamicPaneID));
if (mDynamicPane)
{
mDynamicPane->AddListener(this);
// We need to "prime to pump". The dynamic view may have resized itself
// in it's FinishCreateSelf(), at which point we were not listening.
SDimension16 theSize;
mDynamicPane->GetFrameSize(theSize);
AdaptToBrokeredViewResize(mDynamicPane, theSize, true);
}
}
// ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ
// on adapt to super frame size we ignore broadcasts from the subs
// so that we dont recalculate too often. we really want to know when
// a sub changes height so we can reposition and resize the others.
// ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ
void CSwatchBrokerView::AdaptToSuperFrameSize(
Int32 inSurrWidthDelta,
Int32 inSurrHeightDelta,
Boolean inRefresh)
{
StopListening();
LView::AdaptToSuperFrameSize(inSurrWidthDelta, inSurrHeightDelta, inRefresh);
StartListening();
}
void CSwatchBrokerView::ListenToMessage(
MessageT inMessage,
void* ioParam)
{
CBrokeredView* theView = (CBrokeredView*)ioParam;
switch (inMessage)
{
case msg_BrokeredViewAboutToChangeSize:
{
SDimension16 thePendingSize;
theView->GetPendingFrameSize(thePendingSize);
AdaptToBrokeredViewResize(theView, thePendingSize, true);
}
break;
case msg_BrokeredViewChangeSize:
{
SDimension16 theNewSize;
theView->GetFrameSize(theNewSize);
AdaptToBrokeredViewResize(theView, theNewSize, false);
}
break;
case msg_BrokeredViewAboutToMove:
{
SPoint32 thePendingLocation;
theView->GetPendingFrameLocation(thePendingLocation);
AdaptToBrokeredViewMove(theView, thePendingLocation, true);
}
break;
case msg_BrokeredViewMoved:
{
SPoint32 theNewLocation;
theView->GetFrameLocation(theNewLocation);
AdaptToBrokeredViewMove(theView, theNewLocation, false);
}
break;
}
}
// this whole thing needs to be way more robust. multiple brokered views,
// top to bottom ordering, etc.
void CSwatchBrokerView::AdaptToBrokeredViewResize(
CBrokeredView* inView,
const SDimension16 inNewSize,
Boolean inRefresh)
{
SDimension16 theBrokerSize;
GetFrameSize(theBrokerSize);
SDimension16 theBalanceSize;
mBalancePane->GetFrameSize(theBalanceSize);
SPoint32 theBalanceLocation;
mBalancePane->GetFrameLocation(theBalanceLocation);
SPoint32 theNewLocation;
inView->GetFrameLocation(theNewLocation);
Int32 theBalanceHeight= (theBrokerSize.height - inNewSize.height) - theBalanceSize.height;
mBalancePane->ResizeFrameBy(0, theBalanceHeight, false);
// Need to determine if the balance pane is above or below the dynamic pane
SPoint32 dynamicPaneLocation, balancePaneLocation;
mDynamicPane->GetFrameLocation( dynamicPaneLocation );
mBalancePane->GetFrameLocation( balancePaneLocation );
if( balancePaneLocation.v >= dynamicPaneLocation.v)
mBalancePane->MoveBy(0, -theBalanceHeight, false);
// if we're in an enclosing CBevelView, we need to notify it that
// it's subpanes have changed so that it can recalculate the
// bevel region.
CBevelView::SubPanesChanged(this, inRefresh);
if (inRefresh)
Refresh();
}
void CSwatchBrokerView::AdaptToBrokeredViewMove(
CBrokeredView* /*inView*/,
const SPoint32& /*inNewLocation*/,
Boolean /*inRefresh*/)
{
}