]> git.saurik.com Git - wxWidgets.git/blame - utils/framelayout/src/frmview.cpp
don't crash when invalid colour is set as fg/bg colour
[wxWidgets.git] / utils / framelayout / src / frmview.cpp
CommitLineData
bd9396d5
HH
1/////////////////////////////////////////////////////////////////////////////
2// Name: No names yet.
3// Purpose: Contrib. demo
4// Author: Aleksandras Gluchovas
5// Modified by:
6// Created: 02/01/99
7// RCS-ID: $Id$
8// Copyright: (c) Aleksandras Gluchovas
9// Licence: wxWindows license
10/////////////////////////////////////////////////////////////////////////////
11
12#ifdef __GNUG__
13#pragma implementation "frmview.h"
14// #pragma interface
15#endif
16
17// For compilers that support precompilation, includes "wx.h".
18#include "wx/wxprec.h"
19
20#ifdef __BORLANDC__
21#pragma hdrstop
22#endif
23
24#ifndef WX_PRECOMP
25#include "wx/wx.h"
26#endif
27
28#include "frmview.h"
29#include "wx/utils.h"
30
31/***** Implementation for class wxFrameView *****/
32
33BEGIN_EVENT_TABLE( wxFrameView, wxEvtHandler )
34
35 EVT_IDLE( wxFrameView::OnIdle )
36
37END_EVENT_TABLE()
38
39void wxFrameView::OnIdle( wxIdleEvent& event)
40{
41 event.Skip();
42
43 if ( mDoToolUpdates )
44 {
45 int o;
46 ++o;
47
48 // TBD::
49 }
50}
51
52/*** public methods ***/
53
54wxFrameView::wxFrameView()
55
56 : mpLayout( NULL ),
57 mpFrameMgr( NULL )
58{}
59
60wxFrameView::~wxFrameView()
61{
62 if ( mpLayout ) delete mpLayout;
63}
64
65wxFrame* wxFrameView::GetParentFrame()
66{
67 return mpFrameMgr->GetParentFrame();
68}
69
70wxWindow* wxFrameView::GetClientWindow()
71{
72 return mpFrameMgr->GetClientWindow();
73}
74
75void wxFrameView::Activate()
76{
77 mpFrameMgr->ActivateView( this );
78}
79
80void wxFrameView::Deactivate()
81{
82 mpFrameMgr->DeactivateCurrentView();
83}
84
85void wxFrameView::CreateLayout()
86{
87 mpLayout = new wxFrameLayout( GetParentFrame(), mpFrameMgr->GetClientWindow(), FALSE );
88}
89
90wxFrameLayout* wxFrameView::GetLayout()
91{
92 return mpLayout;
93}
94
95void wxFrameView::SetToolUpdates( bool doToolUpdates )
96{
97 mDoToolUpdates = doToolUpdates;
98}
99
100void wxFrameView::SetLayout( wxFrameLayout* pLayout )
101{
102 if ( mpLayout ) delete mpLayout;
103
104 mpLayout = pLayout;
105}
106
107wxFrameManager& wxFrameView::GetFrameManager()
108{
109 return *mpFrameMgr;
110}
111
112void wxFrameView::RegisterMenu( const wxString& topMenuName )
113{
114 mTopMenus.Add( topMenuName );
115}
116
117#if 0
118
119/***** Implementation for class wxFrameViewSerializer *****/
120
121// NOTE:: currently "stipple" property of the brush is not serialized
122
123class wxFrameViewSerializer : public wxEvtHandlerSerializer
124{
125 DECLARE_SERIALIZER_CLASS( wxFrameViewSerializer );
126
127 static void Serialize( wxObject* pObj, wxObjectStorage& store );
128};
129
130IMPLEMENT_SERIALIZER_CLASS( wxFrameView,
131 wxFrameViewSerializer,
132 wxFrameViewSerializer::Serialize,
133 NO_CLASS_INIT )
134
135void wxFrameViewSerializer::Serialize( wxObject* pObj, wxObjectStorage& store )
136{
137 // wxFrameViewSerializer is a kind of wxEvtHandler - peform serialization of
138 // the base class first
139
140 info.SerializeInherited( pObj, store );
141
142 wxFrameView* pView = (wxFrameView*)pObj;
143
144 store.XchgObjPtr( (wxObject**) &pView->mpFrameMgr );
145 store.XchgObjPtr( (wxObject**) &pView->mpLayout );
146 store.XchgBool ( pView->mDoToolUpdates );
147
148 // serialize members in derived classes
149
150 pView->OnSerialize( store );
151}
152
153#endif
154
155/***** Implementation for class wxFrameManager *****/
156
157void wxFrameManager::DoSerialize( wxObjectStorage& store )
158{
159#if 0
160 store.AddInitialRef( mpFrameWnd );
161 store.AddInitialRef( this );
162 if ( mpClientWnd ) store.AddInitialRef( mpClientWnd );
163
164 store.XchgObj( (wxObject*) &mViews );
165 store.XchgInt( mActiveViewNo );
166
167 store.Finalize(); // finish serialization
168#endif
169}
170
171void wxFrameManager::DestroyViews()
172{
173 DeactivateCurrentView();
174
175 wxNode* pNode = mViews.First();
176
177 while( pNode )
178 {
179 delete (wxFrameView*)pNode->Data();
180
181 pNode = pNode->Next();
182 }
183
184 if ( mActiveViewNo != -1 && GetParentFrame() )
185
186 GetParentFrame()->SetNextHandler( NULL );
187}
188
189int wxFrameManager::GetViewNo( wxFrameView* pView )
190{
191 wxNode* pNode = mViews.First();
192 int n = 0;
193
194 while( pNode )
195 {
196 if ( (wxFrameView*)pNode->Data() == pView )
197
198 return n;
199
200 ++n;
201 pNode = pNode->Next();
202 }
203
204 return -1;
205}
206
207void wxFrameManager::EnableMenusForView( wxFrameView* pView, bool enable )
208{
209 wxMenuBar* pMenuBar = GetParentFrame()->GetMenuBar();
210 int count = pMenuBar->GetMenuCount();
211
212 if ( !pMenuBar ) return;
213
214 wxStringListNode* pNode = pView->mTopMenus.GetFirst();
215
216 while( pNode )
217 {
218 for( int i = 0; i != count; ++i )
219 {
220 if ( pMenuBar->GetMenu(i)->GetTitle() == pNode->GetData() )
221
222 pMenuBar->EnableTop( i, enable );
223 }
224
225 pNode = pNode->GetNext();
226 }
227}
228
229void wxFrameManager::SyncAllMenus()
230{
231 wxNode* pNode = mViews.First();
232 int i = 0;
233
234 while( pNode )
235 {
236 if ( i != mActiveViewNo )
237
238 EnableMenusForView( (wxFrameView*)pNode->GetData(), FALSE );
239
240 pNode = pNode->Next();
241 }
242
243 EnableMenusForView( GetView( mActiveViewNo ), TRUE );
244}
245
246/*** public methods ***/
247
248wxFrameManager::wxFrameManager()
249
250 : mpFrameWnd( NULL ),
251 mActiveViewNo( -1 ),
252 mpClientWnd( NULL )
253{
254}
255
256wxFrameManager::~wxFrameManager()
257{
258 SaveViewsNow();
259 DestroyViews();
260}
261
262void wxFrameManager::Init( wxWindow* pMainFrame, const wxString& settingsFile )
263{
264 mSettingsFile = settingsFile;
265 mpFrameWnd = pMainFrame;
266
267 wxNode* pNode = mViews.First();
268
269 while( pNode )
270 {
271 wxFrameView* pView = (wxFrameView*)pNode->Data();
272
273 pView->OnInit();
274 pView->OnInitMenus();
275
276 pNode = pNode->Next();
277 }
278
279 if ( !ReloadViews() )
280 {
281 // if loading of settings file failed (e.g. was not found),
282 // do recreation of items in each view
283
284 pNode = mViews.First();
285
286 while( pNode )
287 {
288 wxFrameView* pView = (wxFrameView*)pNode->Data();
289
290 pView->OnRecreate();
291
292 pNode = pNode->Next();
293 }
294 }
295
296 if ( mActiveViewNo >= mViews.Number() )
297
298 mActiveViewNo = -1;
299
300 ActivateView( GetView( ( mActiveViewNo == -1 ) ? 0 : mActiveViewNo ) );
301
302 SyncAllMenus();
303}
304
305void wxFrameManager::AddView( wxFrameView* pFrmView )
306{
307 mViews.Append( pFrmView );
308
309 pFrmView->mpFrameMgr = this; // back ref.
310}
311
312void wxFrameManager::RemoveView( wxFrameView* pFrmView )
313{
314 // TBD::
315 wxASSERT(0);
316}
317
318int wxFrameManager::GetActiveViewNo()
319{
320 return mActiveViewNo;
321}
322
323wxFrameView* wxFrameManager::GetActiveView()
324{
325 wxNode* pNode = mViews.Nth( mActiveViewNo );
326
327 if ( pNode ) return (wxFrameView*)pNode->Data();
328 else return NULL;
329}
330
331wxNode* wxFrameManager::GetActiveViewNode()
332{
333 return mViews.Nth( mActiveViewNo );
334}
335
336wxFrame* wxFrameManager::GetParentFrame()
337{
338 return ((wxFrame*)mpFrameWnd);
339}
340
341wxWindow* wxFrameManager::GetParentWindow()
342{
343 return mpFrameWnd;
344}
345
346wxFrameView* wxFrameManager::GetView( int viewNo )
347{
348 wxNode* pNode = mViews.Nth( viewNo );
349
350 if ( pNode ) return (wxFrameView*)pNode->Data();
351 else return NULL;
352}
353
354void wxFrameManager::ActivateView( int viewNo )
355{
356 ActivateView( GetView( viewNo ) );
357}
358
359void wxFrameManager::ActivateView( wxFrameView* pFrmView )
360{
361 DeactivateCurrentView();
362
363 mActiveViewNo = GetViewNo( pFrmView );
364
365 if ( pFrmView->mpLayout )
366
367 pFrmView->mpLayout->Activate();
368
369 // FIXME:: we would have used PushEventHandler(),
370 // but wxFrame bypasses attached handlers when
371 // handling wxCommand events!
372
373 GetParentFrame()->PushEventHandler( pFrmView );
374
375 EnableMenusForView( pFrmView, TRUE );
376}
377
378void wxFrameManager::SetClinetWindow( wxWindow* pFrameClient )
379{
380 if ( mpClientWnd ) mpClientWnd->Destroy();
381
382 mpClientWnd = pFrameClient;
383}
384
385wxWindow* wxFrameManager::GetClientWindow()
386{
387 if ( !mpClientWnd )
388
389 mpClientWnd = new wxWindow( GetParentFrame(), -1 );
390
391 return mpClientWnd;
392}
393
394void wxFrameManager::DeactivateCurrentView()
395{
396 if ( mActiveViewNo == -1 ) return;
397
398 wxFrameView* pView = GetActiveView();
399
400 // FOR NOW::
401 wxASSERT( GetParentFrame()->GetEventHandler() == pView );
402
403 GetParentFrame()->PopEventHandler();
404
405 if ( pView->mpLayout )
406
407 pView->mpLayout->Deactivate();
408
409 EnableMenusForView( pView, FALSE );
410}
411
412void wxFrameManager::SaveViewsNow()
413{
414#if 0
415 if ( mSettingsFile == "" ) return;
416
417 wxIOStreamWrapper stm;
418 stm.CreateForOutput( mSettingsFile );
419
420 mStore.SetDataStream( stm );
421 DoSerialize( mStore );
422#endif
423}
424
425bool wxFrameManager::ReloadViews()
426{
427 return FALSE;
428
429#if 0
430 if ( mSettingsFile == "" || !wxFileExists( mSettingsFile ) )
431
432 return FALSE;
433
434 DestroyViews();
435
436 wxIOStreamWrapper stm;
437 stm.CreateForInput( mSettingsFile );
438
439 mStore.SetDataStream( stm );
440 DoSerialize( mStore );
441#endif
442
443 return TRUE;
444}
445
446bool wxFrameManager::ViewsAreLoaded()
447{
448 return ( mViews.Number() != 0 );
449}