fp.pas 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530
  1. {
  2. $Id$
  3. This file is part of the Free Pascal Integrated Development Environment
  4. Copyright (c) 1998-2000 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 FP;
  13. {$I globdir.inc}
  14. (**********************************************************************)
  15. (* CONDITIONAL DEFINES *)
  16. (* - NODEBUG No Debugging support *)
  17. (* - TP Turbo Pascal mode *)
  18. (* - i386 Target is an i386 IDE *)
  19. (**********************************************************************)
  20. uses
  21. {$ifdef IDEHeapTrc}
  22. HeapTrc,
  23. {$endif IDEHeapTrc}
  24. {$ifdef go32v2}
  25. dpmiexcp,
  26. {$endif go32v2}
  27. {$ifdef fpc}
  28. keyboard,video,
  29. {$endif fpc}
  30. Dos,Objects,
  31. BrowCol,
  32. Drivers,Views,App,Dialogs,
  33. Menus,StdDlg,Validate,
  34. {$ifdef EDITORS}Editors{$else}WEditor,WCEdit{$endif},
  35. {$ifndef FVISION}
  36. ColorSel,
  37. ASCIITab,
  38. {$endif FVISION}
  39. WUtils,WViews,WHTMLScn,WHelp,
  40. FPIDE,FPCalc,FPCompil,
  41. FPIni,FPViews,FPConst,FPVars,FPUtils,FPHelp,FPSwitch,FPUsrScr,
  42. FPTools,{$ifndef NODEBUG}FPDebug,{$endif}FPTemplt,FPCatch,FPRedir,FPDesk,
  43. FPCodTmp,FPCodCmp;
  44. procedure ProcessParams(BeforeINI: boolean);
  45. function IsSwitch(const Param: string): boolean;
  46. begin
  47. IsSwitch:=(Param<>'') and (Param[1]<>DirSep) { <- allow UNIX root-relative paths }
  48. and (Param[1] in ['-','/']); { <- but still accept dos switch char, eg. '/' }
  49. end;
  50. var I: Sw_integer;
  51. Param: string;
  52. begin
  53. for I:=1 to ParamCount do
  54. begin
  55. Param:=System.ParamStr(I);
  56. if IsSwitch(Param) then
  57. begin
  58. Param:=copy(Param,2,255);
  59. if Param<>'' then
  60. if UpcaseStr(copy(Param,1,2))='HM' then
  61. { HeapMonitor }
  62. begin
  63. if (copy(Param,3,1)='+') or (copy(Param,3,1)='') then
  64. StartupOptions:=StartupOptions or soHeapMonitor
  65. else
  66. if (copy(Param,3,1)='-') then
  67. StartupOptions:=StartupOptions and not soHeapMonitor;
  68. end else
  69. {$ifdef go32v2}
  70. if UpcaseStr(Param)='NOLFN' then
  71. begin
  72. LFNSupport:=false;
  73. end else
  74. {$endif go32v2}
  75. if UpcaseStr(Param)='README' then
  76. begin
  77. ShowReadme:=true;
  78. end else
  79. case Upcase(Param[1]) of
  80. 'C' : { custom config file (BP compatiblity) }
  81. if BeforeINI then
  82. begin
  83. if (length(Param)>=1) and (Param[1] in['=',':']) then
  84. Delete(Param,1,1); { eat separator }
  85. IniFileName:=Param;
  86. end;
  87. 'R' : { enter the directory last exited from (BP comp.) }
  88. begin
  89. Param:=copy(Param,2,255);
  90. if (Param='') or (Param='+') then
  91. StartupOptions:=StartupOptions or soReturnToLastDir
  92. else
  93. if (Param='-') then
  94. StartupOptions:=StartupOptions and (not soReturnToLastDir);
  95. end;
  96. 'S' :
  97. if Length(Param)=1 then
  98. begin
  99. UseMouse:=false;
  100. ButtonCount:=0;
  101. end;
  102. {$ifdef fpc}
  103. 'F' :
  104. if Length(Param)=1 then
  105. NoExtendedFrame:=true;
  106. {$ifdef Unix}
  107. 'T' : DebuggeeTTY:=Copy(Param,2,High(Param));
  108. {$endif Unix}
  109. {$endif fpc}
  110. end;
  111. end
  112. else
  113. if not BeforeINI then
  114. TryToOpenFile(nil,Param,0,0,{false}true);
  115. end;
  116. end;
  117. Procedure MyStreamError(Var S: TStream); {$ifndef FPC}far;{$endif}
  118. var ErrS: string;
  119. begin
  120. case S.Status of
  121. stGetError : ErrS:='Get of unregistered object type';
  122. stPutError : ErrS:='Put of unregistered object type';
  123. else ErrS:='';
  124. end;
  125. if ErrS<>'' then
  126. begin
  127. {$ifdef GABOR}{$ifdef TP}asm int 3;end;{$endif}{$endif}
  128. if Assigned(Application) then
  129. ErrorBox('Stream error: '+#13+ErrS,nil)
  130. else
  131. writeln('Error: ',ErrS);
  132. end;
  133. end;
  134. procedure DelTempFiles;
  135. begin
  136. DeleteFile(FPOutFileName);
  137. DeleteFile(FPErrFileName);
  138. DeleteFile(GDBOutFileName);
  139. DeleteFile(GDBOutPutFileName);
  140. DeleteFile(GREPOutName);
  141. DeleteFile(GREPErrName);
  142. end;
  143. procedure RegisterIDEObjects;
  144. begin
  145. RegisterApp;
  146. RegisterCodeComplete;
  147. RegisterCodeTemplates;
  148. {$ifndef FVISION}
  149. RegisterColorSel;
  150. RegisterAsciiTab;
  151. {$endif FVISION}
  152. RegisterDialogs;
  153. {$ifdef EDITORS}
  154. RegisterEditors;
  155. {$else}
  156. RegisterWEditor;
  157. RegisterWCEdit;
  158. {$endif}
  159. RegisterFPCalc;
  160. RegisterFPCompile;
  161. RegisterFPTools;
  162. RegisterFPViews;
  163. {$ifndef NODEBUG}
  164. RegisterFPDebugViews;
  165. {$endif}
  166. RegisterMenus;
  167. RegisterStdDlg;
  168. RegisterSymbols;
  169. RegisterObjects;
  170. RegisterValidate;
  171. RegisterViews;
  172. RegisterWHTMLScan;
  173. RegisterWUtils;
  174. RegisterWViews;
  175. end;
  176. var CanExit : boolean;
  177. {$ifdef win32}
  178. ShowMouseExe : string;
  179. {$endif win32}
  180. BEGIN
  181. {$ifdef DEV}HeapLimit:=4096;{$endif}
  182. writeln('þ Free Pascal IDE Version '+VersionStr);
  183. {$ifdef win32}
  184. Win32ShowMouse;
  185. {$endif win32}
  186. ProcessParams(true);
  187. InitDirs;
  188. RegisterIDEObjects;
  189. StreamError:=@MyStreamError;
  190. ShowReadme:=ShowReadme or (LocateFile(INIFileName)='');
  191. {$ifdef VESA}
  192. InitVESAScreenModes;
  193. {$endif}
  194. InitRedir;
  195. {$ifndef NODEBUG}
  196. InitBreakpoints;
  197. InitWatches;
  198. {$endif}
  199. InitReservedWords;
  200. InitHelpFiles;
  201. InitSwitches;
  202. InitINIFile;
  203. InitUserScreen;
  204. InitTools;
  205. InitTemplates;
  206. InitCodeTemplates;
  207. InitCodeComplete;
  208. IDEApp.Init;
  209. CheckINIFile;
  210. ReadSwitches(SwitchesPath);
  211. { load all options after init because of open files }
  212. ReadINIFile;
  213. InitDesktopFile;
  214. LoadDesktop;
  215. ParseUserScreen;
  216. { why are the screen contents parsed at startup? Gabor }
  217. EnableCatchSignals;
  218. { Update IDE }
  219. IDEApp.Update;
  220. IDEApp.UpdateMode;
  221. IDEApp.UpdateTarget;
  222. ProcessParams(false);
  223. if ShowReadme then
  224. begin
  225. PutCommand(Application,evCommand,cmShowReadme,nil);
  226. ShowReadme:=false; { do not show next time }
  227. end;
  228. repeat
  229. IDEApp.Run;
  230. if (AutoSaveOptions and asEditorFiles)=0 then
  231. CanExit:=IDEApp.AskSaveAll
  232. else
  233. CanExit:=IDEApp.SaveAll;
  234. until CanExit;
  235. IDEApp.AutoSave;
  236. DoneDesktopFile;
  237. DelTempFiles;
  238. IDEApp.Done;
  239. WriteSwitches(SwitchesPath);
  240. DisableCatchSignals;
  241. DoneCodeComplete;
  242. DoneCodeTemplates;
  243. DoneTemplates;
  244. DoneTools;
  245. DoneUserScreen;
  246. DoneSwitches;
  247. DoneHelpFiles;
  248. DoneHelpFilesTypes;
  249. DoneReservedWords;
  250. DoneToolMessages;
  251. DoneBrowserCol;
  252. {$ifndef NODEBUG}
  253. DoneDebugger;
  254. DoneBreakpoints;
  255. DoneWatches;
  256. {$endif}
  257. {$ifdef fpc}
  258. Video.DoneVideo;
  259. Keyboard.DoneKeyboard;
  260. {$endif fpc}
  261. {$ifdef unix}
  262. Keyboard.RestoreStartMode;
  263. {$endif unix}
  264. StreamError:=nil;
  265. END.
  266. {
  267. $Log$
  268. Revision 1.2 2001-08-05 12:23:00 peter
  269. * Automatically support for fvision or old fv
  270. Revision 1.1 2001/08/04 11:30:22 peter
  271. * ide works now with both compiler versions
  272. Revision 1.1.2.10 2001/03/27 12:39:27 pierre
  273. * Use RestoreStartMode function for Unix
  274. Revision 1.1.2.9 2001/03/20 00:20:41 pierre
  275. * fix some memory leaks + several small enhancements
  276. Revision 1.1.2.8 2001/03/14 17:57:07 pierre
  277. * fix invisible mouse problem for win32 on win9X
  278. Revision 1.1.2.7 2000/12/20 14:27:48 pierre
  279. * fp.ini for unix
  280. Revision 1.1.2.6 2000/12/13 16:56:41 pierre
  281. + -t option to specify tty for program run input/output for unix
  282. Revision 1.1.2.5 2000/11/29 00:54:44 pierre
  283. + preserve window number and save special windows
  284. Revision 1.1.2.4 2000/11/09 08:53:35 pierre
  285. + -F option to force use of only one graphic set
  286. Revision 1.1.2.3 2000/09/27 22:32:26 pierre
  287. * suppress lineinfo explicit in _uses
  288. Revision 1.1.2.2 2000/08/16 18:46:14 peter
  289. [*] double clicking on a droplistbox caused GPF (due to invalid recurson)
  290. [*] Make, Build now possible even in Compiler Messages Window
  291. [+] when started in a new dir the IDE now ask whether to create a local
  292. config, or to use the one located in the IDE dir
  293. Revision 1.1.2.1 2000/07/18 05:50:22 michael
  294. + Merged Gabors fixes
  295. Revision 1.1 2000/07/13 09:48:34 michael
  296. + Initial import
  297. Revision 1.47 2000/06/16 08:50:40 pierre
  298. + new bunch of Gabor's changes
  299. Revision 1.46 2000/05/29 10:44:56 pierre
  300. + New bunch of Gabor's changes: see fixes.txt
  301. Revision 1.45 2000/05/02 08:42:26 pierre
  302. * new set of Gabor changes: see fixes.txt
  303. Revision 1.44 2000/04/25 08:42:32 pierre
  304. * New Gabor changes : see fixes.txt
  305. Revision 1.43 2000/04/18 11:42:36 pierre
  306. lot of Gabor changes : see fixes.txt
  307. Revision 1.42 2000/03/21 23:34:10 pierre
  308. adapted to wcedit addition by Gabor
  309. Revision 1.41 2000/03/13 20:41:34 pierre
  310. + option -S to disable the mouse
  311. * adapted to changes in fpusrscr for DOS
  312. Revision 1.40 2000/03/07 21:58:58 pierre
  313. + uses ParseUserScreen and UpdateMode
  314. Revision 1.39 2000/02/12 23:58:26 carl
  315. + Conditional define explanaations
  316. Revision 1.38 2000/02/07 11:54:17 pierre
  317. + RegisterWUtils by Gabor
  318. Revision 1.37 2000/01/25 00:26:35 pierre
  319. + Browser info saving
  320. Revision 1.36 2000/01/10 15:53:37 pierre
  321. * WViews objects were not registered
  322. Revision 1.35 2000/01/03 11:38:33 michael
  323. Changes from Gabor
  324. Revision 1.34 1999/12/20 14:23:16 pierre
  325. * MyApp renamed IDEApp
  326. * TDebugController.ResetDebuggerRows added to
  327. get resetting of debugger rows
  328. Revision 1.33 1999/12/20 09:36:49 pierre
  329. * get the mouse visible on win32 fp
  330. Revision 1.32 1999/12/10 13:02:05 pierre
  331. + VideoMode save/restore
  332. Revision 1.31 1999/09/13 11:43:59 peter
  333. * fixes from gabor, idle event, html fix
  334. Revision 1.30 1999/08/22 22:24:15 pierre
  335. * avoid objpas paramstr functions
  336. Revision 1.29 1999/08/03 20:22:25 peter
  337. + TTab acts now on Ctrl+Tab and Ctrl+Shift+Tab...
  338. + Desktop saving should work now
  339. - History saved
  340. - Clipboard content saved
  341. - Desktop saved
  342. - Symbol info saved
  343. * syntax-highlight bug fixed, which compared special keywords case sensitive
  344. (for ex. 'asm' caused asm-highlighting, while 'ASM' didn't)
  345. * with 'whole words only' set, the editor didn't found occourences of the
  346. searched text, if the text appeared previously in the same line, but didn't
  347. satisfied the 'whole-word' condition
  348. * ^QB jumped to (SelStart.X,SelEnd.X) instead of (SelStart.X,SelStart.Y)
  349. (ie. the beginning of the selection)
  350. * when started typing in a new line, but not at the start (X=0) of it,
  351. the editor inserted the text one character more to left as it should...
  352. * TCodeEditor.HideSelection (Ctrl-K+H) didn't update the screen
  353. * Shift shouldn't cause so much trouble in TCodeEditor now...
  354. * Syntax highlight had problems recognizing a special symbol if it was
  355. prefixed by another symbol character in the source text
  356. * Auto-save also occours at Dos shell, Tool execution, etc. now...
  357. Revision 1.28 1999/07/10 01:24:11 pierre
  358. + First implementation of watches window
  359. Revision 1.27 1999/06/29 22:43:12 peter
  360. * try to add extensions to params
  361. Revision 1.26 1999/06/28 23:31:14 pierre
  362. * typo inside go32v2 cond error removed
  363. Revision 1.25 1999/06/28 19:25:34 peter
  364. * fixes from gabor
  365. Revision 1.24 1999/06/28 12:40:56 pierre
  366. + clear tool messages at exit
  367. Revision 1.23 1999/06/25 00:48:05 pierre
  368. + adds current target in menu at startup
  369. Revision 1.22 1999/05/22 13:44:28 peter
  370. * fixed couple of bugs
  371. Revision 1.21 1999/04/07 21:55:40 peter
  372. + object support for browser
  373. * html help fixes
  374. * more desktop saving things
  375. * NODEBUG directive to exclude debugger
  376. Revision 1.20 1999/03/23 16:16:36 peter
  377. * linux fixes
  378. Revision 1.19 1999/03/23 15:11:26 peter
  379. * desktop saving things
  380. * vesa mode
  381. * preferences dialog
  382. Revision 1.18 1999/03/21 22:51:35 florian
  383. + functional screen mode switching added
  384. Revision 1.17 1999/03/16 12:38:06 peter
  385. * tools macro fixes
  386. + tph writer
  387. + first things for resource files
  388. Revision 1.16 1999/03/12 01:13:01 peter
  389. * use TryToOpen() with parameter files to overcome double opened files
  390. at startup
  391. Revision 1.15 1999/03/08 14:58:08 peter
  392. + prompt with dialogs for tools
  393. Revision 1.14 1999/03/05 17:53:00 pierre
  394. + saving and opening of open files on exit
  395. Revision 1.13 1999/03/01 15:41:48 peter
  396. + Added dummy entries for functions not yet implemented
  397. * MenuBar didn't update itself automatically on command-set changes
  398. * Fixed Debugging/Profiling options dialog
  399. * TCodeEditor converts spaces to tabs at save only if efUseTabChars is
  400. set
  401. * efBackSpaceUnindents works correctly
  402. + 'Messages' window implemented
  403. + Added '$CAP MSG()' and '$CAP EDIT' to available tool-macros
  404. + Added TP message-filter support (for ex. you can call GREP thru
  405. GREP2MSG and view the result in the messages window - just like in TP)
  406. * A 'var' was missing from the param-list of THelpFacility.TopicSearch,
  407. so topic search didn't work...
  408. * In FPHELP.PAS there were still context-variables defined as word instead
  409. of THelpCtx
  410. * StdStatusKeys() was missing from the statusdef for help windows
  411. + Topic-title for index-table can be specified when adding a HTML-files
  412. Revision 1.12 1999/02/20 15:18:25 peter
  413. + ctrl-c capture with confirm dialog
  414. + ascii table in the tools menu
  415. + heapviewer
  416. * empty file fixed
  417. * fixed callback routines in fpdebug to have far for tp7
  418. Revision 1.11 1999/02/18 13:44:30 peter
  419. * search fixed
  420. + backward search
  421. * help fixes
  422. * browser updates
  423. Revision 1.10 1999/02/15 09:07:10 pierre
  424. * HEAPTRC conditionnal renamed IDEHEAPTRC
  425. Revision 1.9 1999/02/10 09:55:43 pierre
  426. + Memory tracing if compiled with -dHEAPTRC
  427. * Many memory leaks removed
  428. Revision 1.8 1999/02/08 09:30:59 florian
  429. + some split heap stuff, in $ifdef TEMPHEAP
  430. Revision 1.7 1999/02/05 13:51:38 peter
  431. * unit name of FPSwitches -> FPSwitch which is easier to use
  432. * some fixes for tp7 compiling
  433. Revision 1.6 1999/01/21 11:54:10 peter
  434. + tools menu
  435. + speedsearch in symbolbrowser
  436. * working run command
  437. Revision 1.5 1999/01/12 14:29:31 peter
  438. + Implemented still missing 'switch' entries in Options menu
  439. + Pressing Ctrl-B sets ASCII mode in editor, after which keypresses (even
  440. ones with ASCII < 32 ; entered with Alt+<###>) are interpreted always as
  441. ASCII chars and inserted directly in the text.
  442. + Added symbol browser
  443. * splitted fp.pas to fpide.pas
  444. }