wxArt2D
strucdlgdoc.cpp
1 /*! \file editor/src/strucdlg.cpp
2  \author Klaas Holwerda
3 
4  Copyright: 2000-2004 (c) Klaas Holwerda
5 
6  Licence: wxWidgets Licence
7 
8  RCS-ID: $Id: strucdlg.cpp,v 1.28 2009/10/05 20:03:12 titato Exp $
9 */
10 
11 #include "a2dprec.h"
12 
13 #ifdef __BORLANDC__
14 #pragma hdrstop
15 #endif
16 
17 #ifndef WX_PRECOMP
18 #include "wx/wx.h"
19 #endif
20 
21 
22 #include "wx/editor/strucdlgdoc.h"
23 #include "wx/canvas/canmod.h"
24 #include "wx/editor/candoc.h"
25 #include "wx/editor/cancom.h"
26 
27 #define STRUCT_HSIZE 220
28 #define STRUCT_VSIZE 400
29 
30 const int GROUP_BUTTON_OK = wxID_HIGHEST + 5401 ;
31 const int GROUP_BUTTON_CANCEL = wxID_HIGHEST + 5402 ;
32 const int GROUP_BUTTON_SHOW = wxID_HIGHEST + 5403 ;
33 const int GROUP_UPDATE_DIALOG = wxID_HIGHEST + 5404 ;
34 const int GROUP_BUTTON_APPLY = wxID_HIGHEST + 5405 ;
35 const int GROUP_DCLICK = wxID_HIGHEST + 5406 ;
36 
37 
38 BEGIN_EVENT_TABLE( a2dCanvasObjectsDocDialog, wxDialog )
39  EVT_CLOSE( a2dCanvasObjectsDocDialog::OnCloseWindow )
40  EVT_LISTBOX( STRUCT_ID_LISTBOX, a2dCanvasObjectsDocDialog::OnStructIdListboxSelected )
41  EVT_LISTBOX_DCLICK( STRUCT_ID_LISTBOX, a2dCanvasObjectsDocDialog::OnStructIdListboxDoubleClicked )
42  EVT_BUTTON( STRUCT_ID_HIDE, a2dCanvasObjectsDocDialog::OnStructIdHideClick )
43  EVT_BUTTON( STRUCT_ID_APPLY, a2dCanvasObjectsDocDialog::OnStructIdApplyClick )
45  EVT_DO( a2dCanvasObjectsDocDialog::OnDoEvent )
47 END_EVENT_TABLE()
48 
49 
50 a2dCanvasObjectsDocDialog::a2dCanvasObjectsDocDialog( wxWindow* parent, a2dCanvasDocument* document, bool structOnly, bool modal, long style,
51  wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size )
52 {
53  m_modal = modal;
54  Create( parent, id, caption, pos, size, style );
55 
56  a2dDocviewGlobals->GetDocviewCommandProcessor()->ConnectEvent( wxEVT_CHANGED_DOCUMENT, this );
59  a2dDocviewGlobals->GetDocviewCommandProcessor()->ConnectEvent( a2dEVT_COM_EVENT, this );
60 
61  m_document = document;
62 
63  m_structureSet.clear();
64 
65  Init( document );
66 
67  Centre( wxBOTH );
68 
69  // set the first structure as default and give it the focus
70  if ( m_structureSet.size() )
71  m_listbox->SetSelection( 0, true );
72  m_object = NULL;
73 }
74 
75 a2dCanvasObjectsDocDialog::a2dCanvasObjectsDocDialog( wxWindow* parent, a2dCanvasObjectList* total, bool modal, long style,
76  wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size )
77 {
78  m_modal = modal;
79  Create( parent, id, caption, pos, size, style );
80 
81  a2dDocviewGlobals->GetDocviewCommandProcessor()->ConnectEvent( wxEVT_CHANGED_DOCUMENT, this );
84  a2dDocviewGlobals->GetDocviewCommandProcessor()->ConnectEvent( a2dEVT_COM_EVENT, this );
85 
86  m_document = NULL;
87 
88  m_structureSet.clear();
89 
90  Init( total );
91 
92  Centre( wxBOTH );
93 
94  // set the first structure as default and give it the focus
95  if ( m_structureSet.size() )
96  m_listbox->SetSelection( 0, true );
97  m_object = NULL;
98 }
99 
100 bool a2dCanvasObjectsDocDialog::Create( wxWindow* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style )
101 {
102  m_object = NULL;
103 
104  m_listbox = NULL;
105  m_hide = NULL;
106  m_Apply = NULL;
107  SetExtraStyle( GetExtraStyle() | wxWS_EX_BLOCK_EVENTS );
108  wxDialog::Create( parent, id, caption, pos, size, style );
109 
110  a2dCanvasObjectsDocDialog* itemDialog1 = this;
111 
112  wxBoxSizer* itemBoxSizer2 = new wxBoxSizer( wxVERTICAL );
113  itemDialog1->SetSizer( itemBoxSizer2 );
114 
115  m_numberObjects = new wxStaticText( itemDialog1, STRUCT_ID_STATIC, _( "Number of objects:" ), wxDefaultPosition, wxDefaultSize, 0 );
116  m_numberObjects->SetHelpText( _( "Displays number of objects in list" ) );
117  if ( ShowToolTips() )
118  m_numberObjects->SetToolTip( _( "Displays number of objects in list" ) );
119  itemBoxSizer2->Add( m_numberObjects, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5 );
120 
121  wxBoxSizer* itemBoxSizer4 = new wxBoxSizer( wxHORIZONTAL );
122  itemBoxSizer2->Add( itemBoxSizer4, 1, wxGROW | wxALL, 1 );
123 
124  wxString* m_listboxStrings = NULL;
125  m_listbox = new wxListBox( itemDialog1, STRUCT_ID_LISTBOX, wxDefaultPosition, wxDefaultSize, 0, m_listboxStrings, wxLB_SINGLE | wxLB_NEEDED_SB );
126  m_listbox->SetHelpText( _( "list of objects to choose from, Double click to choose." ) );
127  if ( ShowToolTips() )
128  m_listbox->SetToolTip( _( "list of objects to choose from, Double click to choose." ) );
129  itemBoxSizer4->Add( m_listbox, 1, wxGROW | wxALL, 1 );
130 
131  wxBoxSizer* itemBoxSizer6 = new wxBoxSizer( wxHORIZONTAL );
132  itemBoxSizer2->Add( itemBoxSizer6, 0, wxGROW | wxALL, 1 );
133 
134  if ( m_modal )
135  {
136  m_hide = new wxButton( itemDialog1, STRUCT_ID_HIDE, _( "Ok" ), wxDefaultPosition, wxDefaultSize, 0 );
137  m_Apply = new wxButton( itemDialog1, STRUCT_ID_APPLY, _( "Cancel" ), wxDefaultPosition, wxDefaultSize, 0 );
138  }
139  else
140  {
141  m_hide = new wxButton( itemDialog1, STRUCT_ID_HIDE, _( "Hide" ), wxDefaultPosition, wxDefaultSize, 0 );
142  m_Apply = new wxButton( itemDialog1, STRUCT_ID_APPLY, _( "Apply" ), wxDefaultPosition, wxDefaultSize, 0 );
143  }
144 
145  m_hide->SetHelpText( _( "Hide this dialog" ) );
146  if ( ShowToolTips() )
147  m_hide->SetToolTip( _( "Hide this dialog" ) );
148  itemBoxSizer6->Add( m_hide, 0, wxALIGN_CENTER_VERTICAL | wxALL, 1 );
149 
150  m_Apply->SetHelpText( _( "Set this object as top in canvas" ) );
151  if ( ShowToolTips() )
152  m_Apply->SetToolTip( _( "Set this object as top in canvas" ) );
153  itemBoxSizer6->Add( m_Apply, 0, wxALIGN_CENTER_VERTICAL | wxALL, 1 );
154 
155  GetSizer()->Fit( this );
156  GetSizer()->SetSizeHints( this );
157  Centre();
158  return TRUE;
159 }
160 
161 a2dCanvasObjectsDocDialog::~a2dCanvasObjectsDocDialog()
162 {
163  a2dDocviewGlobals->GetDocviewCommandProcessor()->DisconnectEvent( wxEVT_CHANGED_DOCUMENT, this );
164  a2dDocviewGlobals->GetDocviewCommandProcessor()->DisconnectEvent( wxEVT_ACTIVATE_VIEW, this );
167  a2dDocviewGlobals->GetDocviewCommandProcessor()->DisconnectEvent( a2dEVT_COM_EVENT, this );
168 }
169 
171 {
172  m_listbox->Clear();
173 
174  s_a2dCanvasObjectSorter = &NameSorter;
175  for( a2dCanvasObjectList::iterator iter = objects->begin(); iter != objects->end(); ++iter )
176  {
177  a2dCanvasObject* obj = *iter;
178  if ( m_structureSet.find( obj ) == m_structureSet.end() )
179  m_structureSet.insert( obj );
180  }
181 
182  for( a2dCanvasObjectsSet::iterator iter = m_structureSet.begin(); iter != m_structureSet.end(); ++iter )
183  {
184  a2dCanvasObject* obj = *iter;
185  if ( obj == m_document->GetDrawing()->GetRootObject() )
186  {
187  m_listbox->Append( obj->GetName() + wxT( "=>top" ) );
188  }
189  else
190  m_listbox->Append( obj->GetName() );
191  }
192 
193  wxString mess = wxT( "" );
194  mess.Printf( _( "Number of structures: %ld" ), m_structureSet.size() - 1 );
195  m_numberObjects->SetLabel( mess );
196 
197  // set the first structure as default and give it the focus
198  if ( m_structureSet.size() )
199  m_listbox->SetSelection( 0, true );
200  m_object = NULL;
201 }
202 
204 {
205  s_a2dCanvasObjectSorter = &NameSorter;
206  m_structureSet.clear();
207  if ( document->GetDrawing()->GetDrawingId() == a2dDrawing::sm_cameleonrefs )
208  {
209  a2dCanvasObjectList::iterator rootchild = document->GetDrawing()->GetRootObject()->GetChildObjectList()->begin();
210  while ( rootchild != document->GetDrawing()->GetRootObject()->GetChildObjectList()->end() )
211  {
212  a2dCameleon* ref = wxDynamicCast( (*rootchild).Get(), a2dCameleon );
213  if ( ref )
214  {
215  a2dLayout* layout = ref->GetAppearance<a2dSymbol>();
216  if ( layout )
217  {
218  if ( m_structureSet.find( layout ) == m_structureSet.end() )
219  m_structureSet.insert( layout );
220  }
221  }
222  rootchild++;
223  }
224 
225  m_listbox->Clear();
226  for( a2dCanvasObjectsSet::iterator iter = m_structureSet.begin(); iter != m_structureSet.end(); ++iter )
227  {
228  a2dCanvasObject* obj = *iter;
229  if ( obj->GetHighLight() )
230  {
231  m_listbox->Append( obj->GetName() + wxT( "=>top" ) );
232  }
233  else
234  m_listbox->Append( obj->GetName() );
235  }
236  }
237  else
238  {
240  collector.SetWithChilds( true );
241  collector.SortOn( a2dWalker_CollectCanvasObjectsSet::onName );
242  collector.SetSkipNotRenderedInDrawing( true );
243  collector.Start( document->GetDrawing()->GetRootObject() );
244 
245  m_structureSet = collector.m_found;
246  m_listbox->Clear();
247 
248  for( a2dCanvasObjectsSet::iterator iter = m_structureSet.begin(); iter != m_structureSet.end(); ++iter )
249  {
250  a2dCanvasObject* obj = *iter;
251  if ( obj == m_document->GetDrawing()->GetRootObject() )
252  {
253  m_listbox->Append( obj->GetName() + wxT( "=>top" ) );
254  }
255  else
256  m_listbox->Append( obj->GetName() );
257  }
258  }
259 
260  wxString mess = wxT( "" );
261  mess.Printf( _( "Number of structures: %i" ), m_structureSet.size() - 1 );
262  m_numberObjects->SetLabel( mess );
263 
264  // set the first structure as default and give it the focus
265  if ( m_structureSet.size() )
266  m_listbox->SetSelection( 0, true );
267  m_object = NULL;
268 }
269 
271 {
272  event.Skip();
273 }
274 
276 {
277  if ( IsModal() )
278  {
279  CmApply();
280  EndModal( wxID_OK );
281  }
282  else
283  {
284  CmApply();
285  SetReturnCode( wxID_OK );
286  Show( false );
287  }
288 }
289 
291 {
292  if ( IsModal() )
293  {
294  EndModal( wxID_CANCEL );
295  return;
296  }
297 }
298 
300 {
301  CmApply();
302 }
303 
304 void a2dCanvasObjectsDocDialog::CmApply()
305 {
306  wxString buf;
307  buf = m_listbox->GetStringSelection();
308  for( a2dCanvasObjectsSet::iterator iter = m_structureSet.begin(); iter != m_structureSet.end(); ++iter )
309  {
310  a2dCanvasObject* obj = *iter;
311  wxString name = obj->GetName();
312  if ( !name.Cmp( buf ) )
313  {
314  m_object = obj;
315  break;
316  }
317  else if ( name + wxT( "=>top" ) == buf )
318  {
319  m_object = obj;
320  break;
321  }
322  }
323  if ( m_document->GetDrawing()->GetDrawingId() == a2dDrawing::sm_cameleonrefs )
324  {
325  m_object = wxStaticCast( m_object, a2dDiagram )->GetDrawing()->GetRootObject();
326  }
327 
328  a2dCanvasView* drawer = a2dGetCmdh()->CheckDrawer();
329  a2dCommand_SetShowObject* command = new a2dCommand_SetShowObject( drawer->GetDrawingPart(), a2dCommand_SetShowObject::Args().canvasobject( m_object ) );
330  a2dGetCmdh()->Submit( command, false );
331  a2dGetCmdh()->GetDrawingCmdProcessor()->ZoomOut();
332 }
333 
335 {
336  return m_object;
337 }
338 
339 void a2dCanvasObjectsDocDialog::OnCloseWindow( wxCloseEvent& WXUNUSED( event ) )
340 {
341  if ( IsModal() )
342  EndModal( wxID_OK );
343  else
344  {
345  SetReturnCode( wxID_OK );
346  Show( false );
347  }
348 }
349 
351 {
352  if ( !m_document )
353  return;
354 
355  a2dCanvasDocument* doc = ( a2dCanvasDocument* ) event.GetDocument();
356  if ( !IsModal() && doc )
357  {
358  m_document = doc;
359  Init( doc );
360  }
361 }
362 
363 void a2dCanvasObjectsDocDialog::OnComEvent( a2dComEvent& event )
364 {
365  if ( !m_document )
366  return;
367 
368  if ( event.GetId() == a2dDrawingPart::sig_changedShowObject )
369  {
370  a2dCanvasObject* newtop = wxStaticCast( event.GetProperty()->GetRefObject(), a2dCanvasObject );
371  }
372  else
373  event.Skip();
374 }
375 
376 void a2dCanvasObjectsDocDialog::OnDoEvent( a2dCommandProcessorEvent& event )
377 {
378  if ( !m_document )
379  return;
380 
381  if ( event.GetCommand()->GetCommandId() == &a2dCommand_SetShowObject::Id )
382  {
383  Init( m_document );
384  }
385  else if ( event.GetCommand()->GetCommandId() == &a2dCommand_NewGroup::Id )
386  {
387  Init( m_document );
388  }
389  else
390  event.Skip();
391 }
392 
393 
394 
395 
#define wxDynamicCast(obj, className)
Define wxDynamicCast so that it will give a compiler error for unrelated types.
Definition: gen.h:75
#define EVT_CHANGED_DOCUMENT(func)
event sent to a2dDocumentCommandProcessor when the current document has changed in the a2dDocumentCom...
Definition: doccom.h:179
diagram is an appearance for a2dCameleon
Definition: cameleon.h:382
virtual wxString GetName() const
Returns the name of this object, if no name is given the internal id will be returned.
Definition: gen.cpp:1310
a2dDrawingId GetDrawingId()
set special id to differentiate drawings
Definition: drawing.h:721
a2dCanvasCommandProcessor * GetDrawingCmdProcessor()
get commandprocessor of document
Definition: cancom.h:240
View on a a2dCanvasDocument.
Definition: candoc.h:212
a2dCommand * GetCommand()
the command ( if there was one ) that did it.
Definition: comevt.h:759
a2dCanvasObjectsSet m_structureSet
Pointer to object list.
Definition: strucdlgdoc.h:107
a2dCanvasObject * GetRootObject() const
get the root object, which holds the objects in the document
Definition: drawing.h:521
#define EVT_DO(func)
event sent from a2DocumentCommandProcessor when a command is initially done
Definition: comevt.h:795
void ConnectEvent(wxEventType type, wxEvtHandler *eventSink)
Definition: gen.cpp:876
see a2dCommandEvent
Definition: doccom.h:79
a2dDrawing * GetDrawing() const
get the root object, which holds the objects in the document.
Definition: candoc.h:418
void OnStructIdHideClick(wxCommandEvent &event)
wxEVT_COMMAND_BUTTON_CLICKED event handler for STRUCT_ID_HIDE
object to show several appearance views on what it contains
Definition: cameleon.h:630
a2dCanvasObject is the base class for Canvas Objects.
Definition: canobj.h:371
a2dCanvasView * CheckDrawer() const
is a view with a2dCanvasView active
Definition: cancom.cpp:1726
a2dCanvasObject * GetCanvasObject()
Pointer to object selected.
static const a2dCommandId Id
Print the current document or view.
Definition: drawing.h:2715
virtual a2dObject * GetRefObject() const
when a2dProperty, return its value else assert
Definition: gen.cpp:1976
a2dCanvasObjectList * GetChildObjectList()
get the list where the child objects are stored in.
Definition: canobj.cpp:2551
void OnCloseWindow(wxCloseEvent &event)
wxEVT_CLOSE_WINDOW event handler for ID_DIALOG
void SetWithChilds(bool check)
if set, objects must have childs
Definition: algos.h:441
static const a2dSignal sig_changedShowObject
Definition: drawer.h:1513
#define EVT_COM_EVENT(func)
static wxEvtHandler for communication event
Definition: gen.h:564
const a2dCommandId * GetCommandId()
a specific id for this command.
Definition: comevt.h:179
#define wxStaticCast(obj, className)
The wxWindows 2.4.2 wxStaticCast is buggy. It evaluates its argument twice.
Definition: gen.h:123
a2dCanvasObject * m_object
Pointer to the choosen object.
Definition: strucdlgdoc.h:110
bool Create(wxWindow *parent, wxWindowID id=SYMBOL_A2DCANVASOBJECTSDIALOG_IDNAME, const wxString &caption=SYMBOL_A2DCANVASOBJECTSDIALOG_TITLE, const wxPoint &pos=SYMBOL_A2DCANVASOBJECTSDIALOG_POSITION, const wxSize &size=SYMBOL_A2DCANVASOBJECTSDIALOG_SIZE, long style=SYMBOL_A2DCANVASOBJECTSDIALOG_STYLE)
Creation.
void OnStructIdListboxSelected(wxCommandEvent &event)
wxEVT_COMMAND_LISTBOX_SELECTED event handler for STRUCT_ID_LISTBOX
Tappear * GetAppearance(bool autoCreate=false)
Get a specific a2dAppear derived class instance from here.
Definition: cameleon.h:666
collect a2dCanvasObject&#39;s in a hierarchy of a a2dCanvasDocument
Definition: algos.h:408
Symbolic appearance for a2dCameleon.
Definition: cameleon.h:470
virtual bool Submit(a2dCommand *command, bool storeIt=true)
next to the base class submit, it sets a2DocumentCommandProcessor for a2dCommand
Definition: comevt.cpp:842
bool NameSorter(const a2dCanvasObjectPtr &x, const a2dCanvasObjectPtr &y)
used to canvas object on name
Definition: algos.cpp:585
void OnStructIdApplyClick(wxCommandEvent &event)
wxEVT_COMMAND_BUTTON_CLICKED event handler for STRUCT_ID_APPLY
a2dDocviewGlobal * a2dDocviewGlobals
a global pointer to get to global instance of important classes.
Definition: doccom.cpp:2348
a2dCanvasObjectsSet m_found
objects found
Definition: algos.h:448
Each a2dCanvasView needs to have a a2dCanvasDocument set in order to render data. ...
Definition: candoc.h:374
Event sent to a2dCommandProcessor.
Definition: comevt.h:701
see a2dComEvent
Definition: gen.h:371
a2dDocumentCommandProcessor * GetDocviewCommandProcessor() const
Gets a2dDocumentCommandProcessor pointer.
Definition: doccom.h:1034
void Init(a2dCanvasObjectList *objects)
take over object to show from objects
void OnChangedDocument(a2dCommandEvent &event)
document changed
void OnStructIdListboxDoubleClicked(wxCommandEvent &event)
wxEVT_COMMAND_LISTBOX_DOUBLECLICKED event handler for STRUCT_ID_LISTBOX
all headers of the canvas module
for choosing a a2dCanvasObject from a list.
bool DisconnectEvent(wxEventType type, wxEvtHandler *eventSink)
Definition: gen.cpp:902
a2dDocument * GetDocument()
the document created/removed or on which the command was applied.
Definition: doccom.h:151
static bool ShowToolTips()
Should we show tooltips?
Definition: strucdlgdoc.h:87
strucdlgdoc.cpp Source File -- Sun Oct 12 2014 17:04:24 -- Sun Oct 12 2014 -- 1.8.5 -- wxArt2D -- . -- Main Page Reference Documentation