diff --git a/components/codetools/codecache.pas b/components/codetools/codecache.pas index 16895dd7f0..5441ce65c3 100644 --- a/components/codetools/codecache.pas +++ b/components/codetools/codecache.pas @@ -46,6 +46,7 @@ type TCodeBuffer = class(TSourceLog) private FFilename: string; + FReferenceCount: integer; FScanner: TLinkScanner; FOnSetScanner: TNotifyEvent; FOnSetFilename: TNotifyEvent; @@ -64,17 +65,15 @@ type procedure SetIsDeleted(const NewValue: boolean); procedure MakeFileDateValid; public - property Scanner: TLinkScanner read FScanner write SetScanner; - property LastIncludedByFile: string - read GetLastIncludedByFile write FLastIncludedByFile; - property Filename: string read FFilename write SetFilename; + constructor Create; + destructor Destroy; override; + function ConsistencyCheck: integer; // 0 = ok + procedure WriteDebugReport; function LoadFromFile(const AFilename: string): boolean; override; function Reload: boolean; // = LoadFromFile(Filename) function Revert: boolean; // ignore changes and reload source function SaveToFile(const AFilename: string): boolean; override; function Save: boolean; - property LoadDateValid: boolean read FLoadDateValid; - property LoadDate: longint read FLoadDate; function FileDateOnDisk: longint; function FileNeedsUpdate: boolean; function FileOnDiskNeedsUpdate: boolean; @@ -83,17 +82,23 @@ type function AutoRevertFromDisk: boolean; procedure LockAutoDiskRevert; procedure UnlockAutoDiskRevert; - property OnSetScanner: TNotifyEvent read FOnSetScanner write FOnSetScanner; - property OnSetFilename: TNotifyEvent read FOnSetFilename write FOnSetFilename; - property IsVirtual: boolean read FIsVirtual; - property IsDeleted: boolean read FIsDeleted write SetIsDeleted; - property GlobalWriteLockStepOnLastLoad: integer - read FGlobalWriteLockStepOnLastLoad write FGlobalWriteLockStepOnLastLoad; + procedure IncrementRefCount; + procedure ReleaseRefCount; + public property CodeCache: TCodeCache read FCodeCache write FCodeCache; - constructor Create; - destructor Destroy; override; - function ConsistencyCheck: integer; // 0 = ok - procedure WriteDebugReport; + property Filename: string read FFilename write SetFilename; + property GlobalWriteLockStepOnLastLoad: integer + read FGlobalWriteLockStepOnLastLoad write FGlobalWriteLockStepOnLastLoad; + property IsDeleted: boolean read FIsDeleted write SetIsDeleted; + property IsVirtual: boolean read FIsVirtual; + property LastIncludedByFile: string read GetLastIncludedByFile + write FLastIncludedByFile; + property LoadDate: longint read FLoadDate; + property LoadDateValid: boolean read FLoadDateValid; + property OnSetFilename: TNotifyEvent read FOnSetFilename write FOnSetFilename; + property OnSetScanner: TNotifyEvent read FOnSetScanner write FOnSetScanner; + property Scanner: TLinkScanner read FScanner write SetScanner; + property ReferenceCount: integer read FReferenceCount; end; TIncludedByLink = class @@ -109,6 +114,7 @@ type private FItems: TAVLTree; // tree of TCodeBuffer FIncludeLinks: TAVLTree; // tree of TIncludedByLink + FDestroying: boolean; FExpirationTimeInDays: integer; FGlobalWriteLockIsSet: boolean; FGlobalWriteLockStep: integer; @@ -140,6 +146,7 @@ type function FindFile(AFilename: string): TCodeBuffer; function LastIncludedByFile(const IncludeFilename: string): string; function LoadFile(const AFilename: string): TCodeBuffer; + procedure RemoveCodeBuffer(Buffer: TCodeBuffer); function LoadIncludeLinksFromFile(const AFilename: string): boolean; function LoadIncludeLinksFromXML(XMLConfig: TXMLConfig; const XMLPath: string): boolean; @@ -218,6 +225,7 @@ end; destructor TCodeCache.Destroy; begin + FDestroying:=true; Clear; FIncludeLinks.FreeAndClear; FIncludeLinks.Free; @@ -287,6 +295,12 @@ begin end; end; +procedure TCodeCache.RemoveCodeBuffer(Buffer: TCodeBuffer); +begin + if not FDestroying then + FItems.Remove(Buffer); +end; + function TCodeCache.CreateFile(const AFilename: string): TCodeBuffer; begin Result:=FindFile(AFileName); @@ -296,7 +310,7 @@ begin Result:=TCodeBuffer.Create; Result.FileName:=AFileName; FItems.Add(Result); - Result.FCodeCache:=Self; + Result.FCodeCache:=Self;// must be called after FileName:= Result.LastIncludedByFile:=FindIncludeLink(Result.Filename); end; end; @@ -725,6 +739,7 @@ end; destructor TCodeBuffer.Destroy; begin if Scanner<>nil then Scanner.Free; + if FCodeCache<>nil then FCodeCache.RemoveCodeBuffer(Self); inherited Destroy; end; @@ -889,6 +904,18 @@ begin if FAutoDiskRevertLock>0 then dec(FAutoDiskRevertLock); end; +procedure TCodeBuffer.IncrementRefCount; +begin + inc(FReferenceCount); +end; + +procedure TCodeBuffer.ReleaseRefCount; +begin + if FReferenceCount=0 then + raise Exception.Create('TCodeBuffer.ReleaseRefCount'); + dec(FReferenceCount); +end; + function TCodeBuffer.ConsistencyCheck: integer; // 0 = ok begin if FScanner<>nil then begin diff --git a/components/codetools/codetoolmanager.pas b/components/codetools/codetoolmanager.pas index 2731608852..6bd11e80ca 100644 --- a/components/codetools/codetoolmanager.pas +++ b/components/codetools/codetoolmanager.pas @@ -152,7 +152,9 @@ type function LoadFile(const ExpandedFilename: string; UpdateFromDisk, Revert: boolean): TCodeBuffer; function CreateFile(const AFilename: string): TCodeBuffer; - function SaveBufferAs(OldBuffer: TCodeBuffer;const ExpandedFilename: string; + function CreateTempFile(const AFilename: string): TCodeBuffer; + procedure ReleaseTempFile(Buffer: TCodeBuffer); + function SaveBufferAs(OldBuffer: TCodeBuffer;const ExpandedFilename: string; var NewBuffer: TCodeBuffer): boolean; function FilenameHasSourceExt(const AFilename: string): boolean; property OnSearchUsedUnit: TOnSearchUsedUnit @@ -578,6 +580,26 @@ begin {$ENDIF} end; +function TCodeToolManager.CreateTempFile(const AFilename: string): TCodeBuffer; +var + i: Integer; + TempFilename: string; +begin + i:=1; + repeat + TempFilename:=VirtualTempDir+PathDelim+IntToStr(i)+PathDelim+AFilename; + Result:=FindFile(TempFilename); + if (Result<>nil) and (Result.ReferenceCount=0) then exit; + until Result=nil; + Result:=SourceCache.CreateFile(TempFilename); + Result.IncrementRefCount; +end; + +procedure TCodeToolManager.ReleaseTempFile(Buffer: TCodeBuffer); +begin + Buffer.ReleaseRefCount; +end; + function TCodeToolManager.SaveBufferAs(OldBuffer: TCodeBuffer; const ExpandedFilename: string; var NewBuffer: TCodeBuffer): boolean; begin diff --git a/components/codetools/definetemplates.pas b/components/codetools/definetemplates.pas index 69768749d6..78d7fdef88 100644 --- a/components/codetools/definetemplates.pas +++ b/components/codetools/definetemplates.pas @@ -78,8 +78,9 @@ const DCUSrcPathMacroName = ExternalMacroStart+'DCUSrcPath'; CompiledSrcPathMacroName = ExternalMacroStart+'CompiledSrcPath'; - // virtual directory + // virtual directories VirtualDirectory='VIRTUALDIRECTORY'; + VirtualTempDir='TEMPORARYDIRECTORY'; // FPC operating systems and processor types FPCOperatingSystemNames: array[1..19] of shortstring =( diff --git a/designer/changeclassdialog.pas b/designer/changeclassdialog.pas index 2bf2f0bdac..5117ac560d 100644 --- a/designer/changeclassdialog.pas +++ b/designer/changeclassdialog.pas @@ -37,7 +37,7 @@ interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, Buttons, AVGLvlTree, PropEdits, LazarusIDEStrConsts, ComponentReg, - FormEditingIntf, LFMTrees; + FormEditingIntf, CheckLFMDlg; type TChangeClassDlg = class(TForm) @@ -118,7 +118,7 @@ begin FormEditingHook.SaveSelectionToStream(ComponentStream); // parse - // change class + // change classname // check properties diff --git a/ide/checklfmdlg.pas b/ide/checklfmdlg.pas index 24a93d88bc..103e03e090 100644 --- a/ide/checklfmdlg.pas +++ b/ide/checklfmdlg.pas @@ -79,6 +79,8 @@ type function CheckLFMBuffer(PascalBuffer, LFMBuffer: TCodeBuffer; const OnOutput: TOnOutputString): boolean; +function CheckLFMText(PascalBuffer: TCodeBuffer; const LFMText: string; + const OnOutput: TOnOutputString): boolean; function ShowRepairLFMWizard(LFMBuffer: TCodeBuffer; LFMTree: TLFMTree): boolean; @@ -120,8 +122,9 @@ var end; begin - Result:=CodeToolBoss.CheckLFM(PascalBuffer,LFMBuffer,nil,LFMTree); + LFMTree:=nil; try + Result:=CodeToolBoss.CheckLFM(PascalBuffer,LFMBuffer,nil,LFMTree); if Result then exit; WriteLFMErrors; Result:=ShowRepairLFMWizard(LFMBuffer,LFMTree); @@ -130,6 +133,21 @@ begin end; end; +function CheckLFMText(PascalBuffer: TCodeBuffer; const LFMText: string; + const OnOutput: TOnOutputString): boolean; +var + LFMBuf: TCodeBuffer; +begin + Result:=false; + LFMBuf:=CodeToolBoss.CreateTempFile('temp.lfm'); + try + LFMBuf.Source:=LFMText; + Result:=CheckLFMBuffer(PascalBuffer,LFMBuf,OnOutput); + finally + CodeToolBoss.ReleaseTempFile(LFMBuf); + end; +end; + function ShowRepairLFMWizard(LFMBuffer: TCodeBuffer; LFMTree: TLFMTree): boolean; var diff --git a/ide/lazarusidestrconsts.pas b/ide/lazarusidestrconsts.pas index d5f3aa8155..ebbce4dcea 100644 --- a/ide/lazarusidestrconsts.pas +++ b/ide/lazarusidestrconsts.pas @@ -418,6 +418,15 @@ resourcestring +'Paths->Other Unit Files'; lisNOTECouldNotCreateDefineTemplateForFreePascal = 'NOTE: Could not create ' +'Define Template for Free Pascal Sources'; + lisClassNotFound = 'Class not found'; + lisClassIsNotARegisteredComponentClassUnableToPaste = 'Class %s%s%s is not ' + +'a registered component class.%sUnable to paste.'; + lisControlNeedsParent = 'Control needs parent'; + lisTheClassIsATControlAndCanNotBePastedOntoANonContro = 'The class %s%s%s ' + +'is a TControl and can not be pasted onto a non control.%sUnable to paste.'; + lisConversionError = 'Conversion error'; + lisUnableToConvertComponentTextIntoBinaryFormat = 'Unable to convert ' + +'component text into binary format:%s%s'; lisNOTECouldNotCreateDefineTemplateForLazarusSources = 'NOTE: Could not ' +'create Define Template for Lazarus Sources'; lisInvalidExpressionHintTheMakeResourcestringFunction = 'Invalid expression.%' diff --git a/ide/main.pp b/ide/main.pp index 56a6912b5a..3c748a3385 100644 --- a/ide/main.pp +++ b/ide/main.pp @@ -8185,19 +8185,18 @@ begin // check if component class is registered ARegComp:=IDEComponentPalette.FindComponent(NewClassName); if ARegComp=nil then begin - MessageDlg('Class not found', - 'Class "'+NewClassName+'" is not a registered component class.'#13 - +'Unable to paste.', + MessageDlg(lisClassNotFound, + Format(lisClassIsNotARegisteredComponentClassUnableToPaste, ['"', + NewClassName, '"', #13]), mtError,[mbCancel],0); exit; end; // check if there is a valid parent if (ParentControl=nil) and ARegComp.IsTControl then begin - MessageDlg('Control needs parent', - 'The class "'+NewClassName+'" is a TControl and can not be pasted ' - +'onto a non control.'#13 - +'Unable to paste.', + MessageDlg(lisControlNeedsParent, + Format(lisTheClassIsATControlAndCanNotBePastedOntoANonContro, ['"', + NewClassName, '"', #13]), mtError,[mbCancel],0); exit; end; @@ -8209,9 +8208,9 @@ begin ObjectTextToBinary(TxtCompStream,BinCompStream); except on E: Exception do begin - MessageDlg('Conversion error', - 'Unable to convert component text into binary format:'#13 - +E.Message, + MessageDlg(lisConversionError, + Format(lisUnableToConvertComponentTextIntoBinaryFormat, [#13, + E.Message]), mtError,[mbCancel],0); exit; end; @@ -10489,6 +10488,9 @@ end. { ============================================================================= $Log$ + Revision 1.743 2004/08/07 07:03:29 mattias + implemented virtual temporary ct files + Revision 1.742 2004/08/05 21:20:46 mattias moved designer/abstractformeditor.pp to ideintf/formeditingintf.pas diff --git a/ide/project.pp b/ide/project.pp index 405d36f734..fb36ceeeb4 100644 --- a/ide/project.pp +++ b/ide/project.pp @@ -843,6 +843,7 @@ begin CodeToolBoss.RenameSource(fSource,NewUnitName); end; fUnitName:=NewUnitName; + Modified:=true; if Project<>nil then Project.Modified:=true; end; end; @@ -1667,9 +1668,11 @@ begin if AddToProjectFile and (MainUnitID>=0) and (MainUnitID<>NewIndex) then begin // add unit to uses section ShortUnitName:=AnUnit.UnitName; - if (ShortUnitName<>'') and (not UnitIsUsed(ShortUnitName)) then + if (ShortUnitName<>'') and (not UnitIsUsed(ShortUnitName)) then begin CodeToolBoss.AddUnitToMainUsesSection(MainUnitInfo.Source, ShortUnitName,''); + MainUnitInfo.Modified:=true; + end; end; EndUpdate; Modified:=true; @@ -1696,12 +1699,16 @@ begin if (MainUnitID>=0) then begin // remove unit from uses section and from createforms in program file if (OldUnitInfo.IsPartOfProject) then begin - if (OldUnitInfo.UnitName<>'') then - CodeToolBoss.RemoveUnitFromAllUsesSections(Units[MainUnitID].Source, + if (OldUnitInfo.UnitName<>'') then begin + CodeToolBoss.RemoveUnitFromAllUsesSections(MainUnitInfo.Source, OldUnitInfo.UnitName); - if (OldUnitInfo.ComponentName<>'') then - CodeToolBoss.RemoveCreateFormStatement(Units[MainUnitID].Source, + MainUnitInfo.Modified:=true; + end; + if (OldUnitInfo.ComponentName<>'') then begin + CodeToolBoss.RemoveCreateFormStatement(MainUnitInfo.Source, OldUnitInfo.ComponentName); + MainUnitInfo.Modified:=true; + end; end; end; @@ -2518,6 +2525,7 @@ begin // rename unit in program uses section CodeToolBoss.RenameUsedUnit(MainUnitInfo.Source ,OldUnitName,NewUnitName,''); + MainUnitInfo.Modified:=true; end; end; end; @@ -2852,6 +2860,9 @@ end. { $Log$ + Revision 1.156 2004/08/07 07:03:29 mattias + implemented virtual temporary ct files + Revision 1.155 2004/08/04 16:58:15 mattias fixed setting Modified for hidden lpr file when adding CreateFormStatement diff --git a/lcl/dbgrids.pas b/lcl/dbgrids.pas index dcb97f2e1b..a436c8988b 100644 --- a/lcl/dbgrids.pas +++ b/lcl/dbgrids.pas @@ -799,7 +799,7 @@ begin else if (FDataLink.DataSet<>nil)and FDatalink.Active then begin F := GetDsFieldFromGridColumn(FromIndex); if F<>nil then begin - {$IFDEF VER1_0_10} + {$IFNDEF VER1_0_10} TProtFields(FDatalink.DataSet.Fields).SetFieldIndex( F, ToIndex - FixedCols ); {$ENDIF} end; @@ -1770,6 +1770,9 @@ end. { $Log$ + Revision 1.12 2004/08/07 07:03:29 mattias + implemented virtual temporary ct files + Revision 1.11 2004/08/06 06:51:15 mattias fixed compilation for fpc 1.0.10