fp.pas 20 KB

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