1 ///////////////////////////////////////////////////////////////////////////////
2 // Name:        stemenum.cpp
3 // Purpose:     wxSTEditorMenuManager
4 // Author:      John Labenski, parts taken from wxGuide by Otto Wyss
5 // Modified by:
6 // Created:     11/05/2002
7 // RCS-ID:
8 // Copyright:   (c) John Labenski, Otto Wyss
9 // Licence:     wxWidgets licence
10 ///////////////////////////////////////////////////////////////////////////////
11 
12 #include "precomp.h"
13 
14 #include <wx/srchctrl.h>
15 
16 #include "wx/stedit/stemenum.h"
17 #include "wx/stedit/stedit.h"
18 #include "wx/stedit/steart.h"
19 #include "wxext.h"
20 
21 //-----------------------------------------------------------------------------
22 // wxSTEditorMenuManager - a holding place for menu generating code
23 //-----------------------------------------------------------------------------
24 
~wxSTEditorMenuManager()25 wxSTEditorMenuManager::~wxSTEditorMenuManager()
26 {
27     delete m_accelEntryArray;
28 }
29 
Init()30 void wxSTEditorMenuManager::Init()
31 {
32     m_enabledEditorItems = true;
33     m_menuOptionTypes = 0;
34     m_menuItemTypes.Add(0, STE_MENU_HELP_MENU+1);
35     m_toolBarToolTypes = 0;
36 
37     m_accels_dirty = true;
38     m_accelEntryArray = new wxArrayAcceleratorEntry();
39 }
40 
InitAcceleratorArray() const41 void wxSTEditorMenuManager::InitAcceleratorArray() const
42 {
43     // No need to recreate if nothing has changed.
44     if (!m_accels_dirty) return;
45 
46     // After running this function, they're all created.
47     m_accels_dirty = false;
48 
49     if (m_accelEntryArray->GetCount() > 0)
50         m_accelEntryArray->Clear();
51 
52     // File menu items --------------------------------------------------------
53     if (GetMenuItemTypes(STE_MENU_FILE_MENU))
54     {
55         m_accelEntryArray->Add(wxAcceleratorHelper::GetStockAccelerator(wxID_NEW));
56         m_accelEntryArray->Add(wxAcceleratorHelper::GetStockAccelerator(wxID_OPEN));
57         m_accelEntryArray->Add(wxAcceleratorHelper::GetStockAccelerator(wxID_SAVE));
58         m_accelEntryArray->Add(wxAcceleratorHelper::GetStockAccelerator(wxID_SAVEAS));
59         m_accelEntryArray->Add(wxAcceleratorHelper::GetStockAccelerator(wxID_PRINT));
60         m_accelEntryArray->Add(wxAcceleratorHelper::GetStockAccelerator(wxID_PREVIEW));
61         m_accelEntryArray->Add(wxAcceleratorHelper::GetStockAccelerator(wxID_EXIT));
62         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_ALT,                  WXK_RETURN, ID_STE_PROPERTIES));
63         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_CTRL,                 'W',        ID_STN_CLOSE_PAGE));
64         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_CTRL | wxACCEL_SHIFT, 'W',        ID_STN_CLOSE_ALL));
65         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_CTRL | wxACCEL_SHIFT, 'A',        ID_STN_SAVE_ALL));
66     }
67 
68     // Edit menu items --------------------------------------------------------
69     if (GetMenuItemTypes(STE_MENU_EDIT_MENU))
70     {
71         m_accelEntryArray->Add(wxAcceleratorHelper::GetStockAccelerator(wxID_UNDO));
72         m_accelEntryArray->Add(wxAcceleratorHelper::GetStockAccelerator(wxID_REDO));
73         m_accelEntryArray->Add(wxAcceleratorHelper::GetStockAccelerator(wxID_CUT));
74         m_accelEntryArray->Add(wxAcceleratorHelper::GetStockAccelerator(wxID_COPY));
75         m_accelEntryArray->Add(wxAcceleratorHelper::GetStockAccelerator(wxID_PASTE));
76         m_accelEntryArray->Add(wxAcceleratorHelper::GetStockAccelerator(wxID_SELECTALL));
77         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_CTRL | wxACCEL_SHIFT, 'V', ID_STE_PASTE_NEW));
78         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_CTRL | wxACCEL_ALT,   'V', ID_STE_PASTE_RECT));
79         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_CTRL,                 'L', ID_STE_LINE_CUT));
80         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_CTRL | wxACCEL_SHIFT, 'T', ID_STE_LINE_COPY));
81         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_CTRL | wxACCEL_SHIFT, 'C', ID_STE_COPYPATH));
82         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_CTRL | wxACCEL_SHIFT, 'L', ID_STE_LINE_DELETE));
83         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_CTRL,                 ' ', ID_STE_COMPLETEWORD));
84         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_CTRL,                 'T', ID_STE_LINE_TRANSPOSE));
85         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_CTRL,                 'D', ID_STE_LINE_DUPLICATE));
86       //m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_CTRL,                 'R', ID_STE_PREF_SELECTION_MODE));
87     #ifdef __UNIX__
88         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_CTRL | wxACCEL_SHIFT, 'C', ID_STE_COPY_PRIMARY));
89     #endif // __UNIX__
90     }
91 
92     // View menu items  -------------------------------------------------------
93     if (GetMenuItemTypes(STE_MENU_VIEW_MENU))
94     {
95         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_NORMAL, WXK_FULLSCREEN, ID_STE_SHOW_FULLSCREEN));
96         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_CTRL,   WXK_F10,        ID_STE_VIEW_NONPRINT));
97     }
98 
99     // Search menu items  -------------------------------------------------------
100     if (GetMenuItemTypes(STE_MENU_SEARCH_MENU))
101     {
102         m_accelEntryArray->Add(wxAcceleratorHelper::GetStockAccelerator(wxID_FIND));
103         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_CTRL,   'H',    wxID_REPLACE));
104         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_NORMAL, WXK_F3, ID_STE_FIND_NEXT));
105         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_SHIFT , WXK_F3, ID_STE_FIND_PREV));
106         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_NORMAL, WXK_F2, ID_STE_FIND_DOWN));
107         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_CTRL,   'G',    ID_STE_GOTO_LINE));
108     }
109 
110     // Insert menu items  -------------------------------------------------------
111     if (GetMenuItemTypes(STE_MENU_INSERT_MENU))
112     {
113         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_CTRL, 'I', ID_STE_INSERT_TEXT));
114     }
115 
116     // Tools menu items  -------------------------------------------------------
117     if (GetMenuItemTypes(STE_MENU_TOOLS_MENU))
118     {
119         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_CTRL | wxACCEL_SHIFT, 'U', ID_STE_UPPERCASE));
120         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_CTRL,                 'U', ID_STE_LOWERCASE));
121         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_CTRL,                 'J', ID_STE_LINES_JOIN));
122         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_CTRL,                 'K', ID_STE_LINES_SPLIT));
123         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_CTRL | wxACCEL_ALT,   'E', ID_STE_TRAILING_WHITESPACE));
124         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_CTRL,                 'E', ID_STE_REMOVE_CHARSAROUND));
125     }
126 
127     // Bookmark menu items  ---------------------------------------------------
128     if (GetMenuItemTypes(STE_MENU_BOOKMARK_MENU))
129     {
130         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_NORMAL, WXK_F4, ID_STE_BOOKMARK_TOGGLE));
131         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_SHIFT,  WXK_F5, ID_STE_BOOKMARK_FIRST));
132         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_NORMAL, WXK_F5, ID_STE_BOOKMARK_PREVIOUS));
133         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_NORMAL, WXK_F6, ID_STE_BOOKMARK_NEXT));
134         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_SHIFT,  WXK_F6, ID_STE_BOOKMARK_LAST));
135         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_SHIFT,  WXK_F4, ID_STE_BOOKMARK_CLEAR));
136     }
137 
138     // Preference menu items  -------------------------------------------------------
139     if (GetMenuItemTypes(STE_MENU_PREFS_MENU))
140     {
141         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_CTRL, WXK_F9, ID_STE_PREFERENCES));
142     }
143 
144     // Window menu items  -----------------------------------------------------
145     if (GetMenuItemTypes(STE_MENU_WINDOW_MENU))
146     {
147         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_CTRL | wxACCEL_SHIFT, 'L',    ID_STS_SPLIT_HORIZ));
148         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_CTRL | wxACCEL_SHIFT, 'T',    ID_STS_SPLIT_VERT));
149         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_SHIFT,                WXK_F8, ID_STN_WIN_PREVIOUS));
150         m_accelEntryArray->Add(wxAcceleratorEntry(wxACCEL_NORMAL,               WXK_F8, ID_STN_WIN_NEXT));
151     }
152 
153     // Help menu items  -----------------------------------------------------
154     if (GetMenuItemTypes(STE_MENU_HELP_MENU))
155     {
156     }
157 }
158 
CreateForSinglePage()159 void wxSTEditorMenuManager::CreateForSinglePage()
160 {
161     m_menuOptionTypes  = 0;
162     m_menuItemTypes[STE_MENU_FILE_MENU]     = STE_MENU_FILE_DEFAULT;
163     m_menuItemTypes[STE_MENU_EDIT_MENU]     = STE_MENU_EDIT_DEFAULT;
164     m_menuItemTypes[STE_MENU_SEARCH_MENU]   = STE_MENU_SEARCH_DEFAULT;
165     m_menuItemTypes[STE_MENU_TOOLS_MENU]    = STE_MENU_TOOLS_DEFAULT;
166     m_menuItemTypes[STE_MENU_VIEW_MENU]     = STE_MENU_VIEW_DEFAULT;
167     m_menuItemTypes[STE_MENU_BOOKMARK_MENU] = STE_MENU_BOOKMARK_DEFAULT;
168     m_menuItemTypes[STE_MENU_PREFS_MENU]    = STE_MENU_PREFS_DEFAULT;
169     m_menuItemTypes[STE_MENU_WINDOW_MENU]   = STE_MENU_WINDOW_DEFAULT;
170     m_menuItemTypes[STE_MENU_HELP_MENU]     = STE_MENU_HELP_DEFAULT;
171     m_toolBarToolTypes = STE_TOOLBAR_TOOLS;
172 }
173 
CreateForNotebook()174 void wxSTEditorMenuManager::CreateForNotebook()
175 {
176     m_menuOptionTypes  = STE_MENU_NOTEBOOK;
177     m_menuItemTypes[STE_MENU_FILE_MENU]     = STE_MENU_FILE_DEFAULT;
178     m_menuItemTypes[STE_MENU_EDIT_MENU]     = STE_MENU_EDIT_DEFAULT;
179     m_menuItemTypes[STE_MENU_SEARCH_MENU]   = STE_MENU_SEARCH_DEFAULT;
180     m_menuItemTypes[STE_MENU_TOOLS_MENU]    = STE_MENU_TOOLS_DEFAULT;
181     m_menuItemTypes[STE_MENU_VIEW_MENU]     = STE_MENU_VIEW_DEFAULT;
182     m_menuItemTypes[STE_MENU_BOOKMARK_MENU] = STE_MENU_BOOKMARK_DEFAULT;
183     m_menuItemTypes[STE_MENU_PREFS_MENU]    = STE_MENU_PREFS_DEFAULT;
184     m_menuItemTypes[STE_MENU_WINDOW_MENU]   = STE_MENU_WINDOW_DEFAULT|STE_MENU_WINDOW_FILECHOOSER|STE_MENU_WINDOW_PREVNEXT|STE_MENU_WINDOW_WINDOWS;
185     m_menuItemTypes[STE_MENU_HELP_MENU]     = STE_MENU_HELP_DEFAULT;
186     m_toolBarToolTypes = STE_TOOLBAR_TOOLS;
187 }
188 
CreateEditorPopupMenu(wxMenu * menu_) const189 wxMenu *wxSTEditorMenuManager::CreateEditorPopupMenu(wxMenu *menu_) const
190 {
191     wxMenu *menu = menu_;
192     if (!menu) menu = new wxMenu;
193 
194     bool add_sep = false;
195 
196     wxMenu *fileMenu     = GetMenuItemTypes(STE_MENU_FILE_MENU)     != 0 ? CreateFileMenu()     : NULL;
197     wxMenu *editMenu     = GetMenuItemTypes(STE_MENU_EDIT_MENU)     != 0 ? CreateEditMenu()     : NULL;
198     wxMenu *searchMenu   = GetMenuItemTypes(STE_MENU_SEARCH_MENU)   != 0 ? CreateSearchMenu()   : NULL;
199     wxMenu *toolsMenu    = GetMenuItemTypes(STE_MENU_TOOLS_MENU)    != 0 ? CreateToolsMenu()    : NULL;
200     wxMenu *insertMenu   = GetMenuItemTypes(STE_MENU_INSERT_MENU)   != 0 ? CreateInsertMenu()   : NULL;
201     wxMenu *viewMenu     = GetMenuItemTypes(STE_MENU_VIEW_MENU)     != 0 ? CreateViewMenu()     : NULL;
202     wxMenu *bookmarkMenu = GetMenuItemTypes(STE_MENU_BOOKMARK_MENU) != 0 ? CreateBookmarkMenu() : NULL;
203     wxMenu *prefMenu     = GetMenuItemTypes(STE_MENU_PREFS_MENU)    != 0 ? CreatePreferenceMenu() : NULL;
204     wxMenu *windowMenu   = GetMenuItemTypes(STE_MENU_WINDOW_MENU)   != 0 ? CreateWindowMenu()   : NULL;
205     wxMenu *helpMenu     = GetMenuItemTypes(STE_MENU_HELP_MENU)     != 0 ? CreateHelpMenu()     : NULL;
206 
207     if (fileMenu)
208     {
209         menu->Append(ID_STE_MENU_FILE, wxGetStockLabel(wxID_FILE), fileMenu);
210         add_sep = true;
211     }
212 
213     if (editMenu)
214     {
215         if (add_sep) menu->AppendSeparator();
216         menu->Append(ID_STE_MENU_EDIT, wxGetStockLabel(wxID_EDIT), editMenu);
217         add_sep = true;
218     }
219 
220     if (viewMenu)
221     {
222         if (add_sep) menu->AppendSeparator();
223         menu->Append(ID_STE_MENU_VIEW, _("&View"), viewMenu);
224         add_sep = true;
225     }
226 
227     if (searchMenu)
228     {
229         if (add_sep) menu->AppendSeparator();
230         menu->Append(ID_STE_MENU_SEARCH, _("&Search"), searchMenu);
231         add_sep = true;
232     }
233 
234     if (toolsMenu)
235     {
236         if (add_sep) menu->AppendSeparator();
237         menu->Append(ID_STE_MENU_TOOLS, _("&Tools"), toolsMenu);
238         add_sep = true;
239     }
240 
241     if (insertMenu)
242     {
243         if (add_sep) menu->AppendSeparator();
244         menu->Append(ID_STE_MENU_INSERT, _("&Insert"), insertMenu);
245         add_sep = true;
246     }
247 
248     if (bookmarkMenu)
249     {
250         if (add_sep) menu->AppendSeparator();
251         menu->Append(ID_STE_MENU_BOOKMARK, _("&Bookmarks"), bookmarkMenu);
252         add_sep = true;
253     }
254 
255     if (prefMenu)
256     {
257         if (add_sep) menu->AppendSeparator();
258         menu->Append(ID_STE_MENU_PREF, wxGetStockLabel(wxID_PREFERENCES), prefMenu);
259         add_sep = true;
260     }
261 
262     if (windowMenu)
263     {
264         if (add_sep) menu->AppendSeparator();
265         menu->Append(ID_STE_MENU_PREF, _("&Window"), windowMenu);
266     }
267 
268     if (helpMenu)
269     {
270         if (add_sep) menu->AppendSeparator();
271         menu->Append(ID_STE_MENU_HELP, wxGetStockLabel(wxID_HELP), helpMenu);
272     }
273 
274     if (!menu_ && menu && (menu->GetMenuItemCount() == 0))
275     {
276         wxDELETE(menu);
277     }
278 
279     return menu;
280 }
281 
CreateSplitterPopupMenu(wxMenu * menu_) const282 wxMenu* wxSTEditorMenuManager::CreateSplitterPopupMenu(wxMenu *menu_) const
283 {
284     wxMenu *menu = menu_;
285     if (!menu) menu = new wxMenu;
286 
287     menu->AppendRadioItem(ID_STS_UNSPLIT,     _("&Unsplit editor"),            _("Unsplit the editor"));
288     menu->AppendRadioItem(ID_STS_SPLIT_HORIZ, _("Split editor &horizontally"), _("Split editor horizontally"));
289     menu->AppendRadioItem(ID_STS_SPLIT_VERT,  _("Split editor &vertically"),   _("Split editor vertically"));
290 
291     return menu;
292 }
CreateNotebookPopupMenu(wxMenu * menu_) const293 wxMenu* wxSTEditorMenuManager::CreateNotebookPopupMenu(wxMenu *menu_) const
294 {
295     wxMenu *menu = menu_;
296     if (!menu) menu = new wxMenu;
297 
298     menu->Append(wxID_NEW,         _("&Add empty page"));
299     menu->Append(wxID_OPEN,        _("&Open file(s)..."));
300     menu->Append(ID_STN_SAVE_ALL,  _("&Save all files"));
301 
302     menu->AppendSeparator();
303     // These are empty and are filled by wxSTEditorNotebook::UpdateMenuItems()
304     wxMenu *gotoMenu  = new wxMenu;
305     wxMenu *closeMenu = new wxMenu;
306 
307     menu->Append(ID_STN_WIN_PREVIOUS, _("Previous page"));
308     menu->Append(ID_STN_WIN_NEXT,     _("Next page"));
309 
310     menu->Append(ID_STN_MENU_GOTO,    _("Goto page"), gotoMenu);
311     menu->AppendSeparator();
312     menu->Append(ID_STN_CLOSE_PAGE,       _("Close current page"));
313     menu->Append(ID_STN_CLOSE_ALL,        _("Close all pages..."));
314     menu->Append(ID_STN_CLOSE_ALL_OTHERS, _("Close all other pages"));
315     menu->Append(ID_STN_MENU_CLOSE,       _("Close page"), closeMenu);
316     menu->AppendSeparator();
317     menu->Append(ID_STN_WINDOWS,          _("&Windows..."), _("Manage opened windows"));
318 
319     return menu;
320 }
321 
CreateMenuBar(wxMenuBar * menuBar,bool for_frame) const322 bool wxSTEditorMenuManager::CreateMenuBar(wxMenuBar *menuBar, bool for_frame) const
323 {
324     wxCHECK_MSG(menuBar, false, wxT("Invalid wxMenuBar"));
325     size_t menu_count = menuBar->GetMenuCount();
326 
327     // Note! here's where we specify that we want menu items for the frame
328     int was_set_frame = HasMenuOptionType(STE_MENU_FRAME);
329     if (!was_set_frame && for_frame)
330         ((wxSTEditorMenuManager*)this)->SetMenuOptionType(STE_MENU_FRAME, true);
331 
332     wxMenu *fileMenu     = GetMenuItemTypes(STE_MENU_FILE_MENU)     != 0 ? CreateFileMenu()     : NULL;
333     wxMenu *editMenu     = GetMenuItemTypes(STE_MENU_EDIT_MENU)     != 0 ? CreateEditMenu()     : NULL;
334     wxMenu *searchMenu   = GetMenuItemTypes(STE_MENU_SEARCH_MENU)   != 0 ? CreateSearchMenu()   : NULL;
335     wxMenu *toolsMenu    = GetMenuItemTypes(STE_MENU_TOOLS_MENU)    != 0 ? CreateToolsMenu()    : NULL;
336     wxMenu *insertMenu   = GetMenuItemTypes(STE_MENU_INSERT_MENU)   != 0 ? CreateInsertMenu()   : NULL;
337     wxMenu *viewMenu     = GetMenuItemTypes(STE_MENU_VIEW_MENU)     != 0 ? CreateViewMenu()     : NULL;
338     wxMenu *bookmarkMenu = GetMenuItemTypes(STE_MENU_BOOKMARK_MENU) != 0 ? CreateBookmarkMenu() : NULL;
339     wxMenu *prefMenu     = GetMenuItemTypes(STE_MENU_PREFS_MENU)    != 0 ? CreatePreferenceMenu() : NULL;
340     wxMenu *windowMenu   = GetMenuItemTypes(STE_MENU_WINDOW_MENU)   != 0 ? CreateWindowMenu()   : NULL;
341     wxMenu *helpMenu     = GetMenuItemTypes(STE_MENU_HELP_MENU)     != 0 ? CreateHelpMenu()     : NULL;
342 
343 
344     if (fileMenu)     menuBar->Append(fileMenu,     wxGetStockLabel(wxID_FILE));
345     if (editMenu)     menuBar->Append(editMenu,     wxGetStockLabel(wxID_EDIT));
346     if (viewMenu)     menuBar->Append(viewMenu,     _("&View"));
347     if (searchMenu)   menuBar->Append(searchMenu,   _("&Search"));
348     if (toolsMenu)    menuBar->Append(toolsMenu,    _("&Tools"));
349     if (insertMenu)   menuBar->Append(insertMenu,   _("&Insert"));
350     if (bookmarkMenu) menuBar->Append(bookmarkMenu, _("&Bookmarks"));
351     if (prefMenu)     menuBar->Append(prefMenu,     wxGetStockLabel(wxID_PREFERENCES));
352     if (windowMenu)   menuBar->Append(windowMenu,   _("&Window"));
353     if (helpMenu)     menuBar->Append(helpMenu,     wxGetStockLabel(wxID_HELP));
354 
355     // reset the frame bit if it wasn't set
356     if (!was_set_frame)
357         ((wxSTEditorMenuManager*)this)->SetMenuOptionType(STE_MENU_FRAME, false);
358 
359     return menuBar->GetMenuCount() > menu_count;
360 }
361 
wxToolBarTool_MakeShortHelp(const wxArrayAcceleratorEntry & accel,int id)362 static wxString wxToolBarTool_MakeShortHelp(const wxArrayAcceleratorEntry& accel, int id)
363 {
364     return wxToolBarTool_MakeShortHelp(wxGetStockLabelEx(id, wxSTOCK_PLAINTEXT), accel, id);
365 }
366 
CreateToolBar(wxToolBar * tb) const367 bool wxSTEditorMenuManager::CreateToolBar(wxToolBar *tb) const
368 {
369     wxCHECK_MSG(tb, false, wxT("Invalid toolbar"));
370 
371     InitAcceleratorArray(); // ALWAYS call this before accessing m_accelEntryArray
372 
373     size_t tools_count = tb->GetToolsCount();
374 
375     if (HasToolbarToolType(STE_TOOLBAR_FILE_NEW))
376     {
377         tb->AddTool(wxID_NEW, wxEmptyString, STE_ARTTOOL(wxART_STEDIT_NEW), wxNullBitmap, wxITEM_NORMAL, ::wxToolBarTool_MakeShortHelp(*m_accelEntryArray, wxID_NEW), _("Clear editor for new file"));
378     }
379     if (HasToolbarToolType(STE_TOOLBAR_FILE_OPEN))
380     {
381         tb->AddTool(wxID_OPEN, wxEmptyString, STE_ARTTOOL(wxART_STEDIT_OPEN), wxNullBitmap, wxITEM_NORMAL, ::wxToolBarTool_MakeShortHelp(*m_accelEntryArray, wxID_OPEN), _("Open a file to edit"));
382     }
383     if (HasToolbarToolType(STE_TOOLBAR_FILE_SAVE))
384     {
385         tb->AddTool(wxID_SAVE,   wxEmptyString, STE_ARTTOOL(wxART_STEDIT_SAVE  ), wxNullBitmap, wxITEM_NORMAL, ::wxToolBarTool_MakeShortHelp(*m_accelEntryArray, wxID_SAVE  ), _("Save current file"));
386         tb->AddTool(wxID_SAVEAS, wxEmptyString, STE_ARTTOOL(wxART_STEDIT_SAVEAS), wxNullBitmap, wxITEM_NORMAL, ::wxToolBarTool_MakeShortHelp(*m_accelEntryArray, wxID_SAVEAS), _("Save to a specific filename"));
387         tb->EnableTool(wxID_SAVE, false);
388 
389         if (HasMenuOptionType(STE_MENU_NOTEBOOK))
390         {
391             tb->AddTool(ID_STN_SAVE_ALL, wxEmptyString, STE_ARTTOOL(wxART_STEDIT_SAVEALL), wxNullBitmap, wxITEM_NORMAL, ::wxToolBarTool_MakeShortHelp(_("Save all files"), *m_accelEntryArray, ID_STN_SAVE_ALL), _("Save all open files"));
392             tb->EnableTool(ID_STN_SAVE_ALL, false);
393         }
394     }
395     if (HasToolbarToolType(STE_TOOLBAR_PRINT))
396     {
397         if (tb->GetToolsCount()) tb->AddSeparator();
398         tb->AddTool(wxID_PRINT  , wxEmptyString, STE_ARTTOOL(wxART_STEDIT_PRINT)       , wxNullBitmap, wxITEM_NORMAL, ::wxToolBarTool_MakeShortHelp(*m_accelEntryArray, wxID_PRINT), wxGetStockHelpString(wxID_PRINT));
399         tb->AddTool(wxID_PREVIEW, wxEmptyString, STE_ARTTOOL(wxART_STEDIT_PRINTPREVIEW), wxNullBitmap, wxITEM_NORMAL, ::wxToolBarTool_MakeShortHelp(*m_accelEntryArray, wxID_PREVIEW), wxGetStockHelpString(wxID_PREVIEW));
400     }
401     if (HasToolbarToolType(STE_TOOLBAR_EDIT_CUTCOPYPASTE))
402     {
403         if (tb->GetToolsCount()) tb->AddSeparator();
404         tb->AddTool(wxID_CUT,    wxEmptyString, STE_ARTTOOL(wxART_STEDIT_CUT  ), wxNullBitmap, wxITEM_NORMAL, ::wxToolBarTool_MakeShortHelp(*m_accelEntryArray, wxID_CUT  ), _("Cut selected text"));
405         tb->AddTool(wxID_COPY,   wxEmptyString, STE_ARTTOOL(wxART_STEDIT_COPY ), wxNullBitmap, wxITEM_NORMAL, ::wxToolBarTool_MakeShortHelp(*m_accelEntryArray, wxID_COPY ), _("Copy selected text"));
406         tb->AddTool(wxID_PASTE,  wxEmptyString, STE_ARTTOOL(wxART_STEDIT_PASTE), wxNullBitmap, wxITEM_NORMAL, ::wxToolBarTool_MakeShortHelp(*m_accelEntryArray, wxID_PASTE), _("Paste text at cursor"));
407     }
408     if (HasToolbarToolType(STE_TOOLBAR_EDIT_UNDOREDO))
409     {
410         if (tb->GetToolsCount()) tb->AddSeparator();
411         tb->AddTool(wxID_UNDO, wxEmptyString, STE_ARTTOOL(wxART_STEDIT_UNDO), wxNullBitmap, wxITEM_NORMAL, ::wxToolBarTool_MakeShortHelp(*m_accelEntryArray, wxID_UNDO), _("Undo last editing"));
412         tb->AddTool(wxID_REDO, wxEmptyString, STE_ARTTOOL(wxART_STEDIT_REDO), wxNullBitmap, wxITEM_NORMAL, ::wxToolBarTool_MakeShortHelp(*m_accelEntryArray, wxID_REDO), _("Redo last undo"));
413     }
414     if (HasToolbarToolType(STE_TOOLBAR_EDIT_FINDREPLACE))
415     {
416         if (tb->GetToolsCount()) tb->AddSeparator();
417         //tb->AddTool(ID_STE_FIND_DOWN, _("Search direction"), STE_ARTTOOL(wxART_STEDIT_FINDDOWN), wxNullBitmap, wxITEM_CHECK, _("Search direction"), _("Search direction for next occurance in document"));
418         tb->AddTool(wxID_FIND       , wxEmptyString, STE_ARTTOOL(wxART_STEDIT_FIND    ), wxNullBitmap, wxITEM_NORMAL, ::wxToolBarTool_MakeShortHelp(*m_accelEntryArray, wxID_FIND), _("Find text in document..."));
419         tb->AddTool(ID_STE_FIND_NEXT, wxEmptyString, STE_ARTTOOL(wxART_STEDIT_FINDDOWN), wxNullBitmap, wxITEM_NORMAL, ::wxToolBarTool_MakeShortHelp(_("Find next"), *m_accelEntryArray, ID_STE_FIND_NEXT), _("Find next occurance in document"));
420         tb->AddTool(ID_STE_FIND_PREV, wxEmptyString, STE_ARTTOOL(wxART_STEDIT_FINDUP  ), wxNullBitmap, wxITEM_NORMAL, ::wxToolBarTool_MakeShortHelp(_("Find previous"), *m_accelEntryArray, ID_STE_FIND_PREV), _("Find previous occurance in document"));
421         tb->AddTool(wxID_REPLACE    , wxEmptyString, STE_ARTTOOL(wxART_STEDIT_REPLACE ), wxNullBitmap, wxITEM_NORMAL, ::wxToolBarTool_MakeShortHelp(*m_accelEntryArray, wxID_REPLACE), _("Replace text in document"));
422     }
423     if (HasToolbarToolType(STE_TOOLBAR_EDIT_SEARCH_CTRL))
424     {
425         if (tb->GetToolsCount()) tb->AddSeparator();
426         wxSearchCtrl *searchCtrl = new wxSearchCtrl(tb, ID_STE_TOOLBAR_SEARCHCTRL, wxT(""), wxDefaultPosition, wxSize(200, -1), wxTE_PROCESS_ENTER);
427         //searchCtrl->SetMenu(new wxMenu);
428         tb->AddControl(searchCtrl);
429     }
430     if (HasToolbarToolType(STE_TOOLBAR_BOOKMARK))
431     {
432         if (tb->GetToolsCount()) tb->AddSeparator();
433         tb->AddTool(ID_STE_BOOKMARK_TOGGLE,   wxEmptyString, STE_ARTTOOL(wxART_ADD_BOOKMARK), wxNullBitmap, wxITEM_NORMAL, ::wxToolBarTool_MakeShortHelp(_("Toggle bookmark"),   *m_accelEntryArray, ID_STE_BOOKMARK_TOGGLE),   _("Toggle a bookmark on cursor line"));
434         tb->AddTool(ID_STE_BOOKMARK_FIRST,    wxEmptyString, STE_ARTTOOL(wxART_GO_UP),        wxNullBitmap, wxITEM_NORMAL, ::wxToolBarTool_MakeShortHelp(_("First bookmark"),    *m_accelEntryArray, ID_STE_BOOKMARK_FIRST),    _("Goto first bookmark"));
435         tb->AddTool(ID_STE_BOOKMARK_PREVIOUS, wxEmptyString, STE_ARTTOOL(wxART_GO_BACK),      wxNullBitmap, wxITEM_NORMAL, ::wxToolBarTool_MakeShortHelp(_("Previous bookmark"), *m_accelEntryArray, ID_STE_BOOKMARK_PREVIOUS), _("Goto previous bookmark"));
436         tb->AddTool(ID_STE_BOOKMARK_NEXT,     wxEmptyString, STE_ARTTOOL(wxART_GO_FORWARD),   wxNullBitmap, wxITEM_NORMAL, ::wxToolBarTool_MakeShortHelp(_("Next bookmark"),     *m_accelEntryArray, ID_STE_BOOKMARK_NEXT),     _("Goto next bookmark"));
437         tb->AddTool(ID_STE_BOOKMARK_LAST,     wxEmptyString, STE_ARTTOOL(wxART_GO_DOWN),      wxNullBitmap, wxITEM_NORMAL, ::wxToolBarTool_MakeShortHelp(_("Last bookmark"),     *m_accelEntryArray, ID_STE_BOOKMARK_LAST),     _("Goto last bookmark"));
438         tb->AddTool(ID_STE_BOOKMARK_CLEAR,    wxEmptyString, STE_ARTTOOL(wxART_DEL_BOOKMARK), wxNullBitmap, wxITEM_NORMAL, ::wxToolBarTool_MakeShortHelp(_("Clear bookmarks"),   *m_accelEntryArray, ID_STE_BOOKMARK_CLEAR),    _("Clear all bookmarks"));
439     }
440     tb->Realize();
441 
442     return tb->GetToolsCount() > tools_count;
443 }
444 
CreateFileMenu(wxMenu * menu_) const445 wxMenu *wxSTEditorMenuManager::CreateFileMenu(wxMenu *menu_) const
446 {
447     wxMenu *menu = menu_ ? menu_ : new wxMenu();
448     bool add_sep = false;
449 
450     if (HasMenuItemType(STE_MENU_FILE_MENU, STE_MENU_FILE_NEW))
451     {
452         menu->Append(MenuItem(menu, wxID_NEW, wxGetStockLabel(wxID_NEW), _("Clear contents and start a new file"), wxITEM_NORMAL, STE_ARTMENU(wxART_STEDIT_NEW)));
453         add_sep = true;
454     }
455     if (HasMenuItemType(STE_MENU_FILE_MENU, STE_MENU_FILE_OPEN))
456     {
457         menu->Append(MenuItem(menu, wxID_OPEN, wxGetStockLabelEx(wxID_OPEN), _("Open file"), wxITEM_NORMAL, STE_ARTMENU(wxART_STEDIT_OPEN)));
458         add_sep = true;
459     }
460     if (HasMenuItemType(STE_MENU_FILE_MENU, STE_MENU_FILE_CLOSE) && HasMenuOptionType(STE_MENU_FRAME))
461     {
462         if (add_sep) menu->AppendSeparator();
463 
464         menu->Append(ID_STN_CLOSE_PAGE, _("&Close current page"), _("Close current page"));
465         if (HasMenuOptionType(STE_MENU_NOTEBOOK))
466         {
467             menu->Append(ID_STN_CLOSE_ALL,        _("Close all pages..."), _("Close all pages"));
468             menu->Append(ID_STN_CLOSE_ALL_OTHERS, _("Close all other pages"), _("Close all other pages"));
469         }
470 
471         add_sep = true;
472     }
473     if (HasMenuItemType(STE_MENU_FILE_MENU, STE_MENU_FILE_SAVE))
474     {
475         if (add_sep) menu->AppendSeparator();
476 
477         menu->Append(MenuItem(menu, wxID_SAVE, wxGetStockLabel(wxID_SAVE), _("Save current file"), wxITEM_NORMAL, STE_ARTMENU(wxART_STEDIT_SAVE)));
478         menu->Enable(wxID_SAVE, false);
479         menu->Append(MenuItem(menu, wxID_SAVEAS, wxGetStockLabelEx(wxID_SAVEAS), _("Save as file"), wxITEM_NORMAL, STE_ARTMENU(wxART_STEDIT_SAVEAS)));
480         if (HasMenuOptionType(STE_MENU_NOTEBOOK))
481         {
482             menu->Append(MenuItem(menu, ID_STN_SAVE_ALL, _("Save A&ll"), _("Save all files"), wxITEM_NORMAL, STE_ARTMENU(wxART_STEDIT_SAVEALL)));
483             menu->Enable(ID_STN_SAVE_ALL, false);
484         }
485         menu->Append(MenuItem(menu, wxID_REVERT, wxGetStockLabelEx(wxID_REVERT), _("Revert to saved version of the file"), wxITEM_NORMAL));
486         add_sep = true;
487     }
488     if (HasMenuItemType(STE_MENU_FILE_MENU, STE_MENU_FILE_EXPORT))
489     {
490         if (add_sep) menu->AppendSeparator();
491 
492         menu->Append(MenuItem(menu, ID_STE_EXPORT, _("E&xport..."), _("Export to file"), wxITEM_NORMAL));
493         add_sep = true;
494     }
495     if (HasMenuItemType(STE_MENU_FILE_MENU, STE_MENU_FILE_PROPERTY))
496     {
497         if (add_sep) menu->AppendSeparator();
498 
499         menu->Append(ID_STE_PROPERTIES, wxGetStockLabelEx(wxID_PROPERTIES), _("Show document properties dialog"));
500         add_sep = true;
501     }
502     if (HasMenuItemType(STE_MENU_FILE_MENU, STE_MENU_FILE_PRINT))
503     {
504         if (add_sep) menu->AppendSeparator();
505 
506         menu->Append(MenuItem(menu, wxID_PRINT,              wxGetStockLabelEx(wxID_PRINT  ), _("Print current document"), wxITEM_NORMAL, STE_ARTMENU(wxART_STEDIT_PRINT)));
507         menu->Append(MenuItem(menu, wxID_PREVIEW,            wxGetStockLabelEx(wxID_PREVIEW), _("Print preview of the current document"), wxITEM_NORMAL, STE_ARTMENU(wxART_STEDIT_PRINTPREVIEW)));
508    #ifdef __WXMSW__
509         // The wxID_PRINT_SETUP dialog is the same as the wxID_PRINT one, at least on Windows; confusing to the user
510    #else
511         menu->Append(MenuItem(menu, wxID_PRINT_SETUP,        _("Printer set&up..."), _("Setup the printer"), wxITEM_NORMAL, STE_ARTMENU(wxART_STEDIT_PRINTSETUP)));
512    #endif
513         menu->Append(MenuItem(menu, ID_STE_PRINT_PAGE_SETUP, _("Printer pa&ge setup..."), _("Setup the printout page"), wxITEM_NORMAL, STE_ARTMENU(wxART_STEDIT_PRINTPAGESETUP)));
514         menu->Append(MenuItem(menu, ID_STE_PRINT_OPTIONS,    _("Printer options..."), _("Set other printout options"), wxITEM_NORMAL, STE_ARTMENU(wxART_STEDIT_PRINTPREVIEW)));
515     }
516 
517     if (HasMenuOptionType(STE_MENU_FRAME))
518     {
519         if (add_sep) menu->AppendSeparator();
520         menu->Append(MenuItem(menu, wxID_EXIT, wxGetStockLabelEx(wxID_EXIT), _("Exit editor"), wxITEM_NORMAL, STE_ARTMENU(wxART_STEDIT_QUIT)));
521     }
522 
523     if (!menu_ && menu && (menu->GetMenuItemCount() == 0))
524     {
525         wxDELETE(menu);
526     }
527 
528     return menu;
529 }
530 
CreateEditMenu(wxMenu * menu_) const531 wxMenu *wxSTEditorMenuManager::CreateEditMenu(wxMenu *menu_) const
532 {
533     wxMenu *menu = menu_ ? menu_ : new wxMenu();
534     bool add_sep = false;
535 
536     if (HasMenuItemType(STE_MENU_EDIT_MENU, STE_MENU_EDIT_UNDOREDO) && !HasMenuOptionType(STE_MENU_READONLY))
537     {
538         if (add_sep) menu->AppendSeparator();
539 
540         menu->Append(MenuItem(menu, wxID_UNDO, wxGetStockLabel(wxID_UNDO), _("Undo last operation"), wxITEM_NORMAL, STE_ARTMENU(wxART_STEDIT_UNDO)));
541         menu->Append(MenuItem(menu, wxID_REDO, wxGetStockLabel(wxID_REDO), _("Redo last undo"), wxITEM_NORMAL, STE_ARTMENU(wxART_STEDIT_REDO)));
542         add_sep = true;
543     }
544     if (HasMenuItemType(STE_MENU_EDIT_MENU, STE_MENU_EDIT_CUTCOPYPASTE))
545     {
546         if (add_sep) menu->AppendSeparator();
547 
548         if (!HasMenuOptionType(STE_MENU_READONLY))
549             menu->Append(MenuItem(menu, wxID_CUT,  wxGetStockLabel(wxID_CUT), _("Cut selected text to clipboard"), wxITEM_NORMAL, STE_ARTMENU(wxART_STEDIT_CUT)));
550         menu->Append(MenuItem(menu, wxID_COPY,  wxGetStockLabel(wxID_COPY), _("Copy selected text to clipboard"), wxITEM_NORMAL, STE_ARTMENU(wxART_STEDIT_COPY)));
551         menu->Append(ID_STE_COPY_HTML, _("Copy as &HTML"), _("Copy selected text to clipboard with text markup"));
552 #ifdef __UNIX__
553         menu->Append(ID_STE_COPY_PRIMARY,  _("Copy primary"), _("Copy selected text to primary clipboard"));
554 #endif // __UNIX__
555         if (!HasMenuOptionType(STE_MENU_READONLY))
556         {
557             menu->Append(MenuItem(menu, wxID_PASTE, wxGetStockLabel(wxID_PASTE), _("Paste text from clipboard"), wxITEM_NORMAL, STE_ARTMENU(wxART_STEDIT_PASTE)));
558             menu->Append(ID_STE_PASTE_RECT, _("Paste &Rectangle"), _("Paste rectangular text from clipboard (select with Shift+Alt)"));
559         }
560 
561         if (HasMenuOptionType(STE_MENU_NOTEBOOK))
562         {
563             // FIXME - this is probably not needed, it's pretty easy to simply do new then paste
564             //menu->Append(ID_STE_PASTE_NEW, _("Paste as &New"), _("Paste text from clipboard into new notebook tab"));
565         }
566 
567         // FIXME - ID_STE_PREF_SELECTION_MODE remmed out since I can't make it work in GTK
568         //menu->AppendCheckItem(ID_STE_PREF_SELECTION_MODE, _("Rectan&gular Selection"), _("Rectangular selections for cut/copy/paste"));
569 
570         // WXK_DELETE - no accelerator to allow scintilla to handle it appropriately
571         menu->Append(MenuItem(menu, wxID_CLEAR, wxGetStockLabel(wxID_DELETE), _("Delete selection"), wxITEM_NORMAL, STE_ARTMENU(wxART_STEDIT_CLEAR)));
572 
573         add_sep = true;
574     }
575     if (add_sep) menu->AppendSeparator();
576     menu->Append(wxID_SELECTALL, wxGetStockLabelEx(wxID_SELECTALL), _("Selects entire document"));
577     add_sep = true;
578     if (HasMenuItemType(STE_MENU_EDIT_MENU, STE_MENU_EDIT_LINE))
579     {
580         if (add_sep) menu->AppendSeparator();
581 
582         wxMenu *m = new wxMenu();
583 
584         // FIXME - these aren't Ctrl-L since the stc handles the keys already (works everywhere?)
585         if (!HasMenuOptionType(STE_MENU_READONLY))
586             m->Append(ID_STE_LINE_CUT,   _("Line Cu&t"), _("Cut current line to clipboard"));
587 
588         m->Append(ID_STE_LINE_COPY,  _("Line &Copy"), _("Copy current line to clipboard"));
589 
590         if (!HasMenuOptionType(STE_MENU_READONLY))
591         {
592             m->Append(ID_STE_LINE_DELETE,    _("Line &Delete"),    _("Delete current line"));
593             m->Append(ID_STE_LINE_TRANSPOSE, _("Line &Transpose"), _("Transpose current line upwards"));
594             m->Append(ID_STE_LINE_DUPLICATE, _("Line D&uplicate"), _("Duplicate current line"));
595         }
596 
597         menu->Append(ID_STE_MENU_LINE, _("L&ine Editing"), m);
598         add_sep = true;
599     }
600     if (HasMenuItemType(STE_MENU_EDIT_MENU, STE_MENU_EDIT_READONLY) && !HasMenuOptionType(STE_MENU_READONLY))
601     {
602         if (add_sep) menu->AppendSeparator();
603 
604         menu->AppendCheckItem(ID_STE_READONLY, _("Read only"), _("Make document read only"));
605         add_sep = true;
606     }
607     if (HasMenuItemType(STE_MENU_EDIT_MENU, STE_MENU_EDIT_COMPLETEWORD) && !HasMenuOptionType(STE_MENU_READONLY))
608     {
609         if (add_sep) menu->AppendSeparator();
610 
611         menu->Append(ID_STE_COMPLETEWORD, _("Complete w&ord"), _("Complete word at cursor"));
612         add_sep = true;
613     }
614 
615     if (HasMenuItemType(STE_MENU_EDIT_MENU, STE_MENU_EDIT_COPYPATH))
616     {
617         if (add_sep) menu->AppendSeparator();
618 
619         menu->Append(ID_STE_COPYPATH, _("Copy &path"), _("Copy full path to clipboard"));
620         add_sep = true;
621     }
622 
623     if ( (menu_ == NULL) && menu && (menu->GetMenuItemCount() == 0))
624     {
625         wxDELETE(menu);
626     }
627 
628     return menu;
629 }
630 
CreateSearchMenu(wxMenu * menu_) const631 wxMenu *wxSTEditorMenuManager::CreateSearchMenu(wxMenu *menu_) const
632 {
633     wxMenu *menu = menu_ ? menu_ : new wxMenu();
634     bool add_sep = false;
635 
636     if (HasMenuItemType(STE_MENU_SEARCH_MENU, STE_MENU_SEARCH_FINDREPLACE))
637     {
638         if (add_sep) menu->AppendSeparator();
639 
640         menu->Append(MenuItem(menu, wxID_FIND, wxGetStockLabelEx(wxID_FIND), _("Find text"), wxITEM_NORMAL, STE_ARTMENU(wxART_STEDIT_FIND)));
641         menu->Append(MenuItem(menu, ID_STE_FIND_NEXT, _("Find &Next"),      _("Find next occurance"), wxITEM_NORMAL, STE_ARTMENU(wxART_STEDIT_FINDNEXT)));
642         menu->Append(MenuItem(menu, ID_STE_FIND_PREV, _("Find &Previous"),  _("Find previous occurance"), wxITEM_NORMAL, STE_ARTMENU(wxART_STEDIT_FINDUP)));
643         menu->AppendCheckItem(ID_STE_FIND_DOWN,       _("Search For&ward"), _("Search forward/reverse in document"));
644         if (!HasMenuOptionType(STE_MENU_READONLY))
645             menu->Append(MenuItem(menu, wxID_REPLACE, wxGetStockLabelEx(wxID_REPLACE), _("Replace text"), wxITEM_NORMAL, STE_ARTMENU(wxART_STEDIT_REPLACE)));
646         add_sep = true;
647     }
648     if (HasMenuItemType(STE_MENU_SEARCH_MENU, STE_MENU_SEARCH_GOTOLINE))
649     {
650         if (add_sep) menu->AppendSeparator();
651 
652         menu->Append(ID_STE_GOTO_LINE, _("&Go to Line..."), _("Goto line number"));
653         add_sep = true;
654     }
655 
656     if ((menu_ == NULL) && menu && (menu->GetMenuItemCount() == 0))
657     {
658         wxDELETE(menu);
659     }
660 
661     return menu;
662 }
663 
CreateToolsMenu(wxMenu * menu_) const664 wxMenu *wxSTEditorMenuManager::CreateToolsMenu(wxMenu *menu_) const
665 {
666     // all of these modify the document
667     if (HasMenuOptionType(STE_MENU_READONLY))
668         return menu_;
669 
670     wxMenu *menu = menu_ ? menu_ : new wxMenu();
671     bool add_sep = false;
672 
673     if (HasMenuItemType(STE_MENU_TOOLS_MENU, STE_MENU_TOOLS_CASE))
674     {
675         if (add_sep) menu->AppendSeparator();
676 
677         menu->Append(ID_STE_UPPERCASE, _("Selection &uppercase"), _("Convert the selected text to uppercase"));
678         menu->Append(ID_STE_LOWERCASE, _("Selection &lowercase"), _("Convert the selected text to lowercase"));
679         add_sep = true;
680     }
681     if (HasMenuItemType(STE_MENU_TOOLS_MENU, STE_MENU_TOOLS_INDENT))
682     {
683         if (add_sep) menu->AppendSeparator();
684 
685         menu->Append(ID_STE_INCREASE_INDENT, _("&Increase indent"), _("Increase indent of selected text or current line"));
686         menu->Append(ID_STE_DECREASE_INDENT, _("&Decrease indent"), _("Decrease indent of selected text or current line"));
687         add_sep = true;
688     }
689     if (HasMenuItemType(STE_MENU_TOOLS_MENU, STE_MENU_TOOLS_JOINSPLIT))
690     {
691         if (add_sep) menu->AppendSeparator();
692 
693         menu->Append(ID_STE_LINES_JOIN,  _("&Join selected lines"),  _("Join selected lines together"));
694         menu->Append(ID_STE_LINES_SPLIT, _("&Split selected lines"), _("Split selected lines to edge marker column"));
695         add_sep = true;
696     }
697     if (HasMenuItemType(STE_MENU_TOOLS_MENU, STE_MENU_TOOLS_TABS_SP))
698     {
699         if (add_sep) menu->AppendSeparator();
700 
701         menu->Append(ID_STE_TABS_TO_SPACES, _("Convert &tabs to spaces"), _("Convert tabs to spaces in selection or current line"));
702         menu->Append(ID_STE_SPACES_TO_TABS, _("Convert s&paces to tabs"), _("Convert spaces to tabs in selection or current line"));
703         add_sep = true;
704     }
705     if (HasMenuItemType(STE_MENU_TOOLS_MENU, STE_MENU_TOOLS_EOL))
706     {
707         if (add_sep) menu->AppendSeparator();
708 
709         menu->Append(ID_STE_CONVERT_EOL, _("Convert &EOL characters..."), _("Convert all end of line characters in doc"));
710         add_sep = true;
711     }
712     if (HasMenuItemType(STE_MENU_TOOLS_MENU, STE_MENU_TOOLS_WHITE))
713     {
714         if (add_sep) menu->AppendSeparator();
715 
716         menu->Append(ID_STE_TRAILING_WHITESPACE, _("Remove trailing &whitespace"),  _("Remove whitespace at the ends of lines"));
717         menu->Append(ID_STE_REMOVE_CHARSAROUND,  _("Remove w&hitespace at cursor"), _("Remove whitespace before and after cursor"));
718         add_sep = true;
719     }
720     if (HasMenuItemType(STE_MENU_TOOLS_MENU, STE_MENU_TOOLS_COLUMNIZE))
721     {
722         if (add_sep) menu->AppendSeparator();
723 
724         menu->Append(ID_STE_COLUMNIZE, _("&Columnize..."), _("Reformat selected lines in columns..."));
725         add_sep = true;
726     }
727 
728     if (!menu_ && menu && (menu->GetMenuItemCount() == 0))
729     {
730         wxDELETE(menu);
731     }
732 
733     return menu;
734 }
735 
CreateInsertMenu(wxMenu * menu_) const736 wxMenu *wxSTEditorMenuManager::CreateInsertMenu(wxMenu *menu_) const
737 {
738     // all of these modify the document
739     if (HasMenuOptionType(STE_MENU_READONLY))
740         return menu_;
741 
742     wxMenu *menu = menu_ ? menu_ : new wxMenu();
743 
744     if (HasMenuItemType(STE_MENU_INSERT_MENU, STE_MENU_INSERT_TEXT))
745     {
746         menu->Append(ID_STE_INSERT_TEXT, _("I&nsert text..."), _("Prepend, Append, or insert text at column..."));
747     }
748 
749     if (HasMenuItemType(STE_MENU_INSERT_MENU, STE_MENU_INSERT_DATETIME))
750     {
751         menu->Append(ID_STE_INSERT_DATETIME, _("Insert &date and time"), _("Insert date and time"));
752     }
753 
754     if (!menu_ && menu && (menu->GetMenuItemCount() == 0))
755     {
756         wxDELETE(menu);
757     }
758 
759     return menu;
760 }
761 
CreateViewMenu(wxMenu * menu_) const762 wxMenu *wxSTEditorMenuManager::CreateViewMenu(wxMenu *menu_) const
763 {
764     wxMenu *menu = menu_ ? menu_ : new wxMenu();
765     bool add_sep = false;
766     wxMenu* submenu;
767 
768     if (HasMenuItemType(STE_MENU_VIEW_MENU, STE_MENU_VIEW_WRAP))
769     {
770         menu->AppendCheckItem(ID_STE_PREF_WRAP_MODE, _("&Wrap text to window"), _("Wrap the text to fit inside window"));
771         add_sep = true;
772     }
773     if (HasMenuItemType(STE_MENU_VIEW_MENU, STE_MENU_VIEW_GUI))
774     {
775         if (add_sep) menu->AppendSeparator();
776 
777         menu->AppendCheckItem(ID_STE_VIEW_NONPRINT,        _("&Nonprinting Characters"), _("Show end of line symbols and whitespace"));
778         menu->AppendCheckItem(ID_STE_PREF_VIEW_EOL,        _("&EOL"), _("Show end of line symbols"));
779         menu->AppendCheckItem(ID_STE_PREF_VIEW_WHITESPACE, _("Whi&tespace"), _("Show whitespace using symbols"));
780 
781         menu->AppendSeparator();
782 
783         submenu = new wxMenu();
784         submenu->AppendCheckItem(ID_STE_PREF_INDENT_GUIDES,   _("Show indent &guides"), _("Show indentation column guides"));
785         submenu->AppendCheckItem(ID_STE_PREF_EDGE_MODE,       _("Show l&ong line guide"), _("Show column guide for long lines"));
786         submenu->Append(ID_STE_PREF_EDGE_COLUMN,              _("Set long l&ine guide column..."), _("Set column long line guide..."));
787         menu->Append(ID_STE_MENU_GUIDES, _("&Guides"), submenu);
788 
789         menu->AppendSeparator();
790 
791         submenu = new wxMenu();
792         submenu->AppendCheckItem(ID_STE_PREF_VIEW_LINEMARGIN, _("Show &line number margin"), _("Show line number margin"));
793         submenu->AppendCheckItem(ID_STE_PREF_VIEW_MARKERMARGIN, _("Show &marker margin"), _("Show a margin for markers"));
794         submenu->AppendCheckItem(ID_STE_PREF_VIEW_FOLDMARGIN, _("Show &folding margin"), _("Show code folding margin"));
795         menu->Append(ID_STE_MENU_MARGINS, _("&Margins"), submenu);
796         add_sep = true;
797     }
798     if (HasMenuItemType(STE_MENU_VIEW_MENU, STE_MENU_VIEW_FOLD))
799     {
800         if (add_sep) menu->AppendSeparator();
801 
802         submenu = new wxMenu();
803         submenu->Append(ID_STE_FOLDS_TOGGLE_CURRENT, _("To&ggle current fold"), _("Toggle the current fold level"));
804         submenu->Append(ID_STE_FOLDS_COLLAPSE_LEVEL, _("&Collapse folds below level..."), _("Collapse all folds below the level in document"));
805         submenu->Append(ID_STE_FOLDS_EXPAND_LEVEL,   _("E&xpand folds above level..."), _("Expand all folds above the level in document"));
806         submenu->Append(ID_STE_FOLDS_COLLAPSE_ALL,   _("&Collapse all folds"), _("Collapse all folds in document"));
807         submenu->Append(ID_STE_FOLDS_EXPAND_ALL,     _("E&xpand all folds"), _("Expand all folds in document"));
808         menu->Append(ID_STE_MENU_FOLDING, _("&Folding"), submenu);
809         add_sep = true;
810     }
811     if (HasMenuItemType(STE_MENU_VIEW_MENU, STE_MENU_VIEW_HILIGHT))
812     {
813         if (add_sep) menu->AppendSeparator();
814 
815         menu->AppendCheckItem(ID_STE_PREF_HIGHLIGHT_SYNTAX, _("S&yntax coloring"), _("Hilight document based on the syntax"));
816         add_sep = true;
817     }
818     if (HasMenuItemType(STE_MENU_VIEW_MENU, STE_MENU_VIEW_ZOOM))
819     {
820         if (add_sep) menu->AppendSeparator();
821 
822         menu->Append(ID_STE_PREF_ZOOM, _("&Scale font size..."), _("Increase or decrease the size of the text"));
823         add_sep = true;
824     }
825     if (HasMenuItemType(STE_MENU_VIEW_MENU, STE_MENU_VIEW_FULLSCREEN) && HasMenuOptionType(STE_MENU_FRAME))
826     {
827         if (add_sep) menu->AppendSeparator();
828 
829         menu->AppendCheckItem(ID_STE_SHOW_FULLSCREEN, _("Show f&ullscreen"), _("Show the editor fullscreen"));
830         add_sep = true;
831     }
832 
833     if (!menu_ && menu && (menu->GetMenuItemCount() == 0))
834     {
835         wxDELETE(menu);
836     }
837 
838     return menu;
839 }
840 
CreateBookmarkMenu(wxMenu * menu_) const841 wxMenu *wxSTEditorMenuManager::CreateBookmarkMenu(wxMenu *menu_) const
842 {
843     wxMenu *menu = menu_;
844 
845     if (HasMenuItemType(STE_MENU_BOOKMARK_MENU, STE_MENU_BOOKMARK_DEFAULT))
846     {
847         if (menu == NULL) menu = new wxMenu;
848         menu->Append(MenuItem(menu, ID_STE_BOOKMARKS, _("&Bookmarks..."), _("View all bookmarks"), wxITEM_NORMAL, STE_ARTMENU(wxART_HELP_BOOK)));
849         menu->AppendSeparator();
850         menu->Append(MenuItem(menu, ID_STE_BOOKMARK_TOGGLE, _("&Toggle bookmark"), _("Toggle a bookmark on cursor line"), wxITEM_NORMAL, STE_ARTMENU(wxART_ADD_BOOKMARK)));
851         menu->AppendSeparator();
852         menu->Append(MenuItem(menu, ID_STE_BOOKMARK_FIRST,    _("&First bookmark"),    _("Goto first bookmark"), wxITEM_NORMAL, STE_ARTMENU(wxART_GO_UP)));
853         menu->Append(MenuItem(menu, ID_STE_BOOKMARK_PREVIOUS, _("&Previous bookmark"), _("Goto previous bookmark"), wxITEM_NORMAL, STE_ARTMENU(wxART_GO_BACK)));
854         menu->Append(MenuItem(menu, ID_STE_BOOKMARK_NEXT,     _("&Next bookmark"),     _("Goto next bookmark"), wxITEM_NORMAL, STE_ARTMENU(wxART_GO_FORWARD)));
855         menu->Append(MenuItem(menu, ID_STE_BOOKMARK_LAST,     _("&Last bookmark"),     _("Goto last bookmark"), wxITEM_NORMAL, STE_ARTMENU(wxART_GO_DOWN)));
856         menu->AppendSeparator();
857         menu->Append(MenuItem(menu, ID_STE_BOOKMARK_CLEAR, _("&Clear all bookmarks"), _("Clear all bookmarks"), wxITEM_NORMAL, STE_ARTMENU(wxART_DEL_BOOKMARK)));
858     }
859 
860     return menu;
861 }
862 
CreatePreferenceMenu(wxMenu * menu_) const863 wxMenu *wxSTEditorMenuManager::CreatePreferenceMenu(wxMenu *menu_) const
864 {
865     wxMenu *menu = menu_ ? menu_ : new wxMenu();
866     bool add_sep = false;
867 
868     if (HasMenuItemType(STE_MENU_PREFS_MENU, STE_MENU_PREFS_DLG))
869     {
870         menu->Append(ID_STE_PREFERENCES, _("Show &preference dialog..."), _("Show preference dialog..."));
871         add_sep = true;
872     }
873     if (HasMenuItemType(STE_MENU_PREFS_MENU, STE_MENU_PREFS_INDENT))
874     {
875         if (add_sep) menu->AppendSeparator();
876 
877         menu->AppendCheckItem(ID_STE_PREF_USE_TABS,        _("Use &tabs"),    _("Tab key inserts a tab character"));
878         menu->AppendCheckItem(ID_STE_PREF_TAB_INDENTS,     _("Tab &indents"), _("Tab key indents"));
879         menu->AppendCheckItem(ID_STE_PREF_BACKSPACE_UNINDENTS, _("&Backspace unindents"), _("Backspace key unindents"));
880         menu->AppendCheckItem(ID_STE_PREF_AUTOINDENT,     _("&Auto indent"), _("Indent new lines to previous indentation"));
881 
882         menu->Append(ID_STE_PREF_TAB_WIDTH,    _("Set tab &width..."),    _("Set the number of spaces to show for tab character"));
883         menu->Append(ID_STE_PREF_INDENT_WIDTH, _("Set indent wi&dth..."), _("Set the number of spaces to use for indentation"));
884         add_sep = true;
885     }
886     if (HasMenuItemType(STE_MENU_PREFS_MENU, STE_MENU_PREFS_EOL))
887     {
888         if (add_sep) menu->AppendSeparator();
889 
890         menu->Append(ID_STE_PREF_EOL_MODE, _("&EOL Mode..."), _("Set the end of line mode"));
891         add_sep = true;
892     }
893     if (HasMenuItemType(STE_MENU_PREFS_MENU, STE_MENU_PREFS_SAVE))
894     {
895         if (add_sep) menu->AppendSeparator();
896 
897         menu->Append(MenuItem(menu, ID_STE_SAVE_PREFERENCES, _("Save preferences"), _("Save current preferences"), wxITEM_NORMAL, STE_ARTMENU(wxART_STEDIT_SAVE)));
898         add_sep = true;
899     }
900 
901     if (!menu_ && menu && (menu->GetMenuItemCount() == 0))
902     {
903         wxDELETE(menu);
904     }
905 
906     return menu;
907 }
908 
CreateWindowMenu(wxMenu * menu_) const909 wxMenu *wxSTEditorMenuManager::CreateWindowMenu(wxMenu *menu_) const
910 {
911     wxMenu *menu = menu_ ? menu_ : new wxMenu();
912     bool add_sep = false;
913 
914     if (HasMenuItemType(STE_MENU_WINDOW_MENU, STE_MENU_WINDOW_SPLIT))
915     {
916         menu = CreateSplitterPopupMenu(menu);
917         add_sep = true;
918     }
919 
920     if (HasMenuItemType(STE_MENU_WINDOW_MENU, STE_MENU_WINDOW_FILECHOOSER))
921     {
922         if (add_sep) menu->AppendSeparator();
923         menu->AppendCheckItem(ID_STF_SHOW_SIDEBAR, _("&Show sidebar"), _("Show the sidebar panel"));
924     }
925 
926     if (HasMenuItemType(STE_MENU_WINDOW_MENU, STE_MENU_WINDOW_PREVNEXT))
927     {
928         if (add_sep) menu->AppendSeparator();
929 
930         menu->Append(ID_STN_WIN_PREVIOUS, _("Pr&evious page"), _("Goto previous page"));
931         menu->Append(ID_STN_WIN_NEXT,     _("Ne&xt page"),     _("Goto next page"));
932         add_sep = true;
933     }
934 
935     if (HasMenuItemType(STE_MENU_WINDOW_MENU, STE_MENU_WINDOW_WINDOWS))
936     {
937         if (add_sep) menu->AppendSeparator();
938 
939         menu->Append(ID_STN_WINDOWS, _("&Windows..."), _("Manage opened windows"));
940         add_sep = true;
941     }
942 
943     if (!menu_ && menu && (menu->GetMenuItemCount() == 0))
944     {
945         wxDELETE(menu);
946     }
947 
948     return menu;
949 }
950 
CreateHelpMenu(wxMenu * menu_) const951 wxMenu *wxSTEditorMenuManager::CreateHelpMenu(wxMenu *menu_) const
952 {
953     wxMenu *menu = menu_ ? menu_ : new wxMenu();
954 
955     if (HasMenuOptionType(STE_MENU_FRAME) && HasMenuItemType(STE_MENU_HELP_MENU, STE_MENU_HELP_ABOUT))
956     {
957         wxMenuItem* item = new wxMenuItem(menu, wxID_ABOUT, wxGetStockLabelEx(wxID_ABOUT), _("About this program"));
958         item->SetBitmap(STE_ARTMENU(wxART_STEDIT_APP));
959         menu->Append(item);
960     }
961 
962     if (!menu_ && menu && (menu->GetMenuItemCount() == 0))
963     {
964         wxDELETE(menu);
965     }
966 
967     return menu;
968 }
969 
970 // static
CreateInsertCharsMenu(wxMenu * menu_,int types)971 wxMenu* wxSTEditorMenuManager::CreateInsertCharsMenu(wxMenu *menu_, int types)
972 {
973     wxMenu *menu = menu_ ? menu_ : new wxMenu();
974 
975     if (STE_HASBIT(types, STE_MENU_INSERTCHARS_CHARS))
976     {
977         menu->Append(ID_STEDLG_INSERTMENU_TAB, _("Tab character"));
978         menu->Append(ID_STEDLG_INSERTMENU_CR,  _("Carriage return"));
979         menu->Append(ID_STEDLG_INSERTMENU_LF,  _("Line feed"));
980     }
981     if (STE_HASBIT(types, STE_MENU_INSERTCHARS_REGEXP))
982     {
983         wxMenu* reMenu = new wxMenu;
984         reMenu->Append(ID_STEDLG_INSERTMENURE_ANYCHAR,   _("Any character"));
985         reMenu->Append(ID_STEDLG_INSERTMENURE_RANGE,     _("Character in range"));
986         reMenu->Append(ID_STEDLG_INSERTMENURE_NOTRANGE,  _("Character not in range"));
987         reMenu->Append(ID_STEDLG_INSERTMENURE_BEGINLINE, _("Beginning of line"));
988         reMenu->Append(ID_STEDLG_INSERTMENURE_ENDLINE,   _("End of line"));
989         reMenu->Append(ID_STEDLG_INSERTMENURE_TAGEXPR,   _("Tagged expression"));
990         reMenu->Append(ID_STEDLG_INSERTMENURE_0MATCHES,  _("0 or more matches"));
991         reMenu->Append(ID_STEDLG_INSERTMENURE_1MATCHES,  _("1 or more matches"));
992         reMenu->Append(ID_STEDLG_INSERTMENURE_01MATCHES, _("0 or 1 matches"));
993         reMenu->AppendSeparator();
994         reMenu->Append(ID_STEDLG_INSERTMENURE_ALPHANUM,  _("Alphanumeric characters"));
995         reMenu->Append(ID_STEDLG_INSERTMENURE_ALPHA,     _("Alphabetical characters"));
996         reMenu->Append(ID_STEDLG_INSERTMENURE_NUMERIC,   _("Numeric characters"));
997         reMenu->Append(ID_STEDLG_INSERTMENURE_TAB,       _("Tab characters"));
998 
999         menu->Append(ID_STEDLG_MENU_INSERTMENURE, _("Regexp"), reMenu);
1000     }
1001 
1002     if (!menu_ && menu && (menu->GetMenuItemCount() == 0))
1003     {
1004         wxDELETE(menu);
1005     }
1006 
1007     return menu;
1008 }
1009 
AddAccelFromMenuItem(const wxMenu * menu,wxArrayPtrVoid & entries)1010 static bool AddAccelFromMenuItem(const wxMenu* menu, wxArrayPtrVoid& entries)
1011 {
1012     if (!menu)
1013         return false;
1014 
1015     bool ret = false;
1016     const wxMenuItemList& itemList = menu->GetMenuItems();
1017 
1018     for ( wxMenuItemList::const_iterator it = itemList.begin();
1019           it != itemList.end();
1020           it++)
1021     {
1022         wxMenuItem *menuItem = *it;
1023         if (!menuItem)
1024             continue;
1025 
1026         if (menuItem->IsSubMenu())
1027             ret |= AddAccelFromMenuItem(menuItem->GetSubMenu(), entries);
1028         else
1029         {
1030             wxAcceleratorEntry *entry = menuItem->GetAccel();
1031             if (entry)
1032             {
1033                 ret = true;
1034                 // make sure the id is set correctly (for GTK at least)
1035                 entry->Set(entry->GetFlags(), entry->GetKeyCode(), menuItem->GetId());
1036                 bool exists = false;
1037                 size_t n, count = entries.GetCount();
1038                 for (n = 0; n < count; n++)
1039                 {
1040                     if (*entry == *((wxAcceleratorEntry*)entries[n]))
1041                     {
1042                         exists = true;
1043                         break;
1044                     }
1045                 }
1046 
1047                 if (exists)
1048                     delete entry;
1049                 else
1050                     entries.Add(entry);
1051             }
1052         }
1053     }
1054 
1055     return ret;
1056 }
1057 
1058 // static
GetAcceleratorEntries(const wxMenu * menu,const wxMenuBar * menuBar,wxArrayPtrVoid & entries)1059 bool wxSTEditorMenuManager::GetAcceleratorEntries(const wxMenu* menu,
1060                                                   const wxMenuBar* menuBar,
1061                                                   wxArrayPtrVoid& entries)
1062 {
1063     bool ret = false;
1064     if (menu)
1065         ret = AddAccelFromMenuItem(menu, entries);
1066     if (menuBar)
1067     {
1068         size_t n, count = menuBar->GetMenuCount();
1069         for (n = 0; n < count; n++)
1070             ret |= AddAccelFromMenuItem(menuBar->GetMenu(n), entries);
1071     }
1072 
1073     return ret;
1074 }
1075 
1076 // static
CreateAcceleratorTable(wxArrayPtrVoid & entries)1077 wxAcceleratorTable wxSTEditorMenuManager::CreateAcceleratorTable(wxArrayPtrVoid& entries)
1078 {
1079     if (entries.GetCount() == 0)
1080         return wxAcceleratorTable();
1081 
1082     return wxAcceleratorTable((int)entries.GetCount(),
1083                               (wxAcceleratorEntry*)&entries.Item(0));
1084 }
1085 
1086 // static
CreateAcceleratorTable(const wxMenu * menu,const wxMenuBar * menuBar)1087 wxAcceleratorTable wxSTEditorMenuManager::CreateAcceleratorTable(const wxMenu* menu,
1088                                                                  const wxMenuBar* menuBar)
1089 {
1090     wxArrayPtrVoid entries;
1091     GetAcceleratorEntries(menu, menuBar, entries);
1092     wxAcceleratorTable table(CreateAcceleratorTable(entries));
1093     while ( entries.GetCount() > 0 )
1094     {
1095         wxAcceleratorEntry *item = (wxAcceleratorEntry*)entries[0];
1096         //wxPrintf(wxT("Accel %d, '%c' %d %d\n"), item->GetFlags(), (wxChar)item->GetKeyCode(), item->GetKeyCode(), item->GetCommand()); fflush(stdout);
1097         delete item;
1098         entries.RemoveAt(0);
1099     }
1100     return table;
1101 }
1102 
EnableEditorItems(bool enable,wxMenu * menu,wxMenuBar * menuBar,wxToolBar * toolBar)1103 void wxSTEditorMenuManager::EnableEditorItems(bool enable, wxMenu *menu,
1104                                               wxMenuBar *menuBar, wxToolBar *toolBar)
1105 {
1106     m_enabledEditorItems = enable;
1107 
1108     int n, count;
1109     for (n = ID_STE_PREF__FIRST; n <= ID_STE_PREF__LAST; n++)
1110         DoEnableItem(menu, menuBar, toolBar, n, enable);
1111 
1112     count = (int)m_enableItemsArray.GetCount();
1113     for (n = 0; n < count; n++)
1114         DoEnableItem(menu, menuBar, toolBar, m_enableItemsArray[n], enable);
1115 
1116     const int menuIds[] = {
1117         wxID_SAVE,
1118         wxID_SAVEAS,
1119         ID_STN_SAVE_ALL,
1120         ID_STN_CLOSE_PAGE,
1121         ID_STN_CLOSE_ALL,
1122         ID_STN_CLOSE_ALL_OTHERS,
1123         ID_STE_PROPERTIES,
1124         wxID_PRINT,
1125         wxID_PREVIEW,
1126         wxID_PRINT_SETUP,
1127         ID_STE_PRINT_PAGE_SETUP,
1128         ID_STE_PRINT_OPTIONS,
1129 
1130         wxID_CUT,
1131         wxID_COPY,
1132         ID_STE_COPY_PRIMARY,
1133         wxID_PASTE,
1134         ID_STE_PASTE_RECT,
1135         wxID_SELECTALL,
1136         wxID_FIND,
1137         ID_STE_FIND_NEXT,
1138         ID_STE_FIND_DOWN,
1139         wxID_REPLACE,
1140         ID_STE_GOTO_LINE,
1141         wxID_UNDO,
1142         wxID_REDO,
1143 
1144         ID_STE_UPPERCASE,
1145         ID_STE_INCREASE_INDENT,
1146         ID_STE_DECREASE_INDENT,
1147         ID_STE_LINES_JOIN,
1148         ID_STE_LINES_SPLIT,
1149         ID_STE_TABS_TO_SPACES,
1150         ID_STE_SPACES_TO_TABS,
1151         ID_STE_CONVERT_EOL,
1152         ID_STE_TRAILING_WHITESPACE,
1153         ID_STE_REMOVE_CHARSAROUND,
1154 
1155         ID_STE_FOLDS_TOGGLE_CURRENT,
1156         ID_STE_FOLDS_COLLAPSE_LEVEL,
1157         ID_STE_FOLDS_EXPAND_LEVEL,
1158         ID_STE_FOLDS_COLLAPSE_ALL,
1159         ID_STE_FOLDS_EXPAND_ALL,
1160 
1161         ID_STE_BOOKMARK_TOGGLE,
1162         ID_STE_BOOKMARK_FIRST,
1163         ID_STE_BOOKMARK_PREVIOUS,
1164         ID_STE_BOOKMARK_NEXT,
1165         ID_STE_BOOKMARK_LAST,
1166         ID_STE_BOOKMARK_CLEAR,
1167 
1168         ID_STE_PREFERENCES,
1169         ID_STE_SAVE_PREFERENCES,
1170 
1171         ID_STS_UNSPLIT,
1172         ID_STS_SPLIT_HORIZ,
1173         ID_STS_SPLIT_VERT
1174     };
1175 
1176     count = WXSIZEOF(menuIds);
1177     for (n = 0; n < count; n++)
1178         DoEnableItem(menu, menuBar, toolBar, menuIds[n], enable);
1179 }
1180 
1181 // static
MenuItem(wxMenu * menu,wxWindowID win_id,const wxString & text,const wxString & help,wxItemKind kind,const wxBitmap & bitmap)1182 wxMenuItem *wxSTEditorMenuManager::MenuItem(wxMenu *menu, wxWindowID win_id,
1183                                      const wxString &text, const wxString &help,
1184                                      wxItemKind kind, const wxBitmap &bitmap)
1185 {
1186     wxMenuItem *item = new wxMenuItem(menu, win_id, text, help, kind);
1187     if (bitmap.IsOk())
1188         item->SetBitmap(bitmap);
1189     return item;
1190 }
1191 
1192 // static
DestroyMenuItem(wxMenu * menu,int menu_id,bool clean_sep)1193 void wxSTEditorMenuManager::DestroyMenuItem(wxMenu *menu, int menu_id, bool clean_sep)
1194 {
1195     wxCHECK_RET(menu, wxT("Invalid menu"));
1196     wxMenuItem *lastItem = menu->FindItem(menu_id);
1197     if (lastItem)
1198         menu->Destroy(lastItem);
1199 
1200     if (!clean_sep) return;
1201 
1202     // find any separators that are next to each other and delete them
1203     wxMenuItemList &menuItems = menu->GetMenuItems();
1204     wxMenuItemList::compatibility_iterator node = menuItems.GetFirst();
1205 
1206     // delete leading separator
1207     if (node && wxStaticCast(node->GetData(), wxMenuItem)->IsSeparator())
1208     {
1209         menu->Destroy(wxStaticCast(node->GetData(), wxMenuItem));
1210         node = node->GetNext();
1211     }
1212 
1213     // delete duplicate separators
1214     for (;
1215          node;
1216          node = node->GetNext())
1217     {
1218         wxMenuItem* item = wxStaticCast(node->GetData(), wxMenuItem);
1219         if (lastItem && lastItem->IsSeparator() && item->IsSeparator())
1220             menu->Destroy(lastItem);
1221 
1222         lastItem = item;
1223     }
1224 
1225     // delete trailing separator too
1226     node = menuItems.GetLast();
1227     if (node && wxStaticCast(node->GetData(), wxMenuItem)->IsSeparator())
1228     {
1229         menu->Destroy(wxStaticCast(node->GetData(), wxMenuItem));
1230     }
1231 }
1232 
DoEnableItem(wxMenu * menu,wxMenuBar * menuBar,wxToolBar * toolBar,wxWindowID menu_id,bool val)1233 bool wxSTEditorMenuManager::DoEnableItem(wxMenu *menu, wxMenuBar *menuBar,
1234                                wxToolBar *toolBar, wxWindowID menu_id, bool val)
1235 {
1236     //wxPrintf(wxT("DoEnableItem %d - val %d\n"), menu_id, int(val));
1237     bool ret = false;
1238 
1239     if (menu)
1240     {
1241         wxMenuItem *menuItem = menu->FindItem(menu_id);
1242         if (menuItem)
1243         {
1244             menuItem->Enable(val);
1245             ret = true;
1246         }
1247     }
1248     if (menuBar)
1249     {
1250         wxMenuItem *menuItem = menuBar->FindItem(menu_id);
1251         if (menuItem)
1252         {
1253             menuItem->Enable(val);
1254             ret = true;
1255         }
1256     }
1257     if (toolBar)
1258     {
1259         toolBar->EnableTool(menu_id, val);
1260         ret = true; // don't know if it exists, pretend that it did...
1261     }
1262 
1263     return ret;
1264 }
DoCheckItem(wxMenu * menu,wxMenuBar * menuBar,wxToolBar * toolBar,wxWindowID menu_id,bool val)1265 bool wxSTEditorMenuManager::DoCheckItem(wxMenu *menu, wxMenuBar *menuBar,
1266                               wxToolBar *toolBar, wxWindowID menu_id, bool val)
1267 {
1268     //wxPrintf(wxT("DoCheckItem %d - val %d\n"), menu_id, int(val));
1269     bool ret = false;
1270 
1271     if (menu)
1272     {
1273         wxMenuItem *menuItem = menu->FindItem(menu_id);
1274         if (menuItem)
1275         {
1276             menuItem->Check(val);
1277             ret = true;
1278         }
1279     }
1280     if (menuBar)
1281     {
1282         wxMenuItem *menuItem = menuBar->FindItem(menu_id);
1283         if (menuItem)
1284         {
1285             menuItem->Check(val);
1286             ret = true;
1287         }
1288     }
1289     if (toolBar)
1290     {
1291         toolBar->ToggleTool(menu_id, val);
1292         ret = true; // don't know if it exists, pretend that it did...
1293     }
1294 
1295     return ret;
1296 }
DoSetTextItem(wxMenu * menu,wxMenuBar * menuBar,wxWindowID menu_id,const wxString & val)1297 bool wxSTEditorMenuManager::DoSetTextItem(wxMenu *menu, wxMenuBar *menuBar,
1298                                         wxWindowID menu_id, const wxString &val)
1299 {
1300     bool ret = false;
1301 
1302     if (menu)
1303     {
1304         wxMenuItem *menuItem = menu->FindItem(menu_id);
1305         if (menuItem)
1306         {
1307             menuItem->SetItemLabel(val);
1308             ret = true;
1309         }
1310     }
1311     if (menuBar)
1312     {
1313         wxMenuItem *menuItem = menuBar->FindItem(menu_id);
1314         if (menuItem)
1315         {
1316             menuItem->SetItemLabel(val);
1317             ret = true;
1318         }
1319     }
1320 
1321     return ret;
1322 }
1323