1 /*
2   FXiTe - The Free eXtensIble Text Editor
3   Copyright (c) 2009-2013 Jeffrey Pohlmeyer <yetanothergeek@gmail.com>
4 
5   This program is free software; you can redistribute it and/or modify it
6   under the terms of the GNU General Public License version 3 as
7   published by the Free Software Foundation.
8 
9   This software is distributed in the hope that it will be useful,
10   but WITHOUT ANY WARRANTY; without even the implied warranty of
11   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12   GNU General Public License for more details.
13 
14   You should have received a copy of the GNU General Public License
15   along with this program; if not, write to the Free Software
16   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17 */
18 
19 
20 #include <fx.h>
21 #include <fxkeys.h>
22 
23 #include "compat.h"
24 #include "scidoc.h"
25 #include "doctabs.h"
26 #include "search.h"
27 #include "filer.h"
28 #include "prefs_base.h"
29 #include "tagread.h"
30 #include "recorder.h"
31 #include "help.h"
32 #include "backup.h"
33 #include "menuspec.h"
34 #include "appname.h"
35 #include "outpane.h"
36 #include "mainmenu.h"
37 #include "statusbar.h"
38 #include "scidoc_util.h"
39 #include "foreachtab.h"
40 
41 #include "intl.h"
42 #include "appwin.h"
43 
44 
45 
46 FXDEFMAP(TopWindow) TopWindowMap[]={
47   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_SCINTILLA,        TopWindow::onScintillaCmd),
48   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_TAB_SWITCHED,     TopWindow::onSwitchTabs),
49   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_TAB_ACTIVATE,     TopWindow::onTabActivate),
50   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_OPEN_FILES,       TopWindow::onFileOpen),
51   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_CLOSE,            TopWindow::onCloseTab),
52   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_CLOSEALL,         TopWindow::onCloseAll),
53   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_SAVE,             TopWindow::onFileSave),
54   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_SAVEAS,           TopWindow::onFileSaveAs),
55   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_SAVEALL,          TopWindow::onFileSaveAll),
56   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_SAVECOPY,         TopWindow::onFileSaveACopy),
57   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_NEW,              TopWindow::onFileNew),
58   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_SELECT_DIR,       TopWindow::onSelectDir),
59   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_QUIT,             TopWindow::onQuit),
60   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_UNDO,             TopWindow::onUndo),
61   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_REDO,             TopWindow::onRedo),
62   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_CUT,              TopWindow::onCut),
63   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_COPY,             TopWindow::onCopy),
64   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_PASTE,            TopWindow::onPaste),
65   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_FIND,             TopWindow::onFind),
66   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_FINDNEXT,         TopWindow::onFindNext),
67   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_FINDPREV,         TopWindow::onFindPrev),
68   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_REPLACE_IN_DOC,   TopWindow::onReplace),
69   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_GOTO,             TopWindow::onGoto),
70   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_GOTO_SELECTED,    TopWindow::onGotoSelected),
71   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_GOTO_ERROR,       TopWindow::onGoToError),
72   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_SHOW_LINENUMS,    TopWindow::onShowLineNums),
73   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_SHOW_TOOLBAR,     TopWindow::onShowToolbar),
74   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_SHOW_WHITESPACE,  TopWindow::onShowWhiteSpace),
75   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_SHOW_STATUSBAR,   TopWindow::onShowStatusBar),
76   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_SHOW_MARGIN,      TopWindow::onShowMargin),
77   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_SHOW_INDENT,      TopWindow::onShowIndent),
78   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_SHOW_CARET_LINE,  TopWindow::onShowCaretLine),
79   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_SHOW_OUTLIST,     TopWindow::onShowOutputPane),
80   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_INVERT_COLORS,    TopWindow::onInvertColors),
81   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_PREFS_DIALOG,     TopWindow::onPrefsDialog),
82   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_CTRL_TAB,         TopWindow::onCtrlTab),
83   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_KILL_COMMAND,     TopWindow::onKillCommand),
84   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_RUN_COMMAND,      TopWindow::onRunCommand),
85   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_SPLIT_CHANGED,    TopWindow::onSplitChanged),
86   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_FOCUS_OUTLIST,    TopWindow::onOutlistFocus),
87   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_SET_LANGUAGE,     TopWindow::onSetLanguage),
88   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_RELOAD,           TopWindow::onReload),
89   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_READONLY,         TopWindow::onReadOnly),
90   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_WORDWRAP,         TopWindow::onWordWrap),
91   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_LOAD_TAGS,        TopWindow::onLoadTags),
92   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_UNLOAD_TAGS,      TopWindow::onUnloadTags),
93   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_FIND_TAG,         TopWindow::onFindTag),
94   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_SHOW_CALLTIP,     TopWindow::onShowCallTip),
95   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_AUTO_COMPLETE,    TopWindow::onAutoComplete),
96   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_MACRO_RECORD,     TopWindow::onMacroRecord),
97   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_MACRO_PLAYBACK,   TopWindow::onMacroPlayback),
98   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_MACRO_TRANSLATE,  TopWindow::onMacroShow),
99   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_RESCAN_USER_MENU, TopWindow::onRescanUserMenu),
100   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_CONFIGURE_TOOLS,  TopWindow::onConfigureTools),
101   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_INSERT_FILE,      TopWindow::onInsertFile),
102   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_HELP_ABOUT,       TopWindow::onHelpAbout),
103   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_FILE_SAVED,       TopWindow::onFileSaved),
104   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_OPEN_PREVIOUS,    TopWindow::onOpenPrevious),
105   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_OPEN_SELECTED,    TopWindow::onOpenSelected),
106   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_CYCLE_SPLITTER,   TopWindow::onCycleSplitter),
107   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_CLEAR_OUTPUT,     TopWindow::onClearOutput),
108   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_SHOW_HELP,        TopWindow::onShowHelp),
109   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_SHOW_LUA_HELP,    TopWindow::onShowHelp),
110   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_TBAR_CUSTOM_CMD,  TopWindow::onTBarCustomCmd),
111   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_POPUP_SELECT_ALL, TopWindow::onPopupSelectAll),
112   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_POPUP_DELETE_SEL, TopWindow::onPopupDeleteSel),
113   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_FOUND_SEARCH,     TopWindow::onFoundSearch),
114   FXMAPFUNC(SEL_PICKED,    TopWindow::ID_SCINTILLA,        TopWindow::onScintillaPick),
115   FXMAPFUNC(SEL_KEYPRESS,  TopWindow::ID_SCINTILLA,        TopWindow::onScintillaKey),
116   FXMAPFUNC(SEL_COMMAND,   TopWindow::ID_TEST_SOMETHING,   TopWindow::onTestSomething),
117   FXMAPFUNC(SEL_CHORE,     TopWindow::ID_TEST_SOMETHING,   TopWindow::onTestSomething),
118   FXMAPFUNCS(SEL_COMMAND,  TopWindow::ID_TABS_TOP,         TopWindow::ID_TABS_RIGHT,      TopWindow::onTabOrient),
119   FXMAPFUNCS(SEL_COMMAND,  TopWindow::ID_TABS_UNIFORM,     TopWindow::ID_TABS_BY_POS,     TopWindow::onPackTabWidth),
120   FXMAPFUNCS(SEL_COMMAND,  TopWindow::ID_TAB_TOFIRST,      TopWindow::ID_TAB_DOWN,        TopWindow::onMoveTab),
121   FXMAPFUNCS(SEL_COMMAND,  TopWindow::ID_TAB_NEXT,         TopWindow::ID_TAB_PREV,        TopWindow::onNextTab),
122   FXMAPFUNCS(SEL_COMMAND,  TopWindow::ID_DEL_WORD_LEFT,    TopWindow::ID_DEL_LINE_RIGHT,  TopWindow::onDeleteChunk),
123   FXMAPFUNCS(SEL_COMMAND,  TopWindow::ID_NEXT_SELECTED,    TopWindow::ID_PREV_SELECTED,   TopWindow::onFindSelected),
124   FXMAPFUNCS(SEL_COMMAND,  TopWindow::ID_BOOKMARK_SET,     TopWindow::ID_BOOKMARK_RETURN, TopWindow::onBookmark),
125   FXMAPFUNCS(SEL_COMMAND,  TopWindow::ID_ZOOM_IN,          TopWindow::ID_ZOOM_NONE,       TopWindow::onZoom),
126   FXMAPFUNCS(SEL_COMMAND,  TopWindow::ID_INDENT_STEP,      TopWindow::ID_UNINDENT_FULL,   TopWindow::onIndent),
127   FXMAPFUNCS(SEL_COMMAND,  TopWindow::ID_FILTER_SEL,       TopWindow::ID_INSERT_CMD_OUT,  TopWindow::onFilterSel),
128   FXMAPFUNCS(SEL_COMMAND,  TopWindow::ID_TOUPPER,          TopWindow::ID_TOLOWER,         TopWindow::onChangeCase),
129   FXMAPFUNCS(SEL_COMMAND,  TopWindow::ID_USER_COMMAND,     TopWindow::ID_USER_MACRO,      TopWindow::onUserCmd),
130   FXMAPFUNCS(SEL_COMMAND,  TopWindow::ID_EXPORT_PDF,       TopWindow::ID_EXPORT_HTML,     TopWindow::onFileExport),
131   FXMAPFUNCS(SEL_COMMAND,  TopWindow::ID_FMT_DOS,          TopWindow::ID_FMT_UNIX,        TopWindow::onFileFormat),
132 };
133 
134 
FXIMPLEMENT(TopWindow,TopWindowBase,TopWindowMap,ARRAYNUMBER (TopWindowMap))135 FXIMPLEMENT(TopWindow,TopWindowBase,TopWindowMap,ARRAYNUMBER(TopWindowMap))
136 
137 
138 
139 /* Utility function, only used for testing new stuff */
140 long TopWindow::onTestSomething(FXObject*o, FXSelector sel, void*p)
141 {
142   if (FXSELTYPE(sel)==SEL_CHORE) {
143  /*do something*/
144   } else {
145     getApp()->addChore(this, ID_TEST_SOMETHING);
146   }
147   return 1;
148 }
149 
150 
151 
onInvertColors(FXObject * o,FXSelector sel,void * p)152 long TopWindow::onInvertColors(FXObject*o, FXSelector sel, void*p)
153 {
154   InvertColors((bool)(FXival)p);
155   return 1;
156 }
157 
158 
159 
onFileFormat(FXObject * o,FXSelector sel,void * p)160 long TopWindow::onFileFormat(FXObject*o, FXSelector sel, void*p)
161 {
162   MenuMgr::SetFileFormat(FocusedDoc(), FXSELID(sel));
163   return 1;
164 }
165 
166 
167 
onBookmark(FXObject * o,FXSelector sel,void * p)168 long TopWindow::onBookmark(FXObject*o, FXSelector sel, void*p)
169 {
170   switch (FXSELID(sel)) {
171     case ID_BOOKMARK_SET: {
172       SetBookmark();
173       break;
174     }
175     case ID_BOOKMARK_RETURN: {
176       GoToBookmark();
177       break;
178     }
179   }
180   return 1;
181 }
182 
183 
184 
onConfigureTools(FXObject * o,FXSelector sel,void * p)185 long TopWindow::onConfigureTools( FXObject*o, FXSelector sel, void*p )
186 {
187   ShowToolManagerDialog();
188   return 1;
189 }
190 
191 
192 
onShowHelp(FXObject * o,FXSelector sel,void * p)193 long TopWindow::onShowHelp(FXObject*o, FXSelector sel, void*p)
194 {
195   // If user has editor background set to dark color, show help with inverted colors
196   bool dark=( (((FXuint)(FocusedDoc()->sendMessage(SCI_STYLEGETBACK,STYLE_DEFAULT,0)))<FXRGB(128,128,128)) );
197   show_help(this, (FXSELID(sel)==ID_SHOW_HELP)?0:1, dark);
198   return 1;
199 }
200 
201 
202 
onFileExport(FXObject * o,FXSelector sel,void * p)203 long TopWindow::onFileExport(FXObject*o, FXSelector sel, void*p)
204 {
205   switch (FXSELID(sel)) {
206     case ID_EXPORT_PDF: {
207       filedlgs->ExportPdf(ControlDoc());
208       break;
209     }
210     case ID_EXPORT_HTML: {
211       filedlgs->ExportHtml(ControlDoc());
212       break;
213     }
214   }
215   return 1;
216 }
217 
218 
219 
onCycleSplitter(FXObject * o,FXSelector sel,void * p)220 long TopWindow::onCycleSplitter(FXObject*o, FXSelector sel, void*p)
221 {
222   SciDocUtils::CycleSplitter(ControlDoc(), (Settings*)prefs);
223   return 1;
224 }
225 
226 
227 
onClearOutput(FXObject * o,FXSelector sel,void * p)228 long TopWindow::onClearOutput(FXObject*o, FXSelector sel, void*p)
229 {
230   outlist->clearItems();
231   return 1;
232 }
233 
234 
235 
onOpenSelected(FXObject * o,FXSelector sel,void * p)236 long TopWindow::onOpenSelected(FXObject*o, FXSelector sel, void*p)
237 {
238   OpenSelected();
239   return 1;
240 }
241 
242 
243 
onOpenPrevious(FXObject * o,FXSelector sel,void * p)244 long TopWindow::onOpenPrevious(FXObject*o, FXSelector sel, void*p)
245 {
246   OpenFile((char*)p, NULL, false, false);
247   return 1;
248 }
249 
250 
251 
onHelpAbout(FXObject * o,FXSelector sel,void * p)252 long TopWindow::onHelpAbout(FXObject*o, FXSelector sel, void*p)
253 {
254   AppAbout::AboutBox();
255   return 1;
256 }
257 
258 
259 
onMacroPlayback(FXObject * o,FXSelector sel,void * p)260 long TopWindow::onMacroPlayback(FXObject*o, FXSelector sel, void*p)
261 {
262   if (recorder&&!recording) { RunMacro(recorder->translate(), false); }
263   return 1;
264 }
265 
266 
267 
onMacroShow(FXObject * o,FXSelector sel,void * p)268 long TopWindow::onMacroShow(FXObject*o, FXSelector sel, void*p)
269 {
270   if (recorder&&!recording) {
271     NewFile(false);
272     ControlDoc()->setLanguage("lua");
273     ControlDoc()->SetText(recorder->translate().text());
274   }
275   return 1;
276 }
277 
278 
279 
onMacroRecord(FXObject * o,FXSelector sel,void * p)280 long TopWindow::onMacroRecord(FXObject*o, FXSelector sel, void*p)
281 {
282   ToggleRecorder();
283   return 1;
284 }
285 
286 
287 
onInsertFile(FXObject * o,FXSelector sel,void * p)288 long TopWindow::onInsertFile(FXObject*o, FXSelector sel, void*p )
289 {
290   ShowInsertFileDlg();
291   return 1;
292 }
293 
294 
295 
onRescanUserMenu(FXObject * o,FXSelector sel,void * p)296 long TopWindow::onRescanUserMenu(FXObject*o, FXSelector sel, void*p)
297 {
298   RescanUserMenu();
299   return 1;
300 }
301 
302 
303 
onFileSaved(FXObject * o,FXSelector sel,void * p)304 long TopWindow::onFileSaved(FXObject*o, FXSelector sel, void*p)
305 {
306   FileSaved((SciDoc*)p);
307   return 1;
308 }
309 
310 
311 
onUserCmd(FXObject * o,FXSelector sel,void * p)312 long TopWindow::onUserCmd(FXObject*o, FXSelector sel, void*p)
313 {
314   FXMenuCommand*mc=(FXMenuCommand*)o;
315   FXuval b=(FXuval)p;
316   FXString script=(char*)(mc->getUserData());
317   if ( b==2 ) { // Right-clicked, open file instead of executing
318     OpenFile(script.text(), NULL, false, true);
319     return 1;
320   }
321   //  If this file is currently open in the editor, and has
322   //  unsaved changes, prompt the user to save the changes.
323   FXWindow*tab,*page;
324   for (tab=tabbook->getFirst(); tab && (page=tab->getNext()); tab=page->getNext()) {
325     if (!filedlgs->AskSaveModifiedCommand((SciDoc*)page->getFirst(), script)) { return 1; }
326   }
327   FXString input="";
328   SciDoc *sci=FocusedDoc();
329   switch (FXSELID(sel)) {
330     case ID_USER_COMMAND: {
331       if (PathMatch("*.save.*", FXPath::name(script), FILEMATCH_CASEFOLD)) {
332         if (!SaveAll(true)) { return 1; }
333       }
334 #ifdef WIN32
335      script.prepend('"');
336      script.append('"');
337 #endif
338       RunCommand(sci, script);
339       break;
340     }
341     case ID_USER_FILTER: {
342       if (sci->GetSelLength()>0) {
343         sci->GetSelText(input);
344         FilterSelection(sci, script, input);
345       }
346       break;
347     }
348     case ID_USER_SNIPPET: {
349       if (PathMatch("*.exec.*", FXPath::name(script), FILEMATCH_CASEFOLD)) {
350         FilterSelection(sci, script, input);
351       } else {
352         SciDocUtils::InsertFile(sci,script);
353       }
354       break;
355     }
356     case ID_USER_MACRO: {
357       RunMacro(script, true);
358       break;
359     }
360   }
361   return 1;
362 }
363 
364 
365 
onTBarCustomCmd(FXObject * o,FXSelector sel,void * p)366 long TopWindow::onTBarCustomCmd(FXObject*o, FXSelector sel, void*p)
367 {
368   MenuSpec*spec=(MenuSpec*)(((FXButton*)o)->getUserData());
369   handle(spec->ms_mc, FXSEL(SEL_COMMAND,spec->ms_mc->getSelector()),0);
370   return 1;
371 }
372 
373 
374 
onFindTag(FXObject * o,FXSelector sel,void * p)375 long TopWindow::onFindTag(FXObject*o, FXSelector sel, void*p)
376 {
377   FindTag();
378   return 1;
379 }
380 
381 
382 
onShowCallTip(FXObject * o,FXSelector sel,void * p)383 long TopWindow::onShowCallTip(FXObject*o, FXSelector sel, void*p )
384 {
385   TagHandler::ShowCallTip(FocusedDoc(), TagFiles());
386   return 1;
387 }
388 
389 
390 
onAutoComplete(FXObject * o,FXSelector sel,void * p)391 long TopWindow::onAutoComplete(FXObject*o, FXSelector sel, void*p)
392 {
393   completions->Start(FocusedDoc(), TagFiles());
394   return 1;
395 }
396 
397 
398 
onLoadTags(FXObject * o,FXSelector sel,void * p)399 long TopWindow::onLoadTags(FXObject*o, FXSelector sel, void*p)
400 {
401   FXString filename="";
402   if (filedlgs->GetOpenTagFilename(ControlDoc(),filename)) { AddFileToTagsMenu(filename); }
403   return 1;
404 }
405 
406 
407 
onUnloadTags(FXObject * o,FXSelector sel,void * p)408 long TopWindow::onUnloadTags(FXObject*o, FXSelector sel, void*p)
409 {
410   menubar->UnloadTagFile((FXMenuCommand*)o);
411   return 1;
412 }
413 
414 
415 
onReadOnly(FXObject * o,FXSelector sel,void * p)416 long TopWindow::onReadOnly(FXObject*o, FXSelector sel, void*p)
417 {
418   SciDoc*sci=ControlDoc();
419   SetReadOnly(sci, !sci->GetReadOnly());
420   sci->setFocus();
421   return 1;
422 }
423 
424 
425 
onWordWrap(FXObject * o,FXSelector sel,void * p)426 long TopWindow::onWordWrap(FXObject*o, FXSelector sel, void*p)
427 {
428   SciDoc*sci=ControlDoc();
429   SetWordWrap(sci, !sci->GetWordWrap());
430   sci->setFocus();
431   return 1;
432 }
433 
434 
435 
onNextTab(FXObject * o,FXSelector sel,void * p)436 long TopWindow::onNextTab(FXObject*o,FXSelector sel,void* p)
437 {
438   tabbook->FocusNextTab(FXSELID(sel) == ID_TAB_NEXT);
439   need_status=32;
440   return 1;
441 }
442 
443 
444 
445 // Active document switched
onSwitchTabs(FXObject * o,FXSelector sel,void * p)446 long TopWindow::onSwitchTabs(FXObject*o, FXSelector sel, void*p)
447 {
448   need_status=32;
449   return 1;
450 }
451 
452 
453 
onReload(FXObject * o,FXSelector sel,void * p)454 long TopWindow::onReload(FXObject*o, FXSelector sel, void*p)
455 {
456   AskReload();
457   return 1;
458 }
459 
460 
461 
onSetLanguage(FXObject * o,FXSelector sel,void * p)462 long TopWindow::onSetLanguage(FXObject*o, FXSelector sel, void*p)
463 {
464   SetLanguage((FXMenuRadio*)o);
465   return 1;
466 }
467 
468 
469 
onSplitChanged(FXObject * o,FXSelector sel,void * p)470 long TopWindow::onSplitChanged(FXObject*o, FXSelector sel, void*p)
471 {
472   if (hsplit->getSplit(1)>0) { prefs->OutputPaneHeight=hsplit->getSplit(1); }
473   return 1;
474 }
475 
476 
477 
onScintillaCmd(FXObject * o,FXSelector s,void * p)478 long TopWindow::onScintillaCmd(FXObject*o,FXSelector s,void*p)
479 {
480   SciDoc* sci=(SciDoc*)o;
481   SCNotification* scn = static_cast<SCNotification*>(p);
482   if ((!need_status)&&(scn->nmhdr.code==SCN_PAINTED)) { return 1; }
483   if (need_status) {need_status--;}
484   if (sci->Loading()) { return 1; }
485   long pos=sci->sendMessage(SCI_GETCURRENTPOS,0,0);
486   long line=sci->sendMessage(SCI_LINEFROMPOSITION,pos,0);
487   long col=sci->sendMessage(SCI_GETCOLUMN,pos,0);
488   switch (scn->nmhdr.code) {
489     case SCN_UPDATEUI: {
490       if ( prefs->BraceMatch ) { sci->MatchBrace(); }
491       break;
492     }
493     case SCN_SAVEPOINTLEFT: {
494       if (!sci->Loading()) { SetTabDirty(sci,true); }
495       break;
496     }
497     case SCN_SAVEPOINTREACHED: {
498       if (!sci->Loading()) {
499         SetTabDirty(sci,false);
500         backups->RemoveBackup(sci);
501       }
502       break;
503     }
504     case SCN_PAINTED: {
505       break;
506     }
507     case SCN_MODIFIED: {
508       if ((scn->modificationType&(SC_MOD_INSERTTEXT|SC_MOD_DELETETEXT))&&(!sci->Loading())) {
509           sci->NeedBackup(true);
510       }
511       break;
512     }
513     case SCN_CHARADDED: {
514       if (!completions->Continue(sci)) { SciDocUtils::CharAdded(sci,line,pos,scn->ch,(Settings*)prefs,recording); }
515       break;
516     }
517     case SCN_DOUBLECLICK: {
518       break;
519     }
520     case SCN_MACRORECORD: {
521       recorder->record(scn->message,scn->wParam, scn->lParam);
522       break;
523     }
524   }
525   UpdateTitle(line,col);
526   EnableUserFilters(sci->GetSelLength()>0);
527   return 1;
528 }
529 
530 
531 
onScintillaPick(FXObject * o,FXSelector s,void * p)532 long TopWindow::onScintillaPick(FXObject*o,FXSelector s,void*p)
533 {
534   MenuMgr::ShowPopupMenu((FXPoint*)p);
535   return 1;
536 }
537 
538 
539 
onScintillaKey(FXObject * o,FXSelector sel,void * p)540 long TopWindow::onScintillaKey(FXObject* o, FXSelector sel, void*p)
541 {
542   if (((FXEvent*)p)->code==KEY_Escape) {
543     if (!FocusedDoc()->sendMessage(SCI_AUTOCACTIVE,0,0)) { srchdlgs->hide(); }
544   }
545   return 0;
546 }
547 
548 
549 
550 // Switch tab orientations
onTabOrient(FXObject * o,FXSelector sel,void * p)551 long TopWindow::onTabOrient(FXObject*o,FXSelector sel,void*p)
552 {
553   prefs->DocTabPosition=MenuMgr::SetTabOrientation(FXSELID(sel));
554   tabbook->setTabStyleByChar(prefs->DocTabPosition);
555   FocusedDoc()->setFocus();
556   return 1;
557 }
558 
559 
560 
onPackTabWidth(FXObject * o,FXSelector sel,void * p)561 long TopWindow::onPackTabWidth(FXObject*o,FXSelector sel,void*p)
562 {
563   switch (FXSELID(sel)) {
564     case ID_TABS_UNIFORM: { prefs->DocTabsPacked='U'; break; }
565     case ID_TABS_COMPACT: { prefs->DocTabsPacked='P'; break; }
566     case ID_TABS_BY_POS:  { prefs->DocTabsPacked='A'; break; }
567   }
568   tabbook->setTabsCompact(prefs->DocTabsPacked);
569   MenuMgr::RadioUpdate(FXSELID(sel),ID_TABS_UNIFORM,ID_TABS_BY_POS);
570   return 1;
571 }
572 
573 
574 
onMoveTab(FXObject * o,FXSelector sel,void * p)575 long TopWindow::onMoveTab(FXObject*o, FXSelector sel, void*p)
576 {
577   switch (FXSELID(sel)) {
578     case ID_TAB_TOLAST:  { tabbook->MoveTabLast();  break; }
579     case ID_TAB_TOFIRST: { tabbook->MoveTabFirst(); break; }
580     case ID_TAB_UP:      { tabbook->MoveTabUp();    break; }
581     case ID_TAB_DOWN:    { tabbook->MoveTabDown();  break; }
582   }
583   return 1;
584 }
585 
586 
587 
onTabActivate(FXObject * o,FXSelector sel,void * p)588 long TopWindow::onTabActivate(FXObject*o, FXSelector sel, void*p)
589 {
590   tabbook->ActivateTab((DocTab*)(((FXMenuCommand*)o)->getUserData()));
591   return 1;
592 }
593 
594 
595 
onFileOpen(FXObject * o,FXSelector sel,void * p)596 long TopWindow::onFileOpen(FXObject*o,FXSelector sel,void*p)
597 {
598   FXString* filenames=NULL;
599   if (filedlgs->GetOpenFilenames(FocusedDoc(),filenames,true)) {
600     FXString* filename;
601     for (filename=filenames; !filename->empty(); filename++) { OpenFile(filename->text(),NULL,false,true); }
602     delete[] filenames;
603   }
604   return 1;
605 }
606 
607 
608 
onCloseTab(FXObject * o,FXSelector sel,void * p)609 long TopWindow::onCloseTab(FXObject*o,FXSelector sel,void*p)
610 {
611   CloseFile(false,true);
612   return 1;
613 }
614 
615 
616 
onCloseAll(FXObject * o,FXSelector sel,void * p)617 long TopWindow::onCloseAll(FXObject*o,FXSelector sel,void*p)
618 {
619   if (prefs->PromptCloseMultiMenu && (tabbook->Count()>1)) {
620     if (FXMessageBox::question(this, MBOX_OK_CANCEL, _("Multiple files"),
621           _("Editing %d files - \nclose all tabs?"), tabbook->Count() ) != MBOX_CLICKED_OK ) {
622       return 1;
623     }
624   }
625   CloseAll(false);
626   return 1;
627 }
628 
629 
630 
onFileSaveACopy(FXObject * o,FXSelector sel,void * p)631 long TopWindow::onFileSaveACopy(FXObject*o, FXSelector sel, void*p)
632 {
633   SciDoc*sci=ControlDoc();
634   filedlgs->SaveFileAs(sci,false,sci->Filename().empty()?"untitled.bak":FXPath::name(sci->Filename()+".bak"));
635   return 1;
636 }
637 
638 
639 
onFileSaveAll(FXObject * o,FXSelector sel,void * p)640 long TopWindow::onFileSaveAll(FXObject*o, FXSelector sel, void*p)
641 {
642   SaveAll(false);
643   return 1;
644 }
645 
646 
647 
onFileSave(FXObject * o,FXSelector sel,void * p)648 long TopWindow::onFileSave(FXObject*o, FXSelector sel, void*p)
649 {
650   if (!ControlDoc()->GetReadOnly()) { filedlgs->SaveFile(ControlDoc(),ControlDoc()->Filename()); }
651   return 1;
652 }
653 
654 
655 
onFileSaveAs(FXObject * o,FXSelector sel,void * p)656 long TopWindow::onFileSaveAs(FXObject*o, FXSelector sel, void*p)
657 {
658   ShowSaveAsDlg(ControlDoc());
659   return 1;
660 }
661 
662 
663 
onFileNew(FXObject * o,FXSelector sel,void * p)664 long TopWindow::onFileNew(FXObject*o, FXSelector sel, void*p )
665 {
666   NewFile(true);
667   return 1;
668 }
669 
670 
671 
onSelectDir(FXObject * o,FXSelector sel,void * p)672 long TopWindow::onSelectDir(FXObject*o, FXSelector sel, void*p)
673 {
674   filedlgs->SetWorkingDirectory(this);
675   return 1;
676 }
677 
678 
679 
onQuit(FXObject * o,FXSelector sel,void * p)680 long TopWindow::onQuit(FXObject*o, FXSelector sel, void*p)
681 {
682   skipfocus=true;
683   close(true);
684   return 1;
685 }
686 
687 
688 
onUndo(FXObject * o,FXSelector sel,void * p)689 long TopWindow::onUndo(FXObject*o, FXSelector sel, void*p)
690 {
691   SciDoc*sci=FocusedDoc();
692   if (!sci) { return 1; }
693   sci->sendMessage(SCI_UNDO,0,0);
694   sci->SetEolModeFromContent();
695   MenuMgr::UpdateEolMenu(sci);
696   sci->setFocus();
697   return 1;
698 }
699 
700 
701 
onRedo(FXObject * o,FXSelector sel,void * p)702 long TopWindow::onRedo(FXObject*o, FXSelector sel, void*p)
703 {
704   SciDoc*sci=FocusedDoc();
705   if (!sci) { return 1; }
706   sci->sendMessage(SCI_REDO,0,0);
707   sci->SetEolModeFromContent();
708   MenuMgr::UpdateEolMenu(sci);
709   sci->setFocus();
710   return 1;
711 }
712 
713 
714 
onCut(FXObject * o,FXSelector sel,void * p)715 long TopWindow::onCut(FXObject*o, FXSelector sel, void*p)
716 {
717   Cut();
718   return 1;
719 }
720 
721 
722 
onCopy(FXObject * o,FXSelector sel,void * p)723 long TopWindow::onCopy(FXObject*o, FXSelector sel, void*p)
724 {
725   Copy();
726   return 1;
727 }
728 
729 
730 
onPaste(FXObject * o,FXSelector sel,void * p)731 long TopWindow::onPaste(FXObject*o, FXSelector sel, void*p)
732 {
733   Paste();
734   return 1;
735 }
736 
737 
738 
onDeleteChunk(FXObject * o,FXSelector sel,void * p)739 long TopWindow::onDeleteChunk(FXObject*o, FXSelector sel, void*p)
740 {
741   SciDoc*sci=FocusedDoc();
742   FXint cmd=0;
743   if (!sci) { return 1; }
744   switch (FXSELID(sel)) {
745     case ID_DEL_WORD_LEFT:  { cmd=SCI_DELWORDLEFT;  break; }
746     case ID_DEL_WORD_RIGHT: { cmd=SCI_DELWORDRIGHT; break; }
747     case ID_DEL_LINE_LEFT:  { cmd=SCI_DELLINELEFT;  break; }
748     case ID_DEL_LINE_RIGHT: { cmd=SCI_DELLINERIGHT; break; }
749     default: return 1;
750   }
751   sci->sendMessage(cmd,0,0);
752   sci->setFocus();
753   return 1;
754 }
755 
756 
757 
onPopupSelectAll(FXObject * o,FXSelector sel,void * p)758 long TopWindow::onPopupSelectAll( FXObject*o, FXSelector sel, void*p )
759 {
760   SciDoc*sci=FocusedDoc();
761   sci->sendMessage(SCI_SELECTALL, 0, 0);
762   return 1;
763 }
764 
765 
766 
onPopupDeleteSel(FXObject * o,FXSelector sel,void * p)767 long TopWindow::onPopupDeleteSel( FXObject*o, FXSelector sel, void*p )
768 {
769   SciDoc*sci=ControlDoc();
770   sci->sendString(SCI_REPLACESEL, 0, "");
771   return 1;
772 }
773 
774 
775 
776 #define macro_record_search() \
777   if (recording==FocusedDoc()) { \
778     recorder->record( \
779       srchdlgs->searchdirn, \
780       srchdlgs->searchmode, \
781       reinterpret_cast<long>(srchdlgs->searchstring.text()) \
782     ); \
783   }
784 
785 
onFind(FXObject * o,FXSelector sel,void * p)786 long TopWindow::onFind(FXObject*o, FXSelector sel, void*p)
787 {
788   skipfocus=true;
789   srchdlgs->ShowFindDialog();
790   return 1;
791 }
792 
793 
794 
onFoundSearch(FXObject * o,FXSelector sel,void * p)795 long TopWindow::onFoundSearch(FXObject* o, FXSelector sel, void* p )
796 {
797   macro_record_search();
798   return 1;
799 }
800 
801 
802 
onFindNext(FXObject * o,FXSelector sel,void * p)803 long TopWindow::onFindNext(FXObject*o, FXSelector sel, void*p)
804 {
805   srchdlgs->FindNext();
806   return 1;
807 }
808 
809 
810 
onFindPrev(FXObject * o,FXSelector sel,void * p)811 long TopWindow::onFindPrev(FXObject*o, FXSelector sel, void*p)
812 {
813   srchdlgs->FindPrev();
814   return 1;
815 }
816 
817 
818 
onReplace(FXObject * o,FXSelector sel,void * p)819 long TopWindow::onReplace(FXObject*o, FXSelector sel, void*p)
820 {
821   skipfocus=true;
822   srchdlgs->ShowReplaceDialog();
823   return 1;
824 }
825 
826 
827 #define macro_record_goto() if (recording==sci) { \
828     recorder->record(SCI_GOTOLINE,sci->GetLineNumber(),sci->GetColumnNumber()); \
829   }
830 
onGoto(FXObject * o,FXSelector sel,void * p)831 long TopWindow::onGoto(FXObject*o, FXSelector sel, void*p)
832 {
833   SciDoc*sci=FocusedDoc();
834   if ( srchdlgs->ShowGoToDialog() ) { macro_record_goto(); }
835   ClosedDialog();
836   return 1;
837 }
838 
839 
840 
onGotoSelected(FXObject * o,FXSelector sel,void * p)841 long TopWindow::onGotoSelected(FXObject*o, FXSelector sel, void*p)
842 {
843   SciDoc*sci=FocusedDoc();
844   if ( srchdlgs->GoToSelected() ) { macro_record_goto(); }
845   return 1;
846 }
847 
848 
849 
onFindSelected(FXObject * o,FXSelector sel,void * p)850 long TopWindow::onFindSelected(FXObject*o, FXSelector sel, void*p)
851 {
852   srchdlgs->FindSelected(FXSELID(sel)==ID_NEXT_SELECTED);
853   macro_record_search();
854   return 1;
855 }
856 
857 
858 
onZoom(FXObject * o,FXSelector sel,void * p)859 long TopWindow::onZoom(FXObject*o, FXSelector sel, void*p)
860 {
861   TabCallbacks::SetZoom(FocusedDoc(),sel,p,tabbook,(Settings*)prefs);
862   return 1;
863 }
864 
865 
866 
onShowLineNums(FXObject * o,FXSelector sel,void * p)867 long TopWindow::onShowLineNums( FXObject*o, FXSelector sel, void*p )
868 {
869   ShowLineNumbers((bool)((FXival)p));
870   return 1;
871 }
872 
873 
874 
onShowToolbar(FXObject * o,FXSelector sel,void * p)875 long TopWindow::onShowToolbar( FXObject*o, FXSelector sel, void*p )
876 {
877   ShowToolbar((bool)((FXival)p));
878   return 1;
879 }
880 
881 
882 
onShowWhiteSpace(FXObject * o,FXSelector sel,void * p)883 long TopWindow::onShowWhiteSpace(FXObject*o, FXSelector sel, void*p)
884 {
885   ShowWhiteSpace((bool)((FXival)p));
886   return 1;
887 }
888 
889 
890 
onShowMargin(FXObject * o,FXSelector sel,void * p)891 long TopWindow::onShowMargin(FXObject*o, FXSelector sel, void*p)
892 {
893   ShowMargin((bool)((FXival)p));
894   return 1;
895 }
896 
897 
898 
onShowIndent(FXObject * o,FXSelector sel,void * p)899 long TopWindow::onShowIndent(FXObject*o, FXSelector sel, void*p)
900 {
901   ShowIndent((bool)((FXival)p));
902   return 1;
903 }
904 
905 
906 
onShowCaretLine(FXObject * o,FXSelector sel,void * p)907 long TopWindow::onShowCaretLine(FXObject*o, FXSelector sel, void*p)
908 {
909   ShowCaretLine((bool)((FXival)p));
910   return 1;
911 }
912 
913 
914 
onShowOutputPane(FXObject * o,FXSelector sel,void * p)915 long TopWindow::onShowOutputPane(FXObject*o, FXSelector sel, void*p)
916 {
917   ShowOutputPane((bool)((FXival)p));
918   return 1;
919 }
920 
921 
922 
onShowStatusBar(FXObject * o,FXSelector sel,void * p)923 long TopWindow::onShowStatusBar(FXObject*o, FXSelector sel, void*p)
924 {
925   ShowStatusBar((bool)((FXival)p));
926   return 1;
927 }
928 
929 
930 
onPrefsDialog(FXObject * o,FXSelector sel,void * p)931 long TopWindow::onPrefsDialog(FXObject*o, FXSelector sel, void*p)
932 {
933   ShowPrefsDialog();
934   return 1;
935 }
936 
937 
938 
onCtrlTab(FXObject * o,FXSelector sel,void * p)939 long TopWindow::onCtrlTab(FXObject*o, FXSelector sel, void*p)
940 {
941   if (!FocusedDoc()->UseTabs()) {
942     FocusedDoc()->sendString(SCI_REPLACESEL,0,"\t");
943     return 1;
944   }
945   return 0;
946 }
947 
948 
949 
onIndent(FXObject * o,FXSelector sel,void * p)950 long TopWindow::onIndent(FXObject*o, FXSelector sel, void*p)
951 {
952   sel=FXSELID(sel);
953   SciDocUtils::Indent(FocusedDoc(), ID_INDENT_STEP==sel||ID_INDENT_FULL==sel,
954                                     ID_INDENT_STEP==sel||ID_UNINDENT_STEP==sel, prefs->IndentWidth);
955   return 1;
956 }
957 
958 
959 
onFilterSel(FXObject * o,FXSelector sel,void * p)960 long TopWindow::onFilterSel(FXObject*o, FXSelector sel, void*p)
961 {
962   ShowFilterDialog(FXSELID(sel)==ID_FILTER_SEL);
963   return 1;
964 }
965 
966 
967 
onKillCommand(FXObject * o,FXSelector sel,void * p)968 long TopWindow::onKillCommand(FXObject*o, FXSelector sel, void*p)
969 {
970   command_timeout=true;
971   return 1;
972 }
973 
974 
975 
onRunCommand(FXObject * o,FXSelector sel,void * p)976 long TopWindow::onRunCommand(FXObject*o, FXSelector sel, void*p)
977 {
978   ShowCommandDialog();
979   return 1;
980 }
981 
982 
983 
onOutlistFocus(FXObject * o,FXSelector sel,void * p)984 long TopWindow::onOutlistFocus(FXObject*o, FXSelector sel, void*p)
985 {
986   if (outlist->Focus()) { skipfocus=true; }
987   return 1;
988 }
989 
990 
991 
onGoToError(FXObject * o,FXSelector sel,void * p)992 long TopWindow::onGoToError(FXObject*o, FXSelector sel, void*p)
993 {
994   outlist->GoToError();
995   return 1;
996 }
997 
998 
999 
onChangeCase(FXObject * o,FXSelector sel,void * p)1000 long TopWindow::onChangeCase(FXObject*o, FXSelector sel, void*p)
1001 {
1002   ChangeCase(FXSELID(sel)==ID_TOUPPER);
1003   return 1;
1004 }
1005 
1006 
1007 
TopWindow(FXApp * a)1008 TopWindow::TopWindow(FXApp *a):TopWindowBase(a)
1009 {
1010   hsplit->setSelector(ID_SPLIT_CHANGED);
1011   tabbook->setSelector(ID_TAB_SWITCHED);
1012   statusbar->SetKillID(ID_KILL_COMMAND);
1013   filedlgs->setSelector(ID_FILE_SAVED);
1014   srchdlgs->setSelector(ID_FOUND_SEARCH);
1015   SciDocUtils::SetScintillaSelector(ID_SCINTILLA);
1016   SciDocUtils::SetMacroRecordSelector(ID_MACRO_RECORD);
1017   ShowOutputPane(prefs->ShowOutputPane);
1018   ShowStatusBar(prefs->ShowStatusBar);
1019 }
1020 
1021