fpdesk.pas 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660
  1. {
  2. $Id$
  3. This file is part of the Free Pascal Integrated Development Environment
  4. Copyright (c) 1998 by Berczi Gabor
  5. Desktop loading/saving routines
  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 FPDesk;
  13. interface
  14. const
  15. DesktopVersion = $0005; { <- if you change any Load&Store methods,
  16. default object properties (Options,State)
  17. then you should also change this }
  18. ResDesktopFlags = 'FLAGS';
  19. ResVideo = 'VIDEOMODE';
  20. ResHistory = 'HISTORY';
  21. ResClipboard = 'CLIPBOARD';
  22. ResWatches = 'WATCHES';
  23. ResBreakpoints = 'BREAKPOINTS';
  24. ResDesktop = 'DESKTOP';
  25. ResSymbols = 'SYMBOLS';
  26. procedure InitDesktopFile;
  27. function LoadDesktop: boolean;
  28. function SaveDesktop: boolean;
  29. procedure DoneDesktopFile;
  30. function WriteSymbolsFile(const filename : string): boolean;
  31. function ReadSymbolsFile(const filename : string): boolean;
  32. implementation
  33. uses Dos,
  34. Objects,Drivers,Video,
  35. Views,App,HistList,BrowCol,
  36. WResource,WViews,WEditor,
  37. WUtils,
  38. {$ifndef NODEBUG}
  39. fpdebug,
  40. {$endif ndef NODEBUG}
  41. FPConst,FPVars,FPUtils,FPViews,FPCompile,FPTools,FPHelp;
  42. procedure InitDesktopFile;
  43. begin
  44. if DesktopLocation=dlCurrentDir then
  45. DesktopPath:=FExpand(DesktopName)
  46. else
  47. DesktopPath:=FExpand(DirOf(INIPath)+DesktopName);
  48. end;
  49. procedure DoneDesktopFile;
  50. begin
  51. end;
  52. function ReadHistory(F: PResourceFile): boolean;
  53. var S: PMemoryStream;
  54. OK: boolean;
  55. begin
  56. PushStatus('Reading history...');
  57. New(S, Init(32*1024,4096));
  58. OK:=F^.ReadResourceEntryToStream(resHistory,langDefault,S^);
  59. S^.Seek(0);
  60. if OK then
  61. LoadHistory(S^);
  62. Dispose(S, Done);
  63. if OK=false then
  64. ErrorBox('Error loading history',nil);
  65. PopStatus;
  66. ReadHistory:=OK;
  67. end;
  68. function WriteHistory(F: PResourceFile): boolean;
  69. var S: PMemoryStream;
  70. OK: boolean;
  71. begin
  72. PushStatus('Storing history...');
  73. New(S, Init(10*1024,4096));
  74. StoreHistory(S^);
  75. S^.Seek(0);
  76. F^.CreateResource(resHistory,rcBinary,0);
  77. OK:=F^.AddResourceEntryFromStream(resHistory,langDefault,0,S^,S^.GetSize);
  78. Dispose(S, Done);
  79. if OK=false then
  80. ErrorBox('Error storing history',nil);
  81. PopStatus;
  82. WriteHistory:=OK;
  83. end;
  84. (*function ReadClipboard(F: PResourceFile): boolean;
  85. begin
  86. ReadClipboard:=true;
  87. end;
  88. function WriteClipboard(F: PResourceFile): boolean;
  89. var S: PMemoryStream;
  90. begin
  91. if Assigned(Clipboard) then
  92. begin
  93. PushStatus('Storing clipboard content...');
  94. New(S, Init(10*1024,4096));
  95. Clipboard^.SaveToStream(S^);
  96. S^.Seek(0);
  97. F^.CreateResource(resClipboard,rcBinary,0);
  98. F^.AddResourceEntryFromStream(resClipboard,langDefault,0,S^,S^.GetSize);
  99. Dispose(S, Done);
  100. PopStatus;
  101. end;
  102. WriteClipboard:=true;
  103. end;*)
  104. function ReadWatches(F: PResourceFile): boolean;
  105. {$ifndef NODEBUG}
  106. var S: PMemoryStream;
  107. OK: boolean;
  108. OWC : PWatchesCollection;
  109. {$endif}
  110. begin
  111. {$ifndef NODEBUG}
  112. PushStatus('Reading watches...');
  113. New(S, Init(32*1024,4096));
  114. OK:=F^.ReadResourceEntryToStream(resWatches,langDefault,S^);
  115. S^.Seek(0);
  116. if OK then
  117. begin
  118. OWC:=WatchesCollection;
  119. WatchesCollection:=PWatchesCollection(S^.Get);
  120. OK:=(S^.Status=stOK);
  121. if OK and assigned(OWC) and assigned(WatchesCollection) then
  122. Dispose(OWC,Done)
  123. else if assigned(OWC) then
  124. WatchesCollection:=OWC;
  125. end;
  126. if OK=false then
  127. ErrorBox('Error loading watches',nil);
  128. ReadWatches:=OK;
  129. Dispose(S, Done);
  130. PopStatus;
  131. {$else NODEBUG}
  132. ReadWatches:=true;
  133. {$endif NODEBUG}
  134. end;
  135. function WriteWatches(F: PResourceFile): boolean;
  136. var
  137. S : PMemoryStream;
  138. OK : boolean;
  139. begin
  140. {$ifndef NODEBUG}
  141. if not assigned(WatchesCollection) then
  142. {$endif NODEBUG}
  143. WriteWatches:=true
  144. {$ifndef NODEBUG}
  145. else
  146. begin
  147. PushStatus('Storing watches...');
  148. New(S, Init(30*1024,4096));
  149. S^.Put(WatchesCollection);
  150. S^.Seek(0);
  151. F^.CreateResource(resWatches,rcBinary,0);
  152. OK:=F^.AddResourceEntryFromStream(resWatches,langDefault,0,S^,S^.GetSize);
  153. Dispose(S, Done);
  154. if OK=false then
  155. ErrorBox('Error storing watches',nil);
  156. PopStatus;
  157. WriteWatches:=OK;
  158. end;
  159. {$endif NODEBUG}
  160. end;
  161. function ReadBreakpoints(F: PResourceFile): boolean;
  162. {$ifndef NODEBUG}
  163. var S: PMemoryStream;
  164. OK: boolean;
  165. OBC : PBreakpointCollection;
  166. {$endif}
  167. begin
  168. {$ifndef NODEBUG}
  169. PushStatus('Reading breakpoints...');
  170. New(S, Init(32*1024,4096));
  171. OK:=F^.ReadResourceEntryToStream(resBreakpoints,langDefault,S^);
  172. S^.Seek(0);
  173. if OK then
  174. begin
  175. OBC:=BreakpointsCollection;
  176. BreakpointsCollection:=PBreakpointCollection(S^.get);
  177. OK:=(S^.Status=stOK);
  178. If OK and assigned(OBC) and assigned(BreakpointsCollection) then
  179. Dispose(OBC,Done)
  180. else if assigned(OBC) then
  181. BreakpointsCollection:=OBC;
  182. end;
  183. if OK=false then
  184. ErrorBox('Error loading breakpoints',nil);
  185. ReadBreakpoints:=OK;
  186. Dispose(S, Done);
  187. PopStatus;
  188. {$else NODEBUG}
  189. ReadBreakpoints:=true;
  190. {$endif NODEBUG}
  191. end;
  192. function WriteBreakpoints(F: PResourceFile): boolean;
  193. var
  194. S : PMemoryStream;
  195. OK : boolean;
  196. begin
  197. {$ifndef NODEBUG}
  198. if not assigned(BreakpointsCollection) then
  199. {$endif NODEBUG}
  200. WriteBreakPoints:=true
  201. {$ifndef NODEBUG}
  202. else
  203. begin
  204. PushStatus('Storing breakpoints...');
  205. New(S, Init(30*1024,4096));
  206. BreakpointsCollection^.Store(S^);
  207. S^.Seek(0);
  208. F^.CreateResource(resBreakpoints,rcBinary,0);
  209. OK:=F^.AddResourceEntryFromStream(resBreakpoints,langDefault,0,S^,S^.GetSize);
  210. Dispose(S, Done);
  211. if OK=false then
  212. ErrorBox('Error storing breakpoints',nil);
  213. WriteBreakPoints:=OK;
  214. PopStatus;
  215. end;
  216. {$endif NODEBUG}
  217. end;
  218. function ReadOpenWindows(F: PResourceFile): boolean;
  219. var S: PMemoryStream;
  220. TempDesk: PFPDesktop;
  221. OK: boolean;
  222. R : TRect;
  223. W: word;
  224. begin
  225. PushStatus('Reading desktop contents...');
  226. New(S, Init(32*1024,4096));
  227. OK:=F^.ReadResourceEntryToStream(resDesktop,langDefault,S^);
  228. S^.Seek(0);
  229. if OK then
  230. begin
  231. S^.Read(W,SizeOf(W));
  232. OK:=(W=DesktopVersion);
  233. if OK=false then
  234. ErrorBox('Invalid desktop version. Desktop layout lost.',nil);
  235. end;
  236. if OK then
  237. begin
  238. TempDesk:=PFPDesktop(S^.Get);
  239. OK:=Assigned(TempDesk);
  240. if OK then
  241. begin
  242. Dispose(Desktop, Done);
  243. Desktop:=TempDesk;
  244. with Desktop^ do
  245. begin
  246. GetSubViewPtr(S^,CompilerMessageWindow);
  247. GetSubViewPtr(S^,CompilerStatusDialog);
  248. GetSubViewPtr(S^,ClipboardWindow);
  249. if Assigned(ClipboardWindow) then Clipboard:=ClipboardWindow^.Editor;
  250. GetSubViewPtr(S^,CalcWindow);
  251. GetSubViewPtr(S^,ProgramInfoWindow);
  252. GetSubViewPtr(S^,GDBWindow);
  253. GetSubViewPtr(S^,BreakpointsWindow);
  254. GetSubViewPtr(S^,WatchesWindow);
  255. GetSubViewPtr(S^,UserScreenWindow);
  256. GetSubViewPtr(S^,ASCIIChart);
  257. GetSubViewPtr(S^,MessagesWindow); LastToolMessageFocused:=nil;
  258. end;
  259. Application^.GetExtent(R);
  260. Inc(R.A.Y);Dec(R.B.Y);
  261. DeskTop^.Locate(R);
  262. Application^.Insert(Desktop);
  263. Desktop^.ReDraw;
  264. Message(Application,evBroadcast,cmUpdate,nil);
  265. end;
  266. if OK=false then
  267. ErrorBox('Error loading desktop',nil);
  268. end;
  269. Dispose(S, Done);
  270. PopStatus;
  271. ReadOpenWindows:=OK;
  272. end;
  273. function WriteOpenWindows(F: PResourceFile): boolean;
  274. var S: PMemoryStream;
  275. W: word;
  276. OK: boolean;
  277. begin
  278. PushStatus('Storing desktop contents...');
  279. New(S, Init(30*1024,4096));
  280. OK:=Assigned(S);
  281. if OK then
  282. begin
  283. W:=DesktopVersion;
  284. S^.Write(W,SizeOf(W));
  285. S^.Put(Desktop);
  286. with Desktop^ do
  287. begin
  288. PutSubViewPtr(S^,CompilerMessageWindow);
  289. PutSubViewPtr(S^,CompilerStatusDialog);
  290. PutSubViewPtr(S^,ClipboardWindow);
  291. PutSubViewPtr(S^,CalcWindow);
  292. PutSubViewPtr(S^,ProgramInfoWindow);
  293. PutSubViewPtr(S^,GDBWindow);
  294. PutSubViewPtr(S^,BreakpointsWindow);
  295. PutSubViewPtr(S^,WatchesWindow);
  296. PutSubViewPtr(S^,UserScreenWindow);
  297. PutSubViewPtr(S^,ASCIIChart);
  298. PutSubViewPtr(S^,MessagesWindow);
  299. end;
  300. OK:=(S^.Status=stOK);
  301. if OK then
  302. begin
  303. S^.Seek(0);
  304. OK:=F^.CreateResource(resDesktop,rcBinary,0);
  305. OK:=OK and F^.AddResourceEntryFromStream(resDesktop,langDefault,0,S^,S^.GetSize);
  306. end;
  307. Dispose(S, Done);
  308. end;
  309. if OK=false then
  310. ErrorBox('Error storing desktop',nil);
  311. PopStatus;
  312. WriteOpenWindows:=OK;
  313. end;
  314. function WriteFlags(F: PResourceFile): boolean;
  315. var
  316. OK: boolean;
  317. begin
  318. F^.CreateResource(resDesktopFlags,rcBinary,0);
  319. OK:=F^.AddResourceEntry(resDesktopFlags,langDefault,0,DesktopFileFlags,
  320. SizeOf(DesktopFileFlags));
  321. if OK=false then
  322. ErrorBox('Error writing flags',nil);
  323. WriteFlags:=OK;
  324. end;
  325. function ReadFlags(F: PResourceFile): boolean;
  326. var
  327. size : sw_word;
  328. OK: boolean;
  329. begin
  330. OK:=F^.ReadResourceEntry(resDesktopFlags,langDefault,DesktopFileFlags,
  331. size);
  332. if OK=false then
  333. ErrorBox('Error loading flags',nil);
  334. ReadFlags:=OK;
  335. end;
  336. function WriteVideoMode(F: PResourceFile): boolean;
  337. var
  338. OK: boolean;
  339. begin
  340. F^.CreateResource(resVideo,rcBinary,0);
  341. OK:=F^.AddResourceEntry(resVideo,langDefault,0,ScreenMode,
  342. SizeOf(TVideoMode));
  343. if OK=false then
  344. ErrorBox('Error storing video mode',nil);
  345. WriteVideoMode:=OK;
  346. end;
  347. function ReadVideoMode(F: PResourceFile;var NewScreenMode : TVideoMode): boolean;
  348. var
  349. size : sw_word;
  350. OK,test : boolean;
  351. begin
  352. size:=SizeOf(TVideoMode);
  353. test:=F^.ReadResourceEntry(resVideo,langDefault,NewScreenMode,
  354. size);
  355. if not test then
  356. NewScreenMode:=ScreenMode;
  357. OK:=test and (size = SizeOf(TVideoMode));
  358. if OK=false then
  359. ErrorBox('Error loading video mode',nil);
  360. ReadVideoMode:=OK;
  361. end;
  362. function ReadSymbols(F: PResourceFile): boolean;
  363. var S: PMemoryStream;
  364. OK: boolean;
  365. begin
  366. { if no symbols stored ... no problems }
  367. if not Assigned(F^.FindResource(resSymbols)) then
  368. exit;
  369. PushStatus('Reading symbol information...');
  370. New(S, Init(32*1024,4096));
  371. OK:=F^.ReadResourceEntryToStream(resSymbols,langDefault,S^);
  372. S^.Seek(0);
  373. if OK then
  374. OK:=LoadBrowserCol(S);
  375. Dispose(S, Done);
  376. if OK=false then
  377. ErrorBox('Error loading symbol information',nil);
  378. PopStatus;
  379. ReadSymbols:=OK;
  380. end;
  381. function WriteSymbols(F: PResourceFile): boolean;
  382. var S: PMemoryStream;
  383. OK: boolean;
  384. begin
  385. OK:=Assigned(Modules);
  386. if OK then
  387. begin
  388. PushStatus('Storing symbol information...');
  389. New(S, Init(200*1024,4096));
  390. OK:=Assigned(S);
  391. if OK then
  392. OK:=StoreBrowserCol(S);
  393. if OK then
  394. begin
  395. S^.Seek(0);
  396. F^.CreateResource(resSymbols,rcBinary,0);
  397. OK:=F^.AddResourceEntryFromStream(resSymbols,langDefault,0,S^,S^.GetSize);
  398. end;
  399. Dispose(S, Done);
  400. if OK=false then
  401. ErrorBox('Error storing symbol information',nil);
  402. PopStatus;
  403. end;
  404. WriteSymbols:=OK;
  405. end;
  406. function LoadDesktop: boolean;
  407. var OK,VOK: boolean;
  408. F: PResourceFile;
  409. VM : TVideoMode;
  410. begin
  411. PushStatus('Reading desktop file...');
  412. New(F, LoadFile(GetShortName(DesktopPath)));
  413. OK:=false;
  414. if Assigned(F) then
  415. begin
  416. OK:=ReadFlags(F);
  417. VOK:=ReadVideoMode(F,VM);
  418. if VOK and ((VM.Col<>ScreenMode.Col) or
  419. (VM.Row<>ScreenMode.Row) or (VM.Color<>ScreenMode.Color)) then
  420. Application^.SetScreenVideoMode(VM);
  421. if ((DesktopFileFlags and dfHistoryLists)<>0) then
  422. OK:=OK and ReadHistory(F);
  423. if ((DesktopFileFlags and dfWatches)<>0) then
  424. OK:=OK and ReadWatches(F);
  425. if ((DesktopFileFlags and dfBreakpoints)<>0) then
  426. OK:=OK and ReadBreakpoints(F);
  427. if ((DesktopFileFlags and dfOpenWindows)<>0) then
  428. OK:=OK and ReadOpenWindows(F);
  429. { no errors if no browser info available PM }
  430. if ((DesktopFileFlags and dfSymbolInformation)<>0) then
  431. OK:=OK and ReadSymbols(F);
  432. Dispose(F, Done);
  433. end;
  434. PopStatus;
  435. LoadDesktop:=OK;
  436. end;
  437. function SaveDesktop: boolean;
  438. var OK: boolean;
  439. F: PResourceFile;
  440. TempPath: string;
  441. begin
  442. TempPath:=DirOf(DesktopPath)+DesktopTempName;
  443. PushStatus('Writing desktop file...');
  444. New(F, CreateFile(GetShortName(TempPath)));
  445. if Assigned(Clipboard) then
  446. if (DesktopFileFlags and dfClipboardContent)<>0 then
  447. Clipboard^.Flags:=Clipboard^.Flags or efStoreContent
  448. else
  449. Clipboard^.Flags:=Clipboard^.Flags and not efStoreContent;
  450. OK:=false;
  451. if Assigned(F) then
  452. begin
  453. OK:=WriteFlags(F);
  454. OK:=OK and WriteVideoMode(F);
  455. if ((DesktopFileFlags and dfHistoryLists)<>0) then
  456. OK:=OK and WriteHistory(F);
  457. if ((DesktopFileFlags and dfWatches)<>0) then
  458. OK:=OK and WriteWatches(F);
  459. if ((DesktopFileFlags and dfBreakpoints)<>0) then
  460. OK:=OK and WriteBreakpoints(F);
  461. if ((DesktopFileFlags and dfOpenWindows)<>0) then
  462. OK:=OK and WriteOpenWindows(F);
  463. { no errors if no browser info available PM }
  464. if ((DesktopFileFlags and dfSymbolInformation)<>0) then
  465. OK:=OK and (WriteSymbols(F) or not Assigned(Modules));
  466. Dispose(F, Done);
  467. end;
  468. if OK then
  469. begin
  470. if ExistsFile(DesktopPath) then
  471. OK:=EraseFile(DesktopPath);
  472. OK:=OK and RenameFile(TempPath,DesktopPath);
  473. if OK=false then
  474. ErrorBox('Failed to replace desktop file.',nil);
  475. end;
  476. PopStatus;
  477. SaveDesktop:=OK;
  478. end;
  479. function WriteSymbolsFile(const filename : string): boolean;
  480. var OK: boolean;
  481. F: PResourceFile;
  482. begin
  483. WriteSymbolsFile:=false;
  484. If not assigned(Modules) then
  485. exit;
  486. New(F, CreateFile(GetShortName(FileName)));
  487. OK:=Assigned(F);
  488. if OK and ((DesktopFileFlags and dfSymbolInformation)<>0) then
  489. OK:=OK and WriteSymbols(F);
  490. if assigned(F) then
  491. Dispose(F,Done);
  492. WriteSymbolsFile:=OK;
  493. end;
  494. function ReadSymbolsFile(const FileName : string): boolean;
  495. var OK: boolean;
  496. F: PResourceFile;
  497. begin
  498. ReadSymbolsFile:=false;
  499. { Don't read again !! }
  500. If assigned(Modules) then
  501. exit;
  502. New(F, LoadFile(GetShortName(FileName)));
  503. OK:=Assigned(F);
  504. if OK and ((DesktopFileFlags and dfSymbolInformation)<>0) then
  505. OK:=OK and ReadSymbols(F);
  506. if assigned(F) then
  507. Dispose(F,Done);
  508. ReadSymbolsFile:=OK;
  509. end;
  510. END.
  511. {
  512. $Log$
  513. Revision 1.19 2000-01-25 00:26:36 pierre
  514. + Browser info saving
  515. Revision 1.18 2000/01/03 11:38:33 michael
  516. Changes from Gabor
  517. Revision 1.17 1999/12/20 00:30:56 pierre
  518. * problem with VideoMode storing solved
  519. Revision 1.16 1999/12/10 13:02:05 pierre
  520. + VideoMode save/restore
  521. Revision 1.15 1999/11/26 17:09:51 pierre
  522. * Force Desktop into Screen
  523. Revision 1.14 1999/11/25 00:25:43 pierre
  524. * add Status when loading/saving files
  525. Revision 1.13 1999/09/20 15:37:59 pierre
  526. * ReadOpenWindows and ReadSymobls was missing, still does not work correctly :(
  527. Revision 1.12 1999/09/17 16:41:10 pierre
  528. * other stream error for Watches/Breakpoints corrected
  529. Revision 1.11 1999/09/17 16:28:58 pierre
  530. * ResWatches in WriteBreakpoints typo !
  531. Revision 1.10 1999/09/16 14:34:58 pierre
  532. + TBreakpoint and TWatch registering
  533. + WatchesCollection and BreakpointsCollection stored in desk file
  534. * Syntax highlighting was broken
  535. Revision 1.9 1999/09/07 09:23:00 pierre
  536. * no errors if no browser info available
  537. Revision 1.8 1999/08/16 18:25:16 peter
  538. * Adjusting the selection when the editor didn't contain any line.
  539. * Reserved word recognition redesigned, but this didn't affect the overall
  540. syntax highlight speed remarkably (at least not on my Amd-K6/350).
  541. The syntax scanner loop is a bit slow but the main problem is the
  542. recognition of special symbols. Switching off symbol processing boosts
  543. the performance up to ca. 200%...
  544. * The editor didn't allow copying (for ex to clipboard) of a single character
  545. * 'File|Save as' caused permanently run-time error 3. Not any more now...
  546. * Compiler Messages window (actually the whole desktop) did not act on any
  547. keypress when compilation failed and thus the window remained visible
  548. + Message windows are now closed upon pressing Esc
  549. + At 'Run' the IDE checks whether any sources are modified, and recompiles
  550. only when neccessary
  551. + BlockRead and BlockWrite (Ctrl+K+R/W) implemented in TCodeEditor
  552. + LineSelect (Ctrl+K+L) implemented
  553. * The IDE had problems closing help windows before saving the desktop
  554. Revision 1.7 1999/08/03 20:22:30 peter
  555. + TTab acts now on Ctrl+Tab and Ctrl+Shift+Tab...
  556. + Desktop saving should work now
  557. - History saved
  558. - Clipboard content saved
  559. - Desktop saved
  560. - Symbol info saved
  561. * syntax-highlight bug fixed, which compared special keywords case sensitive
  562. (for ex. 'asm' caused asm-highlighting, while 'ASM' didn't)
  563. * with 'whole words only' set, the editor didn't found occourences of the
  564. searched text, if the text appeared previously in the same line, but didn't
  565. satisfied the 'whole-word' condition
  566. * ^QB jumped to (SelStart.X,SelEnd.X) instead of (SelStart.X,SelStart.Y)
  567. (ie. the beginning of the selection)
  568. * when started typing in a new line, but not at the start (X=0) of it,
  569. the editor inserted the text one character more to left as it should...
  570. * TCodeEditor.HideSelection (Ctrl-K+H) didn't update the screen
  571. * Shift shouldn't cause so much trouble in TCodeEditor now...
  572. * Syntax highlight had problems recognizing a special symbol if it was
  573. prefixed by another symbol character in the source text
  574. * Auto-save also occours at Dos shell, Tool execution, etc. now...
  575. Revision 1.5 1999/06/30 23:58:13 pierre
  576. + BreakpointsList Window implemented
  577. with Edit/New/Delete functions
  578. + Individual breakpoint dialog with support for all types
  579. ignorecount and conditions
  580. (commands are not yet implemented, don't know if this wolud be useful)
  581. awatch and rwatch have problems because GDB does not annotate them
  582. I fixed v4.16 for this
  583. Revision 1.4 1999/04/15 08:58:05 peter
  584. * syntax highlight fixes
  585. * browser updates
  586. Revision 1.3 1999/04/07 21:55:45 peter
  587. + object support for browser
  588. * html help fixes
  589. * more desktop saving things
  590. * NODEBUG directive to exclude debugger
  591. Revision 1.2 1999/03/23 16:16:39 peter
  592. * linux fixes
  593. Revision 1.1 1999/03/23 15:11:28 peter
  594. * desktop saving things
  595. * vesa mode
  596. * preferences dialog
  597. }