/////////////////////////////////////////////////////////////////////////////
-// Name: No names yet.
-// Purpose: Contrib. demo
+// Name: controlbar.cpp
+// Purpose: Implementation for main controlbar classes.
// Author: Aleksandras Gluchovas
// Modified by:
// Created: 06/09/98
// meet the new event paradigm as of wx2.3.0. Probably we
// should find a way to make these be non-global, but this
// works for right now.
-#if wxCHECK_VERSION(2,3,0)
wxEventType cbEVT_PL_LEFT_DOWN = wxNewEventType();
wxEventType cbEVT_PL_LEFT_UP = wxNewEventType();
wxEventType cbEVT_PL_RIGHT_DOWN = wxNewEventType();
wxEventType cbEVT_PL_CUSTOMIZE_LAYOUT = wxNewEventType();
wxEventType wxCUSTOM_CB_PLUGIN_EVENTS_START_AT = wxNewEventType();
-#endif // #if wxCHECK_VERSION(2,3,0)
// some ascii-art, still can't get these *nice* cursors working on wx... :-(
+/*
+// FIXME:: see places where _gHorizCursorImg is used
+
static const char* _gHorizCursorImg[] =
{
"............XX....XX............",
"...............XXX..............",
"................X..............."
};
+*/
// helper inline functions
mFloatingOn = CanReparent();
}
-// NOTE:: below are the only plaftorm-check "ifdef"s in the docking system!
+// NOTE:: below are the only platform-check "ifdef"s in the docking system!
bool wxFrameLayout::CanReparent()
{
pChild->Reparent(pNewParent);
return;
-#elif defined(__WXGTK__)
+#elif defined(__WXGTK__) || defined(__WXX11__)
// FOR NOW:: floating with wxGtk still very buggy
return;
void wxFrameLayout::DestroyBarWindows()
{
- wxNode* pSpy = mBarSpyList.First();
+ wxNode* pSpy = mBarSpyList.GetFirst();
while( pSpy )
{
- cbBarSpy& spy = *((cbBarSpy*)pSpy->Data());
+ cbBarSpy& spy = *((cbBarSpy*)pSpy->GetData());
if ( spy.mpBarWnd->GetEventHandler() == &spy )
delete &spy;
- pSpy = pSpy->Next();
+ pSpy = pSpy->GetNext();
}
mBarSpyList.Clear();
void wxFrameLayout::ShowFloatedWindows( bool show )
{
- wxNode* pNode = mFloatedFrames.First();
+ wxNode* pNode = mFloatedFrames.GetFirst();
while( pNode )
{
- cbFloatedBarWindow* pFFrm = ((cbFloatedBarWindow*)pNode->Data());
+ cbFloatedBarWindow* pFFrm = ((cbFloatedBarWindow*)pNode->GetData());
pFFrm->Show( show );
- pNode = pNode->Next();
+ pNode = pNode->GetNext();
}
}
wxFrameLayout::~wxFrameLayout()
{
+ size_t i;
+
UnhookFromFrame();
if ( mpUpdatesMgr )
// destroy contents of arrays and lists
- size_t i = 0;
for ( i = 0; i != MAX_PANES; ++i )
{
if ( mPanes[i] )
if ( mpNECursor )
delete mpNECursor;
- wxNode* pSpy = mBarSpyList.First();
+ wxNode* pSpy = mBarSpyList.GetFirst();
while( pSpy )
{
- cbBarSpy& spy = *((cbBarSpy*)pSpy->Data());
+ cbBarSpy& spy = *((cbBarSpy*)pSpy->GetData());
if ( spy.mpBarWnd->GetEventHandler() == &spy )
delete &spy;
- pSpy = pSpy->Next();
+ pSpy = pSpy->GetNext();
}
for ( i = 0; i != mAllBars.Count(); ++i )
pBarPane->RemoveBar( pBar );
- // FIXME FIXME:: the below recalc. may be a *huge* performance
+ // FIXME FIXME:: the recalculation below may be a *huge* performance
// hit, it could be eliminated though...
// but first the "pane-postion-changed" problem
- // have to be fixed
+ // has to be fixed
RecalcLayout( FALSE );
void wxFrameLayout::SetBarState( cbBarInfo* pBar, int newState, bool updateNow )
{
- if ( newState == wxCBAR_FLOATING && !mFloatingOn )
+ if ( newState == wxCBAR_FLOATING && !(mFloatingOn && pBar->mFloatingOn))
return;
cbDockPane* pPane;
cbRowInfo* pRow;
- bool success = LocateBar( pBar, &pRow, &pPane );
+ #ifdef __WXDEBUG__
+ bool success =
+ #endif
+ LocateBar( pBar, &pRow, &pPane );
wxASSERT( success ); // DBG::
if ( pBar->mState == wxCBAR_FLOATING && newState != wxCBAR_FLOATING )
{
- // remove bar's window form the containing mini-frame
- // and set it's parent to be layout's parent frame
+ // remove bar's window from the containing mini-frame
+ // and set its parent to be layout's parent frame
if ( pBar->mpBarWnd )
{
pBar->mpBarWnd->Show(FALSE); // to avoid flicker upon reparenting
- wxNode* pNode = mFloatedFrames.First();
+ wxNode* pNode = mFloatedFrames.GetFirst();
while( pNode )
{
- cbFloatedBarWindow* pFFrm = ((cbFloatedBarWindow*)pNode->Data());
+ cbFloatedBarWindow* pFFrm = ((cbFloatedBarWindow*)pNode->GetData());
if ( pFFrm->GetBar() == pBar )
{
pFFrm->Destroy(); break;
}
- pNode = pNode->Next();
+ pNode = pNode->GetNext();
}
// FOR NOW:: excessive!
}
}
+ if ( pBar->mDimInfo.GetDimHandler() )
+ {
+ pBar->mDimInfo.GetDimHandler()->OnChangeBarState( pBar, newState );
+ }
+
pBar->mState = newState;
DoSetBarState( pBar );
// "inverse" bar-visibility of the selected bar
- int newState = 0;
+ int newState;
if ( pBar->mState == wxCBAR_HIDDEN )
{
void wxFrameLayout::RepositionFloatedBar( cbBarInfo* pBar )
{
- if ( !mFloatingOn ) return;
+ if ( !(mFloatingOn && pBar->mFloatingOn)) return;
- wxNode* pNode = mFloatedFrames.First();
+ wxNode* pNode = mFloatedFrames.GetFirst();
while( pNode )
{
- cbFloatedBarWindow* pFFrm = ((cbFloatedBarWindow*)pNode->Data());
+ cbFloatedBarWindow* pFFrm = ((cbFloatedBarWindow*)pNode->GetData());
if ( pFFrm->GetBar() == pBar )
{
break;
}
- pNode = pNode->Next();
+ pNode = pNode->GetNext();
}
}
}
else
{
- if ( !mFloatingOn ) return;
+ if ( !(mFloatingOn && pBar->mFloatingOn) )
+ return;
// float it
pMiniFrm->Create( &GetParentFrame(), -1, pBar->mName,
wxPoint( 50,50 ),
wxSize ( 0, 0 ),
- wxFRAME_FLOAT_ON_PARENT | wxFRAME_TOOL_WINDOW
+ wxFRAME_FLOAT_ON_PARENT |
+ wxFRAME_TOOL_WINDOW |
+ wxFRAME_NO_TASKBAR
);
pMiniFrm->SetClient( pBar->mpBarWnd );
return;
}
}
- wxFAIL_MSG("bar info should be present in the list of all bars of all panes");
+ wxFAIL_MSG(wxT("bar info should be present in the list of all bars of all panes"));
}
bool wxFrameLayout::LocateBar( cbBarInfo* pBarInfo,
int frmWidth, frmHeight;
mpFrame->GetClientSize( &frmWidth, &frmHeight );
- int paneHeight = 0;
int curY = 0;
int curX = 0;
pPane->SetPaneWidth( frmWidth );
pPane->RecalcLayout();
- paneHeight = pPane->GetPaneHeight();
+ int paneHeight = pPane->GetPaneHeight();
rect.x = curX;
rect.y = curY;
void wxFrameLayout::OnSize( wxSizeEvent& event )
{
+ mpFrame->ProcessEvent( event );
+ event.Skip( FALSE ); // stop its progpagation
+
if ( event.GetEventObject() == (wxObject*) mpFrame )
-
+ {
+ GetUpdatesManager().OnStartChanges();
RecalcLayout(TRUE);
+ GetUpdatesManager().OnFinishChanges();
+ GetUpdatesManager().UpdateNow();
+ }
+
}
/*** protected members ***/
void wxFrameLayout::UnhookFromFrame()
{
// NOTE:: the SetEvtHandlerEnabled() method is not used
- // here, since it is assumed, that unhooking layout
+ // here, since it is assumed that unhooking layout
// from window may result destroying of the layout itself
//
// BUG BUG BUG (wx):: this would not be a problem if
- // wxEvtHandler's destructor would check if
+ // wxEvtHandler's destructor checked if
// this handler is currently the top-most
// handler of some window, and additionally
- // to the reconnecting itself from the chain
- // it would also re-setup current event handler
+ // to the reconnecting itself from the chain.
+ // It would also re-setup current event handler
// of the window using wxWindow::SetEventHandler()
// FOR NOW::
cbMotionEvent evt( pos, pToPane );
FirePluginEvent( evt );
}
- else
- {
- int avoidCompilerWarning = 0;
- wxASSERT(avoidCompilerWarning); // DBG::
- }
} // wxFrameLayout::ForwardMouseEvent()
event.Skip();
}
-void wxFrameLayout::OnEraseBackground( wxEraseEvent& event )
+void wxFrameLayout::OnEraseBackground( wxEraseEvent& WXUNUSED(event) )
{
// do nothing
}
if ( !focus && mCheckFocusWhenIdle )
{
- wxMessageBox( "Hi, no more focus in this app!" );
+ wxMessageBox(wxT("Hi, no more focus in this app!"));
mCheckFocusWhenIdle = FALSE;
//ShowFloatedWindows( FALSE );
}
-void wxFrameLayout::OnKillFocus( wxFocusEvent& event )
+void wxFrameLayout::OnKillFocus( wxFocusEvent& WXUNUSED(event) )
{
//wxMessageBox( "wxFrameLayoutGot Kill Focus!" );
//ShowFloatedWindows( FALSE );
}
-void wxFrameLayout::OnSetFocus( wxFocusEvent& event )
+void wxFrameLayout::OnSetFocus( wxFocusEvent& WXUNUSED(event) )
{
//ShowFloatedWindows( TRUE );
}
-void wxFrameLayout::OnActivate( wxActivateEvent& event )
+void wxFrameLayout::OnActivate( wxActivateEvent& WXUNUSED(event) )
{
#if 0
if ( event.GetActive() == FALSE )
void wxFrameLayout::RefreshNow( bool recalcLayout )
{
- if ( recalcLayout ) RecalcLayout( TRUE );
+ if ( recalcLayout )
+ RecalcLayout( TRUE );
- if ( mpFrame ) mpFrame->Refresh();
+ if ( mpFrame )
+ mpFrame->Refresh();
}
/*** plugin-related methods ***/
}
-void wxFrameLayout::ReleaseEventsFromPlugin( cbPluginBase* pPlugin )
+void wxFrameLayout::ReleaseEventsFromPlugin( cbPluginBase* WXUNUSED(pPlugin) )
{
// events should be captured first
wxASSERT( mpCaputesInput != NULL );
mpPaneInFocus = toPane;
}
-void wxFrameLayout::ReleaseEventsFromPane( cbDockPane* fromPane )
+void wxFrameLayout::ReleaseEventsFromPane( cbDockPane* WXUNUSED(fromPane) )
{
// cannot release events without capturing them
wxASSERT( mpPaneInFocus != NULL );
: mRealTimeUpdatesOn ( TRUE ),
mOutOfPaneDragOn ( TRUE ),
mExactDockPredictionOn( FALSE ),
- mNonDestructFirctionOn( FALSE ),
+ mNonDestructFrictionOn( FALSE ),
mShow3DPaneBorderOn ( TRUE ),
mBarFloatingOn ( FALSE ),
mRowProportionsOn ( FALSE ),
mResizeHandleSize( 4 )
{}
+cbCommonPaneProperties::cbCommonPaneProperties(const cbCommonPaneProperties& props)
+
+ : wxObject(),
+ mRealTimeUpdatesOn (props.mRealTimeUpdatesOn),
+ mOutOfPaneDragOn (props.mOutOfPaneDragOn),
+ mExactDockPredictionOn(props.mExactDockPredictionOn),
+ mNonDestructFrictionOn(props.mNonDestructFrictionOn),
+ mShow3DPaneBorderOn (props.mShow3DPaneBorderOn),
+ mBarFloatingOn (props.mBarFloatingOn),
+ mRowProportionsOn (props.mRowProportionsOn),
+ mColProportionsOn (props.mColProportionsOn),
+ mBarCollapseIconsOn (props.mBarCollapseIconsOn),
+ mBarDragHintsOn (props.mBarDragHintsOn),
+
+ mMinCBarDim(props.mMinCBarDim),
+ mResizeHandleSize(props.mResizeHandleSize)
+{}
+
+cbCommonPaneProperties& cbCommonPaneProperties::operator=(const cbCommonPaneProperties& props)
+{
+ mRealTimeUpdatesOn = props.mRealTimeUpdatesOn;
+ mOutOfPaneDragOn = props.mOutOfPaneDragOn;
+ mExactDockPredictionOn = props.mExactDockPredictionOn;
+ mNonDestructFrictionOn = props.mNonDestructFrictionOn;
+ mShow3DPaneBorderOn = props.mShow3DPaneBorderOn;
+ mBarFloatingOn = props.mBarFloatingOn;
+ mRowProportionsOn = props.mRowProportionsOn;
+ mColProportionsOn = props.mColProportionsOn;
+ mBarCollapseIconsOn = props.mBarCollapseIconsOn;
+ mBarDragHintsOn = props.mBarDragHintsOn;
+
+ mMinCBarDim = props.mMinCBarDim;
+ mResizeHandleSize = props.mResizeHandleSize;
+
+ return *this;
+}
+
/***** Implementation for class cbRowInfo *****/
IMPLEMENT_DYNAMIC_CLASS( cbRowInfo, wxObject )
cbBarInfo::cbBarInfo(void)
: mpRow( NULL ),
-
+ mFloatingOn( TRUE ),
mpNext( NULL ),
mpPrev( NULL )
{}
void cbDockPane::PaintRowDecorations( cbRowInfo* pRow, wxDC& dc )
{
- size_t i = 0;
+ size_t i;
// decorations first
for ( i = 0; i != pRow->mBars.Count(); ++i )
void cbDockPane::PaintPane( wxDC& dc )
{
- PaintPaneBackground( dc );
+ size_t i;
- size_t i = 0;
+ PaintPaneBackground( dc );
// first decorations
for ( i = 0; i != mRows.Count(); ++i )
void cbDockPane::RemoveBar( cbBarInfo* pBar )
{
- bool needsRestoring = mProps.mNonDestructFirctionOn &&
+ bool needsRestoring = mProps.mNonDestructFrictionOn &&
mpStoredRow == pBar->mpRow;
cbRemoveBarEvent evt( pBar, this );
int range = lowerY - upperY;
int oneThird = range / 3;
- wxNode* pRow = mRows.First();
+ wxNode* pRow = mRows.GetFirst();
int row = 0;
int curY = 0;
while( pRow )
{
- int rowHeight = GetRowHeight( (wxList*)pRow->Data() );
+ int rowHeight = GetRowHeight( (wxList*)pRow->GetData() );
if ( upperY >= curY &&
lowerY < curY ) return row;
++row;
curY += rowHeight;
- pRow = pRow->Next();
+ pRow = pRow->GetNext();
}
*/
void cbDockPane::CalcLengthRatios( cbRowInfo* pInRow )
{
- int totalWidth = 0;
+ size_t i;
- size_t i = 0;
+ int totalWidth = 0;
- // clac current-maximal-total-length of all maximized bars
+ // calc current-maximal-total-length of all maximized bars
for ( i = 0; i != pInRow->mBars.GetCount(); ++i )
{
totalWidth += bar.mBounds.width;
}
- // set up persentages of occupied space for each maximized bar
+ // set up percentages of occupied space for each maximized bar
for ( i = 0; i != pInRow->mBars.Count(); ++i )
{
void cbDockPane::DoInsertBar( cbBarInfo* pBar, int rowNo )
{
- cbRowInfo* pRow = NULL;
+ cbRowInfo* pRow;
if ( rowNo == -1 || rowNo >= (int)mRows.Count() )
{
{
pRow = mRows[rowNo];
- if ( mProps.mNonDestructFirctionOn == TRUE )
+ if ( mProps.mNonDestructFrictionOn == TRUE )
{
// store original shape of the row (before the bar is inserted)
return i;
}
- wxFAIL_MSG("Row must be present to call cbDockPane::GetRowIndex()");
+ wxFAIL_MSG(wxT("Row must be present to call cbDockPane::GetRowIndex()"));
return 0;
}
case FL_ALIGN_RIGHT : thisMask = FL_ALIGN_RIGHT_PANE; break;
default:
- wxFAIL_MSG("Bad FL alignment type detected in cbDockPane::MatchesMask()");
+ wxFAIL_MSG(wxT("Bad FL alignment type detected in cbDockPane::MatchesMask()"));
}
return ( thisMask & paneMask ) != 0;
void cbDockPane::SetRowShapeData( cbRowInfo* pRow, wxList* pLst )
{
- if ( pLst->First() == NULL )
+ if ( pLst->GetFirst() == NULL )
return;
- wxNode* pData = pLst->First();
+ wxNode* pData = pLst->GetFirst();
size_t i;
for ( i = 0; i != pRow->mBars.Count(); ++i )
cbBarInfo& bar = *pRow->mBars[i];;
- cbBarShapeData& data = *((cbBarShapeData*)pData->Data());
+ cbBarShapeData& data = *((cbBarShapeData*)pData->GetData());
bar.mBounds = data.mBounds;
bar.mLenRatio = data.mLenRatio;
- pData = pData->Next();
+ pData = pData->GetNext();
}
}