fpide.pas 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898
  1. {
  2. $Id$
  3. This file is part of the Free Pascal Integrated Development Environment
  4. Copyright (c) 1998 by Berczi Gabor
  5. Main IDEApp object
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. unit fpide;
  13. interface
  14. uses
  15. Objects,Drivers,Views,App,Gadgets,MsgBox,
  16. {$ifdef EDITORS}Editors,{$else}WEditor,{$endif}
  17. Comphook,Browcol,
  18. FPViews,FPSymbol;
  19. type
  20. TExecType = (exNormal,exNoSwap,exDosShell);
  21. TIDEApp = object(TApplication)
  22. constructor Init;
  23. procedure InitMenuBar; virtual;
  24. procedure InitStatusLine; virtual;
  25. procedure Open(FileName: string);
  26. function OpenSearch(FileName: string) : boolean;
  27. function SaveAll: boolean;
  28. procedure Idle; virtual;
  29. procedure Update;
  30. procedure HandleEvent(var Event: TEvent); virtual;
  31. procedure GetTileRect(var R: TRect); virtual;
  32. function GetPalette: PPalette; virtual;
  33. procedure DosShell; virtual;
  34. destructor Done; virtual;
  35. public
  36. procedure ShowUserScreen;
  37. procedure ShowIDEScreen;
  38. private
  39. procedure NewEditor;
  40. procedure NewFromTemplate;
  41. procedure OpenRecentFile(RecentIndex: integer);
  42. procedure ChangeDir;
  43. procedure ShowClipboard;
  44. procedure FindProcedure;
  45. procedure Objects;
  46. procedure Modules;
  47. procedure Globals;
  48. procedure Parameters;
  49. procedure DoStepOver;
  50. procedure DoTraceInto;
  51. procedure DoRun;
  52. procedure DoResetDebugger;
  53. procedure DoContToCursor;
  54. procedure Target;
  55. procedure DoCompilerMessages;
  56. procedure DoPrimaryFile;
  57. procedure DoClearPrimary;
  58. procedure DoUserScreenWindow;
  59. procedure DoUserScreen;
  60. procedure DoOpenGDBWindow;
  61. procedure DoToggleBreak;
  62. procedure DoInformation;
  63. procedure Messages;
  64. procedure Calculator;
  65. procedure DoAsciiTable;
  66. procedure ExecuteTool(Idx: integer);
  67. procedure SetSwitchesMode;
  68. procedure DoCompilerSwitch;
  69. procedure MemorySizes;
  70. procedure DoLinkerSwitch;
  71. procedure DoDebuggerSwitch;
  72. procedure Directories;
  73. procedure Tools;
  74. procedure DoGrep;
  75. procedure Preferences;
  76. procedure EditorOptions(Editor: PEditor);
  77. procedure BrowserOptions(Browser: PBrowserWindow);
  78. procedure DesktopOptions;
  79. procedure Mouse;
  80. procedure StartUp;
  81. procedure Colors;
  82. procedure OpenINI;
  83. procedure SaveINI;
  84. procedure SaveAsINI;
  85. procedure CloseAll;
  86. procedure WindowList;
  87. procedure HelpContents;
  88. procedure HelpHelpIndex;
  89. procedure HelpTopicSearch;
  90. procedure HelpPrevTopic;
  91. procedure HelpUsingHelp;
  92. procedure HelpFiles;
  93. procedure About;
  94. private
  95. procedure DoExecute(ProgramPath, Params, InFile, OutFile: string; ExecType: TExecType);
  96. private
  97. procedure AddRecentFile(AFileName: string; CurX, CurY: integer);
  98. function SearchRecentFile(AFileName: string): integer;
  99. procedure RemoveRecentFile(Index: integer);
  100. private
  101. SaveCancelled: boolean;
  102. procedure CurDirChanged;
  103. procedure UpdatePrimaryFile;
  104. procedure UpdateINIFile;
  105. procedure UpdateRecentFileList;
  106. procedure UpdateTools;
  107. end;
  108. var
  109. MyApp: TIDEApp;
  110. implementation
  111. uses
  112. {$ifdef linux}
  113. linux,
  114. {$endif}
  115. Video,Mouse,Keyboard,
  116. Dos,Memory,Menus,Dialogs,StdDlg,ColorSel,Commands,HelpCtx,
  117. AsciiTab,
  118. Systems,
  119. WUtils,WHelp,WHlpView,WINI,WViews,
  120. FPConst,FPVars,FPUtils,FPSwitch,FPIni,FPIntf,FPCompile,FPHelp,
  121. FPTemplt,FPCalc,FPUsrScr,FPTools,{$ifndef NODEBUG}FPDebug,{$endif}FPRedir;
  122. function IDEUseSyntaxHighlight(Editor: PFileEditor): boolean; {$ifndef FPC}far;{$endif}
  123. begin
  124. IDEUseSyntaxHighlight:=(Editor^.FileName='') or MatchesFileList(NameAndExtOf(Editor^.FileName),HighlightExts);
  125. end;
  126. function IDEUseTabsPattern(Editor: PFileEditor): boolean; {$ifndef FPC}far;{$endif}
  127. begin
  128. IDEUseTabsPattern:=(Editor^.FileName='') or MatchesFileList(NameAndExtOf(Editor^.FileName),TabsPattern);
  129. end;
  130. constructor TIDEApp.Init;
  131. var R: TRect;
  132. begin
  133. {$ifndef EDITORS}
  134. UseSyntaxHighlight:=IDEUseSyntaxHighlight;
  135. UseTabsPattern:=IDEUseTabsPattern;
  136. {$endif}
  137. inherited Init;
  138. New(ClipboardWindow, Init);
  139. Desktop^.Insert(ClipboardWindow);
  140. New(CalcWindow, Init); CalcWindow^.Hide;
  141. Desktop^.Insert(CalcWindow);
  142. {$ifndef OLDCOMP}
  143. New(CompilerMessageWindow, Init);
  144. CompilerMessageWindow^.Hide;
  145. Desktop^.Insert(CompilerMessageWindow);
  146. {$else}
  147. New(ProgramInfoWindow, Init);
  148. ProgramInfoWindow^.Hide;
  149. Desktop^.Insert(ProgramInfoWindow);
  150. {$endif}
  151. Message(@Self,evBroadcast,cmUpdate,nil);
  152. CurDirChanged;
  153. { heap viewer }
  154. GetExtent(R); Dec(R.B.X); R.A.X:=R.B.X-9; R.A.Y:=R.B.Y-1;
  155. New(HeapView, InitKb(R));
  156. Insert(HeapView);
  157. end;
  158. procedure TIDEApp.InitMenuBar;
  159. var R: TRect;
  160. begin
  161. GetExtent(R); R.B.Y:=R.A.Y+1;
  162. MenuBar:=New(PAdvancedMenuBar, Init(R, NewMenu(
  163. NewSubMenu('~F~ile',hcFileMenu, NewMenu(
  164. NewItem('~N~ew','',kbNoKey,cmNew,hcNew,
  165. NewItem('New from ~t~emplate...','',kbNoKey,cmNewFromTemplate,hcNewFromTemplate,
  166. NewItem('~O~pen...','F3',kbF3,cmOpen,hcOpen,
  167. NewItem('~S~ave','F2',kbF2,cmSave,hcSave,
  168. NewItem('Save ~a~s...','',kbNoKey,cmSaveAs,hcSaveAs,
  169. NewItem('Save a~l~l','',kbNoKey,cmSaveAll,hcSaveAll,
  170. NewLine(
  171. NewItem('~C~hange dir...','',kbNoKey,cmChangeDir,hcChangeDir,
  172. NewItem('~D~OS shell','',kbNoKey,cmDOSShell,hcDOSShell,
  173. NewItem('E~x~it','Alt+X',kbNoKey,cmQuit,hcQuit,
  174. nil))))))))))),
  175. NewSubMenu('~E~dit',hcEditMenu, NewMenu(
  176. NewItem('~U~ndo','Alt+BkSp', kbAltBack, cmUndo, hcUndo,
  177. NewItem('~R~edo','', kbNoKey, cmRedo, hcRedo,
  178. NewLine(
  179. NewItem('Cu~t~','Shift+Del', kbShiftDel, cmCut, hcCut,
  180. NewItem('~C~opy','Ctrl+Ins', kbCtrlIns, cmCopy, hcCut,
  181. NewItem('~P~aste','Shift+Ins', kbShiftIns, cmPaste, hcPaste,
  182. NewItem('C~l~ear','Ctrl+Del', kbCtrlDel, cmClear, hcClear,
  183. NewLine(
  184. NewItem('~S~how clipboard','', kbNoKey, cmShowClipboard, hcShowClipboard,
  185. nil)))))))))),
  186. NewSubMenu('~S~earch',hcSearchMenu, NewMenu(
  187. NewItem('~F~ind...','', kbNoKey, cmFind, hcFind,
  188. NewItem('~R~eplace...','', kbNoKey, cmReplace, hcReplace,
  189. NewItem('~S~earch again','', kbNoKey, cmSearchAgain, hcSearchAgain,
  190. NewLine(
  191. NewItem('~G~o to line number...','', kbNoKey, cmJumpLine, hcGotoLine,
  192. NewItem('Find ~p~rocedure...','', kbNoKey, cmFindProcedure, hcFindProcedure,
  193. NewLine(
  194. NewItem('~O~bjects','', kbNoKey, cmObjects, hcObjects,
  195. NewItem('Mod~u~les','', kbNoKey, cmModules, hcModules,
  196. NewItem('G~l~obals','', kbNoKey, cmGlobals, hcGlobals,
  197. nil))))))))))),
  198. NewSubMenu('~R~un',hcRunMenu, NewMenu(
  199. NewItem('~R~un','Ctrl+F9', kbCtrlF9, cmRun, hcRun,
  200. NewItem('~S~tep over','F8', kbF8, cmStepOver, hcRun,
  201. NewItem('~T~race into','F7', kbF7, cmTraceInto, hcRun,
  202. NewItem('~G~oto Cursor','F4', kbF4, cmContToCursor, hcContToCursor,
  203. NewItem('P~a~rameters...','', kbNoKey, cmParameters, hcParameters,
  204. NewItem('~P~rogram reset','Ctrl+F2', kbCtrlF2, cmResetDebugger, hcResetDebugger,
  205. nil))))))),
  206. NewSubMenu('~C~ompile',hcCompileMenu, NewMenu(
  207. NewItem('~C~ompile','Alt+F9', kbAltF9, cmCompile, hcCompile,
  208. NewItem('~M~ake','F9', kbF9, cmMake, hcMake,
  209. NewItem('~B~uild','', kbNoKey, cmBuild, hcBuild,
  210. NewLine(
  211. NewItem('~T~arget...','', kbNoKey, cmTarget, hcTarget,
  212. NewItem('~P~rimary file...','', kbNoKey, cmPrimaryFile, hcPrimaryFile,
  213. NewItem('C~l~ear primary file','', kbNoKey, cmClearPrimary, hcClearPrimary,
  214. NewLine(
  215. NewItem('~I~nformation...','', kbNoKey, cmInformation, hcInformation,
  216. NewItem('C~o~mpiler messages','F12', kbF12, cmCompilerMessages, hcCompilerMessages,
  217. nil))))))))))),
  218. NewSubMenu('~D~ebug', hcDebugMenu, NewMenu(
  219. NewItem('~O~utput','', kbNoKey, cmUserScreenWindow, hcUserScreenWindow,
  220. NewItem('~U~ser screen','Alt+F5', kbAltF5, cmUserScreen, hcUserScreen,
  221. NewItem('~B~reakpoint','Ctrl+F8', kbCtrlF8, cmToggleBreakpoint, hcToggleBreakpoint,
  222. NewItem('~G~DB window','', kbNoKey, cmOpenGDBWindow, hcOpenGDBWindow,
  223. nil))))),
  224. NewSubMenu('~T~ools', hcToolsMenu, NewMenu(
  225. NewItem('~M~essages', 'F11', kbF11, cmToolsMessages, hcToolsMessages,
  226. NewItem('Goto ~n~ext','Alt+F8', kbAltF8, cmToolsMsgNext, hcToolsMsgNext,
  227. NewItem('Goto ~p~revious','Alt+F7', kbAltF7, cmToolsMsgPrev, hcToolsMsgPrev,
  228. NewLine(
  229. NewItem('~G~rep', 'Shift+F2', kbShiftF2, cmGrep, hcGrep,
  230. NewItem('~C~alculator', '', kbNoKey, cmCalculator, hcCalculator,
  231. NewItem('Ascii ~t~able', '', kbNoKey, cmAsciiTable, hcAsciiTable,
  232. nil)))))))),
  233. NewSubMenu('~O~ptions', hcOptionsMenu, NewMenu(
  234. NewItem('Mode~.~..','', kbNoKey, cmSwitchesMode, hcSwitchesMode,
  235. NewItem('~C~ompiler...','', kbNoKey, cmCompiler, hcCompiler,
  236. NewItem('~M~emory sizes...','', kbNoKey, cmMemorySizes, hcMemorySizes,
  237. NewItem('~L~inker...','', kbNoKey, cmLinker, hcLinker,
  238. NewItem('De~b~ugger...','', kbNoKey, cmDebugger, hcDebugger,
  239. NewItem('~D~irectories...','', kbNoKey, cmDirectories, hcDirectories,
  240. NewItem('Bro~w~ser...','',kbNoKey, cmBrowser, hcBrowser,
  241. NewItem('~T~ools...','', kbNoKey, cmTools, hcTools,
  242. NewLine(
  243. NewSubMenu('~E~nvironment', hcEnvironmentMenu, NewMenu(
  244. NewItem('~P~references...','', kbNoKey, cmPreferences, hcPreferences,
  245. NewItem('~E~ditor...','', kbNoKey, cmEditor, hcEditor,
  246. NewItem('~D~esktop...','', kbNoKey, cmDesktopOptions, hcDesktopOptions,
  247. NewItem('~M~ouse...','', kbNoKey, cmMouse, hcMouse,
  248. NewItem('~S~tartup...','', kbNoKey, cmStartup, hcStartup,
  249. NewItem('~C~olors...','', kbNoKey, cmColors, hcColors,
  250. nil))))))),
  251. NewLine(
  252. NewItem('~O~pen...','', kbNoKey, cmOpenINI, hcOpenINI,
  253. NewItem('~S~ave','', kbNoKey, cmSaveINI, hcSaveINI,
  254. NewItem('Save ~a~s...','', kbNoKey, cmSaveAsINI, hcSaveAsINI,
  255. nil))))))))))))))),
  256. NewSubMenu('~W~indow', hcWindowMenu, NewMenu(
  257. NewItem('~T~ile','', kbNoKey, cmTile, hcTile,
  258. NewItem('C~a~scade','', kbNoKey, cmCascade, hcCascade,
  259. NewItem('Cl~o~se all','', kbNoKey, cmCloseAll, hcCloseAll,
  260. NewLine(
  261. NewItem('~S~ize/Move','Ctrl+F5', kbCtrlF5, cmResize, hcResize,
  262. NewItem('~Z~oom','F5', kbF5, cmZoom, hcZoom,
  263. NewItem('~N~ext','F6', kbF6, cmNext, hcNext,
  264. NewItem('~P~revious','Shift+F6', kbShiftF6, cmPrev, hcPrev,
  265. NewItem('~C~lose','Alt+F3', kbAltF3, cmClose, hcClose,
  266. NewLine(
  267. NewItem('~L~ist...','Alt+0', kbAlt0, cmWindowList, hcWindowList,
  268. NewItem('~R~efresh display','', kbNoKey, cmUpdate, hcUpdate,
  269. nil))))))))))))),
  270. NewSubMenu('~H~elp', hcHelpMenu, NewMenu(
  271. NewItem('~C~ontents','', kbNoKey, cmHelpContents, hcHelpContents,
  272. NewItem('~I~ndex','Shift+F1', kbShiftF1, cmHelpIndex, hcHelpIndex,
  273. NewItem('~T~opic search','Ctrl+F1', kbCtrlF1, cmHelpTopicSearch, hcHelpTopicSearch,
  274. NewItem('~P~revious topic','Alt+F1', kbAltF1, cmHelpPrevTopic, hcHelpPrevTopic,
  275. NewItem('~U~sing help','',kbNoKey, cmHelpUsingHelp, hcHelpUsingHelp,
  276. NewItem('~F~iles...','',kbNoKey, cmHelpFiles, hcHelpFiles,
  277. NewLine(
  278. NewItem('~A~bout...','',kbNoKey, cmAbout, hcAbout,
  279. nil))))))))),
  280. nil)))))))))))));
  281. DisableCommands(EditorCmds+SourceCmds+CompileCmds);
  282. Update;
  283. end;
  284. procedure TIDEApp.InitStatusLine;
  285. var
  286. R: TRect;
  287. begin
  288. GetExtent(R);
  289. R.A.Y := R.B.Y - 1;
  290. StatusLine:=New(PIDEStatusLine, Init(R,
  291. NewStatusDef(hcFirstCommand, hcLastCommand,
  292. NewStatusKey('~F1~ Help', kbF1, cmHelp,
  293. StdStatusKeys(
  294. nil)),
  295. NewStatusDef(hcHelpWindow, hcHelpWindow,
  296. NewStatusKey('~F1~ Help on help', kbF1, cmHelpUsingHelp,
  297. NewStatusKey('~Alt+F1~ Previous topic', kbAltF1, cmHelpPrevTopic,
  298. NewStatusKey('~Shift+F1~ Help index', kbShiftF1, cmHelpIndex,
  299. NewStatusKey('~Esc~ Close help', kbEsc, cmClose,
  300. StdStatusKeys(
  301. nil))))),
  302. NewStatusDef(hcSourceWindow, hcSourceWindow,
  303. NewStatusKey('~F1~ Help', kbF1, cmHelp,
  304. NewStatusKey('~F2~ Save', kbF2, cmSave,
  305. NewStatusKey('~F3~ Open', kbF3, cmOpen,
  306. NewStatusKey('~Alt+F9~ Compile', kbAltF9, cmCompile,
  307. NewStatusKey('~F9~ Make', kbF9, cmMake,
  308. NewStatusKey('~Alt+F10~ Local menu', kbAltF10, cmLocalMenu,
  309. StdStatusKeys(
  310. nil))))))),
  311. NewStatusDef(hcMessagesWindow, hcMessagesWindow,
  312. NewStatusKey('~F1~ Help', kbF1, cmHelp,
  313. NewStatusKey('~'+EnterSign+'~ Goto source', kbEnter, cmMsgGotoSource,
  314. NewStatusKey('~Space~ Track source', kbNoKey, cmMsgTrackSource,
  315. NewStatusKey('~Alt+F10~ Local menu', kbAltF10, cmLocalMenu,
  316. StdStatusKeys(
  317. nil))))),
  318. NewStatusDef(hcCalcWindow, hcCalcWindow,
  319. NewStatusKey('~F1~ Help', kbF1, cmHelp,
  320. NewStatusKey('~Esc~ Close', kbEsc, cmClose,
  321. NewStatusKey('~Ctrl+Enter~ Transfer result', kbCtrlEnter, cmCalculatorPaste,
  322. StdStatusKeys(
  323. nil)))),
  324. NewStatusDef(0, $FFFF,
  325. NewStatusKey('~F1~ Help', kbF1, cmHelp,
  326. NewStatusKey('~F3~ Open', kbF3, cmOpen,
  327. NewStatusKey('~Alt+F9~ Compile', kbAltF9, cmCompile,
  328. NewStatusKey('~F9~ Make', kbF9, cmMake,
  329. NewStatusKey('~Alt+F10~ Local menu', kbAltF10, cmLocalMenu,
  330. StdStatusKeys(
  331. nil)))))),
  332. nil))))))));
  333. end;
  334. procedure TIDEApp.Idle;
  335. begin
  336. inherited Idle;
  337. Message(Application,evIdle,0,nil);
  338. end;
  339. procedure TIDEApp.HandleEvent(var Event: TEvent);
  340. var DontClear: boolean;
  341. begin
  342. case Event.What of
  343. evCommand :
  344. begin
  345. DontClear:=false;
  346. case Event.Command of
  347. cmUpdate : Message(Application,evBroadcast,cmUpdate,nil);
  348. { -- File menu -- }
  349. cmNew : NewEditor;
  350. cmNewFromTemplate: NewFromTemplate;
  351. cmOpen : begin
  352. if (DirOf(OpenFileName)='') or (Pos(ListSeparator,OpenFileName)<>0) then
  353. OpenFileName:=LocateFile(OpenFileName);
  354. Open(OpenFileName);
  355. OpenFileName:='';
  356. end;
  357. cmSaveAll : SaveAll;
  358. cmChangeDir : ChangeDir;
  359. cmDOSShell : DOSShell;
  360. cmRecentFileBase..
  361. cmRecentFileBase+10
  362. : OpenRecentFile(Event.Command-cmRecentFileBase);
  363. { -- Edit menu -- }
  364. cmShowClipboard : ShowClipboard;
  365. { -- Search menu -- }
  366. cmFindProcedure : FindProcedure;
  367. cmObjects : Objects;
  368. cmModules : Modules;
  369. cmGlobals : Globals;
  370. { -- Run menu -- }
  371. cmParameters : Parameters;
  372. cmStepOver : DoStepOver;
  373. cmTraceInto : DoTraceInto;
  374. cmRun : DoRun;
  375. cmResetDebugger : DoResetDebugger;
  376. cmContToCursor : DoContToCursor;
  377. { -- Compile menu -- }
  378. cmCompile : DoCompile(cCompile);
  379. cmBuild : DoCompile(cBuild);
  380. cmMake : DoCompile(cMake);
  381. cmTarget : Target;
  382. cmPrimaryFile : DoPrimaryFile;
  383. cmClearPrimary : DoClearPrimary;
  384. cmInformation : DoInformation;
  385. cmCompilerMessages : DoCompilerMessages;
  386. { -- Debug menu -- }
  387. cmUserScreen : DoUserScreen;
  388. cmToggleBreakpoint : DoToggleBreak;
  389. cmOpenGDBWindow : DoOpenGDBWindow;
  390. { -- Options menu -- }
  391. cmSwitchesMode : SetSwitchesMode;
  392. cmCompiler : DoCompilerSwitch;
  393. cmMemorySizes : MemorySizes;
  394. cmLinker : DoLinkerSwitch;
  395. cmDebugger : DoDebuggerSwitch;
  396. cmDirectories : Directories;
  397. cmTools : Tools;
  398. cmPreferences : Preferences;
  399. cmEditor : EditorOptions(nil);
  400. cmEditorOptions : EditorOptions(Event.InfoPtr);
  401. cmBrowser : BrowserOptions(nil);
  402. cmBrowserOptions : BrowserOptions(Event.InfoPtr);
  403. cmMouse : Mouse;
  404. cmStartup : StartUp;
  405. cmDesktopOptions: DesktopOptions;
  406. cmColors : Colors;
  407. cmOpenINI : OpenINI;
  408. cmSaveINI : SaveINI;
  409. cmSaveAsINI : SaveAsINI;
  410. { -- Tools menu -- }
  411. cmToolsMessages : Messages;
  412. cmCalculator : Calculator;
  413. cmAsciiTable : DoAsciiTable;
  414. cmGrep : DoGrep;
  415. cmToolsBase+1..
  416. cmToolsBase+MaxToolCount
  417. : ExecuteTool(Event.Command-cmToolsBase);
  418. { -- Window menu -- }
  419. cmCloseAll : CloseAll;
  420. cmWindowList : WindowList;
  421. cmUserScreenWindow: DoUserScreenWindow;
  422. { -- Help menu -- }
  423. cmHelpContents : HelpContents;
  424. cmHelpIndex : HelpHelpIndex;
  425. { cmHelpTopicSearch: HelpTopicSearch;}
  426. cmHelpPrevTopic : HelpPrevTopic;
  427. cmHelpUsingHelp : HelpUsingHelp;
  428. cmHelpFiles : HelpFiles;
  429. cmAbout : About;
  430. else DontClear:=true;
  431. end;
  432. if DontClear=false then ClearEvent(Event);
  433. end;
  434. evBroadcast :
  435. case Event.Command of
  436. cmSaveCancelled :
  437. SaveCancelled:=true;
  438. cmUpdateTools :
  439. UpdateTools;
  440. cmCommandSetChanged :
  441. UpdateMenu(MenuBar^.Menu);
  442. cmUpdate :
  443. Update;
  444. cmSourceWndClosing :
  445. begin
  446. with PSourceWindow(Event.InfoPtr)^ do
  447. if Editor^.FileName<>'' then
  448. AddRecentFile(Editor^.FileName,Editor^.CurPos.X,Editor^.CurPos.Y);
  449. {$ifndef NODEBUG}
  450. if assigned(Debugger) and (PView(Event.InfoPtr)=Debugger^.LastSource) then
  451. Debugger^.LastSource:=nil;
  452. {$endif}
  453. end;
  454. end;
  455. end;
  456. inherited HandleEvent(Event);
  457. end;
  458. procedure TIDEApp.GetTileRect(var R: TRect);
  459. begin
  460. Desktop^.GetExtent(R);
  461. { Leave the compiler messages window in the bottom }
  462. if assigned(CompilerMessageWindow) then
  463. R.B.Y:=CompilerMessageWindow^.Origin.Y;
  464. { Leave the messages window in the bottom }
  465. if assigned(MessagesWindow) and (MessagesWindow^.Origin.Y<R.B.Y) then
  466. R.B.Y:=MessagesWindow^.Origin.Y;
  467. end;
  468. {****************************************************************************
  469. Switch Screens
  470. ****************************************************************************}
  471. procedure TIDEApp.ShowUserScreen;
  472. begin
  473. DoneSysError;
  474. DoneEvents;
  475. DoneMouse;
  476. DoneScreen; { this is available in FV app.pas (PFV) }
  477. DoneDosMem;
  478. if Assigned(UserScreen) then
  479. UserScreen^.SwitchTo;
  480. end;
  481. procedure TIDEApp.ShowIDEScreen;
  482. begin
  483. if Assigned(UserScreen) then
  484. UserScreen^.SwitchBack;
  485. InitDosMem;
  486. InitScreen;
  487. InitMouse;
  488. InitEvents;
  489. InitSysError;
  490. Redraw;
  491. CurDirChanged;
  492. Message(Application,evBroadcast,cmUpdate,nil);
  493. UpdateScreen(true);
  494. end;
  495. procedure TIDEApp.DoExecute(ProgramPath, Params, InFile,OutFile: string; ExecType: TExecType);
  496. begin
  497. if UserScreen=nil then
  498. begin
  499. ErrorBox('Sorry, user screen not available.',nil);
  500. Exit;
  501. end;
  502. if ExecType<>exNoSwap then
  503. ShowUserScreen;
  504. if ExecType=exDosShell then
  505. WriteShellMsg;
  506. {$ifdef linux}
  507. Shell(ProgramPath+' '+Params);
  508. {$else}
  509. if (InFile='') and (OutFile='') then
  510. Dos.Exec(GetEnv('COMSPEC'),'/C '+ProgramPath+' '+Params)
  511. else
  512. ExecuteRedir(GetEnv('COMSPEC'),'/C '+ProgramPath+' '+Params,InFile,OutFile,'stderr');
  513. {$endif}
  514. if ExecType<>exNoSwap then
  515. ShowIDEScreen;
  516. end;
  517. procedure TIDEApp.Update;
  518. begin
  519. SetCmdState([cmSaveAll],IsThereAnyEditor);
  520. SetCmdState([cmCloseAll,cmTile,cmCascade,cmWindowList],IsThereAnyWindow);
  521. SetCmdState([cmFindProcedure,cmObjects,cmModules,cmGlobals{,cmInformation}],IsSymbolInfoAvailable);
  522. {$ifndef NODEBUG}
  523. SetCmdState([cmResetDebugger],assigned(debugger) and debugger^.debugger_started);
  524. {$endif}
  525. SetCmdState([cmToolsMsgNext,cmToolsMsgPrev],MessagesWindow<>nil);
  526. UpdateTools;
  527. UpdateRecentFileList;
  528. UpdatePrimaryFile;
  529. UpdateINIFile;
  530. Message(Application,evBroadcast,cmCommandSetChanged,nil);
  531. end;
  532. procedure TIDEApp.CurDirChanged;
  533. begin
  534. Message(Application,evBroadcast,cmUpdateTitle,nil);
  535. UpdatePrimaryFile;
  536. UpdateINIFile;
  537. UpdateMenu(MenuBar^.Menu);
  538. end;
  539. procedure TIDEApp.UpdatePrimaryFile;
  540. begin
  541. SetMenuItemParam(SearchMenuItem(MenuBar^.Menu,cmPrimaryFile),SmartPath(PrimaryFile));
  542. SetCmdState([cmClearPrimary],PrimaryFile<>'');
  543. if PrimaryFile<>'' then
  544. SetCmdState(CompileCmds,true);
  545. UpdateMenu(MenuBar^.Menu);
  546. Message(ProgramInfoWindow,evBroadcast,cmUpdate,nil);
  547. end;
  548. procedure TIDEApp.UpdateINIFile;
  549. begin
  550. SetMenuItemParam(SearchMenuItem(MenuBar^.Menu,cmSaveINI),SmartPath(INIPath));
  551. end;
  552. procedure TIDEApp.UpdateRecentFileList;
  553. var P: PMenuItem;
  554. ID,I: word;
  555. FileMenu: PMenuItem;
  556. begin
  557. ID:=cmRecentFileBase;
  558. FileMenu:=SearchSubMenu(MenuBar^.Menu,menuFile);
  559. repeat
  560. { Inc(ID);
  561. P:=SearchMenuItem(FileMenu^.SubMenu,ID);
  562. if FileMenu^.SubMenu^.Default=P then
  563. FileMenu^.SubMenu^.Default:=FileMenu^.SubMenu^.Items;
  564. if P<>nil then RemoveMenuItem(FileMenu^.SubMenu,P);}
  565. P:=GetMenuItemBefore(FileMenu^.SubMenu,nil);
  566. if (P<>nil) then
  567. begin
  568. if (cmRecentFileBase<P^.Command) and (P^.Command<=cmRecentFileBase+MaxRecentFileCount) then
  569. begin
  570. RemoveMenuItem(FileMenu^.SubMenu,P);
  571. if FileMenu^.SubMenu^.Default=P then
  572. FileMenu^.SubMenu^.Default:=FileMenu^.SubMenu^.Items;
  573. end
  574. else
  575. P:=nil;
  576. end;
  577. until P=nil;
  578. P:=GetMenuItemBefore(FileMenu^.SubMenu,nil);
  579. if (P<>nil) and IsSeparator(P) then
  580. RemoveMenuItem(FileMenu^.SubMenu,P);
  581. if RecentFileCount>0 then
  582. AppendMenuItem(FileMenu^.SubMenu,NewLine(nil));
  583. for I:=1 to RecentFileCount do
  584. begin
  585. P:=NewItem('~'+IntToStr(I)+'~. '+SmartPath(RecentFiles[I].FileName),' ',
  586. kbNoKey,cmRecentFileBase+I,hcRecentFileBase+I,nil);
  587. AppendMenuItem(FileMenu^.SubMenu,P);
  588. end;
  589. end;
  590. procedure TIDEApp.UpdateTools;
  591. var P: PMenuItem;
  592. ID,I: word;
  593. ToolsMenu: PMenuItem;
  594. S1,S2,S3: string;
  595. W: word;
  596. begin
  597. ID:=cmToolsBase;
  598. ToolsMenu:=SearchSubMenu(MenuBar^.Menu,menuTools);
  599. repeat
  600. P:=GetMenuItemBefore(ToolsMenu^.SubMenu,nil);
  601. if (P<>nil) then
  602. begin
  603. if (cmToolsBase<P^.Command) and (P^.Command<=cmToolsBase+MaxToolCount) then
  604. begin
  605. RemoveMenuItem(ToolsMenu^.SubMenu,P);
  606. if ToolsMenu^.SubMenu^.Default=P then
  607. ToolsMenu^.SubMenu^.Default:=ToolsMenu^.SubMenu^.Items;
  608. end
  609. else
  610. P:=nil;
  611. end;
  612. until P=nil;
  613. P:=GetMenuItemBefore(ToolsMenu^.SubMenu,nil);
  614. if (P<>nil) and IsSeparator(P) then
  615. RemoveMenuItem(ToolsMenu^.SubMenu,P);
  616. if GetToolCount>0 then
  617. AppendMenuItem(ToolsMenu^.SubMenu,NewLine(nil));
  618. for I:=1 to GetToolCount do
  619. begin
  620. GetToolParams(I-1,S1,S2,S3,W);
  621. P:=NewItem(S1,KillTilde(GetHotKeyName(W)),W,cmToolsBase+I,hcToolsBase+I,nil);
  622. AppendMenuItem(ToolsMenu^.SubMenu,P);
  623. end;
  624. end;
  625. procedure TIDEApp.DosShell;
  626. begin
  627. DoExecute(GetEnv('COMSPEC'), '', '', '', exDosShell);
  628. end;
  629. {$I FPMFILE.INC}
  630. {$I FPMEDIT.INC}
  631. {$I FPMSRCH.INC}
  632. {$I FPMRUN.INC}
  633. {$I FPMCOMP.INC}
  634. {$I FPMDEBUG.INC}
  635. {$I FPMTOOLS.INC}
  636. {$I FPMOPTS.INC}
  637. {$I FPMWND.INC}
  638. {$I FPMHELP.INC}
  639. procedure TIDEApp.AddRecentFile(AFileName: string; CurX, CurY: integer);
  640. begin
  641. if SearchRecentFile(AFileName)<>-1 then Exit;
  642. if RecentFileCount>0 then
  643. Move(RecentFiles[1],RecentFiles[2],SizeOf(RecentFiles[1])*Min(RecentFileCount,High(RecentFiles)-1));
  644. if RecentFileCount<High(RecentFiles) then Inc(RecentFileCount);
  645. with RecentFiles[1] do
  646. begin
  647. FileName:=AFileName;
  648. LastPos.X:=CurX; LastPos.Y:=CurY;
  649. end;
  650. UpdateRecentFileList;
  651. end;
  652. function TIDEApp.SearchRecentFile(AFileName: string): integer;
  653. var Idx,I: integer;
  654. begin
  655. Idx:=-1;
  656. for I:=1 to RecentFileCount do
  657. if UpcaseStr(AFileName)=UpcaseStr(RecentFiles[I].FileName) then
  658. begin Idx:=I; Break; end;
  659. SearchRecentFile:=Idx;
  660. end;
  661. procedure TIDEApp.RemoveRecentFile(Index: integer);
  662. begin
  663. if Index<RecentFileCount then
  664. Move(RecentFiles[Index+1],RecentFiles[Index],SizeOf(RecentFiles[1])*(RecentFileCount-Index));
  665. Dec(RecentFileCount);
  666. end;
  667. function TIDEApp.GetPalette: PPalette;
  668. var P: string;
  669. begin
  670. P:=AppPalette;
  671. GetPalette:=@P;
  672. end;
  673. destructor TIDEApp.Done;
  674. begin
  675. inherited Done;
  676. DoneHelpSystem;
  677. end;
  678. END.
  679. {
  680. $Log$
  681. Revision 1.27 1999-05-22 13:44:30 peter
  682. * fixed couple of bugs
  683. Revision 1.26 1999/04/07 21:55:47 peter
  684. + object support for browser
  685. * html help fixes
  686. * more desktop saving things
  687. * NODEBUG directive to exclude debugger
  688. Revision 1.25 1999/03/23 15:11:29 peter
  689. * desktop saving things
  690. * vesa mode
  691. * preferences dialog
  692. Revision 1.24 1999/03/19 16:04:29 peter
  693. * new compiler dialog
  694. Revision 1.23 1999/03/16 12:38:10 peter
  695. * tools macro fixes
  696. + tph writer
  697. + first things for resource files
  698. Revision 1.22 1999/03/12 01:13:57 peter
  699. * flag if trytoopen should look for other extensions
  700. + browser tab in the tools-compiler
  701. Revision 1.21 1999/03/02 13:48:29 peter
  702. * fixed far problem is fpdebug
  703. * tile/cascading with message window
  704. * grep fixes
  705. Revision 1.20 1999/03/01 15:41:54 peter
  706. + Added dummy entries for functions not yet implemented
  707. * MenuBar didn't update itself automatically on command-set changes
  708. * Fixed Debugging/Profiling options dialog
  709. * TCodeEditor converts spaces to tabs at save only if efUseTabChars is
  710. set
  711. * efBackSpaceUnindents works correctly
  712. + 'Messages' window implemented
  713. + Added '$CAP MSG()' and '$CAP EDIT' to available tool-macros
  714. + Added TP message-filter support (for ex. you can call GREP thru
  715. GREP2MSG and view the result in the messages window - just like in TP)
  716. * A 'var' was missing from the param-list of THelpFacility.TopicSearch,
  717. so topic search didn't work...
  718. * In FPHELP.PAS there were still context-variables defined as word instead
  719. of THelpCtx
  720. * StdStatusKeys() was missing from the statusdef for help windows
  721. + Topic-title for index-table can be specified when adding a HTML-files
  722. Revision 1.19 1999/02/22 11:51:36 peter
  723. * browser updates from gabor
  724. Revision 1.18 1999/02/22 02:15:13 peter
  725. + default extension for save in the editor
  726. + Separate Text to Find for the grep dialog
  727. * fixed redir crash with tp7
  728. Revision 1.17 1999/02/20 15:18:30 peter
  729. + ctrl-c capture with confirm dialog
  730. + ascii table in the tools menu
  731. + heapviewer
  732. * empty file fixed
  733. * fixed callback routines in fpdebug to have far for tp7
  734. Revision 1.16 1999/02/18 13:44:31 peter
  735. * search fixed
  736. + backward search
  737. * help fixes
  738. * browser updates
  739. Revision 1.15 1999/02/16 10:43:55 peter
  740. * use -dGDB for the compiler
  741. * only use gdb_file when -dDEBUG is used
  742. * profiler switch is now a toggle instead of radiobutton
  743. Revision 1.14 1999/02/11 19:07:22 pierre
  744. * GDBWindow redesigned :
  745. normal editor apart from
  746. that any kbEnter will send the line (for begin to cursor)
  747. to GDB command !
  748. GDBWindow opened in Debugger Menu
  749. still buggy :
  750. -echo should not be present if at end of text
  751. -GDBWindow becomes First after each step (I don't know why !)
  752. Revision 1.13 1999/02/10 09:54:11 pierre
  753. * cmSourceWindowClosing resets Debugger LastSource field to avoid problems
  754. Revision 1.12 1999/02/08 17:43:44 pierre
  755. * RestDebugger or multiple running of debugged program now works
  756. + added DoContToCursor(F4)
  757. * Breakpoints are now inserted correctly (was mainlyy a problem
  758. of directories)
  759. Revision 1.11 1999/02/08 10:37:44 peter
  760. + html helpviewer
  761. Revision 1.7 1999/02/04 13:32:03 pierre
  762. * Several things added (I cannot commit them independently !)
  763. + added TBreakpoint and TBreakpointCollection
  764. + added cmResetDebugger,cmGrep,CmToggleBreakpoint
  765. + Breakpoint list in INIFile
  766. * Select items now also depend of SwitchMode
  767. * Reading of option '-g' was not possible !
  768. + added search for -Fu args pathes in TryToOpen
  769. + added code for automatic opening of FileDialog
  770. if source not found
  771. Revision 1.6 1999/02/02 16:41:39 peter
  772. + automatic .pas/.pp adding by opening of file
  773. * better debuggerscreen changes
  774. Revision 1.5 1999/01/22 18:13:22 pierre
  775. * DoneScreen Removed I did not find any such proc ??
  776. Revision 1.4 1999/01/22 10:24:03 peter
  777. * first debugger things
  778. Revision 1.3 1999/01/21 11:54:14 peter
  779. + tools menu
  780. + speedsearch in symbolbrowser
  781. * working run command
  782. Revision 1.2 1999/01/14 21:42:20 peter
  783. * source tracking from Gabor
  784. Revision 1.1 1999/01/12 14:29:34 peter
  785. + Implemented still missing 'switch' entries in Options menu
  786. + Pressing Ctrl-B sets ASCII mode in editor, after which keypresses (even
  787. ones with ASCII < 32 ; entered with Alt+<###>) are interpreted always as
  788. ASCII chars and inserted directly in the text.
  789. + Added symbol browser
  790. * splitted fp.pas to fpide.pas
  791. Revision 1.4 1999/01/04 11:49:41 peter
  792. * 'Use tab characters' now works correctly
  793. + Syntax highlight now acts on File|Save As...
  794. + Added a new class to syntax highlight: 'hex numbers'.
  795. * There was something very wrong with the palette managment. Now fixed.
  796. + Added output directory (-FE<xxx>) support to 'Directories' dialog...
  797. * Fixed some possible bugs in Running/Compiling, and the compilation/run
  798. process revised
  799. Revision 1.2 1998/12/28 15:47:40 peter
  800. + Added user screen support, display & window
  801. + Implemented Editor,Mouse Options dialog
  802. + Added location of .INI and .CFG file
  803. + Option (INI) file managment implemented (see bottom of Options Menu)
  804. + Switches updated
  805. + Run program
  806. Revision 1.3 1998/12/22 10:39:38 peter
  807. + options are now written/read
  808. + find and replace routines
  809. }