fpcompil.pas 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702
  1. {
  2. $Id$
  3. This file is part of the Free Pascal Integrated Development Environment
  4. Copyright (c) 1998 by Berczi Gabor
  5. Compiler call routines for 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. unit FPCompile;
  13. interface
  14. { don't redir under linux, because all stdout (also from the ide!) will
  15. then be redired (PFV) }
  16. { this should work now correctly because
  17. RedirDisableAll and RedirEnableAll function are added in fpredir (PM) }
  18. {$ifndef debug}
  19. {$ifndef linux}
  20. {$define redircompiler}
  21. {$endif}
  22. {$endif}
  23. { $define VERBOSETXT}
  24. uses
  25. Objects,
  26. Drivers,Views,Dialogs,
  27. WViews,
  28. FPViews;
  29. type
  30. TCompileMode = (cBuild,cMake,cCompile,cRun);
  31. type
  32. PCompilerMessage = ^TCompilerMessage;
  33. TCompilerMessage = object(TMessageItem)
  34. function GetText(MaxLen: Sw_Integer): String; virtual;
  35. end;
  36. PCompilerMessageListBox = ^TCompilerMessageListBox;
  37. TCompilerMessageListBox = object(TMessageListBox)
  38. function GetPalette: PPalette; virtual;
  39. end;
  40. PCompilerMessageWindow = ^TCompilerMessageWindow;
  41. TCompilerMessageWindow = object(TFPWindow)
  42. constructor Init;
  43. procedure HandleEvent(var Event: TEvent); virtual;
  44. function GetPalette: PPalette; virtual;
  45. procedure Close;virtual;
  46. destructor Done; virtual;
  47. procedure SizeLimits(var Min, Max: TPoint); virtual;
  48. procedure AddMessage(AClass: longint;const Msg, Module: string; Line, Column: longint);
  49. procedure ClearMessages;
  50. constructor Load(var S: TStream);
  51. procedure Store(var S: TStream);
  52. private
  53. CompileShowed : boolean;
  54. Mode : TCompileMode;
  55. MsgLB : PCompilerMessageListBox;
  56. CurrST,
  57. InfoST : PColorStaticText;
  58. LineST : PStaticText;
  59. end;
  60. PCompilerStatusDialog = ^TCompilerStatusDialog;
  61. TCompilerStatusDialog = object(TCenterDialog)
  62. ST : PAdvancedStaticText;
  63. KeyST : PColorStaticText;
  64. constructor Init;
  65. procedure Update;
  66. end;
  67. const
  68. CompilerMessageWindow : PCompilerMessageWindow = nil;
  69. CompilerStatusDialog : PCompilerStatusDialog = nil;
  70. procedure DoCompile(Mode: TCompileMode);
  71. procedure RegisterFPCompile;
  72. implementation
  73. uses
  74. Dos,Video,
  75. App,Commands,
  76. CompHook,
  77. WUtils,WEditor,
  78. {$ifdef redircompiler}
  79. FPRedir,
  80. {$endif}
  81. FPConst,FPVars,FPUtils,FPIntf,FPSwitch;
  82. const
  83. RCompilerMessageListBox: TStreamRec = (
  84. ObjType: 1211;
  85. VmtLink: Ofs(TypeOf(TCompilerMessageListBox)^);
  86. Load: @TCompilerMessageListBox.Load;
  87. Store: @TCompilerMessageListBox.Store
  88. );
  89. RCompilerMessageWindow: TStreamRec = (
  90. ObjType: 1212;
  91. VmtLink: Ofs(TypeOf(TCompilerMessageWindow)^);
  92. Load: @TCompilerMessageWindow.Load;
  93. Store: @TCompilerMessageWindow.Store
  94. );
  95. {*****************************************************************************
  96. TCompilerMessage
  97. *****************************************************************************}
  98. function TCompilerMessage.GetText(MaxLen: Sw_Integer): String;
  99. var
  100. ClassS: string[20];
  101. S: string;
  102. begin
  103. if TClass=
  104. V_Fatal then ClassS:='Fatal' else if TClass =
  105. V_Error then ClassS:='Error' else if TClass =
  106. V_Normal then ClassS:='' else if TClass =
  107. V_Warning then ClassS:='Warning' else if TClass =
  108. V_Note then ClassS:='Note' else if TClass =
  109. V_Hint then ClassS:='Hint'
  110. {$ifdef VERBOSETXT}
  111. else if TClass =
  112. V_Macro then ClassS:='Macro' else if TClass =
  113. V_Procedure then ClassS:='Procedure' else if TClass =
  114. V_Conditional then ClassS:='Conditional' else if TClass =
  115. V_Info then ClassS:='Info' else if TClass =
  116. V_Status then ClassS:='Status' else if TClass =
  117. V_Used then ClassS:='Used' else if TClass =
  118. V_Tried then ClassS:='Tried' else if TClass =
  119. V_Debug then ClassS:='Debug'
  120. else
  121. ClassS:='???';
  122. {$else}
  123. else
  124. ClassS:='';
  125. {$endif}
  126. if ClassS<>'' then
  127. ClassS:=RExpand(ClassS,0)+': ';
  128. if assigned(Module) and
  129. (TClass<=V_ShowFile) and (status.currentsource<>'') and (status.currentline>0) then
  130. begin
  131. if Row>0 then
  132. begin
  133. if Col>0 then
  134. S:=NameAndExtOf(Module^)+'('+IntToStr(Row)+','+IntToStr(Col)+') '+ClassS
  135. else
  136. S:=NameAndExtOf(Module^)+'('+IntToStr(Row)+') '+ClassS;
  137. end
  138. else
  139. S:=NameAndExtOf(Module^)+'('+IntToStr(Row)+') '+ClassS
  140. end
  141. else
  142. S:=ClassS;
  143. if assigned(Text) then
  144. S:=S+Text^;
  145. if length(S)>MaxLen then
  146. S:=copy(S,1,MaxLen-2)+'..';
  147. GetText:=S;
  148. end;
  149. {*****************************************************************************
  150. TCompilerMessageListBox
  151. *****************************************************************************}
  152. function TCompilerMessageListBox.GetPalette: PPalette;
  153. const
  154. P: string[length(CBrowserListBox)] = CBrowserListBox;
  155. begin
  156. GetPalette:=@P;
  157. end;
  158. {*****************************************************************************
  159. TCompilerMessageWindow
  160. *****************************************************************************}
  161. constructor TCompilerMessageWindow.Init;
  162. var R: TRect;
  163. HSB,VSB: PScrollBar;
  164. begin
  165. Desktop^.GetExtent(R);
  166. R.A.Y:=R.B.Y-7;
  167. inherited Init(R,'Compiler Messages',SearchFreeWindowNo);
  168. HelpCtx:=hcMessagesWindow;
  169. HSB:=StandardScrollBar(sbHorizontal+sbHandleKeyboard);
  170. HSB^.GrowMode:=gfGrowLoY+gfGrowHiX+gfGrowHiY;
  171. Insert(HSB);
  172. VSB:=StandardScrollBar(sbVertical+sbHandleKeyboard);
  173. VSB^.GrowMode:=gfGrowLoX+gfGrowHiX+gfGrowHiY;
  174. Insert(VSB);
  175. GetExtent(R);
  176. R.Grow(-1,-1);
  177. New(MsgLB, Init(R, HSB, VSB));
  178. Insert(MsgLB);
  179. CompilerMessageWindow:=@self;
  180. end;
  181. procedure TCompilerMessageWindow.AddMessage(AClass: longint;const Msg, Module: string; Line, Column: longint);
  182. begin
  183. if AClass>=V_Info then
  184. Line:=0;
  185. MsgLB^.AddItem(New(PCompilerMessage,Init(AClass, Msg, MsgLB^.AddModuleName(Module), Line, Column)));
  186. end;
  187. procedure TCompilerMessageWindow.ClearMessages;
  188. begin
  189. MsgLB^.Clear;
  190. ReDraw;
  191. end;
  192. {procedure TCompilerMessageWindow.Updateinfo;
  193. begin
  194. if CompileShowed then
  195. begin
  196. InfoST^.SetText(
  197. RExpand(' Main file : '#1#$7f+Copy(SmartPath(MainFile),1,39),40)+#2+
  198. 'Total lines : '#1#$7e+IntToStr(Status.CompiledLines)+#2#13+
  199. RExpand(' Target : '#1#$7f+KillTilde(TargetSwitches^.ItemName(TargetSwitches^.GetCurrSel)),40)+#2+
  200. 'Total errors : '#1#$7e+IntToStr(Status.ErrorCount)
  201. );
  202. if status.currentline>0 then
  203. CurrST^.SetText(' Status: '#1#$7e+status.currentsource+'('+IntToStr(status.currentline)+')'#2)
  204. else
  205. CurrST^.SetText(' Status: '#1#$7e+status.currentsource+#2);
  206. end;
  207. ReDraw;
  208. end;}
  209. procedure TCompilerMessageWindow.HandleEvent(var Event: TEvent);
  210. begin
  211. case Event.What of
  212. evBroadcast :
  213. case Event.Command of
  214. cmListFocusChanged :
  215. if Event.InfoPtr=MsgLB then
  216. Message(Application,evBroadcast,cmClearLineHighlights,@Self);
  217. end;
  218. end;
  219. inherited HandleEvent(Event);
  220. end;
  221. procedure TCompilerMessageWindow.SizeLimits(var Min, Max: TPoint);
  222. begin
  223. inherited SizeLimits(Min,Max);
  224. Min.X:=20;
  225. Min.Y:=4;
  226. end;
  227. procedure TCompilerMessageWindow.Close;
  228. begin
  229. Hide;
  230. end;
  231. function TCompilerMessageWindow.GetPalette: PPalette;
  232. const
  233. S : string[length(CBrowserWindow)] = CBrowserWindow;
  234. begin
  235. GetPalette:=@S;
  236. end;
  237. constructor TCompilerMessageWindow.Load(var S: TStream);
  238. begin
  239. inherited Load(S);
  240. GetSubViewPtr(S,MsgLB);
  241. end;
  242. procedure TCompilerMessageWindow.Store(var S: TStream);
  243. begin
  244. if MsgLB^.List=nil then
  245. MsgLB^.NewList(New(PCollection, Init(100,100)));
  246. inherited Store(S);
  247. PutSubViewPtr(S,MsgLB);
  248. end;
  249. destructor TCompilerMessageWindow.Done;
  250. begin
  251. CompilerMessageWindow:=nil;
  252. inherited Done;
  253. end;
  254. {****************************************************************************
  255. CompilerStatusDialog
  256. ****************************************************************************}
  257. constructor TCompilerStatusDialog.Init;
  258. var R: TRect;
  259. begin
  260. R.Assign(0,0,50,11);
  261. inherited Init(R, 'Compiling');
  262. GetExtent(R); R.B.Y:=11;
  263. R.Grow(-3,-2);
  264. New(ST, Init(R, ''));
  265. Insert(ST);
  266. GetExtent(R); R.B.Y:=11;
  267. R.Grow(-1,-1); R.A.Y:=R.B.Y-1;
  268. New(KeyST, Init(R, '', Blue*16+White+longint($80+Blue*16+White)*256));
  269. Insert(KeyST);
  270. end;
  271. procedure TCompilerStatusDialog.Update;
  272. const
  273. CtrlBS = 'Press ESC to cancel';
  274. SuccessS = 'Compile successful: ~Press Enter~';
  275. FailS = 'Compile failed';
  276. var
  277. StatusS,KeyS: string;
  278. begin
  279. {$ifdef TEMPHEAP}
  280. switch_to_base_heap;
  281. {$endif TEMPHEAP}
  282. case CompilationPhase of
  283. cpCompiling :
  284. begin
  285. StatusS:='Compiling '+SmartPath(Status.CurrentSource);
  286. KeyS:=CtrlBS;
  287. end;
  288. cpLinking :
  289. begin
  290. StatusS:='Linking...';
  291. KeyS:=CtrlBS;
  292. end;
  293. cpDone :
  294. begin
  295. StatusS:='Done.';
  296. KeyS:=SuccessS;
  297. end;
  298. cpFailed :
  299. begin
  300. StatusS:='Failed to compile...';
  301. KeyS:=FailS;
  302. end;
  303. end;
  304. ST^.SetText(
  305. 'Main file: '+SmartPath(MainFile)+#13+
  306. StatusS+#13#13+
  307. 'Target: '+LExpand(KillTilde(TargetSwitches^.ItemName(TargetSwitches^.GetCurrSel)),12)+' '+
  308. 'Line number: '+IntToStrL(Status.CurrentLine,7)+#13+
  309. 'Free memory: '+IntToStrL(MemAvail div 1024,6)+'K'+ ' '+
  310. 'Total lines: '+IntToStrL(Status.CompiledLines,7)+#13+
  311. 'Total errors: '+IntToStrL(Status.ErrorCount,5)
  312. );
  313. KeyST^.SetText(^C+KeyS);
  314. {$ifdef TEMPHEAP}
  315. switch_to_temp_heap;
  316. {$endif TEMPHEAP}
  317. end;
  318. {****************************************************************************
  319. Compiler Hooks
  320. ****************************************************************************}
  321. function CompilerStatus: boolean; {$ifndef FPC}far;{$endif}
  322. begin
  323. {$ifdef redircompiler}
  324. RedirDisableAll;
  325. {$endif}
  326. { only display line info every 100 lines, ofcourse all other messages
  327. will be displayed directly }
  328. if (status.currentline mod 100=0) then
  329. begin
  330. { update info messages }
  331. if assigned(CompilerStatusDialog) then
  332. CompilerStatusDialog^.Update;
  333. { update memory usage }
  334. { HeapView^.Update; }
  335. end;
  336. CompilerStatus:=false;
  337. {$ifdef redircompiler}
  338. RedirEnableAll;
  339. {$endif}
  340. end;
  341. procedure CompilerStop; {$ifndef FPC}far;{$endif}
  342. begin
  343. end;
  344. function CompilerComment(Level:Longint; const s:string):boolean; {$ifndef FPC}far;{$endif}
  345. begin
  346. {$ifdef TEMPHEAP}
  347. switch_to_base_heap;
  348. {$endif TEMPHEAP}
  349. {$ifdef redircompiler}
  350. RedirDisableAll;
  351. {$endif}
  352. CompilerComment:=false;
  353. {$ifndef DEV}
  354. if (status.verbosity and Level)=Level then
  355. {$endif}
  356. begin
  357. CompilerMessageWindow^.AddMessage(Level,S,status.currentsourcepath+status.currentsource,
  358. status.currentline,status.currentcolumn);
  359. { update info messages }
  360. if assigned(CompilerStatusDialog) then
  361. CompilerStatusDialog^.Update;
  362. { update memory usage }
  363. { HeapView^.Update; }
  364. end;
  365. {$ifdef redircompiler}
  366. RedirEnableAll;
  367. {$endif}
  368. {$ifdef TEMPHEAP}
  369. switch_to_temp_heap;
  370. {$endif TEMPHEAP}
  371. end;
  372. {****************************************************************************
  373. DoCompile
  374. ****************************************************************************}
  375. function GetExePath: string;
  376. var Path: string;
  377. I: Sw_integer;
  378. begin
  379. Path:='.'+DirSep;
  380. if DirectorySwitches<>nil then
  381. with DirectorySwitches^ do
  382. for I:=0 to ItemCount-1 do
  383. begin
  384. if Pos('EXE',KillTilde(ItemName(I)))>0 then
  385. begin Path:=GetStringItem(I); Break; end;
  386. end;
  387. GetExePath:=CompleteDir(FExpand(Path));
  388. end;
  389. procedure DoCompile(Mode: TCompileMode);
  390. function IsExitEvent(E: TEvent): boolean;
  391. begin
  392. IsExitEvent:=(E.What=evKeyDown) and
  393. ((E.KeyCode=kbEnter) or (E.KeyCode=kbEsc)) or
  394. ((E.What=evCommand) and (E.command=cmClose));
  395. end;
  396. var
  397. P : PSourceWindow;
  398. FileName: string;
  399. E : TEvent;
  400. begin
  401. { Get FileName }
  402. P:=Message(Desktop,evBroadcast,cmSearchWindow,nil);
  403. if (PrimaryFileMain='') and (P=nil) then
  404. begin
  405. ErrorBox('Oooops, nothing to compile.',nil);
  406. Exit;
  407. end;
  408. if PrimaryFileMain<>'' then
  409. FileName:=PrimaryFileMain
  410. else
  411. begin
  412. if P^.Editor^.Modified and (not P^.Editor^.Save) then
  413. begin
  414. ErrorBox('Can''t compile unsaved file.',nil);
  415. Exit;
  416. end;
  417. FileName:=P^.Editor^.FileName;
  418. end;
  419. WriteSwitches(SwitchesPath);
  420. MainFile:=FixFileName(FExpand(FileName));
  421. If GetEXEPath<>'' then
  422. EXEFile:=FixFileName(GetEXEPath+NameOf(MainFile)+ExeExt)
  423. else
  424. EXEFile:=DirOf(MainFile)+NameOf(MainFile)+ExeExt;
  425. { Reset }
  426. CtrlBreakHit:=false;
  427. { Show Compiler Messages Window }
  428. if not CompilerMessageWindow^.GetState(sfVisible) then
  429. CompilerMessageWindow^.Show;
  430. CompilerMessageWindow^.MakeFirst;
  431. CompilerMessageWindow^.ClearMessages;
  432. { Create Compiler Status Dialog }
  433. CompilationPhase:=cpCompiling;
  434. New(CompilerStatusDialog, Init);
  435. CompilerStatusDialog^.SetState(sfModal,true);
  436. Application^.Insert(CompilerStatusDialog);
  437. CompilerStatusDialog^.Update;
  438. { hook compiler output }
  439. do_status:=CompilerStatus;
  440. do_stop:=CompilerStop;
  441. do_comment:=CompilerComment;
  442. { Compile ! }
  443. {$ifdef redircompiler}
  444. ChangeRedirOut('fp$$$.out',false);
  445. ChangeRedirError('fp$$$.err',false);
  446. {$endif}
  447. {$ifdef TEMPHEAP}
  448. split_heap;
  449. switch_to_temp_heap;
  450. {$endif TEMPHEAP}
  451. Compile(FileName);
  452. {$ifdef TEMPHEAP}
  453. switch_to_base_heap;
  454. {$endif TEMPHEAP}
  455. {$ifdef redircompiler}
  456. RestoreRedirOut;
  457. RestoreRedirError;
  458. {$endif}
  459. { Set end status }
  460. if status.errorCount=0 then
  461. CompilationPhase:=cpDone
  462. else
  463. CompilationPhase:=cpFailed;
  464. { Show end status }
  465. CompilerStatusDialog^.Update;
  466. CompilerStatusDialog^.SetState(sfModal,false);
  467. if ((CompilationPhase in[cpDone,cpFailed]) or (ShowStatusOnError)) and (Mode<>cRun) then
  468. repeat
  469. CompilerStatusDialog^.GetEvent(E);
  470. if IsExitEvent(E)=false then
  471. CompilerStatusDialog^.HandleEvent(E);
  472. until IsExitEvent(E);
  473. Application^.Delete(CompilerStatusDialog);
  474. Dispose(CompilerStatusDialog, Done);
  475. CompilerStatusDialog:=nil;
  476. { endcompilation returns true if the messagewindow should be removed }
  477. if CompilationPhase=cpDone then
  478. CompilerMessageWindow^.Hide;
  479. { Update the app }
  480. Message(Application,evCommand,cmUpdate,nil);
  481. {$ifdef TEMPHEAP}
  482. releasetempheap;
  483. unsplit_heap;
  484. {$endif TEMPHEAP}
  485. end;
  486. procedure RegisterFPCompile;
  487. begin
  488. RegisterType(RCompilerMessageListBox);
  489. RegisterType(RCompilerMessageWindow);
  490. end;
  491. end.
  492. {
  493. $Log$
  494. Revision 1.27 1999-05-22 13:44:29 peter
  495. * fixed couple of bugs
  496. Revision 1.26 1999/05/02 14:29:35 peter
  497. * fixed typo disableredir -> redirdisable
  498. Revision 1.25 1999/04/29 22:58:09 pierre
  499. + disabling of redirction in compiler dialogs
  500. Revision 1.24 1999/04/29 09:36:11 peter
  501. * fixed hotkeys with Compiler switches
  502. * fixed compiler status dialog
  503. * Run shows again the output
  504. Revision 1.23 1999/04/07 21:55:43 peter
  505. + object support for browser
  506. * html help fixes
  507. * more desktop saving things
  508. * NODEBUG directive to exclude debugger
  509. Revision 1.22 1999/04/01 10:27:07 pierre
  510. + file(line) in start of message added
  511. Revision 1.21 1999/04/01 10:15:17 pierre
  512. * CurrSt,InfoSt and LineSt were not disposed correctly in done
  513. * TComiplerMessage destructor first calls SetCompileShow(false)
  514. to get proper cleaning up
  515. Revision 1.20 1999/03/23 16:16:38 peter
  516. * linux fixes
  517. Revision 1.19 1999/03/19 16:04:27 peter
  518. * new compiler dialog
  519. Revision 1.18 1999/03/16 12:38:07 peter
  520. * tools macro fixes
  521. + tph writer
  522. + first things for resource files
  523. Revision 1.17 1999/03/12 01:13:56 peter
  524. * flag if trytoopen should look for other extensions
  525. + browser tab in the tools-compiler
  526. Revision 1.16 1999/03/07 23:00:47 pierre
  527. * Fix for path of executable
  528. Revision 1.15 1999/03/01 15:41:50 peter
  529. + Added dummy entries for functions not yet implemented
  530. * MenuBar didn't update itself automatically on command-set changes
  531. * Fixed Debugging/Profiling options dialog
  532. * TCodeEditor converts spaces to tabs at save only if efUseTabChars is
  533. set
  534. * efBackSpaceUnindents works correctly
  535. + 'Messages' window implemented
  536. + Added '$CAP MSG()' and '$CAP EDIT' to available tool-macros
  537. + Added TP message-filter support (for ex. you can call GREP thru
  538. GREP2MSG and view the result in the messages window - just like in TP)
  539. * A 'var' was missing from the param-list of THelpFacility.TopicSearch,
  540. so topic search didn't work...
  541. * In FPHELP.PAS there were still context-variables defined as word instead
  542. of THelpCtx
  543. * StdStatusKeys() was missing from the statusdef for help windows
  544. + Topic-title for index-table can be specified when adding a HTML-files
  545. Revision 1.14 1999/02/22 12:46:56 peter
  546. * small fixes for linux and grep
  547. Revision 1.13 1999/02/22 11:51:33 peter
  548. * browser updates from gabor
  549. Revision 1.12 1999/02/22 11:29:36 pierre
  550. + added col info in MessageItem
  551. + grep uses HighLightExts and should work for linux
  552. Revision 1.11 1999/02/08 09:31:00 florian
  553. + some split heap stuff, in $ifdef TEMPHEAP
  554. Revision 1.10 1999/02/05 13:51:39 peter
  555. * unit name of FPSwitches -> FPSwitch which is easier to use
  556. * some fixes for tp7 compiling
  557. Revision 1.9 1999/02/05 13:06:28 pierre
  558. * allow cmClose for Compilation Dialog box
  559. Revision 1.8 1999/02/04 13:32:01 pierre
  560. * Several things added (I cannot commit them independently !)
  561. + added TBreakpoint and TBreakpointCollection
  562. + added cmResetDebugger,cmGrep,CmToggleBreakpoint
  563. + Breakpoint list in INIFile
  564. * Select items now also depend of SwitchMode
  565. * Reading of option '-g' was not possible !
  566. + added search for -Fu args pathes in TryToOpen
  567. + added code for automatic opening of FileDialog
  568. if source not found
  569. Revision 1.7 1999/01/21 11:54:11 peter
  570. + tools menu
  571. + speedsearch in symbolbrowser
  572. * working run command
  573. Revision 1.6 1999/01/15 16:12:43 peter
  574. * fixed crash after compile
  575. Revision 1.5 1999/01/14 21:42:19 peter
  576. * source tracking from Gabor
  577. Revision 1.4 1999/01/12 14:29:32 peter
  578. + Implemented still missing 'switch' entries in Options menu
  579. + Pressing Ctrl-B sets ASCII mode in editor, after which keypresses (even
  580. ones with ASCII < 32 ; entered with Alt+<###>) are interpreted always as
  581. ASCII chars and inserted directly in the text.
  582. + Added symbol browser
  583. * splitted fp.pas to fpide.pas
  584. Revision 1.3 1999/01/04 11:49:42 peter
  585. * 'Use tab characters' now works correctly
  586. + Syntax highlight now acts on File|Save As...
  587. + Added a new class to syntax highlight: 'hex numbers'.
  588. * There was something very wrong with the palette managment. Now fixed.
  589. + Added output directory (-FE<xxx>) support to 'Directories' dialog...
  590. * Fixed some possible bugs in Running/Compiling, and the compilation/run
  591. process revised
  592. Revision 1.2 1998/12/28 15:47:42 peter
  593. + Added user screen support, display & window
  594. + Implemented Editor,Mouse Options dialog
  595. + Added location of .INI and .CFG file
  596. + Option (INI) file managment implemented (see bottom of Options Menu)
  597. + Switches updated
  598. + Run program
  599. Revision 1.3 1998/12/22 10:39:40 peter
  600. + options are now written/read
  601. + find and replace routines
  602. }