fpide.pas 25 KB

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