fpide.pas 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727
  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. Drivers,Views,App,
  16. {$ifdef EDITORS}Editors,{$else}WEditor,{$endif}
  17. Comphook,
  18. FPViews;
  19. type
  20. TIDEApp = object(TApplication)
  21. constructor Init;
  22. procedure InitMenuBar; virtual;
  23. procedure InitStatusLine; virtual;
  24. procedure Open(FileName: string);
  25. function OpenSearch(FileName: string) : boolean;
  26. procedure HandleEvent(var Event: TEvent); virtual;
  27. function GetPalette: PPalette; virtual;
  28. procedure DosShell; virtual;
  29. destructor Done; virtual;
  30. public
  31. procedure ShowUserScreen;
  32. procedure ShowIDEScreen;
  33. private
  34. procedure NewEditor;
  35. procedure NewFromTemplate;
  36. procedure OpenRecentFile(RecentIndex: integer);
  37. procedure SaveAll;
  38. procedure ChangeDir;
  39. procedure ShowClipboard;
  40. procedure Objects;
  41. procedure Modules;
  42. procedure Globals;
  43. procedure Parameters;
  44. procedure DoStepOver;
  45. procedure DoTraceInto;
  46. procedure DoRun;
  47. procedure DoResetDebugger;
  48. procedure DoContToCursor;
  49. procedure Target;
  50. procedure PrimaryFile_;
  51. procedure ClearPrimary;
  52. procedure DoUserScreenWindow;
  53. procedure DoUserScreen;
  54. procedure DoToggleBreak;
  55. procedure Information;
  56. procedure Calculator;
  57. procedure ExecuteTool(Idx: integer);
  58. procedure SetSwitchesMode;
  59. procedure DoCompilerSwitch;
  60. procedure MemorySizes;
  61. procedure DoLinkerSwitch;
  62. procedure DoDebuggerSwitch;
  63. procedure Directories;
  64. procedure Tools;
  65. procedure Grep;
  66. procedure EditorOptions(Editor: PEditor);
  67. procedure Mouse;
  68. procedure Colors;
  69. procedure OpenINI;
  70. procedure SaveINI;
  71. procedure SaveAsINI;
  72. procedure CloseAll;
  73. procedure WindowList;
  74. procedure HelpContents;
  75. procedure HelpHelpIndex;
  76. procedure HelpTopicSearch;
  77. procedure HelpPrevTopic;
  78. procedure HelpUsingHelp;
  79. procedure HelpFiles;
  80. procedure About;
  81. private
  82. procedure DoExecute(ProgramPath, Params: string; IsDOSShell: boolean);
  83. private
  84. procedure AddRecentFile(AFileName: string; CurX, CurY: integer);
  85. function SearchRecentFile(AFileName: string): integer;
  86. procedure RemoveRecentFile(Index: integer);
  87. private
  88. procedure Update;
  89. procedure CurDirChanged;
  90. procedure UpdatePrimaryFile;
  91. procedure UpdateINIFile;
  92. procedure UpdateRecentFileList;
  93. procedure UpdateTools;
  94. end;
  95. var
  96. MyApp: TIDEApp;
  97. implementation
  98. uses
  99. Video,Mouse,Keyboard,
  100. Dos,Objects,Memory,Menus,Dialogs,StdDlg,ColorSel,Commands,HelpCtx,
  101. Systems,BrowCol,
  102. WHelp,WHlpView,WINI,
  103. FPConst,FPVars,FPUtils,FPSwitch,FPIni,FPIntf,FPCompile,FPHelp,
  104. FPTemplt,FPCalc,FPUsrScr,FPSymbol,FPTools,FPDebug,FPRedir;
  105. function IDEUseSyntaxHighlight(Editor: PFileEditor): boolean; {$ifndef FPC}far;{$endif}
  106. begin
  107. IDEUseSyntaxHighlight:=(Editor^.FileName='') or MatchesFileList(NameAndExtOf(Editor^.FileName),HighlightExts);
  108. end;
  109. function IDEUseTabsPattern(Editor: PFileEditor): boolean; {$ifndef FPC}far;{$endif}
  110. begin
  111. IDEUseTabsPattern:=(Editor^.FileName='') or MatchesFileList(NameAndExtOf(Editor^.FileName),TabsPattern);
  112. end;
  113. constructor TIDEApp.Init;
  114. begin
  115. {$ifndef EDITORS}
  116. UseSyntaxHighlight:=IDEUseSyntaxHighlight;
  117. UseTabsPattern:=IDEUseTabsPattern;
  118. {$endif}
  119. inherited Init;
  120. New(ClipboardWindow, Init);
  121. Desktop^.Insert(ClipboardWindow);
  122. New(CalcWindow, Init); CalcWindow^.Hide;
  123. Desktop^.Insert(CalcWindow);
  124. New(ProgramInfoWindow, Init);
  125. ProgramInfoWindow^.Hide;
  126. Desktop^.Insert(ProgramInfoWindow);
  127. Message(@Self,evBroadcast,cmUpdate,nil);
  128. InitTemplates;
  129. CurDirChanged;
  130. end;
  131. procedure TIDEApp.InitMenuBar;
  132. var R: TRect;
  133. begin
  134. GetExtent(R); R.B.Y:=R.A.Y+1;
  135. MenuBar:=New(PAdvancedMenuBar, Init(R, NewMenu(
  136. NewSubMenu('~F~ile',hcFileMenu, NewMenu(
  137. NewItem('~N~ew','',kbNoKey,cmNew,hcNew,
  138. NewItem('New from ~t~emplate...','',kbNoKey,cmNewFromTemplate,hcNewFromTemplate,
  139. NewItem('~O~pen...','F3',kbF3,cmOpen,hcOpen,
  140. NewItem('~S~ave','F2',kbF2,cmSave,hcSave,
  141. NewItem('Save ~a~s...','',kbNoKey,cmSaveAs,hcSaveAs,
  142. NewItem('Save a~l~l','',kbNoKey,cmSaveAll,hcSaveAll,
  143. NewLine(
  144. NewItem('~C~hange dir...','',kbNoKey,cmChangeDir,hcChangeDir,
  145. NewItem('~D~OS shell','',kbNoKey,cmDOSShell,hcDOSShell,
  146. NewItem('E~x~it','Alt+X',kbNoKey,cmQuit,hcQuit,
  147. nil))))))))))),
  148. NewSubMenu('~E~dit',hcEditMenu, NewMenu(
  149. NewItem('~U~ndo','Alt+BkSp', kbAltBack, cmUndo, hcUndo,
  150. NewItem('~R~edo','', kbNoKey, cmRedo, hcRedo,
  151. NewLine(
  152. NewItem('Cu~t~','Shift+Del', kbShiftDel, cmCut, hcCut,
  153. NewItem('~C~opy','Ctrl+Ins', kbCtrlIns, cmCopy, hcCut,
  154. NewItem('~P~aste','Shift+Ins', kbShiftIns, cmPaste, hcPaste,
  155. NewItem('C~l~ear','Ctrl+Del', kbCtrlDel, cmClear, hcClear,
  156. NewLine(
  157. NewItem('~S~how clipboard','', kbNoKey, cmShowClipboard, hcShowClipboard,
  158. nil)))))))))),
  159. NewSubMenu('~S~earch',hcSearchMenu, NewMenu(
  160. NewItem('~F~ind...','', kbNoKey, cmFind, hcFind,
  161. NewItem('~R~eplace...','', kbNoKey, cmReplace, hcReplace,
  162. NewItem('~S~earch again','', kbNoKey, cmSearchAgain, hcSearchAgain,
  163. NewLine(
  164. NewItem('~G~o to line number...','', kbNoKey, cmJumpLine, hcGotoLine,
  165. NewItem('Find ~p~rocedure...','', kbNoKey, cmFindProcedure, hcFindProcedure,
  166. NewLine(
  167. NewItem('~O~bjects','', kbNoKey, cmObjects, hcObjects,
  168. NewItem('Mod~u~les','', kbNoKey, cmModules, hcModules,
  169. NewItem('G~l~obals','', kbNoKey, cmGlobals, hcGlobals,
  170. nil))))))))))),
  171. NewSubMenu('~R~un',hcRunMenu, NewMenu(
  172. NewItem('~R~un','Ctrl+F9', kbCtrlF9, cmRun, hcRun,
  173. NewItem('~S~tep over','F8', kbF8, cmStepOver, hcRun,
  174. NewItem('~T~race into','F7', kbF7, cmTraceInto, hcRun,
  175. NewItem('~G~oto Cursor','F4', kbF4, cmContToCursor, hcContToCursor,
  176. NewItem('P~a~rameters...','', kbNoKey, cmParameters, hcParameters,
  177. NewItem('~P~rogram reset','Ctrl+F2', kbCtrlF2, cmResetDebugger, hcResetDebugger,
  178. nil))))))),
  179. NewSubMenu('~C~ompile',hcCompileMenu, NewMenu(
  180. NewItem('~C~ompile','Alt+F9', kbAltF9, cmCompile, hcCompile,
  181. NewItem('~M~ake','F9', kbF9, cmMake, hcMake,
  182. NewItem('~B~uild','', kbNoKey, cmBuild, hcBuild,
  183. NewLine(
  184. NewItem('~T~arget...','', kbNoKey, cmTarget, hcTarget,
  185. NewItem('~P~rimary file...','', kbNoKey, cmPrimaryFile, hcPrimaryFile,
  186. NewItem('C~l~ear primary file','', kbNoKey, cmClearPrimary, hcClearPrimary,
  187. NewLine(
  188. NewItem('~I~nformation...','', kbNoKey, cmInformation, hcInformation,
  189. nil)))))))))),
  190. NewSubMenu('~D~ebug', hcDebugMenu, NewMenu(
  191. NewItem('~O~utput','', kbNoKey, cmUserScreenWindow, hcUserScreenWindow,
  192. NewItem('~U~ser screen','Alt+F5', kbAltF5, cmUserScreen, hcUserScreen,
  193. NewItem('~B~reakpoint','Ctrl+F8', kbCtrlF8, cmToggleBreakpoint, hcToggleBreakpoint,
  194. nil)))),
  195. NewSubMenu('~T~ools', hcToolsMenu, NewMenu(
  196. NewItem('~M~essages', '', kbNoKey, cmToolsMessages, hcToolsMessages,
  197. NewLine(
  198. NewItem('~G~rep', 'Shift+F2', kbShiftF2, cmGrep, hcGrep,
  199. NewItem('~C~alculator', '', kbNoKey, cmCalculator, hcCalculator,
  200. nil))))),
  201. NewSubMenu('~O~ptions', hcOptionsMenu, NewMenu(
  202. NewItem('Mode~.~..','', kbNoKey, cmSwitchesMode, hcSwitchesMode,
  203. NewItem('~C~ompiler...','', kbNoKey, cmCompiler, hcCompiler,
  204. NewItem('~M~emory sizes...','', kbNoKey, cmMemorySizes, hcMemorySizes,
  205. NewItem('~L~inker...','', kbNoKey, cmLinker, hcLinker,
  206. NewItem('De~b~ugger...','', kbNoKey, cmDebugger, hcDebugger,
  207. NewItem('~D~irectories...','', kbNoKey, cmDirectories, hcDirectories,
  208. NewItem('~T~ools...','', kbNoKey, cmTools, hcTools,
  209. NewLine(
  210. NewSubMenu('~E~nvironment', hcEnvironmentMenu, NewMenu(
  211. NewItem('~P~references...','', kbNoKey, cmPreferences, hcPreferences,
  212. NewItem('~E~ditor...','', kbNoKey, cmEditor, hcEditor,
  213. NewItem('~M~ouse...','', kbNoKey, cmMouse, hcMouse,
  214. NewItem('~S~tartup...','', kbNoKey, cmStartup, hcStartup,
  215. NewItem('~C~olors...','', kbNoKey, cmColors, hcColors,
  216. nil)))))),
  217. NewLine(
  218. NewItem('~O~pen...','', kbNoKey, cmOpenINI, hcOpenINI,
  219. NewItem('~S~ave','', kbNoKey, cmSaveINI, hcSaveINI,
  220. NewItem('Save ~a~s...','', kbNoKey, cmSaveAsINI, hcSaveAsINI,
  221. nil)))))))))))))),
  222. NewSubMenu('~W~indow', hcWindowMenu, NewMenu(
  223. NewItem('~T~ile','', kbNoKey, cmTile, hcTile,
  224. NewItem('C~a~scade','', kbNoKey, cmCascade, hcCascade,
  225. NewItem('Cl~o~se all','', kbNoKey, cmCloseAll, hcCloseAll,
  226. NewLine(
  227. NewItem('~S~ize/Move','Ctrl+F5', kbCtrlF5, cmResize, hcResize,
  228. NewItem('~Z~oom','F5', kbF5, cmZoom, hcZoom,
  229. NewItem('~N~ext','F6', kbF6, cmNext, hcNext,
  230. NewItem('~P~revious','Shift+F6', kbShiftF6, cmPrev, hcPrev,
  231. NewItem('~C~lose','Alt+F3', kbAltF3, cmClose, hcClose,
  232. NewLine(
  233. NewItem('~L~ist...','Alt+0', kbAlt0, cmWindowList, hcWindowList,
  234. NewItem('~R~efresh display','', kbNoKey, cmUpdate, hcUpdate,
  235. nil))))))))))))),
  236. NewSubMenu('~H~elp', hcHelpMenu, NewMenu(
  237. NewItem('~C~ontents','', kbNoKey, cmHelpContents, hcHelpContents,
  238. NewItem('~I~ndex','Shift+F1', kbShiftF1, cmHelpIndex, hcHelpIndex,
  239. NewItem('~T~opic search','Ctrl+F1', kbCtrlF1, cmHelpTopicSearch, hcHelpTopicSearch,
  240. NewItem('~P~revious topic','Alt+F1', kbAltF1, cmHelpPrevTopic, hcHelpPrevTopic,
  241. NewItem('~U~sing help','',kbNoKey, cmHelpUsingHelp, hcHelpUsingHelp,
  242. NewItem('~F~iles...','',kbNoKey, cmHelpFiles, hcHelpFiles,
  243. NewLine(
  244. NewItem('~A~bout...','',kbNoKey, cmAbout, hcAbout,
  245. nil))))))))),
  246. nil)))))))))))));
  247. DisableCommands(EditorCmds+SourceCmds+CompileCmds);
  248. Update;
  249. end;
  250. procedure TIDEApp.InitStatusLine;
  251. var
  252. R: TRect;
  253. begin
  254. GetExtent(R);
  255. R.A.Y := R.B.Y - 1;
  256. StatusLine:=New(PIDEStatusLine, Init(R,
  257. NewStatusDef(hcFirstCommand, hcLastCommand,
  258. NewStatusKey('~F1~ Help', kbF1, cmHelp,
  259. StdStatusKeys(
  260. nil)),
  261. NewStatusDef(hcHelpWindow, hcHelpWindow,
  262. NewStatusKey('~F1~ Help on help', kbF1, cmHelpUsingHelp,
  263. NewStatusKey('~Alt+F1~ Previous topic', kbAltF1, cmHelpPrevTopic,
  264. NewStatusKey('~Shift+F1~ Help index', kbShiftF1, cmHelpIndex,
  265. NewStatusKey('~Esc~ Close help', kbEsc, cmClose,
  266. nil)))),
  267. NewStatusDef(hcSourceWindow, hcSourceWindow,
  268. NewStatusKey('~F1~ Help', kbF1, cmHelp,
  269. NewStatusKey('~F2~ Save', kbF2, cmSave,
  270. NewStatusKey('~F3~ Open', kbF3, cmOpen,
  271. NewStatusKey('~Alt+F9~ Compile', kbAltF9, cmCompile,
  272. NewStatusKey('~F9~ Make', kbF9, cmMake,
  273. NewStatusKey('~Alt+F10~ Local menu', kbAltF10, cmLocalMenu,
  274. StdStatusKeys(
  275. nil))))))),
  276. NewStatusDef(hcCalcWindow, hcCalcWindow,
  277. NewStatusKey('~F1~ Help', kbF1, cmHelp,
  278. NewStatusKey('~Esc~ Close', kbEsc, cmClose,
  279. NewStatusKey('~Ctrl+Enter~ Transfer result', kbCtrlEnter, cmCalculatorPaste,
  280. StdStatusKeys(
  281. nil)))),
  282. NewStatusDef(0, $FFFF,
  283. NewStatusKey('~F1~ Help', kbF1, cmHelp,
  284. NewStatusKey('~F3~ Open', kbF3, cmOpen,
  285. NewStatusKey('~Alt+F9~ Compile', kbAltF9, cmCompile,
  286. NewStatusKey('~F9~ Make', kbF9, cmMake,
  287. NewStatusKey('~Alt+F10~ Local menu', kbAltF10, cmLocalMenu,
  288. StdStatusKeys(
  289. nil)))))),
  290. nil)))))));
  291. end;
  292. procedure TIDEApp.HandleEvent(var Event: TEvent);
  293. var DontClear: boolean;
  294. begin
  295. case Event.What of
  296. evCommand :
  297. begin
  298. DontClear:=false;
  299. case Event.Command of
  300. cmUpdate : Message(Application,evBroadcast,cmUpdate,nil);
  301. { -- File menu -- }
  302. cmNew : NewEditor;
  303. cmNewFromTemplate: NewFromTemplate;
  304. cmOpen : begin
  305. if (DirOf(OpenFileName)='') or (Pos(ListSeparator,OpenFileName)<>0) then
  306. OpenFileName:=LocateFile(OpenFileName);
  307. Open(OpenFileName);
  308. OpenFileName:='';
  309. end;
  310. cmSaveAll : SaveAll;
  311. cmChangeDir : ChangeDir;
  312. cmDOSShell : DOSShell;
  313. cmRecentFileBase..
  314. cmRecentFileBase+10
  315. : OpenRecentFile(Event.Command-cmRecentFileBase);
  316. { -- Edit menu -- }
  317. cmShowClipboard : ShowClipboard;
  318. { -- Search menu -- }
  319. cmObjects : Objects;
  320. cmModules : Modules;
  321. cmGlobals : Globals;
  322. { -- Run menu -- }
  323. cmParameters : Parameters;
  324. cmStepOver : DoStepOver;
  325. cmTraceInto : DoTraceInto;
  326. cmRun : DoRun;
  327. cmResetDebugger : DoResetDebugger;
  328. cmContToCursor : DoContToCursor;
  329. { -- Compile menu -- }
  330. cmCompile : DoCompile(cCompile);
  331. cmBuild : DoCompile(cBuild);
  332. cmMake : DoCompile(cMake);
  333. cmTarget : Target;
  334. cmPrimaryFile : PrimaryFile_;
  335. cmClearPrimary : ClearPrimary;
  336. cmInformation : Information;
  337. { -- Debug menu -- }
  338. cmUserScreen : DoUserScreen;
  339. cmToggleBreakpoint : DoToggleBreak;
  340. { -- Options menu -- }
  341. cmSwitchesMode : SetSwitchesMode;
  342. cmCompiler : DoCompilerSwitch;
  343. cmMemorySizes : MemorySizes;
  344. cmLinker : DoLinkerSwitch;
  345. cmDebugger : DoDebuggerSwitch;
  346. cmDirectories : Directories;
  347. cmTools : Tools;
  348. cmEditor : EditorOptions(nil);
  349. cmEditorOptions : EditorOptions(Event.InfoPtr);
  350. cmMouse : Mouse;
  351. cmColors : Colors;
  352. cmOpenINI : OpenINI;
  353. cmSaveINI : SaveINI;
  354. cmSaveAsINI : SaveAsINI;
  355. { -- Tools menu -- }
  356. cmCalculator : Calculator;
  357. cmGrep : Grep;
  358. cmToolsBase+1..
  359. cmToolsBase+MaxToolCount
  360. : ExecuteTool(Event.Command-cmToolsBase);
  361. { -- Window menu -- }
  362. cmCloseAll : CloseAll;
  363. cmWindowList : WindowList;
  364. cmUserScreenWindow: DoUserScreenWindow;
  365. { -- Help menu -- }
  366. cmHelpContents : HelpContents;
  367. cmHelpIndex : HelpHelpIndex;
  368. { cmHelpTopicSearch: HelpTopicSearch;}
  369. cmHelpPrevTopic : HelpPrevTopic;
  370. cmHelpUsingHelp : HelpUsingHelp;
  371. cmHelpFiles : HelpFiles;
  372. cmAbout : About;
  373. else DontClear:=true;
  374. end;
  375. if DontClear=false then ClearEvent(Event);
  376. end;
  377. evBroadcast :
  378. case Event.Command of
  379. cmUpdateTools :
  380. UpdateTools;
  381. cmUpdate :
  382. Update;
  383. cmSourceWndClosing :
  384. begin
  385. with PSourceWindow(Event.InfoPtr)^ do
  386. if Editor^.FileName<>'' then
  387. AddRecentFile(Editor^.FileName,Editor^.CurPos.X,Editor^.CurPos.Y);
  388. if assigned(Debugger) and (PView(Event.InfoPtr)=Debugger^.LastSource) then
  389. Debugger^.LastSource:=nil;
  390. end;
  391. end;
  392. end;
  393. inherited HandleEvent(Event);
  394. end;
  395. {****************************************************************************
  396. Switch Screens
  397. ****************************************************************************}
  398. procedure TIDEApp.ShowUserScreen;
  399. begin
  400. DoneSysError;
  401. DoneEvents;
  402. DoneMouse;
  403. DoneScreen; { this is available in FV app.pas (PFV) }
  404. DoneDosMem;
  405. if Assigned(UserScreen) then
  406. UserScreen^.SwitchTo;
  407. end;
  408. procedure TIDEApp.ShowIDEScreen;
  409. begin
  410. if Assigned(UserScreen) then
  411. UserScreen^.SwitchBack;
  412. InitDosMem;
  413. InitScreen;
  414. InitMouse;
  415. InitEvents;
  416. InitSysError;
  417. Redraw;
  418. CurDirChanged;
  419. Message(Application,evBroadcast,cmUpdate,nil);
  420. UpdateScreen(true);
  421. end;
  422. procedure TIDEApp.DoExecute(ProgramPath, Params: string; IsDosShell: boolean);
  423. begin
  424. if UserScreen=nil then
  425. begin
  426. ErrorBox('Sorry, user screen not available.',nil);
  427. Exit;
  428. end;
  429. ShowUserScreen;
  430. if IsDOSShell then
  431. WriteShellMsg;
  432. SwapVectors;
  433. Dos.Exec(GetEnv('COMSPEC'),'/C '+ProgramPath+' '+Params);
  434. SwapVectors;
  435. ShowIDEScreen;
  436. end;
  437. procedure TIDEApp.Update;
  438. begin
  439. SetCmdState([cmSaveAll],IsThereAnyEditor);
  440. SetCmdState([cmCloseAll,cmTile,cmCascade,cmWindowList],IsThereAnyWindow);
  441. SetCmdState([cmFindProcedure,cmObjects,cmModules,cmGlobals{,cmInformation}],IsSymbolInfoAvailable);
  442. SetCmdState([cmResetDebugger],assigned(debugger) and debugger^.debugger_started);
  443. UpdatePrimaryFile;
  444. UpdateINIFile;
  445. Message(MenuBar,evBroadcast,cmUpdate,nil);
  446. UpdateRecentFileList;
  447. UpdateTools;
  448. Message(Application,evBroadcast,cmCommandSetChanged,nil);
  449. end;
  450. procedure TIDEApp.CurDirChanged;
  451. begin
  452. Message(Application,evBroadcast,cmUpdateTitle,nil);
  453. UpdatePrimaryFile;
  454. UpdateINIFile;
  455. UpdateMenu(MenuBar^.Menu);
  456. end;
  457. procedure TIDEApp.UpdatePrimaryFile;
  458. begin
  459. SetMenuItemParam(SearchMenuItem(MenuBar^.Menu,cmPrimaryFile),SmartPath(PrimaryFile));
  460. SetCmdState([cmClearPrimary],PrimaryFile<>'');
  461. if PrimaryFile<>'' then
  462. SetCmdState(CompileCmds,true);
  463. UpdateMenu(MenuBar^.Menu);
  464. Message(ProgramInfoWindow,evBroadcast,cmUpdate,nil);
  465. end;
  466. procedure TIDEApp.UpdateINIFile;
  467. begin
  468. SetMenuItemParam(SearchMenuItem(MenuBar^.Menu,cmSaveINI),SmartPath(INIPath));
  469. end;
  470. procedure TIDEApp.UpdateRecentFileList;
  471. var P: PMenuItem;
  472. ID,I: word;
  473. FileMenu: PMenuItem;
  474. begin
  475. ID:=cmRecentFileBase;
  476. FileMenu:=SearchSubMenu(MenuBar^.Menu,menuFile);
  477. repeat
  478. { Inc(ID);
  479. P:=SearchMenuItem(FileMenu^.SubMenu,ID);
  480. if FileMenu^.SubMenu^.Default=P then
  481. FileMenu^.SubMenu^.Default:=FileMenu^.SubMenu^.Items;
  482. if P<>nil then RemoveMenuItem(FileMenu^.SubMenu,P);}
  483. P:=GetMenuItemBefore(FileMenu^.SubMenu,nil);
  484. if (P<>nil) then
  485. begin
  486. if (cmRecentFileBase<P^.Command) and (P^.Command<=cmRecentFileBase+MaxRecentFileCount) then
  487. begin
  488. RemoveMenuItem(FileMenu^.SubMenu,P);
  489. if FileMenu^.SubMenu^.Default=P then
  490. FileMenu^.SubMenu^.Default:=FileMenu^.SubMenu^.Items;
  491. end
  492. else
  493. P:=nil;
  494. end;
  495. until P=nil;
  496. P:=GetMenuItemBefore(FileMenu^.SubMenu,nil);
  497. if (P<>nil) and IsSeparator(P) then
  498. RemoveMenuItem(FileMenu^.SubMenu,P);
  499. if RecentFileCount>0 then
  500. AppendMenuItem(FileMenu^.SubMenu,NewLine(nil));
  501. for I:=1 to RecentFileCount do
  502. begin
  503. P:=NewItem('~'+IntToStr(I)+'~. '+SmartPath(RecentFiles[I].FileName),' ',
  504. kbNoKey,cmRecentFileBase+I,hcRecentFileBase+I,nil);
  505. AppendMenuItem(FileMenu^.SubMenu,P);
  506. end;
  507. end;
  508. procedure TIDEApp.UpdateTools;
  509. var P: PMenuItem;
  510. ID,I: word;
  511. ToolsMenu: PMenuItem;
  512. S1,S2,S3: string;
  513. W: word;
  514. begin
  515. ID:=cmToolsBase;
  516. ToolsMenu:=SearchSubMenu(MenuBar^.Menu,menuTools);
  517. repeat
  518. P:=GetMenuItemBefore(ToolsMenu^.SubMenu,nil);
  519. if (P<>nil) then
  520. begin
  521. if (cmToolsBase<P^.Command) and (P^.Command<=cmToolsBase+MaxToolCount) then
  522. begin
  523. RemoveMenuItem(ToolsMenu^.SubMenu,P);
  524. if ToolsMenu^.SubMenu^.Default=P then
  525. ToolsMenu^.SubMenu^.Default:=ToolsMenu^.SubMenu^.Items;
  526. end
  527. else
  528. P:=nil;
  529. end;
  530. until P=nil;
  531. P:=GetMenuItemBefore(ToolsMenu^.SubMenu,nil);
  532. if (P<>nil) and IsSeparator(P) then
  533. RemoveMenuItem(ToolsMenu^.SubMenu,P);
  534. if GetToolCount>0 then
  535. AppendMenuItem(ToolsMenu^.SubMenu,NewLine(nil));
  536. for I:=1 to GetToolCount do
  537. begin
  538. GetToolParams(I-1,S1,S2,S3,W);
  539. P:=NewItem(S1,KillTilde(GetHotKeyName(W)),W,cmToolsBase+I,hcToolsBase+I,nil);
  540. AppendMenuItem(ToolsMenu^.SubMenu,P);
  541. end;
  542. end;
  543. procedure TIDEApp.DosShell;
  544. begin
  545. DoExecute(GetEnv('COMSPEC'), '', true);
  546. end;
  547. {$I FPMFILE.INC}
  548. {$I FPMEDIT.INC}
  549. {$I FPMSRCH.INC}
  550. {$I FPMRUN.INC}
  551. {$I FPMCOMP.INC}
  552. {$I FPMDEBUG.INC}
  553. {$I FPMTOOLS.INC}
  554. {$I FPMOPTS.INC}
  555. {$I FPMWND.INC}
  556. {$I FPMHELP.INC}
  557. procedure TIDEApp.AddRecentFile(AFileName: string; CurX, CurY: integer);
  558. begin
  559. if SearchRecentFile(AFileName)<>-1 then Exit;
  560. if RecentFileCount>0 then
  561. Move(RecentFiles[1],RecentFiles[2],SizeOf(RecentFiles[1])*Min(RecentFileCount,High(RecentFiles)-1));
  562. if RecentFileCount<High(RecentFiles) then Inc(RecentFileCount);
  563. with RecentFiles[1] do
  564. begin
  565. FileName:=AFileName;
  566. LastPos.X:=CurX; LastPos.Y:=CurY;
  567. end;
  568. UpdateRecentFileList;
  569. end;
  570. function TIDEApp.SearchRecentFile(AFileName: string): integer;
  571. var Idx,I: integer;
  572. begin
  573. Idx:=-1;
  574. for I:=1 to RecentFileCount do
  575. if UpcaseStr(AFileName)=UpcaseStr(RecentFiles[I].FileName) then
  576. begin Idx:=I; Break; end;
  577. SearchRecentFile:=Idx;
  578. end;
  579. procedure TIDEApp.RemoveRecentFile(Index: integer);
  580. begin
  581. if Index<RecentFileCount then
  582. Move(RecentFiles[Index+1],RecentFiles[Index],SizeOf(RecentFiles[1])*(RecentFileCount-Index));
  583. Dec(RecentFileCount);
  584. end;
  585. function TIDEApp.GetPalette: PPalette;
  586. var P: string;
  587. begin
  588. P:=AppPalette;
  589. GetPalette:=@P;
  590. end;
  591. destructor TIDEApp.Done;
  592. begin
  593. inherited Done;
  594. DoneHelpSystem;
  595. DoneTemplates;
  596. end;
  597. END.
  598. {
  599. $Log$
  600. Revision 1.13 1999-02-10 09:54:11 pierre
  601. * cmSourceWindowClosing resets Debugger LastSource field to avoid problems
  602. Revision 1.12 1999/02/08 17:43:44 pierre
  603. * RestDebugger or multiple running of debugged program now works
  604. + added DoContToCursor(F4)
  605. * Breakpoints are now inserted correctly (was mainlyy a problem
  606. of directories)
  607. Revision 1.11 1999/02/08 10:37:44 peter
  608. + html helpviewer
  609. Revision 1.7 1999/02/04 13:32:03 pierre
  610. * Several things added (I cannot commit them independently !)
  611. + added TBreakpoint and TBreakpointCollection
  612. + added cmResetDebugger,cmGrep,CmToggleBreakpoint
  613. + Breakpoint list in INIFile
  614. * Select items now also depend of SwitchMode
  615. * Reading of option '-g' was not possible !
  616. + added search for -Fu args pathes in TryToOpen
  617. + added code for automatic opening of FileDialog
  618. if source not found
  619. Revision 1.6 1999/02/02 16:41:39 peter
  620. + automatic .pas/.pp adding by opening of file
  621. * better debuggerscreen changes
  622. Revision 1.5 1999/01/22 18:13:22 pierre
  623. * DoneScreen Removed I did not find any such proc ??
  624. Revision 1.4 1999/01/22 10:24:03 peter
  625. * first debugger things
  626. Revision 1.3 1999/01/21 11:54:14 peter
  627. + tools menu
  628. + speedsearch in symbolbrowser
  629. * working run command
  630. Revision 1.2 1999/01/14 21:42:20 peter
  631. * source tracking from Gabor
  632. Revision 1.1 1999/01/12 14:29:34 peter
  633. + Implemented still missing 'switch' entries in Options menu
  634. + Pressing Ctrl-B sets ASCII mode in editor, after which keypresses (even
  635. ones with ASCII < 32 ; entered with Alt+<###>) are interpreted always as
  636. ASCII chars and inserted directly in the text.
  637. + Added symbol browser
  638. * splitted fp.pas to fpide.pas
  639. Revision 1.4 1999/01/04 11:49:41 peter
  640. * 'Use tab characters' now works correctly
  641. + Syntax highlight now acts on File|Save As...
  642. + Added a new class to syntax highlight: 'hex numbers'.
  643. * There was something very wrong with the palette managment. Now fixed.
  644. + Added output directory (-FE<xxx>) support to 'Directories' dialog...
  645. * Fixed some possible bugs in Running/Compiling, and the compilation/run
  646. process revised
  647. Revision 1.2 1998/12/28 15:47:40 peter
  648. + Added user screen support, display & window
  649. + Implemented Editor,Mouse Options dialog
  650. + Added location of .INI and .CFG file
  651. + Option (INI) file managment implemented (see bottom of Options Menu)
  652. + Switches updated
  653. + Run program
  654. Revision 1.3 1998/12/22 10:39:38 peter
  655. + options are now written/read
  656. + find and replace routines
  657. }