1
/////////////////////////////////////////////////////////////////////////////
3
// Purpose: wxFrameView implementation. NOT USED IN FL.
4
// Author: Aleksandras Gluchovas
7
// RCS-ID: $Id: frmview.cpp,v 1.10 2004/07/23 18:04:08 ABX Exp $
8
// Copyright: (c) Aleksandras Gluchovas
9
// Licence: wxWindows licence
10
/////////////////////////////////////////////////////////////////////////////
13
#pragma implementation "frmview.h"
16
// For compilers that support precompilation, includes "wx.h".
17
#include "wx/wxprec.h"
27
#include "wx/fl/frmview.h"
30
/***** Implementation for class wxFrameView *****/
32
BEGIN_EVENT_TABLE( wxFrameView, wxEvtHandler )
34
EVT_IDLE( wxFrameView::OnIdle )
38
void wxFrameView::OnIdle( wxIdleEvent& event)
48
/*** public methods ***/
50
wxFrameView::wxFrameView()
56
wxFrameView::~wxFrameView()
58
if ( mpLayout ) delete mpLayout;
61
wxFrame* wxFrameView::GetParentFrame()
63
return mpFrameMgr->GetParentFrame();
66
wxWindow* wxFrameView::GetClientWindow()
68
return mpFrameMgr->GetClientWindow();
71
void wxFrameView::Activate()
73
mpFrameMgr->ActivateView( this );
76
void wxFrameView::Deactivate()
78
mpFrameMgr->DeactivateCurrentView();
81
void wxFrameView::CreateLayout()
83
mpLayout = new wxFrameLayout( GetParentFrame(), mpFrameMgr->GetClientWindow(), false );
86
wxFrameLayout* wxFrameView::GetLayout()
91
void wxFrameView::SetToolUpdates( bool doToolUpdates )
93
mDoToolUpdates = doToolUpdates;
96
void wxFrameView::SetLayout( wxFrameLayout* pLayout )
98
if ( mpLayout ) delete mpLayout;
103
wxFrameManager& wxFrameView::GetFrameManager()
108
void wxFrameView::RegisterMenu( const wxString& topMenuName )
110
mTopMenus.Add( topMenuName );
115
/***** Implementation for class wxFrameViewSerializer *****/
117
// NOTE:: currently "stipple" property of the brush is not serialized
119
class wxFrameViewSerializer : public wxEvtHandlerSerializer
121
DECLARE_SERIALIZER_CLASS( wxFrameViewSerializer );
123
static void Serialize( wxObject* pObj, wxObjectStorage& store );
126
IMPLEMENT_SERIALIZER_CLASS( wxFrameView,
127
wxFrameViewSerializer,
128
wxFrameViewSerializer::Serialize,
131
void wxFrameViewSerializer::Serialize( wxObject* pObj, wxObjectStorage& store )
133
// wxFrameViewSerializer is a kind of wxEvtHandler - peform serialization of
134
// the base class first
136
info.SerializeInherited( pObj, store );
138
wxFrameView* pView = (wxFrameView*)pObj;
140
store.XchgObjPtr( (wxObject**) &pView->mpFrameMgr );
141
store.XchgObjPtr( (wxObject**) &pView->mpLayout );
142
store.XchgBool ( pView->mDoToolUpdates );
144
// serialize members in derived classes
146
pView->OnSerialize( store );
151
/***** Implementation for class wxFrameManager *****/
153
void wxFrameManager::DoSerialize( wxObjectStorage& WXUNUSED(store) )
156
store.AddInitialRef( mpFrameWnd );
157
store.AddInitialRef( this );
158
if ( mpClientWnd ) store.AddInitialRef( mpClientWnd );
160
store.XchgObj( (wxObject*) &mViews );
161
store.XchgInt( mActiveViewNo );
163
store.Finalize(); // finish serialization
167
void wxFrameManager::DestroyViews()
169
DeactivateCurrentView();
171
wxObjectList::compatibility_iterator pNode = mViews.GetFirst();
175
delete (wxFrameView*)pNode->GetData();
177
pNode = pNode->GetNext();
180
if ( mActiveViewNo != -1 && GetParentFrame() )
182
GetParentFrame()->SetNextHandler( NULL );
185
int wxFrameManager::GetViewNo( wxFrameView* pView )
187
wxObjectList::compatibility_iterator pNode = mViews.GetFirst();
192
if ( (wxFrameView*)pNode->GetData() == pView )
197
pNode = pNode->GetNext();
203
void wxFrameManager::EnableMenusForView( wxFrameView* pView, bool enable )
205
wxMenuBar* pMenuBar = GetParentFrame()->GetMenuBar();
206
int count = pMenuBar->GetMenuCount();
211
wxStringList::compatibility_iterator pNode = pView->mTopMenus.GetFirst();
216
for ( i = 0; i != count; ++i )
218
if ( pMenuBar->GetMenu(i)->GetTitle() == pNode->GetData() )
219
pMenuBar->EnableTop( i, enable );
222
pNode = pNode->GetNext();
226
void wxFrameManager::SyncAllMenus()
228
wxObjectList::compatibility_iterator pNode = mViews.GetFirst();
233
if ( i != mActiveViewNo )
235
EnableMenusForView( (wxFrameView*)pNode->GetData(), false );
237
pNode = pNode->GetNext();
240
EnableMenusForView( GetView( mActiveViewNo ), true );
243
/*** public methods ***/
245
wxFrameManager::wxFrameManager()
247
: mpFrameWnd( NULL ),
253
wxFrameManager::~wxFrameManager()
259
void wxFrameManager::Init( wxWindow* pMainFrame, const wxString& settingsFile )
261
mSettingsFile = settingsFile;
262
mpFrameWnd = pMainFrame;
264
wxObjectList::compatibility_iterator pNode = mViews.GetFirst();
268
wxFrameView* pView = (wxFrameView*)pNode->GetData();
271
pView->OnInitMenus();
273
pNode = pNode->GetNext();
276
if ( !ReloadViews() )
278
// if loading of settings file failed (e.g. was not found),
279
// do recreation of items in each view
281
pNode = mViews.GetFirst();
285
wxFrameView* pView = (wxFrameView*)pNode->GetData();
289
pNode = pNode->GetNext();
293
if ( mActiveViewNo >= (int)mViews.GetCount() )
296
ActivateView( GetView( ( mActiveViewNo == -1 ) ? 0 : mActiveViewNo ) );
301
void wxFrameManager::AddView( wxFrameView* pFrmView )
303
mViews.Append( pFrmView );
305
pFrmView->mpFrameMgr = this; // back ref.
308
void wxFrameManager::RemoveView( wxFrameView* WXUNUSED(pFrmView) )
311
wxFAIL_MSG( _T("wxFrameManager::RemoveView() has not been implemented yet.") );
314
int wxFrameManager::GetActiveViewNo()
316
return mActiveViewNo;
319
wxFrameView* wxFrameManager::GetActiveView()
321
wxObjectList::compatibility_iterator pNode = mViews.Item( mActiveViewNo );
323
if ( pNode ) return (wxFrameView*)pNode->GetData();
327
wxObjectList::compatibility_iterator wxFrameManager::GetActiveViewNode()
329
return mViews.Item( mActiveViewNo );
332
wxFrame* wxFrameManager::GetParentFrame()
334
return ((wxFrame*)mpFrameWnd);
337
wxWindow* wxFrameManager::GetParentWindow()
342
wxFrameView* wxFrameManager::GetView( int viewNo )
344
wxObjectList::compatibility_iterator pNode = mViews.Item( viewNo );
346
if ( pNode ) return (wxFrameView*)pNode->GetData();
350
void wxFrameManager::ActivateView( int viewNo )
352
ActivateView( GetView( viewNo ) );
355
void wxFrameManager::ActivateView( wxFrameView* pFrmView )
357
DeactivateCurrentView();
359
mActiveViewNo = GetViewNo( pFrmView );
361
if ( pFrmView->mpLayout )
363
pFrmView->mpLayout->Activate();
365
// FIXME:: we would have used PushEventHandler(),
366
// but wxFrame bypasses attached handlers when
367
// handling wxCommand events!
369
GetParentFrame()->PushEventHandler( pFrmView );
371
EnableMenusForView( pFrmView, true );
374
void wxFrameManager::SetClinetWindow( wxWindow* pFrameClient )
376
if ( mpClientWnd ) mpClientWnd->Destroy();
378
mpClientWnd = pFrameClient;
381
wxWindow* wxFrameManager::GetClientWindow()
385
mpClientWnd = new wxWindow( GetParentFrame(), -1 );
390
void wxFrameManager::DeactivateCurrentView()
392
if ( mActiveViewNo == -1 )
395
wxFrameView* pView = GetActiveView();
398
wxASSERT( GetParentFrame()->GetEventHandler() == pView );
400
GetParentFrame()->PopEventHandler();
402
if ( pView->mpLayout )
403
pView->mpLayout->Deactivate();
405
EnableMenusForView( pView, false );
408
void wxFrameManager::SaveViewsNow()
411
if ( mSettingsFile == "" ) return;
413
wxIOStreamWrapper stm;
414
stm.CreateForOutput( mSettingsFile );
416
mStore.SetDataStream( stm );
417
DoSerialize( mStore );
421
bool wxFrameManager::ReloadViews()
427
if ( mSettingsFile == "" || !wxFileExists( mSettingsFile ) )
432
wxIOStreamWrapper stm;
433
stm.CreateForInput( mSettingsFile );
435
mStore.SetDataStream( stm );
436
DoSerialize( mStore );
442
bool wxFrameManager::ViewsAreLoaded()
444
return ( mViews.GetCount() != 0 );