1 #include <wx/sstream.h>
2 #include <wx/txtstrm.h>
3 
4 
5 #include <sdk.h> // Code::Blocks SDK
6 #ifndef CB_PRECOMP
7     #include <wx/xrc/xmlres.h>
8     #include <cbeditor.h>
9 #endif
10 #include <configurationpanel.h>
11 #include <cbstyledtextctrl.h>
12 #include <cbcolourmanager.h>
13 #include <filefilters.h>
14 #include "NassiPlugin.h"
15 
16 #include "NassiEditorPanel.h"
17 #include "NassiView.h"
18 
19 // Register the plugin with Code::Blocks.
20 // We are using an anonymous namespace so we don't litter the global one.
21 namespace
22 {
23     const int MaxInsertMenuEntries = 10;
24 
25     PluginRegistrant<NassiPlugin> reg(_T("NassiShneidermanPlugin"));
26     const int NASSI_ID_NEW_FILE = wxNewId();
27     const int idParseC = wxNewId();
28     const int insertCFromDiagram[MaxInsertMenuEntries] = {
29         static_cast<int>(wxNewId()), static_cast<int>(wxNewId()), static_cast<int>(wxNewId()), static_cast<int>(wxNewId()), static_cast<int>(wxNewId()),
30         static_cast<int>(wxNewId()), static_cast<int>(wxNewId()), static_cast<int>(wxNewId()), static_cast<int>(wxNewId()), static_cast<int>(wxNewId())};
31 }
32 
33 namespace {
34     const int NASSI_ID_TOGGLE_SOURCE =  XRCID("NASSI_ID_TOGGLE_SOURCE");
35     const int NASSI_ID_TOGGLE_COMMENT =  XRCID("NASSI_ID_TOGGLE_COMMENT");
36 
37     const int NASSI_ID_ESC = XRCID("NASSI_ID_ESC");
38     const int NASSI_ID_INSTRUCTION = XRCID("NASSI_ID_INSTRUCTION");
39     const int NASSI_ID_IF = XRCID("NASSI_ID_IF");
40     const int NASSI_ID_SWITCH = XRCID("NASSI_ID_SWITCH");
41     const int NASSI_ID_WHILE = XRCID("NASSI_ID_WHILE");
42     const int NASSI_ID_DOWHILE = XRCID("NASSI_ID_DOWHILE");
43     const int NASSI_ID_FOR = XRCID("NASSI_ID_FOR");
44     const int NASSI_ID_BLOCK = XRCID("NASSI_ID_BLOCK");
45     const int NASSI_ID_BREAK = XRCID("NASSI_ID_BREAK");
46     const int NASSI_ID_CONTINUE = XRCID("NASSI_ID_CONTINUE");
47     const int NASSI_ID_RETURN = XRCID("NASSI_ID_RETURN");
48 
49     const int NASSI_ID_EXPORT_SVG = wxNewId();
50     const int NASSI_ID_EXPORT_SOURCE = wxNewId();
51     const int NASSI_ID_EXPORT_VHDL = wxNewId();
52     const int NASSI_ID_EXPORT_PS = wxNewId();
53     const int NASSI_ID_EXPORT_STRUKTEX = wxNewId();
54     const int NASSI_ID_EXPORT_BITMAP = wxNewId();
55 
56     const int NASSI_ID_GLASS_P = XRCID("NASSI_ID_GLASS_P");
57     const int NASSI_ID_GLASS_N = XRCID("NASSI_ID_GLASS_N");
58 }
59 // TODO (danselmi#1#): Check if export of svg generates not conformant SVG data???
60 
61 // events handling
BEGIN_EVENT_TABLE(NassiPlugin,cbPlugin)62 BEGIN_EVENT_TABLE(NassiPlugin, cbPlugin)
63 
64     EVT_MENU(NASSI_ID_NEW_FILE, NassiPlugin::OnNewDiagram)
65 
66     //EVT_MENU(idParseC, NassiPlugin::ParseC)
67 
68     EVT_UPDATE_UI(NASSI_ID_TOGGLE_SOURCE, NassiPlugin::OnUpdateToggleText)
69     EVT_UPDATE_UI(NASSI_ID_TOGGLE_COMMENT, NassiPlugin::OnUpdateToggleText)
70 
71     EVT_MENU(NASSI_ID_TOGGLE_SOURCE, NassiPlugin::OnToggleText)
72     EVT_MENU(NASSI_ID_TOGGLE_COMMENT , NassiPlugin::OnToggleText)
73 
74     EVT_UPDATE_UI(NASSI_ID_ESC, NassiPlugin::OnUpdateTools)
75     EVT_UPDATE_UI(NASSI_ID_INSTRUCTION, NassiPlugin::OnUpdateTools)
76     EVT_UPDATE_UI(NASSI_ID_IF, NassiPlugin::OnUpdateTools)
77     EVT_UPDATE_UI(NASSI_ID_SWITCH, NassiPlugin::OnUpdateTools)
78     EVT_UPDATE_UI(NASSI_ID_WHILE, NassiPlugin::OnUpdateTools)
79     EVT_UPDATE_UI(NASSI_ID_DOWHILE, NassiPlugin::OnUpdateTools)
80     EVT_UPDATE_UI(NASSI_ID_FOR, NassiPlugin::OnUpdateTools)
81     EVT_UPDATE_UI(NASSI_ID_BLOCK, NassiPlugin::OnUpdateTools)
82     EVT_UPDATE_UI(NASSI_ID_BREAK, NassiPlugin::OnUpdateTools)
83     EVT_UPDATE_UI(NASSI_ID_CONTINUE, NassiPlugin::OnUpdateTools)
84     EVT_UPDATE_UI(NASSI_ID_RETURN, NassiPlugin::OnUpdateTools)
85 
86     EVT_MENU(NASSI_ID_INSTRUCTION, NassiPlugin::OnChangeTool)
87     EVT_MENU(NASSI_ID_IF, NassiPlugin::OnChangeTool)
88     EVT_MENU(NASSI_ID_SWITCH, NassiPlugin::OnChangeTool)
89     EVT_MENU(NASSI_ID_WHILE, NassiPlugin::OnChangeTool)
90     EVT_MENU(NASSI_ID_DOWHILE, NassiPlugin::OnChangeTool)
91     EVT_MENU(NASSI_ID_FOR, NassiPlugin::OnChangeTool)
92     EVT_MENU(NASSI_ID_BLOCK, NassiPlugin::OnChangeTool)
93     EVT_MENU(NASSI_ID_BREAK, NassiPlugin::OnChangeTool)
94     EVT_MENU(NASSI_ID_CONTINUE, NassiPlugin::OnChangeTool)
95     EVT_MENU(NASSI_ID_RETURN, NassiPlugin::OnChangeTool)
96 
97     EVT_MENU(NASSI_ID_ESC, NassiPlugin::OnToolSelect)
98 
99     EVT_UPDATE_UI(NASSI_ID_GLASS_P, NassiPlugin::OnUpdateZoom)
100     EVT_UPDATE_UI(NASSI_ID_GLASS_N, NassiPlugin::OnUpdateZoom)
101     EVT_MENU(NASSI_ID_GLASS_P, NassiPlugin::OnZoom)
102     EVT_MENU(NASSI_ID_GLASS_N, NassiPlugin::OnZoom)
103 
104     //EVT_MENU(wxID_SELECTALL, NassiPlugin::OnSelectAll)
105     //EVT_MENU(wxID_DELETE, NassiPlugin::OnDelete)
106 
107     /*EVT_MENU(NASSI_ID_NEXT_TOOL, NassiEditView::OnNextTool)
108     EVT_MENU(NASSI_ID_PREV_TOOL, NassiEditView::OnPrevTool)*/
109 
110     EVT_UPDATE_UI_RANGE(NASSI_ID_EXPORT_SVG, NASSI_ID_EXPORT_BITMAP, NassiPlugin::OnUpdateExport)
111     EVT_MENU_RANGE(NASSI_ID_EXPORT_SVG, NASSI_ID_EXPORT_BITMAP,      NassiPlugin::OnExport)
112 
113     EVT_UPDATE_UI(idParseC, NassiPlugin::OnUpdateUIMenuItem)
114 END_EVENT_TABLE()
115 
116 // constructor
117 NassiPlugin::NassiPlugin()
118 {
119     // Make sure our resources are available.
120     if (!Manager::LoadResource(_T("NassiShneiderman.zip")))
121     {
122         NotifyMissingFile(_T("NassiShneiderman.zip"));
123     }
124 }
125 
126 // destructor
~NassiPlugin()127 NassiPlugin::~NassiPlugin()
128 {
129 }
130 
OnAttach()131 void NassiPlugin::OnAttach()
132 {
133     // do whatever initialization you need for your plugin
134     // after this function, the inherited member variable
135     // m_IsAttached will be TRUE...
136     // You should check for it in other functions, because if it
137     // is FALSE, it means that the application did *not* "load"
138     // (see: does not need) this plugin...
139 
140     ColourManager* cmgr = Manager::Get()->GetColourManager();
141     cmgr->RegisterColour(_("NassiShneiderman"), _("Brick background"), wxT("nassi_brick_background"), *wxWHITE);
142     cmgr->RegisterColour(_("NassiShneiderman"), _("Empty brick background"), wxT("nassi_empty_brick_background"), *wxLIGHT_GREY);
143     cmgr->RegisterColour(_("NassiShneiderman"), _("Graphics colour"), wxT("nassi_graphics_colour"), *wxBLACK);
144     cmgr->RegisterColour(_("NassiShneiderman"), _("Selection colour"), wxT("nassi_selection_colour"), *wxCYAN);
145     cmgr->RegisterColour(_("NassiShneiderman"), _("Source colour"), wxT("nassi_source_colour"), *wxBLACK);
146     cmgr->RegisterColour(_("NassiShneiderman"), _("Comment colour"), wxT("nassi_comment_colour"), *wxRED);
147 
148     for ( int i = 0 ; i < MaxInsertMenuEntries ; i++ )
149         Connect(insertCFromDiagram[i], wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(NassiPlugin::OnInsertCFromDiagram), 0, this);
150     Connect(idParseC, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(NassiPlugin::ParseC), 0, this);
151 
152     cbEventFunctor<NassiPlugin, CodeBlocksEvent> *functor;
153     functor = new cbEventFunctor<NassiPlugin, CodeBlocksEvent>(this, &NassiPlugin::OnSettingsChanged);
154     Manager::Get()->RegisterEventSink(cbEVT_SETTINGS_CHANGED, functor);
155 
156     FileFilters::Add(_("Nassi Shneiderman diagram"), _T("*.nsd") );
157 }
158 
OnRelease(bool appShutDown)159 void NassiPlugin::OnRelease(bool appShutDown)
160 {
161     if ( !appShutDown )
162     {
163         NassiEditorPanel::CloseAllNassiEditors();
164         for ( int i = 0 ; i < MaxInsertMenuEntries ; i++ )
165             Disconnect(insertCFromDiagram[i], wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(NassiPlugin::OnInsertCFromDiagram), 0, this);
166         Disconnect(idParseC, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(NassiPlugin::ParseC), 0, this);
167     }
168 }
169 
FindOrInsertExportMenu(wxMenu * & fileMenu,wxMenuBar * menuBar)170 static wxMenu* FindOrInsertExportMenu(wxMenu *&fileMenu, wxMenuBar *menuBar)
171 {
172     fileMenu = nullptr;
173     // find "File" menu position
174     const int fileMenuPos = menuBar->FindMenu(_("&File"));
175     if (fileMenuPos == -1)
176         return nullptr;
177     // find actual "File" menu
178     fileMenu = menuBar->GetMenu(fileMenuPos);
179     if (!fileMenu)
180         return nullptr;
181 
182     // decide where to insert in "File" menu
183     size_t printPos = fileMenu->GetMenuItemCount() - 4; // the default location
184     const int printID = fileMenu->FindItem(_("Print..."));
185     if (printID != wxNOT_FOUND)
186     {
187         fileMenu->FindChildItem(printID, &printPos);
188         ++printPos; // after "Print"
189     }
190     wxMenu *exportMenu = nullptr;
191     const int pos = fileMenu->FindItem(_("&Export"));
192     if (pos != wxNOT_FOUND)
193     {
194         wxMenuItem *menuItem = fileMenu->FindItem(pos);
195         exportMenu = menuItem->GetSubMenu();
196         if (exportMenu)
197             exportMenu->AppendSeparator();
198     }
199     else
200     {
201         exportMenu = new wxMenu();
202         fileMenu->Insert(printPos, wxID_ANY, _("&Export"), exportMenu);
203     }
204     return exportMenu;
205 }
206 
BuildMenu(wxMenuBar * menuBar)207 void NassiPlugin::BuildMenu(wxMenuBar* menuBar)
208 {
209     //The application is offering its menubar for your plugin,
210     //to add any menu items you want...
211     //Append any items you need in the menu...
212     //Be careful in here... The application's menubar is at your disposal.
213 
214     wxMenu *filemenu;
215     wxMenu *exportmenu = FindOrInsertExportMenu(filemenu, menuBar);
216     if (!exportmenu)
217         return;
218 
219     if ( !exportmenu->FindItem(NASSI_ID_EXPORT_SOURCE) )
220         exportmenu->Append(NASSI_ID_EXPORT_SOURCE,  _("&Export Source..."), _("Export to C source format"));
221     //if ( !exportmenu->FindItem(NASSI_ID_EXPORT_VHDL) )
222     //    exportmenu->Append(NASSI_ID_EXPORT_VHDL, _T("VHDL"), _T("export to VHDL format"));
223     if ( !exportmenu->FindItem(NASSI_ID_EXPORT_STRUKTEX) )
224         exportmenu->Append(NASSI_ID_EXPORT_STRUKTEX, _T("StrukTeX"), _("export to StrukTeX format"));
225 
226 // TODO (danselmi#1#): check why svg export crashes on wx30; fix and enable feature again
227         //    #if wxCHECK_VERSION(3, 0, 0)
228 //    if ( !exportmenu->FindItem(NASSI_ID_EXPORT_SVG) )
229 //        exportmenu->Append(NASSI_ID_EXPORT_SVG, _T("SVG"), _("export to SVG format"));
230 //    #endif
231 
232     if ( !exportmenu->FindItem(NASSI_ID_EXPORT_BITMAP) )
233         exportmenu->Append(NASSI_ID_EXPORT_BITMAP, _T("PNG"), _("export to PNG format"));
234 
235     #if wxUSE_POSTSCRIPT
236     if ( !exportmenu->FindItem(NASSI_ID_EXPORT_PS) )
237         exportmenu->Append(NASSI_ID_EXPORT_PS, _T("PS"), _("export to PS"));
238     #endif
239 
240 
241     wxMenu* filenewmenu = 0;
242     int pos = filemenu->FindItem( _("New") );
243     if ( pos != wxNOT_FOUND )
244     {
245         wxMenuItem *menuitm = filemenu->FindItem(pos);
246         filenewmenu = menuitm->GetSubMenu();
247     }
248     else
249     {
250         filenewmenu = new wxMenu();
251         wxMenuItem *item = new wxMenuItem(filemenu, wxID_ANY, _("New"), _T(""), wxITEM_NORMAL, filenewmenu);
252         filemenu->Prepend(item);
253     }
254 
255 
256     if ( !filenewmenu->FindItem(NASSI_ID_NEW_FILE) )
257         filenewmenu->Append(NASSI_ID_NEW_FILE, _("Nassi Shneiderman diagram"), _("Create a new Nassi Shneiderman diagram"));
258 
259     pos = menuBar->FindMenu(_("&View"));
260     if (pos == wxNOT_FOUND)
261         return;
262 
263     wxMenu* viewmenu = menuBar->GetMenu(pos);
264     viewmenu->Append(idParseC, _("Nassi-Shneiderman diagram"), _("Construct Nassi-Shneiderman diagram from selected text"));
265     viewmenu->Enable(idParseC, false);
266 }
267 
BuildModuleMenu(const ModuleType type,wxMenu * menu,const FileTreeData *)268 void NassiPlugin::BuildModuleMenu(const ModuleType type, wxMenu* menu, const FileTreeData* /*data*/)
269 {
270     //Some library module is ready to display a pop-up menu.
271     //Check the parameter \"type\" and see which module it is
272     //and append any items you need in the menu...
273     //TIP: for consistency, add a separator as the first item...
274     if ( !IsAttached() || !menu ) return;
275 
276     if ( type != mtEditorManager ) return;
277 
278     EditorManager* emngr = Manager::Get()->GetEditorManager();
279     if ( !emngr ) return;
280 
281     EditorBase *edb = emngr->GetActiveEditor();
282     if ( !edb || !edb->IsBuiltinEditor() ) return;
283 
284     cbStyledTextCtrl* stc = ((cbEditor*)edb)->GetControl();
285     if ( !stc ) return;
286 
287     wxMenu *NassiMenu = 0;
288 
289     // check if user can select to generate a diagram from selection
290     if ( stc->GetLexer() == wxSCI_LEX_CPP && stc->GetSelectionEnd() - stc->GetSelectionStart() > 0 )
291     {
292         if (! NassiMenu ) NassiMenu = new wxMenu();
293         NassiMenu->Append(idParseC, _("Create diagram"));
294     }
295 
296     // check if user can insert an opened diagram
297     wxArrayString names;
298     for ( int i = 0 ; i < Manager::Get()->GetEditorManager()->GetEditorsCount() ; ++i )
299     {
300         EditorBase *ed = Manager::Get()->GetEditorManager()->GetEditor( i );
301         if ( NassiEditorPanel::IsNassiEditor( ed ) )
302             names.Add(ed->GetTitle( ) );
303     }
304     if ( stc->GetLexer() == wxSCI_LEX_CPP && names.GetCount() > 0 )
305     {
306         if (! NassiMenu )
307         {
308             NassiMenu = new wxMenu();
309         }
310         else
311         {
312             NassiMenu->AppendSeparator();
313         }
314 
315         for ( int i = 0; i < static_cast<int>(names.GetCount()) && i < 10 ; ++i )
316         {
317             NassiMenu->Append(insertCFromDiagram[i], _("insert from ") + names[i] );
318         }
319     }
320 
321     if ( NassiMenu )
322     {
323         const wxString label = _("Nassi Shneiderman");
324         const int position = Manager::Get()->GetPluginManager()->FindSortedMenuItemPosition(*menu, label);
325         menu->Insert(position, wxID_ANY, label, NassiMenu);
326     }
327 }
328 
BuildToolBar(wxToolBar * toolBar)329 bool NassiPlugin::BuildToolBar(wxToolBar* toolBar)
330 {
331     //The application is offering its toolbar for your plugin,
332     //to add any toolbar items you want...
333     //Append any items you need on the toolbar...
334     if (!m_IsAttached || !toolBar)
335     {
336         return false;
337     }
338     Manager::Get()->AddonToolBar(toolBar, _T("nassi_shneiderman_toolbar"));
339     toolBar->Realize();
340     toolBar->SetInitialSize();
341     return true;
342 }
343 
344 //{ mime handler
CanHandleFile(const wxString & filename) const345 bool NassiPlugin::CanHandleFile(const wxString& filename) const
346 {
347     wxFileName fname(filename);
348     if (fname.GetExt().Lower() == _T("nsd") )
349         return true;
350     return false;
351 }
352 
OpenFile(const wxString & fileName)353 int NassiPlugin::OpenFile(const wxString& fileName)
354 {
355     EditorBase *alreadopeneditor = Manager::Get()->GetEditorManager()->IsOpen( fileName );
356     if ( alreadopeneditor )
357     {
358         Manager::Get()->GetEditorManager()->SetActiveEditor(alreadopeneditor);
359         return 0;
360     }
361 
362     wxString title = wxFileName( fileName ).GetFullName();
363     if ( new NassiEditorPanel( fileName, title ) )
364         return 0;
365 
366     return -1;
367 }
368 
OnNewDiagram(wxCommandEvent &)369 void NassiPlugin::OnNewDiagram(wxCommandEvent & /*event*/)
370 {
371     new NassiEditorPanel(_T(""), _T(""));
372 }
373 //} end mime handler
374 
ParseC(wxCommandEvent &)375 void NassiPlugin::ParseC(wxCommandEvent & /*event*/)
376 {
377     EditorManager* emngr = Manager::Get()->GetEditorManager();
378     if ( !emngr ) return;
379 
380     EditorBase *edb = emngr->GetActiveEditor();
381     if ( !edb || !edb->IsBuiltinEditor() ) return;
382 
383     cbStyledTextCtrl* stc = ((cbEditor*)edb)->GetControl();
384     if ( !stc ) return;
385 
386 
387     NassiEditorPanel *panel = new NassiEditorPanel(_T(""), _T(""));
388 
389     switch ( stc->GetLexer() )
390     {
391         case wxSCI_LEX_CPP:
392         {
393             const wxString str = stc->GetSelectedText();
394             if ( !panel->ParseC(str) )
395             {
396                 panel->Close();
397                 wxMessageBox(_("unable to parse input"), _("Error!"));
398             }
399             //else stc->SetReadOnly(true);
400 
401         }
402             break;
403         default:
404             break;
405     }
406 }
407 
OnInsertCFromDiagram(wxCommandEvent & event)408 void NassiPlugin::OnInsertCFromDiagram(wxCommandEvent &event)
409 {
410     // check if user can isert an opened diagram
411     unsigned idx = 0;
412     for ( int i = 0 ; i < Manager::Get()->GetEditorManager()->GetEditorsCount() ; i++ )
413     {
414         EditorBase *ed = Manager::Get()->GetEditorManager()->GetEditor( i );
415         if ( NassiEditorPanel::IsNassiEditor( ed ) )
416         {
417             NassiEditorPanel *ned = (NassiEditorPanel *)ed;
418             if ( event.GetId() == insertCFromDiagram[idx] )
419             {
420                 EditorManager* emngr = Manager::Get()->GetEditorManager();
421                 if ( !emngr ) return;
422                 EditorBase *edb = emngr->GetActiveEditor();
423                 if ( !edb || !edb->IsBuiltinEditor() ) return;
424                 unsigned int indent = ((cbEditor*)edb)->GetLineIndentInSpaces(); // from current line
425                 cbStyledTextCtrl *stc = ((cbEditor*)edb)->GetControl();
426                 if ( !stc ) return;
427 
428                 wxStringOutputStream ostrstream;
429                 wxTextOutputStream text_stream(ostrstream);
430 
431                 if ( !ned ) return;
432                 ned->GetCSource(text_stream, indent);
433 
434                 stc->InsertText(wxSCI_INVALID_POSITION, ostrstream.GetString());
435 
436             }
437             //some comment
438             idx++;
439         }
440     }
441 }
442 
IsNassiEditorPanelActive()443 bool NassiPlugin::IsNassiEditorPanelActive()
444 {
445     EditorBase *ed = Manager::Get()->GetEditorManager()->GetActiveEditor();
446     if ( NassiEditorPanel::IsNassiEditor(ed) )
447         return true;
448     return false;
449 }
450 
OnUpdateToggleText(wxUpdateUIEvent & event)451 void NassiPlugin::OnUpdateToggleText(wxUpdateUIEvent &event)
452 {
453     if ( IsNassiEditorPanelActive() )
454     {
455         NassiEditorPanel *ed = (NassiEditorPanel *)Manager::Get()->GetEditorManager()->GetActiveEditor();
456 
457         event.Enable(true);
458         if ( event.GetId() == NASSI_ID_TOGGLE_SOURCE )
459             event.Check( ed->IsDrawingSource() );
460         else
461             event.Check( ed->IsDrawingComment() );
462     }
463     else
464         event.Enable(false);
465 }
466 
OnUpdateTools(wxUpdateUIEvent & event)467 void NassiPlugin::OnUpdateTools(wxUpdateUIEvent &event)
468 {
469     event.Enable( IsNassiEditorPanelActive() );
470 }
471 
OnToggleText(wxCommandEvent & event)472 void NassiPlugin::OnToggleText(wxCommandEvent &event)
473 {
474     if ( IsNassiEditorPanelActive() )
475     {
476         NassiEditorPanel *ed = (NassiEditorPanel *)Manager::Get()->GetEditorManager()->GetActiveEditor();
477         if ( event.GetId() == NASSI_ID_TOGGLE_SOURCE )
478             ed->EnableDrawSource( event.IsChecked() );
479         else
480             ed->EnableDrawComment( event.IsChecked() );
481     }
482 }
483 
OnChangeTool(wxCommandEvent & event)484 void NassiPlugin::OnChangeTool(wxCommandEvent &event)
485 {
486     if ( !IsNassiEditorPanelActive() ) return;
487     NassiEditorPanel *ed = (NassiEditorPanel *)Manager::Get()->GetEditorManager()->GetActiveEditor();
488 
489     int id =  event.GetId();
490     if      ( id == NASSI_ID_IF )      ed->ChangeToolTo(NassiView::NASSI_TOOL_IF);
491     else if ( id == NASSI_ID_SWITCH )  ed->ChangeToolTo(NassiView::NASSI_TOOL_SWITCH);
492     else if ( id == NASSI_ID_WHILE )   ed->ChangeToolTo(NassiView::NASSI_TOOL_WHILE);
493     else if ( id == NASSI_ID_DOWHILE ) ed->ChangeToolTo(NassiView::NASSI_TOOL_DOWHILE);
494     else if ( id == NASSI_ID_FOR )     ed->ChangeToolTo(NassiView::NASSI_TOOL_FOR);
495     else if ( id == NASSI_ID_BLOCK )   ed->ChangeToolTo(NassiView::NASSI_TOOL_BLOCK);
496     else if ( id == NASSI_ID_BREAK )   ed->ChangeToolTo(NassiView::NASSI_TOOL_BREAK);
497     else if ( id == NASSI_ID_CONTINUE )ed->ChangeToolTo(NassiView::NASSI_TOOL_CONTINUE);
498     else if ( id == NASSI_ID_RETURN )  ed->ChangeToolTo(NassiView::NASSI_TOOL_RETURN);
499     else /*NASSI_ID_INSTRUCTION*/      ed->ChangeToolTo(NassiView::NASSI_TOOL_INSTRUCTION);
500 }
501 
OnToolSelect(wxCommandEvent &)502 void NassiPlugin::OnToolSelect(wxCommandEvent & /*event*/)
503 {
504     if ( !IsNassiEditorPanelActive() ) return;
505     NassiEditorPanel *ed = (NassiEditorPanel *)Manager::Get()->GetEditorManager()->GetActiveEditor();
506 
507     ed->ToolSelect();
508 }
509 
510 //{ zoom
OnUpdateZoom(wxUpdateUIEvent & event)511 void NassiPlugin::OnUpdateZoom(wxUpdateUIEvent &event)
512 {
513     if ( !IsNassiEditorPanelActive() )
514     {
515         event.Enable(false);
516         return;
517     }
518     NassiEditorPanel *ed = (NassiEditorPanel *)Manager::Get()->GetEditorManager()->GetActiveEditor();
519 
520     if ( event.GetId() == NASSI_ID_GLASS_P )
521         event.Enable(ed->CanZoomIn());
522     else
523         event.Enable(ed->CanZoomOut());
524 
525 }
526 
OnZoom(wxCommandEvent & event)527 void NassiPlugin::OnZoom(wxCommandEvent &event)
528 {
529     if ( !IsNassiEditorPanelActive() ) return;
530     NassiEditorPanel *ed = (NassiEditorPanel *)Manager::Get()->GetEditorManager()->GetActiveEditor();
531 
532     if ( event.GetId() == NASSI_ID_GLASS_P )
533         ed->ZoomIn();
534     else
535         ed->ZoomOut();
536 }
537 //} zoom end
538 
539 //{ export
OnUpdateExport(wxUpdateUIEvent & event)540 void NassiPlugin::OnUpdateExport(wxUpdateUIEvent &event)
541 {
542     if ( !IsNassiEditorPanelActive() )
543     {
544         event.Enable(false);
545         return;
546     }
547 
548     NassiEditorPanel *ed = (NassiEditorPanel *)Manager::Get()->GetEditorManager()->GetActiveEditor();
549 
550     event.Enable(ed->CanExport());
551 }
552 
OnExport(wxCommandEvent & event)553 void NassiPlugin::OnExport(wxCommandEvent &event)
554 {
555     if ( !IsNassiEditorPanelActive() )return;
556 
557     NassiEditorPanel *ed = (NassiEditorPanel *)Manager::Get()->GetEditorManager()->GetActiveEditor();
558 
559     int id = event.GetId();
560     if( id == NASSI_ID_EXPORT_SOURCE )        ed->ExportCSource();
561     #if wxCHECK_VERSION(3, 0, 0)
562         else if ( id == NASSI_ID_EXPORT_SVG ) ed->ExportSVG();
563     #endif
564     else if( id == NASSI_ID_EXPORT_VHDL )     ed->ExportVHDLSource();
565     #if wxUSE_POSTSCRIPT
566         else if( id == NASSI_ID_EXPORT_PS )   ed->ExportPS();
567     #endif
568     else if( id == NASSI_ID_EXPORT_STRUKTEX ) ed->ExportStrukTeX();
569     else /*NASSI_ID_EXPORT_BITMAP*/           ed->ExportBitmap();
570 }
571 
572 //} export end
573 
OnUpdateUIMenuItem(wxUpdateUIEvent & event)574 void NassiPlugin::OnUpdateUIMenuItem(wxUpdateUIEvent &event)
575 {
576     bool enable = false;
577 
578     EditorManager* emngr = Manager::Get()->GetEditorManager();
579     if (emngr)
580     {
581         EditorBase *edb = emngr->GetActiveEditor();
582         if (edb && edb->IsBuiltinEditor())
583         {
584             cbStyledTextCtrl* stc = static_cast<cbEditor*>(edb)->GetControl();
585             if (stc && stc->GetLexer() == wxSCI_LEX_CPP)
586                 enable = edb->HasSelection();
587         }
588     }
589     event.Enable(enable);
590 }
591 
OnSettingsChanged(CodeBlocksEvent & event)592 void NassiPlugin::OnSettingsChanged(CodeBlocksEvent &event)
593 {
594     if (event.GetInt()==cbSettingsType::Environment)
595     {
596         for (int i = 0 ; i < Manager::Get()->GetEditorManager()->GetEditorsCount() ; i++)
597         {
598             EditorBase *ed = Manager::Get()->GetEditorManager()->GetEditor(i);
599             if (NassiEditorPanel::IsNassiEditor(ed))
600             {
601                 NassiEditorPanel *ned = static_cast<NassiEditorPanel*>(ed);
602                 ned->UpdateColors();
603             }
604         }
605     }
606 }
607