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