fpc/ide/fpdesk.pas
2001-10-11 11:38:22 +00:00

1126 lines
30 KiB
ObjectPascal

{
$Id$
This file is part of the Free Pascal Integrated Development Environment
Copyright (c) 1998 by Berczi Gabor
Desktop loading/saving routines
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************}
unit FPDesk;
interface
const
DesktopVersion = $0009; { <- if you change any Load&Store methods,
default object properties (Options,State)
then you should also change this }
ResDesktopFlags = 'FLAGS';
ResVideo = 'VIDEOMODE';
ResHistory = 'HISTORY';
ResClipboard = 'CLIPBOARD';
ResWatches = 'WATCHES';
ResBreakpoints = 'BREAKPOINTS';
ResDesktop = 'DESKTOP';
ResSymbols = 'SYMBOLS';
ResCodeComplete = 'CODECOMPLETE';
ResCodeTemplates = 'CODETEMPLATES';
ResKeys = 'KEYS';
procedure InitDesktopFile;
function LoadDesktop: boolean;
function SaveDesktop: boolean;
procedure DoneDesktopFile;
function WriteSymbolsFile(const filename : string): boolean;
function ReadSymbolsFile(const filename : string): boolean;
implementation
uses Dos,
Objects,Drivers,
{$ifndef FVISION}
Video,
{$else FVISION}
{$ifndef GRAPH_API}
Video,
{$endif GRAPH_API}
{$endif FVISION}
Views,App,HistList,BrowCol,
WUtils,WResourc,WViews,WEditor,
{$ifndef NODEBUG}
fpdebug,
{$endif ndef NODEBUG}
{$ifdef Unix}
FPKeys,
{$endif Unix}
FPConst,FPVars,FPString,FPTools,FPUtils,FPViews,FPHelp,
FPCompil,FPCodCmp,FPCodTmp;
type
TWindowInfo = packed record
HelpCtx : word;
Bounds : TRect;
Visible : boolean;
WinNb : byte;
ExtraDataSize : word;
TitleLen : word;
Title : packed record end;
end;
procedure InitDesktopFile;
begin
if DesktopLocation=dlCurrentDir then
DesktopPath:=FExpand(DesktopName)
else
DesktopPath:=FExpand(DirOf(IniFileName)+DesktopName);
end;
procedure DoneDesktopFile;
begin
end;
function ReadHistory(F: PResourceFile): boolean;
var S: PMemoryStream;
OK: boolean;
begin
PushStatus(msg_readinghistory);
New(S, Init(32*1024,4096));
OK:=F^.ReadResourceEntryToStream(resHistory,langDefault,S^);
S^.Seek(0);
if OK then
LoadHistory(S^);
Dispose(S, Done);
if OK=false then
ErrorBox(msg_errorloadinghistory,nil);
PopStatus;
ReadHistory:=OK;
end;
function WriteHistory(F: PResourceFile): boolean;
var S: PMemoryStream;
OK: boolean;
begin
PushStatus(msg_storinghistory);
New(S, Init(10*1024,4096));
StoreHistory(S^);
S^.Seek(0);
F^.CreateResource(resHistory,rcBinary,0);
OK:=F^.AddResourceEntryFromStream(resHistory,langDefault,0,S^,S^.GetSize);
Dispose(S, Done);
if OK=false then
ErrorBox(msg_errorstoringhistory,nil);
PopStatus;
WriteHistory:=OK;
end;
{$ifdef Unix}
function ReadKeys(F: PResourceFile): boolean;
var S: PMemoryStream;
OK: boolean;
begin
New(S, Init(32*1024,4096));
OK:=F^.ReadResourceEntryToStream(resKeys,langDefault,S^);
S^.Seek(0);
if OK then
LoadKeys(S^);
Dispose(S, Done);
if OK=false then
ErrorBox(msg_errorloadingkeys,nil);
ReadKeys:=OK;
end;
function WriteKeys(F: PResourceFile): boolean;
var S: PMemoryStream;
OK: boolean;
begin
New(S, Init(10*1024,4096));
StoreKeys(S^);
S^.Seek(0);
F^.CreateResource(resKeys,rcBinary,0);
OK:=F^.AddResourceEntryFromStream(resKeys,langDefault,0,S^,S^.GetSize);
Dispose(S, Done);
if OK=false then
ErrorBox(msg_errorstoringkeys,nil);
WriteKeys:=OK;
end;
{$endif Unix}
(*function ReadClipboard(F: PResourceFile): boolean;
begin
ReadClipboard:=true;
end;
function WriteClipboard(F: PResourceFile): boolean;
var S: PMemoryStream;
begin
if Assigned(Clipboard) then
begin
PushStatus('Storing clipboard content...');
New(S, Init(10*1024,4096));
Clipboard^.SaveToStream(S^);
S^.Seek(0);
F^.CreateResource(resClipboard,rcBinary,0);
F^.AddResourceEntryFromStream(resClipboard,langDefault,0,S^,S^.GetSize);
Dispose(S, Done);
PopStatus;
end;
WriteClipboard:=true;
end;*)
function ReadWatches(F: PResourceFile): boolean;
{$ifndef NODEBUG}
var S: PMemoryStream;
OK: boolean;
OWC : PWatchesCollection;
{$endif}
begin
{$ifndef NODEBUG}
PushStatus(msg_readingwatches);
New(S, Init(32*1024,4096));
OK:=F^.ReadResourceEntryToStream(resWatches,langDefault,S^);
S^.Seek(0);
if OK then
begin
OWC:=WatchesCollection;
WatchesCollection:=PWatchesCollection(S^.Get);
OK:=(S^.Status=stOK);
if OK and assigned(OWC) and assigned(WatchesCollection) then
Dispose(OWC,Done)
else if assigned(OWC) then
WatchesCollection:=OWC;
end;
if OK=false then
ErrorBox(msg_errorloadingwatches,nil);
ReadWatches:=OK;
Dispose(S, Done);
PopStatus;
{$else NODEBUG}
ReadWatches:=true;
{$endif NODEBUG}
end;
function WriteWatches(F: PResourceFile): boolean;
var
S : PMemoryStream;
OK : boolean;
begin
{$ifndef NODEBUG}
if not assigned(WatchesCollection) then
{$endif NODEBUG}
WriteWatches:=true
{$ifndef NODEBUG}
else
begin
PushStatus(msg_storingwatches);
New(S, Init(30*1024,4096));
S^.Put(WatchesCollection);
S^.Seek(0);
F^.CreateResource(resWatches,rcBinary,0);
OK:=F^.AddResourceEntryFromStream(resWatches,langDefault,0,S^,S^.GetSize);
Dispose(S, Done);
if OK=false then
ErrorBox(msg_errorstoringwatches,nil);
PopStatus;
WriteWatches:=OK;
end;
{$endif NODEBUG}
end;
function ReadBreakpoints(F: PResourceFile): boolean;
{$ifndef NODEBUG}
var S: PMemoryStream;
OK: boolean;
OBC : PBreakpointCollection;
{$endif}
begin
{$ifndef NODEBUG}
PushStatus(msg_readingbreakpoints);
New(S, Init(32*1024,4096));
OK:=F^.ReadResourceEntryToStream(resBreakpoints,langDefault,S^);
S^.Seek(0);
if OK then
begin
OBC:=BreakpointsCollection;
BreakpointsCollection:=PBreakpointCollection(S^.get);
OK:=(S^.Status=stOK);
If OK and assigned(OBC) and assigned(BreakpointsCollection) then
Begin
Dispose(OBC,Done);
BreakpointsCollection^.ShowAllBreakpoints;
end
else if assigned(OBC) then
BreakpointsCollection:=OBC;
end;
if OK=false then
ErrorBox(msg_errorloadingbreakpoints,nil);
ReadBreakpoints:=OK;
Dispose(S, Done);
PopStatus;
{$else NODEBUG}
ReadBreakpoints:=true;
{$endif NODEBUG}
end;
function WriteBreakpoints(F: PResourceFile): boolean;
var
S : PMemoryStream;
OK : boolean;
begin
{$ifndef NODEBUG}
if not assigned(BreakpointsCollection) then
{$endif NODEBUG}
WriteBreakPoints:=true
{$ifndef NODEBUG}
else
begin
PushStatus(msg_storingbreakpoints);
New(S, Init(30*1024,4096));
BreakpointsCollection^.Store(S^);
S^.Seek(0);
F^.CreateResource(resBreakpoints,rcBinary,0);
OK:=F^.AddResourceEntryFromStream(resBreakpoints,langDefault,0,S^,S^.GetSize);
Dispose(S, Done);
if OK=false then
ErrorBox(msg_errorstoringbreakpoints,nil);
WriteBreakPoints:=OK;
PopStatus;
end;
{$endif NODEBUG}
end;
function ReadOpenWindows(F: PResourceFile): boolean;
var S: PMemoryStream;
OK: boolean;
W: word;
WI: TWindowInfo;
Title: string;
XDataOfs: word;
XData: array[0..1024] of byte;
procedure GetData(var B; Size: word);
begin
Move(XData[XDataOfs],B,Size);
Inc(XDataOfs,Size);
end;
procedure ProcessWindowInfo;
var W: PWindow;
SW: PSourceWindow absolute W;
St: string;
TP,TP2: TPoint;
L: longint;
R: TRect;
begin
XDataOfs:=0;
Desktop^.Lock;
W:=SearchWindow(Title);
case WI.HelpCtx of
hcSourceWindow :
begin
GetData(St[0],1);
GetData(St[1],ord(St[0]));
W:=ITryToOpenFile(@WI.Bounds,St,0,0,false,false,true);
if Assigned(W)=false then
begin
ClearFormatParams;
AddFormatParamStr(St);
Desktop^.Unlock;
ErrorBox(msg_cantopenfile,@FormatParams);
Desktop^.Lock;
end
else
begin
GetData(L,sizeof(L)); SW^.Editor^.SetFlags(L);
GetData(TP,sizeof(TP)); GetData(TP2,sizeof(TP2));
SW^.Editor^.SetSelection(TP,TP2);
GetData(TP,sizeof(TP)); SW^.Editor^.SetCurPtr(TP.X,TP.Y);
GetData(TP,sizeof(TP)); SW^.Editor^.ScrollTo(TP.X,TP.Y);
end;
end;
hcClipboardWindow:
W:=ClipboardWindow;
hcCalcWindow:
W:=CalcWindow;
hcMessagesWindow:
begin
if MessagesWindow=nil then
Desktop^.Insert(New(PMessagesWindow, Init));
W:=MessagesWindow;
end;
hcCompilerMessagesWindow:
W:=CompilerMessageWindow;
hcGDBWindow:
begin
InitGDBWindow;
W:=GDBWindow;
end;
hcDisassemblyWindow:
begin
InitDisassemblyWindow;
W:=DisassemblyWindow;
end;
hcInfoWindow:
begin
if ProgramInfoWindow=nil then
begin
New(ProgramInfoWindow, Init);
Desktop^.Insert(ProgramInfoWindow);
end;
W:=ProgramInfoWindow;
end;
hcWatchesWindow:
begin
if WatchesWindow=nil then
begin
New(WatchesWindow,Init);
Desktop^.Insert(WatchesWindow);
end;
W:=WatchesWindow;
end;
hcStackWindow:
begin
if StackWindow=nil then
begin
New(StackWindow,Init);
Desktop^.Insert(StackWindow);
end;
W:=StackWindow;
end;
hcFPURegisters:
begin
if FPUWindow=nil then
begin
New(FPUWindow,Init);
Desktop^.Insert(FPUWindow);
end;
W:=FPUWindow;
end;
hcRegistersWindow:
begin
if RegistersWindow=nil then
begin
New(RegistersWindow,Init);
Desktop^.Insert(RegistersWindow);
end;
W:=RegistersWindow;
end;
hcBreakpointListWindow:
begin
if BreakpointsWindow=nil then
begin
New(BreakpointsWindow,Init);
Desktop^.Insert(BreakpointsWindow);
end;
W:=BreakpointsWindow;
end;
hcASCIITableWindow:
begin
{$ifndef FVISION}
if ASCIIChart=nil then
begin
New(ASCIIChart, Init);
Desktop^.Insert(ASCIIChart);
end;
W:=ASCIIChart;
{$else FVISION}
W:=nil;
{$endif FVISION}
end;
end;
if W=nil then
begin
Desktop^.Unlock;
Exit;
end;
W^.GetBounds(R);
if (R.A.X<>WI.Bounds.A.X) or (R.A.Y<>WI.Bounds.A.Y) then
R.Move(WI.Bounds.A.X-R.A.X,WI.Bounds.A.Y-R.A.Y);
if (W^.Flags and wfGrow)<>0 then
begin
R.B.X:=R.A.X+(WI.Bounds.B.X-WI.Bounds.A.X);
R.B.Y:=R.A.Y+(WI.Bounds.B.Y-WI.Bounds.A.Y);
end;
W^.Locate(R);
if W^.GetState(sfVisible)<>WI.Visible then
if WI.Visible then
begin
W^.Show;
W^.MakeFirst;
end
else
W^.Hide;
W^.Number:=WI.WinNb;
Desktop^.Unlock;
end;
begin
PushStatus(msg_readingdesktopcontents);
New(S, Init(32*1024,4096));
OK:=F^.ReadResourceEntryToStream(resDesktop,langDefault,S^);
S^.Seek(0);
if OK then
begin
S^.Read(W,SizeOf(W));
OK:=(W=DesktopVersion);
if OK=false then
ErrorBox(msg_invaliddesktopversionlayoutlost,nil);
end;
if OK then
begin
XDataOfs:=0;
repeat
S^.Read(WI,sizeof(WI));
if S^.Status=stOK then
begin
Title[0]:=chr(WI.TitleLen);
S^.Read(Title[1],WI.TitleLen);
if WI.ExtraDataSize>0 then
S^.Read(XData,WI.ExtraDataSize);
ProcessWindowInfo;
end;
until (S^.Status<>stOK) or (S^.GetPos=S^.GetSize);
(* TempDesk:=PFPDesktop(S^.Get);
OK:=Assigned(TempDesk);
if OK then
begin
Dispose(Desktop, Done);
Desktop:=TempDesk;
with Desktop^ do
begin
GetSubViewPtr(S^,CompilerMessageWindow);
GetSubViewPtr(S^,CompilerStatusDialog);
GetSubViewPtr(S^,ClipboardWindow);
if Assigned(ClipboardWindow) then Clipboard:=ClipboardWindow^.Editor;
GetSubViewPtr(S^,CalcWindow);
GetSubViewPtr(S^,ProgramInfoWindow);
GetSubViewPtr(S^,GDBWindow);
GetSubViewPtr(S^,BreakpointsWindow);
GetSubViewPtr(S^,WatchesWindow);
GetSubViewPtr(S^,UserScreenWindow);
GetSubViewPtr(S^,ASCIIChart);
GetSubViewPtr(S^,MessagesWindow); LastToolMessageFocused:=nil;
end;
Application^.GetExtent(R);
Inc(R.A.Y);Dec(R.B.Y);
DeskTop^.Locate(R);
Application^.Insert(Desktop);
Desktop^.ReDraw;
Message(Application,evBroadcast,cmUpdate,nil);
end;*)
if OK=false then
ErrorBox(msg_errorloadingdesktop,nil);
end;
Dispose(S, Done);
PopStatus;
ReadOpenWindows:=OK;
end;
function WriteOpenWindows(F: PResourceFile): boolean;
var S: PMemoryStream;
procedure CollectInfo(P: PView); {$ifndef FPC}far;{$endif}
var W: PWindow;
SW: PSourceWindow absolute W;
WI: TWindowInfo;
Title: string;
XDataOfs: word;
XData: array[0..1024] of byte;
St: string;
TP: TPoint;
L: longint;
procedure AddData(const B; Size: word);
begin
Move(B,XData[XDataOfs],Size);
Inc(XDataOfs,Size);
end;
begin
XDataOfs:=0;
W:=nil;
if (P^.HelpCtx=hcSourceWindow) or
(P^.HelpCtx=hcHelpWindow) or
(P^.HelpCtx=hcClipboardWindow) or
(P^.HelpCtx=hcCalcWindow) or
(P^.HelpCtx=hcInfoWindow) or
(P^.HelpCtx=hcBrowserWindow) or
(P^.HelpCtx=hcMessagesWindow) or
(P^.HelpCtx=hcCompilerMessagesWindow) or
(P^.HelpCtx=hcGDBWindow) or
(P^.HelpCtx=hcDisassemblyWindow) or
(P^.HelpCtx=hcStackWindow) or
(P^.HelpCtx=hcRegistersWindow) or
(P^.HelpCtx=hcFPURegisters) or
(P^.HelpCtx=hcWatchesWindow) or
(P^.HelpCtx=hcBreakpointListWindow) or
(P^.HelpCtx=hcASCIITableWindow)
then
W:=PWindow(P);
if Assigned(W) and (P^.HelpCtx=hcSourceWindow) then
if SW^.Editor^.FileName='' then
W:=nil;
if W=nil then Exit;
FillChar(WI,sizeof(WI),0);
Title:=W^.GetTitle(255);
WI.HelpCtx:=W^.HelpCtx;
W^.GetBounds(WI.Bounds);
WI.Visible:=W^.GetState(sfVisible);
WI.WinNb:=W^.Number;
case WI.HelpCtx of
hcSourceWindow :
begin
St:=SW^.Editor^.FileName; AddData(St,length(St)+1);
L:=SW^.Editor^.GetFlags; AddData(L,sizeof(L));
TP:=SW^.Editor^.SelStart; AddData(TP,sizeof(TP));
TP:=SW^.Editor^.SelEnd; AddData(TP,sizeof(TP));
TP:=SW^.Editor^.CurPos; AddData(TP,sizeof(TP));
TP:=SW^.Editor^.Delta; AddData(TP,sizeof(TP));
end;
end;
WI.TitleLen:=length(Title);
WI.ExtraDataSize:=XDataOfs;
S^.Write(WI,sizeof(WI));
S^.Write(Title[1],WI.TitleLen);
if WI.ExtraDataSize>0 then
S^.Write(XData,WI.ExtraDataSize);
end;
var W: word;
OK: boolean;
PV: PView;
begin
PushStatus(msg_storingdesktopcontents);
New(S, Init(30*1024,4096));
OK:=Assigned(S);
if OK then
begin
W:=DesktopVersion;
S^.Write(W,SizeOf(W));
{ S^.Put(Desktop);
with Desktop^ do
begin
PutSubViewPtr(S^,CompilerMessageWindow);
PutSubViewPtr(S^,CompilerStatusDialog);
PutSubViewPtr(S^,ClipboardWindow);
PutSubViewPtr(S^,CalcWindow);
PutSubViewPtr(S^,ProgramInfoWindow);
PutSubViewPtr(S^,GDBWindow);
PutSubViewPtr(S^,BreakpointsWindow);
PutSubViewPtr(S^,WatchesWindow);
PutSubViewPtr(S^,UserScreenWindow);
PutSubViewPtr(S^,ASCIIChart);
PutSubViewPtr(S^,MessagesWindow);
end;}
{ PV:=Application^.Last;
while PV<>nil do
begin
CollectInfo(PV);
PV:=PV^.PrevView;
end;}
PV:=Desktop^.Last;
while PV<>nil do
begin
CollectInfo(PV);
PV:=PV^.PrevView;
end;
OK:=(S^.Status=stOK);
if OK then
begin
S^.Seek(0);
OK:=F^.CreateResource(resDesktop,rcBinary,0);
OK:=OK and F^.AddResourceEntryFromStream(resDesktop,langDefault,0,S^,S^.GetSize);
end;
Dispose(S, Done);
end;
if OK=false then
ErrorBox(msg_errorstoringdesktop,nil);
PopStatus;
WriteOpenWindows:=OK;
end;
function WriteFlags(F: PResourceFile): boolean;
var
OK: boolean;
begin
F^.CreateResource(resDesktopFlags,rcBinary,0);
OK:=F^.AddResourceEntry(resDesktopFlags,langDefault,0,DesktopFileFlags,
SizeOf(DesktopFileFlags));
if OK=false then
ErrorBox(msg_errorwritingflags,nil);
WriteFlags:=OK;
end;
function ReadCodeComplete(F: PResourceFile): boolean;
var S: PMemoryStream;
OK: boolean;
begin
PushStatus(msg_readingcodecompletewordlist);
New(S, Init(1024,1024));
OK:=F^.ReadResourceEntryToStream(resCodeComplete,langDefault,S^);
S^.Seek(0);
if OK then
OK:=LoadCodeComplete(S^);
Dispose(S, Done);
if OK=false then
ErrorBox(msg_errorloadingcodecompletewordlist,nil);
PopStatus;
ReadCodeComplete:=OK;
end;
function WriteCodeComplete(F: PResourceFile): boolean;
var OK: boolean;
S: PMemoryStream;
begin
PushStatus(msg_storingcodecompletewordlist);
New(S, Init(1024,1024));
OK:=StoreCodeComplete(S^);
if OK then
begin
S^.Seek(0);
F^.CreateResource(resCodeComplete,rcBinary,0);
OK:=F^.AddResourceEntryFromStream(resCodeComplete,langDefault,0,S^,S^.GetSize);
end;
Dispose(S, Done);
if OK=false then
ErrorBox(msg_errorstoringcodecompletewordlist,nil);
PopStatus;
WriteCodeComplete:=OK;
end;
function ReadCodeTemplates(F: PResourceFile): boolean;
var S: PMemoryStream;
OK: boolean;
begin
PushStatus(msg_readingcodetemplates);
New(S, Init(1024,4096));
OK:=F^.ReadResourceEntryToStream(resCodeTemplates,langDefault,S^);
S^.Seek(0);
if OK then
OK:=LoadCodeTemplates(S^);
Dispose(S, Done);
if OK=false then
ErrorBox(msg_errorloadingcodetemplates,nil);
PopStatus;
ReadCodeTemplates:=OK;
end;
function WriteCodeTemplates(F: PResourceFile): boolean;
var OK: boolean;
S: PMemoryStream;
begin
PushStatus(msg_storingcodetemplates);
New(S, Init(1024,4096));
OK:=StoreCodeTemplates(S^);
if OK then
begin
S^.Seek(0);
F^.CreateResource(resCodeTemplates,rcBinary,0);
OK:=F^.AddResourceEntryFromStream(resCodeTemplates,langDefault,0,S^,S^.GetSize);
end;
Dispose(S, Done);
if OK=false then
ErrorBox(msg_errorstoringcodetemplates,nil);
PopStatus;
WriteCodeTemplates:=OK;
end;
function ReadFlags(F: PResourceFile): boolean;
var
size : sw_word;
OK: boolean;
begin
OK:=F^.ReadResourceEntry(resDesktopFlags,langDefault,DesktopFileFlags,
size);
if OK=false then
ErrorBox(msg_errorreadingflags,nil);
ReadFlags:=OK;
end;
function WriteVideoMode(F: PResourceFile): boolean;
var
OK: boolean;
begin
F^.CreateResource(resVideo,rcBinary,0);
OK:=F^.AddResourceEntry(resVideo,langDefault,0,ScreenMode,
SizeOf(TVideoMode));
if OK=false then
ErrorBox(msg_errorstoringvideomode,nil);
WriteVideoMode:=OK;
end;
function ReadVideoMode(F: PResourceFile;var NewScreenMode : TVideoMode): boolean;
var
size : sw_word;
OK,test : boolean;
begin
size:=SizeOf(TVideoMode);
test:=F^.ReadResourceEntry(resVideo,langDefault,NewScreenMode,
size);
if not test then
NewScreenMode:=ScreenMode;
OK:=test and (size = SizeOf(TVideoMode));
if OK=false then
ErrorBox(msg_errorreadingvideomode,nil);
ReadVideoMode:=OK;
end;
function ReadSymbols(F: PResourceFile): boolean;
var S: PMemoryStream;
OK: boolean;
R: PResource;
begin
{ if no symbols stored ... no problems }
R:=F^.FindResource(resSymbols);
if not Assigned(R) then
exit;
PushStatus(msg_readingsymbolinformation);
New(S, Init(32*1024,4096));
OK:=F^.ReadResourceEntryToStream(resSymbols,langDefault,S^);
S^.Seek(0);
if OK then
OK:=LoadBrowserCol(S);
Dispose(S, Done);
if OK=false then
ErrorBox(msg_errorloadingsymbolinformation,nil);
PopStatus;
ReadSymbols:=OK;
end;
function WriteSymbols(F: PResourceFile): boolean;
var S: PMemoryStream;
OK: boolean;
begin
OK:=Assigned(Modules);
if OK then
begin
PushStatus(msg_storingsymbolinformation);
New(S, Init(200*1024,4096));
OK:=Assigned(S);
if OK then
OK:=StoreBrowserCol(S);
if OK then
begin
S^.Seek(0);
F^.CreateResource(resSymbols,rcBinary,0);
OK:=F^.AddResourceEntryFromStream(resSymbols,langDefault,0,S^,S^.GetSize);
end;
Dispose(S, Done);
if OK=false then
ErrorBox(msg_errorstoringsymbolinformation,nil);
PopStatus;
end;
WriteSymbols:=OK;
end;
function LoadDesktop: boolean;
var OK,VOK: boolean;
F: PResourceFile;
VM : TVideoMode;
begin
PushStatus(msg_readingdesktopfile);
New(F, LoadFile(DesktopPath));
OK:=false;
if Assigned(F) then
begin
OK:=ReadFlags(F);
VOK:=ReadVideoMode(F,VM);
if VOK and ((VM.Col<>ScreenMode.Col) or
(VM.Row<>ScreenMode.Row) or (VM.Color<>ScreenMode.Color)) then
begin
if Assigned(Application) then
Application^.SetScreenVideoMode(VM);
end;
if ((DesktopFileFlags and dfHistoryLists)<>0) then
OK:=OK and ReadHistory(F);
if ((DesktopFileFlags and dfWatches)<>0) then
OK:=OK and ReadWatches(F);
if ((DesktopFileFlags and dfBreakpoints)<>0) then
OK:=OK and ReadBreakpoints(F);
if ((DesktopFileFlags and dfOpenWindows)<>0) then
OK:=OK and ReadOpenWindows(F);
{ no errors if no browser info available PM }
if ((DesktopFileFlags and dfSymbolInformation)<>0) then
OK:=OK and ReadSymbols(F);
if ((DesktopFileFlags and dfCodeCompleteWords)<>0) then
OK:=OK and ReadCodeComplete(F);
if ((DesktopFileFlags and dfCodeTemplates)<>0) then
OK:=OK and ReadCodeTemplates(F);
{$ifdef Unix}
OK:=OK and ReadKeys(F);
{$endif Unix}
Dispose(F, Done);
end;
PopStatus;
LoadDesktop:=OK;
end;
function SaveDesktop: boolean;
var OK: boolean;
F: PResourceFile;
TempPath: string;
begin
TempPath:=DirOf(DesktopPath)+DesktopTempName;
PushStatus(msg_writingdesktopfile);
New(F, CreateFile(TempPath));
if Assigned(Clipboard) then
if (DesktopFileFlags and dfClipboardContent)<>0 then
Clipboard^.SetFlags(Clipboard^.GetFlags or efStoreContent)
else
Clipboard^.SetFlags(Clipboard^.GetFlags and not efStoreContent);
OK:=false;
if Assigned(F) then
begin
OK:=WriteFlags(F);
OK:=OK and WriteVideoMode(F);
if ((DesktopFileFlags and dfHistoryLists)<>0) then
OK:=OK and WriteHistory(F);
if ((DesktopFileFlags and dfWatches)<>0) then
OK:=OK and WriteWatches(F);
if ((DesktopFileFlags and dfBreakpoints)<>0) then
OK:=OK and WriteBreakpoints(F);
if ((DesktopFileFlags and dfOpenWindows)<>0) then
OK:=OK and WriteOpenWindows(F);
{ no errors if no browser info available PM }
if ((DesktopFileFlags and dfSymbolInformation)<>0) then
OK:=OK and (WriteSymbols(F) or not Assigned(Modules));
if ((DesktopFileFlags and dfCodeCompleteWords)<>0) then
OK:=OK and WriteCodeComplete(F);
if ((DesktopFileFlags and dfCodeTemplates)<>0) then
OK:=OK and WriteCodeTemplates(F);
{$ifdef Unix}
OK:=OK and WriteKeys(F);
{$endif Unix}
Dispose(F, Done);
end;
if OK then
begin
if ExistsFile(DesktopPath) then
OK:=EraseFile(DesktopPath);
OK:=OK and RenameFile(TempPath,DesktopPath);
if OK=false then
ErrorBox(msg_failedtoreplacedesktopfile,nil);
end;
PopStatus;
SaveDesktop:=OK;
end;
function WriteSymbolsFile(const filename : string): boolean;
var OK: boolean;
F: PResourceFile;
begin
WriteSymbolsFile:=false;
If not assigned(Modules) then
exit;
New(F, CreateFile(FileName));
OK:=Assigned(F);
if OK and ((DesktopFileFlags and dfSymbolInformation)<>0) then
OK:=OK and WriteSymbols(F);
if assigned(F) then
Dispose(F,Done);
WriteSymbolsFile:=OK;
end;
function ReadSymbolsFile(const FileName : string): boolean;
var OK: boolean;
F: PResourceFile;
begin
ReadSymbolsFile:=false;
{ Don't read again !! }
If assigned(Modules) then
exit;
New(F, LoadFile(FileName));
OK:=Assigned(F);
if OK and ((DesktopFileFlags and dfSymbolInformation)<>0) then
OK:=OK and ReadSymbols(F);
if assigned(F) then
Dispose(F,Done);
ReadSymbolsFile:=OK;
end;
END.
{
$Log$
Revision 1.3 2001-10-11 11:38:22 pierre
* small fvision specific changes
Revision 1.2 2001/08/05 12:23:00 peter
* Automatically support for fvision or old fv
Revision 1.1 2001/08/04 11:30:23 peter
* ide works now with both compiler versions
Revision 1.1.2.8 2001/03/22 17:28:03 pierre
* small fix to OpenWindows
Revision 1.1.2.7 2001/03/12 17:34:55 pierre
+ Disassembly window started
Revision 1.1.2.6 2000/12/12 16:51:50 pierre
+ keys loading/storing begin
Revision 1.1.2.5 2000/11/29 11:25:59 pierre
+ TFPDlgWindow that handles cmSearchWindow
Revision 1.1.2.4 2000/11/29 00:54:44 pierre
+ preserve window number and save special windows
Revision 1.1.2.3 2000/10/18 21:53:26 pierre
* several Gabor fixes
Revision 1.1.2.2 2000/09/18 13:20:54 pierre
New bunch of Gabor changes
Revision 1.1.2.1 2000/07/20 11:02:15 michael
+ Fixes from gabor. See fixes.txt
Revision 1.1 2000/07/13 09:48:34 michael
+ Initial import
Revision 1.29 2000/06/22 09:07:12 pierre
* Gabor changes: see fixes.txt
Revision 1.28 2000/05/02 08:42:27 pierre
* new set of Gabor changes: see fixes.txt
Revision 1.27 2000/04/25 08:42:33 pierre
* New Gabor changes : see fixes.txt
Revision 1.26 2000/04/18 11:42:36 pierre
lot of Gabor changes : see fixes.txt
Revision 1.25 2000/03/21 23:32:05 pierre
adapted to wcedit addition by Gabor
Revision 1.24 2000/03/20 19:19:46 pierre
* LFN support in streams
Revision 1.23 2000/03/13 20:36:52 pierre
* Breakpoints saved and loaded before sources
Revision 1.22 2000/02/07 12:03:48 pierre
Last commit is from Gabor's changes!
Revision 1.21 2000/02/07 11:55:27 pierre
+ Code Complete and Template saving from Gabor
Revision 1.20 2000/02/04 00:12:57 pierre
* Breakpoint are marked in source at desktop loading
Revision 1.19 2000/01/25 00:26:36 pierre
+ Browser info saving
Revision 1.18 2000/01/03 11:38:33 michael
Changes from Gabor
Revision 1.17 1999/12/20 00:30:56 pierre
* problem with VideoMode storing solved
Revision 1.16 1999/12/10 13:02:05 pierre
+ VideoMode save/restore
Revision 1.15 1999/11/26 17:09:51 pierre
* Force Desktop into Screen
Revision 1.14 1999/11/25 00:25:43 pierre
* add Status when loading/saving files
Revision 1.13 1999/09/20 15:37:59 pierre
* ReadOpenWindows and ReadSymobls was missing, still does not work correctly :(
Revision 1.12 1999/09/17 16:41:10 pierre
* other stream error for Watches/Breakpoints corrected
Revision 1.11 1999/09/17 16:28:58 pierre
* ResWatches in WriteBreakpoints typo !
Revision 1.10 1999/09/16 14:34:58 pierre
+ TBreakpoint and TWatch registering
+ WatchesCollection and BreakpointsCollection stored in desk file
* Syntax highlighting was broken
Revision 1.9 1999/09/07 09:23:00 pierre
* no errors if no browser info available
Revision 1.8 1999/08/16 18:25:16 peter
* Adjusting the selection when the editor didn't contain any line.
* Reserved word recognition redesigned, but this didn't affect the overall
syntax highlight speed remarkably (at least not on my Amd-K6/350).
The syntax scanner loop is a bit slow but the main problem is the
recognition of special symbols. Switching off symbol processing boosts
the performance up to ca. 200%...
* The editor didn't allow copying (for ex to clipboard) of a single character
* 'File|Save as' caused permanently run-time error 3. Not any more now...
* Compiler Messages window (actually the whole desktop) did not act on any
keypress when compilation failed and thus the window remained visible
+ Message windows are now closed upon pressing Esc
+ At 'Run' the IDE checks whether any sources are modified, and recompiles
only when neccessary
+ BlockRead and BlockWrite (Ctrl+K+R/W) implemented in TCodeEditor
+ LineSelect (Ctrl+K+L) implemented
* The IDE had problems closing help windows before saving the desktop
Revision 1.7 1999/08/03 20:22:30 peter
+ TTab acts now on Ctrl+Tab and Ctrl+Shift+Tab...
+ Desktop saving should work now
- History saved
- Clipboard content saved
- Desktop saved
- Symbol info saved
* syntax-highlight bug fixed, which compared special keywords case sensitive
(for ex. 'asm' caused asm-highlighting, while 'ASM' didn't)
* with 'whole words only' set, the editor didn't found occourences of the
searched text, if the text appeared previously in the same line, but didn't
satisfied the 'whole-word' condition
* ^QB jumped to (SelStart.X,SelEnd.X) instead of (SelStart.X,SelStart.Y)
(ie. the beginning of the selection)
* when started typing in a new line, but not at the start (X=0) of it,
the editor inserted the text one character more to left as it should...
* TCodeEditor.HideSelection (Ctrl-K+H) didn't update the screen
* Shift shouldn't cause so much trouble in TCodeEditor now...
* Syntax highlight had problems recognizing a special symbol if it was
prefixed by another symbol character in the source text
* Auto-save also occours at Dos shell, Tool execution, etc. now...
Revision 1.5 1999/06/30 23:58:13 pierre
+ BreakpointsList Window implemented
with Edit/New/Delete functions
+ Individual breakpoint dialog with support for all types
ignorecount and conditions
(commands are not yet implemented, don't know if this wolud be useful)
awatch and rwatch have problems because GDB does not annotate them
I fixed v4.16 for this
Revision 1.4 1999/04/15 08:58:05 peter
* syntax highlight fixes
* browser updates
Revision 1.3 1999/04/07 21:55:45 peter
+ object support for browser
* html help fixes
* more desktop saving things
* NODEBUG directive to exclude debugger
Revision 1.2 1999/03/23 16:16:39 peter
* linux fixes
Revision 1.1 1999/03/23 15:11:28 peter
* desktop saving things
* vesa mode
* preferences dialog
}