fpide.pas 21 KB

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