fpide.pas 26 KB

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