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