codetools: searching include file of include file in directory of first include file

git-svn-id: trunk@10723 -
This commit is contained in:
mattias 2007-03-08 23:35:58 +00:00
parent c64b39bc07
commit e77c31ed38
12 changed files with 845 additions and 199 deletions

View File

@ -304,6 +304,7 @@ type
SrcLen: integer; // length of current source
Code: pointer; // current code object
Values: TExpressionEvaluator;
SrcFilename: string;// current parsed filename
ScannedRange: TLinkScannerRange;
@ -849,6 +850,7 @@ begin
SrcLog:=FOnGetSource(Self,ACode);
if SrcLog=nil then
RaiseUnableToGetCode;
SrcFilename:=FOnGetFileName(Self,ACode);
AddSourceChangeStep(ACode,SrcLog.ChangeStep);
Src:=SrcLog.Source;
Code:=ACode;
@ -2541,13 +2543,13 @@ begin
if HasPathDelims then
DoDirSeparators(AFilename);
// first search include file in the directory of the main source
// first search include file in the directory of the current source
{$IFDEF VerboseIncludeSearch}
DebugLn('TLinkScanner.SearchIncludeFile MainSourceFilename="',FMainSourceFilename,'"');
{$ENDIF}
if FilenameIsAbsolute(FMainSourceFilename) then begin
if FilenameIsAbsolute(SrcFilename) then begin
// main source has absolute filename
ExpFilename:=ExtractFilePath(FMainSourceFilename)+AFilename;
ExpFilename:=ExtractFilePath(SrcFilename)+AFilename;
NewCode:=LoadSourceCaseLoUp(ExpFilename);
Result:=(NewCode<>nil);
if Result then exit;

View File

@ -6,6 +6,7 @@
<General>
<SessionStorage Value="InProjectDir"/>
<MainUnit Value="0"/>
<IconPath Value="./"/>
<TargetFileExt Value=""/>
</General>
<VersionInfo>
@ -13,7 +14,6 @@
</VersionInfo>
<PublishOptions>
<Version Value="2"/>
<IgnoreBinaries Value="False"/>
<IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
<ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
</PublishOptions>

View File

@ -5,6 +5,7 @@ object Form1: TForm1
Width = 400
HorzScrollBar.Page = 399
VertScrollBar.Page = 299
ActiveControl = StringGrid1
Caption = 'Form1'
OnCreate = FormCreate
object StringGrid1: TStringGrid
@ -23,9 +24,9 @@ object Form1: TForm1
OnSelectEditor = StringGrid1SelectEditor
end
object ComboBox1: TComboBox
Left = 140
Left = 120
Height = 25
Top = 170
Top = 175
Width = 100
AutoCompleteText = [cbactEndOfLineComplete, cbactSearchAscending]
ItemIndex = 0

View File

@ -2,17 +2,17 @@
LazarusResources.Add('TForm1','FORMDATA',[
'TPF0'#6'TForm1'#5'Form1'#4'Left'#3'"'#1#6'Height'#3','#1#3'Top'#3#189#0#5'Wi'
+'dth'#3#144#1#18'HorzScrollBar.Page'#3#143#1#18'VertScrollBar.Page'#3'+'#1#7
+'Caption'#6#5'Form1'#8'OnCreate'#7#10'FormCreate'#0#11'TStringGrid'#11'Strin'
+'gGrid1'#4'Left'#2#25#6'Height'#3#227#0#3'Top'#2'-'#5'Width'#3'h'#1#8'ColCou'
+'nt'#2#5#10'FixedColor'#7#9'clBtnFace'#13'GridLineWidth'#2#0#7'Options'#11#15
+'goFixedVertLine'#15'goFixedHorzLine'#10'goVertLine'#10'goHorzLine'#13'goRan'
+'geSelect'#9'goEditing'#18'goAlwaysShowEditor'#14'goSmoothScroll'#0#8'RowCou'
+'nt'#2#5#10'ScrollBars'#7#10'ssAutoBoth'#8'TabOrder'#2#0#7'TabStop'#9#14'OnS'
+'electEditor'#7#23'StringGrid1SelectEditor'#0#0#9'TComboBox'#9'ComboBox1'#4
+'Left'#3#140#0#6'Height'#2#25#3'Top'#3#170#0#5'Width'#2'd'#16'AutoCompleteTe'
+'xt'#11#22'cbactEndOfLineComplete'#20'cbactSearchAscending'#0#9'ItemIndex'#2
+#0#13'Items.Strings'#1#6#1'A'#6#1'B'#6#1'C'#0#9'MaxLength'#2#0#13'OnEditingD'
+'one'#7#20'ComboBox1EditingDone'#8'TabOrder'#2#1#4'Text'#6#1'A'#7'Visible'#8
+#0#0#0
+'dth'#3#144#1#18'HorzScrollBar.Page'#3#143#1#18'VertScrollBar.Page'#3'+'#1#13
+'ActiveControl'#7#11'StringGrid1'#7'Caption'#6#5'Form1'#8'OnCreate'#7#10'For'
+'mCreate'#0#11'TStringGrid'#11'StringGrid1'#4'Left'#2#25#6'Height'#3#227#0#3
+'Top'#2'-'#5'Width'#3'h'#1#8'ColCount'#2#5#10'FixedColor'#7#9'clBtnFace'#13
+'GridLineWidth'#2#0#7'Options'#11#15'goFixedVertLine'#15'goFixedHorzLine'#10
+'goVertLine'#10'goHorzLine'#13'goRangeSelect'#9'goEditing'#18'goAlwaysShowEd'
+'itor'#14'goSmoothScroll'#0#8'RowCount'#2#5#10'ScrollBars'#7#10'ssAutoBoth'#8
+'TabOrder'#2#0#7'TabStop'#9#14'OnSelectEditor'#7#23'StringGrid1SelectEditor'
+#0#0#9'TComboBox'#9'ComboBox1'#4'Left'#2'x'#6'Height'#2#25#3'Top'#3#175#0#5
+'Width'#2'd'#16'AutoCompleteText'#11#22'cbactEndOfLineComplete'#20'cbactSear'
+'chAscending'#0#9'ItemIndex'#2#0#13'Items.Strings'#1#6#1'A'#6#1'B'#6#1'C'#0#9
+'MaxLength'#2#0#13'OnEditingDone'#7#20'ComboBox1EditingDone'#8'TabOrder'#2#1
+#4'Text'#6#1'A'#7'Visible'#8#0#0#0
]);

View File

@ -41,54 +41,23 @@ object CodeBrowserView: TCodeBrowserView
UseOnChange = True
end
end
object LevelsCheckGroup: TCheckGroup
object OptionsGroupBox: TGroupBox
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = ScopeGroupBox
AnchorSideTop.Side = asrBottom
Left = 6
Height = 82
Top = 62
Width = 185
AutoFill = True
BorderSpacing.Around = 6
Caption = 'LevelsCheckGroup'
ChildSizing.LeftRightSpacing = 6
ChildSizing.TopBottomSpacing = 6
ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
ChildSizing.EnlargeVertical = crsHomogenousChildResize
ChildSizing.ShrinkHorizontal = crsScaleChilds
ChildSizing.ShrinkVertical = crsScaleChilds
ChildSizing.Layout = cclLeftToRightThenTopToBottom
ChildSizing.ControlsPerLine = 1
Items.Strings = (
'Packages'
'Units'
)
OnItemClick = LevelsCheckGroupItemClick
TabOrder = 1
Data = {
020000000202
}
end
object FilterGroupBox: TGroupBox
AnchorSideLeft.Control = LevelsCheckGroup
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = ScopeGroupBox
AnchorSideTop.Control = LevelsGroupBox
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = LevelsCheckGroup
AnchorSideBottom.Side = asrBottom
Left = 197
Height = 82
Top = 62
Width = 431
Anchors = [akTop, akLeft, akRight, akBottom]
Left = 6
Height = 50
Top = 190
Width = 622
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 6
BorderSpacing.Top = 6
BorderSpacing.Right = 6
Caption = 'FilterGroupBox'
TabOrder = 2
Caption = 'OptionsGroupBox'
TabOrder = 1
object ShowPrivateCheckBox: TCheckBox
Left = 12
Height = 20
@ -100,9 +69,9 @@ object CodeBrowserView: TCodeBrowserView
UseOnChange = True
end
object ShowProtectedCheckBox: TCheckBox
Left = 12
Left = 272
Height = 20
Top = 37
Top = 8
Width = 168
Caption = 'ShowProtectedCheckBox'
OnChange = ShowProtectedCheckBoxChange
@ -111,19 +80,21 @@ object CodeBrowserView: TCodeBrowserView
end
end
object BrowseTreeView: TTreeView
AnchorSideTop.Control = LevelsCheckGroup
AnchorSideTop.Control = OptionsGroupBox
AnchorSideTop.Side = asrBottom
Height = 394
Top = 150
Height = 298
Top = 246
Width = 634
Align = alBottom
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Top = 6
DefaultItemHeight = 16
Images = ImageList1
ParentShowHint = False
PopupMenu = PopupMenu1
ShowHint = True
ShowRoot = False
TabOrder = 3
TabOrder = 2
OnMouseDown = BrowseTreeViewMouseDown
OnShowHint = BrowseTreeViewShowHint
Options = [tvoAutoItemHeight, tvoHideSelection, tvoKeepCollapsedNodes, tvoShowButtons, tvoShowLines, tvoToolTips]
@ -134,8 +105,146 @@ object CodeBrowserView: TCodeBrowserView
Width = 634
Panels = <>
end
object LevelsGroupBox: TGroupBox
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = ScopeGroupBox
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
Left = 6
Height = 122
Top = 62
Width = 622
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Around = 6
Caption = 'LevelsGroupBox'
TabOrder = 3
object PackageFilterBeginsSpeedButton: TSpeedButton
AnchorSideLeft.Control = PackageFilterEdit
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = PackageFilterEdit
Left = 424
Height = 22
Top = 2
Width = 23
Color = clBtnFace
NumGlyphs = 0
end
object PackageFilterContainsSpeedButton: TSpeedButton
AnchorSideLeft.Control = PackageFilterBeginsSpeedButton
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = PackageFilterEdit
Left = 447
Height = 22
Top = 2
Width = 23
Color = clBtnFace
NumGlyphs = 0
end
object PackageFilterRegExSpeedButton: TSpeedButton
AnchorSideLeft.Control = PackageFilterContainsSpeedButton
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = PackageFilterEdit
Left = 470
Height = 22
Top = 2
Width = 23
Color = clBtnFace
NumGlyphs = 0
end
object ShowPackagesCheckBox: TCheckBox
Left = 6
Height = 20
Top = 3
Width = 170
Caption = 'ShowPackagesCheckBox'
OnChange = ShowPackagesCheckBoxChange
TabOrder = 0
end
object ShowUnitsCheckBox: TCheckBox
Left = 6
Height = 20
Top = 27
Width = 142
Caption = 'ShowUnitsCheckBox'
OnChange = ShowUnitsCheckBoxChange
TabOrder = 1
end
object ShowIdentifiersCheckBox: TCheckBox
Left = 6
Height = 20
Top = 51
Width = 168
Caption = 'ShowIdentifiersCheckBox'
OnChange = ShowIdentifiersCheckBoxChange
TabOrder = 2
end
object PackageFilterEdit: TEdit
AnchorSideTop.Control = ShowPackagesCheckBox
AnchorSideTop.Side = asrCenter
Left = 223
Height = 23
Top = 2
Width = 201
TabOrder = 3
Text = 'PackageFilterEdit'
end
end
object ImageList1: TImageList
left = 298
top = 196
end
object PopupMenu1: TPopupMenu
OnPopup = PopupMenu1Popup
left = 248
top = 196
object CopyDescriptionMenuItem: TMenuItem
Caption = 'CopyDescriptionMenuItem'
OnClick = CopyDescriptionMenuItemClick
end
object CopyIdentifierMenuItem: TMenuItem
Caption = 'CopyIdentifierMenuItem'
OnClick = CopyIdentifierMenuItemClick
end
object CopySeparatorMenuItem: TMenuItem
Caption = '-'
end
object ExpandAllPackagesMenuItem: TMenuItem
Caption = 'ExpandAllPackagesMenuItem'
OnClick = ExpandAllPackagesMenuItemClick
end
object CollapseAllPackagesMenuItem: TMenuItem
Caption = 'CollapseAllPackagesMenuItem'
OnClick = CollapseAllPackagesMenuItemClick
end
object AllPackagesSeparatorMenuItem: TMenuItem
Caption = '-'
end
object ExpandAllUnitsMenuItem: TMenuItem
Caption = 'ExpandAllUnitsMenuItem'
OnClick = ExpandAllUnitsMenuItemClick
end
object CollapseAllUnitsMenuItem: TMenuItem
Caption = 'CollapseAllUnitsMenuItem'
OnClick = CollapseAllUnitsMenuItemClick
end
object AllUnitsSeparatorMenuItem: TMenuItem
Caption = '-'
end
object ExpandAllClassesMenuItem: TMenuItem
Caption = 'ExpandAllClassesMenuItem'
OnClick = ExpandAllClassesMenuItemClick
end
object CollapseAllClassesMenuItem: TMenuItem
Caption = 'CollapseAllClassesMenuItem'
OnClick = CollapseAllClassesMenuItemClick
end
object AllClassesSeparatorMenuItem: TMenuItem
Caption = '-'
end
object ExportMenuItem: TMenuItem
Caption = 'ExportMenuItem'
OnClick = ExportMenuItemClick
end
end
end

View File

@ -15,40 +15,77 @@ LazarusResources.Add('TCodeBrowserView','FORMDATA',[
+'Box!ScopeWithRequiredPackagesCheckBox'#4'Left'#3'H'#1#6'Height'#2#20#3'Top'
+#2#3#5'Width'#3#249#0#7'Caption'#6'!ScopeWithRequiredPackagesCheckBox'#8'OnC'
+'hange'#7'''ScopeWithRequiredPackagesCheckBoxChange'#8'TabOrder'#2#1#11'UseO'
+'nChange'#9#0#0#0#11'TCheckGroup'#16'LevelsCheckGroup'#22'AnchorSideLeft.Con'
+'trol'#7#5'Owner'#21'AnchorSideTop.Control'#7#13'ScopeGroupBox'#18'AnchorSid'
+'eTop.Side'#7#9'asrBottom'#4'Left'#2#6#6'Height'#2'R'#3'Top'#2'>'#5'Width'#3
+#185#0#8'AutoFill'#9#20'BorderSpacing.Around'#2#6#7'Caption'#6#16'LevelsChec'
+'kGroup'#28'ChildSizing.LeftRightSpacing'#2#6#28'ChildSizing.TopBottomSpacin'
+'g'#2#6#29'ChildSizing.EnlargeHorizontal'#7#24'crsHomogenousChildResize'#27
+'ChildSizing.EnlargeVertical'#7#24'crsHomogenousChildResize'#28'ChildSizing.'
+'ShrinkHorizontal'#7#14'crsScaleChilds'#26'ChildSizing.ShrinkVertical'#7#14
+'crsScaleChilds'#18'ChildSizing.Layout'#7#29'cclLeftToRightThenTopToBottom'
+#27'ChildSizing.ControlsPerLine'#2#1#13'Items.Strings'#1#6#8'Packages'#6#5'U'
+'nits'#0#11'OnItemClick'#7#25'LevelsCheckGroupItemClick'#8'TabOrder'#2#1#4'D'
+'ata'#10#6#0#0#0#2#0#0#0#2#2#0#0#9'TGroupBox'#14'FilterGroupBox'#22'AnchorSi'
+'deLeft.Control'#7#16'LevelsCheckGroup'#19'AnchorSideLeft.Side'#7#9'asrBotto'
+'m'#21'AnchorSideTop.Control'#7#13'ScopeGroupBox'#18'AnchorSideTop.Side'#7#9
+'asrBottom'#23'AnchorSideRight.Control'#7#5'Owner'#20'AnchorSideRight.Side'#7
+#9'asrBottom'#24'AnchorSideBottom.Control'#7#16'LevelsCheckGroup'#21'AnchorS'
+'ideBottom.Side'#7#9'asrBottom'#4'Left'#3#197#0#6'Height'#2'R'#3'Top'#2'>'#5
+'Width'#3#175#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#8'akBottom'#0#18
+'BorderSpacing.Left'#2#6#17'BorderSpacing.Top'#2#6#19'BorderSpacing.Right'#2
+#6#7'Caption'#6#14'FilterGroupBox'#8'TabOrder'#2#2#0#9'TCheckBox'#19'ShowPri'
+'vateCheckBox'#4'Left'#2#12#6'Height'#2#20#3'Top'#2#8#5'Width'#3#154#0#7'Cap'
+'tion'#6#19'ShowPrivateCheckBox'#8'OnChange'#7#25'ShowPrivateCheckBoxChange'
+#8'TabOrder'#2#0#11'UseOnChange'#9#0#0#9'TCheckBox'#21'ShowProtectedCheckBox'
+#4'Left'#2#12#6'Height'#2#20#3'Top'#2'%'#5'Width'#3#168#0#7'Caption'#6#21'Sh'
+'owProtectedCheckBox'#8'OnChange'#7#27'ShowProtectedCheckBoxChange'#8'TabOrd'
+'er'#2#1#11'UseOnChange'#9#0#0#0#9'TTreeView'#14'BrowseTreeView'#21'AnchorSi'
+'deTop.Control'#7#16'LevelsCheckGroup'#18'AnchorSideTop.Side'#7#9'asrBottom'
+#6'Height'#3#138#1#3'Top'#3#150#0#5'Width'#3'z'#2#5'Align'#7#8'alBottom'#7'A'
+'nchors'#11#5'akTop'#6'akLeft'#7'akRight'#8'akBottom'#0#17'DefaultItemHeight'
+#2#16#6'Images'#7#10'ImageList1'#14'ParentShowHint'#8#8'ShowHint'#9#8'ShowRo'
+'ot'#8#8'TabOrder'#2#3#11'OnMouseDown'#7#23'BrowseTreeViewMouseDown'#10'OnSh'
+'owHint'#7#22'BrowseTreeViewShowHint'#7'Options'#11#17'tvoAutoItemHeight'#16
+'tvoHideSelection'#21'tvoKeepCollapsedNodes'#14'tvoShowButtons'#12'tvoShowLi'
+'nes'#11'tvoToolTips'#0#0#0#10'TStatusBar'#10'StatusBar1'#6'Height'#2#20#3'T'
+'op'#3' '#2#5'Width'#3'z'#2#6'Panels'#14#0#0#0#10'TImageList'#10'ImageList1'
+#4'left'#3'*'#1#3'top'#3#196#0#0#0#0
+'nChange'#9#0#0#0#9'TGroupBox'#15'OptionsGroupBox'#22'AnchorSideLeft.Control'
+#7#5'Owner'#21'AnchorSideTop.Control'#7#14'LevelsGroupBox'#18'AnchorSideTop.'
+'Side'#7#9'asrBottom'#23'AnchorSideRight.Control'#7#5'Owner'#20'AnchorSideRi'
+'ght.Side'#7#9'asrBottom'#21'AnchorSideBottom.Side'#7#9'asrBottom'#4'Left'#2
+#6#6'Height'#2'2'#3'Top'#3#190#0#5'Width'#3'n'#2#7'Anchors'#11#5'akTop'#6'ak'
+'Left'#7'akRight'#0#18'BorderSpacing.Left'#2#6#17'BorderSpacing.Top'#2#6#19
+'BorderSpacing.Right'#2#6#7'Caption'#6#15'OptionsGroupBox'#8'TabOrder'#2#1#0
+#9'TCheckBox'#19'ShowPrivateCheckBox'#4'Left'#2#12#6'Height'#2#20#3'Top'#2#8
+#5'Width'#3#154#0#7'Caption'#6#19'ShowPrivateCheckBox'#8'OnChange'#7#25'Show'
+'PrivateCheckBoxChange'#8'TabOrder'#2#0#11'UseOnChange'#9#0#0#9'TCheckBox'#21
+'ShowProtectedCheckBox'#4'Left'#3#16#1#6'Height'#2#20#3'Top'#2#8#5'Width'#3
+#168#0#7'Caption'#6#21'ShowProtectedCheckBox'#8'OnChange'#7#27'ShowProtected'
+'CheckBoxChange'#8'TabOrder'#2#1#11'UseOnChange'#9#0#0#0#9'TTreeView'#14'Bro'
+'wseTreeView'#21'AnchorSideTop.Control'#7#15'OptionsGroupBox'#18'AnchorSideT'
+'op.Side'#7#9'asrBottom'#6'Height'#3'*'#1#3'Top'#3#246#0#5'Width'#3'z'#2#5'A'
+'lign'#7#8'alBottom'#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#8'akBottom'
+#0#17'BorderSpacing.Top'#2#6#17'DefaultItemHeight'#2#16#6'Images'#7#10'Image'
+'List1'#14'ParentShowHint'#8#9'PopupMenu'#7#10'PopupMenu1'#8'ShowHint'#9#8'S'
+'howRoot'#8#8'TabOrder'#2#2#11'OnMouseDown'#7#23'BrowseTreeViewMouseDown'#10
+'OnShowHint'#7#22'BrowseTreeViewShowHint'#7'Options'#11#17'tvoAutoItemHeight'
+#16'tvoHideSelection'#21'tvoKeepCollapsedNodes'#14'tvoShowButtons'#12'tvoSho'
+'wLines'#11'tvoToolTips'#0#0#0#10'TStatusBar'#10'StatusBar1'#6'Height'#2#20#3
+'Top'#3' '#2#5'Width'#3'z'#2#6'Panels'#14#0#0#0#9'TGroupBox'#14'LevelsGroupB'
+'ox'#22'AnchorSideLeft.Control'#7#5'Owner'#21'AnchorSideTop.Control'#7#13'Sc'
+'opeGroupBox'#18'AnchorSideTop.Side'#7#9'asrBottom'#23'AnchorSideRight.Contr'
+'ol'#7#5'Owner'#20'AnchorSideRight.Side'#7#9'asrBottom'#4'Left'#2#6#6'Height'
+#2'z'#3'Top'#2'>'#5'Width'#3'n'#2#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'
+#0#20'BorderSpacing.Around'#2#6#7'Caption'#6#14'LevelsGroupBox'#8'TabOrder'#2
+#3#0#12'TSpeedButton'#30'PackageFilterBeginsSpeedButton'#22'AnchorSideLeft.C'
+'ontrol'#7#17'PackageFilterEdit'#19'AnchorSideLeft.Side'#7#9'asrBottom'#21'A'
+'nchorSideTop.Control'#7#17'PackageFilterEdit'#4'Left'#3#168#1#6'Height'#2#22
+#3'Top'#2#2#5'Width'#2#23#5'Color'#7#9'clBtnFace'#9'NumGlyphs'#2#0#0#0#12'TS'
+'peedButton PackageFilterContainsSpeedButton'#22'AnchorSideLeft.Control'#7#30
+'PackageFilterBeginsSpeedButton'#19'AnchorSideLeft.Side'#7#9'asrBottom'#21'A'
+'nchorSideTop.Control'#7#17'PackageFilterEdit'#4'Left'#3#191#1#6'Height'#2#22
+#3'Top'#2#2#5'Width'#2#23#5'Color'#7#9'clBtnFace'#9'NumGlyphs'#2#0#0#0#12'TS'
+'peedButton'#29'PackageFilterRegExSpeedButton'#22'AnchorSideLeft.Control'#7
+' PackageFilterContainsSpeedButton'#19'AnchorSideLeft.Side'#7#9'asrBottom'#21
+'AnchorSideTop.Control'#7#17'PackageFilterEdit'#4'Left'#3#214#1#6'Height'#2
+#22#3'Top'#2#2#5'Width'#2#23#5'Color'#7#9'clBtnFace'#9'NumGlyphs'#2#0#0#0#9
+'TCheckBox'#20'ShowPackagesCheckBox'#4'Left'#2#6#6'Height'#2#20#3'Top'#2#3#5
+'Width'#3#170#0#7'Caption'#6#20'ShowPackagesCheckBox'#8'OnChange'#7#26'ShowP'
+'ackagesCheckBoxChange'#8'TabOrder'#2#0#0#0#9'TCheckBox'#17'ShowUnitsCheckBo'
+'x'#4'Left'#2#6#6'Height'#2#20#3'Top'#2#27#5'Width'#3#142#0#7'Caption'#6#17
+'ShowUnitsCheckBox'#8'OnChange'#7#23'ShowUnitsCheckBoxChange'#8'TabOrder'#2#1
+#0#0#9'TCheckBox'#23'ShowIdentifiersCheckBox'#4'Left'#2#6#6'Height'#2#20#3'T'
+'op'#2'3'#5'Width'#3#168#0#7'Caption'#6#23'ShowIdentifiersCheckBox'#8'OnChan'
+'ge'#7#29'ShowIdentifiersCheckBoxChange'#8'TabOrder'#2#2#0#0#5'TEdit'#17'Pac'
+'kageFilterEdit'#21'AnchorSideTop.Control'#7#20'ShowPackagesCheckBox'#18'Anc'
+'horSideTop.Side'#7#9'asrCenter'#4'Left'#3#223#0#6'Height'#2#23#3'Top'#2#2#5
,'Width'#3#201#0#8'TabOrder'#2#3#4'Text'#6#17'PackageFilterEdit'#0#0#0#10'TIm'
+'ageList'#10'ImageList1'#4'left'#3'*'#1#3'top'#3#196#0#0#0#10'TPopupMenu'#10
+'PopupMenu1'#7'OnPopup'#7#15'PopupMenu1Popup'#4'left'#3#248#0#3'top'#3#196#0
+#0#9'TMenuItem'#23'CopyDescriptionMenuItem'#7'Caption'#6#23'CopyDescriptionM'
+'enuItem'#7'OnClick'#7#28'CopyDescriptionMenuItemClick'#0#0#9'TMenuItem'#22
+'CopyIdentifierMenuItem'#7'Caption'#6#22'CopyIdentifierMenuItem'#7'OnClick'#7
+#27'CopyIdentifierMenuItemClick'#0#0#9'TMenuItem'#21'CopySeparatorMenuItem'#7
+'Caption'#6#1'-'#0#0#9'TMenuItem'#25'ExpandAllPackagesMenuItem'#7'Caption'#6
+#25'ExpandAllPackagesMenuItem'#7'OnClick'#7#30'ExpandAllPackagesMenuItemClic'
+'k'#0#0#9'TMenuItem'#27'CollapseAllPackagesMenuItem'#7'Caption'#6#27'Collaps'
+'eAllPackagesMenuItem'#7'OnClick'#7' CollapseAllPackagesMenuItemClick'#0#0#9
+'TMenuItem'#28'AllPackagesSeparatorMenuItem'#7'Caption'#6#1'-'#0#0#9'TMenuIt'
+'em'#22'ExpandAllUnitsMenuItem'#7'Caption'#6#22'ExpandAllUnitsMenuItem'#7'On'
+'Click'#7#27'ExpandAllUnitsMenuItemClick'#0#0#9'TMenuItem'#24'CollapseAllUni'
+'tsMenuItem'#7'Caption'#6#24'CollapseAllUnitsMenuItem'#7'OnClick'#7#29'Colla'
+'pseAllUnitsMenuItemClick'#0#0#9'TMenuItem'#25'AllUnitsSeparatorMenuItem'#7
+'Caption'#6#1'-'#0#0#9'TMenuItem'#24'ExpandAllClassesMenuItem'#7'Caption'#6
+#24'ExpandAllClassesMenuItem'#7'OnClick'#7#29'ExpandAllClassesMenuItemClick'
+#0#0#9'TMenuItem'#26'CollapseAllClassesMenuItem'#7'Caption'#6#26'CollapseAll'
+'ClassesMenuItem'#7'OnClick'#7#31'CollapseAllClassesMenuItemClick'#0#0#9'TMe'
+'nuItem'#27'AllClassesSeparatorMenuItem'#7'Caption'#6#1'-'#0#0#9'TMenuItem'
+#14'ExportMenuItem'#7'Caption'#6#14'ExportMenuItem'#7'OnClick'#7#19'ExportMe'
+'nuItemClick'#0#0#0#0
]);

View File

@ -40,15 +40,16 @@ interface
uses
Classes, SysUtils, LCLProc, LResources, Forms, Controls, Graphics, Dialogs,
LCLIntf, AvgLvlTree, StdCtrls, ExtCtrls, ComCtrls, Buttons,
Clipbrd, LCLIntf, AvgLvlTree, StdCtrls, ExtCtrls, ComCtrls, Buttons,
// codetools
CodeAtom, BasicCodeTools, DefineTemplates, CodeTree, CodeCache, CodeToolManager,
PascalParserTool, LinkScanner, FileProcs,
CodeAtom, BasicCodeTools, DefineTemplates, CodeTree, CodeCache,
CodeToolManager, PascalParserTool, LinkScanner, FileProcs,
// IDEIntf
LazConfigStorage, Project, PackageIntf, IDECommands, LazIDEIntf,
IDEDialogs, LazConfigStorage, Project, PackageIntf, IDECommands, LazIDEIntf,
DialogProcs,
// IDE
PackageSystem, PackageDefs, LazarusIDEStrConsts, IDEOptionDefs,
EnvironmentOpts;
EnvironmentOpts, Menus;
type
TCodeBrowserUnit = class;
@ -64,20 +65,22 @@ type
FCodePos: TCodePosition;
FDesc: TCodeTreeNodeDesc;
FDescription: string;
FIdentifier: string;
FParentNode: TCodeBrowserNode;
public
constructor Create(TheUnit: TCodeBrowserUnit;
TheParent: TCodeBrowserNode;
const TheDescription: string);
const TheDescription, TheIdentifier: string);
destructor Destroy; override;
procedure Clear;
function AddNode(const Description: string): TCodeBrowserNode;
function AddNode(const Description, Identifier: string): TCodeBrowserNode;
property CBUnit: TCodeBrowserUnit read FCBUnit;
property Desc: TCodeTreeNodeDesc read FDesc write FDesc;
property CodePos: TCodePosition read FCodePos write FCodePos;
property ParentNode: TCodeBrowserNode read FParentNode;
property ChildNodes: TAvgLvlTree read FChildNodes;
property Description: string read FDescription;
property Identifier: string read FIdentifier;
end;
@ -102,7 +105,7 @@ type
constructor Create(const TheFilename: string);
destructor Destroy; override;
procedure Clear;
function AddNode(const Description: string): TCodeBrowserNode;
function AddNode(const Description, Identifier: string): TCodeBrowserNode;
property Filename: string read FFilename;
property CodeBuffer: TCodeBuffer read FCodeBuffer write SetCodeBuffer;
property CodeTool: TCodeTool read FCodeTool write SetCodeTool;
@ -150,13 +153,29 @@ type
type
TCodeBrowserLevel = (
cblPackages,
cblUnits
cblUnits,
cblIdentifiers
);
TCodeBrowserTextFilter = (
cbtfBegins,
cbtfContains,
cbtfEnds,
cbtfRegEx
);
const
CodeBrowserLevelNames: array[TCodeBrowserLevel] of string = (
'Packages',
'Units'
'Units',
'Identifiers'
);
CodeBrowserTextFilterNames: array[TCodeBrowserTextFilter] of string = (
'Begins',
'Contains',
'Ends',
'RegEx'
);
CodeBrowserIDEName = ' '+'Lazarus IDE';// Note: space is needed to avoid name clashing
@ -175,6 +194,15 @@ type
FShowPrivate: boolean;
FShowProtected: boolean;
FWithRequiredPackages: boolean;
FLevelFilterText: array[TCodeBrowserLevel] of string;
FLevelFilterType: array[TCodeBrowserLevel] of TCodeBrowserTextFilter;
function GetLevelFilterText(Level: TCodeBrowserLevel): string;
function GetLevelFilterType(Level: TCodeBrowserLevel
): TCodeBrowserTextFilter;
procedure SetLevelFilterText(Level: TCodeBrowserLevel; const AValue: string
);
procedure SetLevelFilterType(Level: TCodeBrowserLevel;
const AValue: TCodeBrowserTextFilter);
procedure SetModified(const AValue: boolean);
procedure SetScope(const AValue: string);
procedure SetLevels(const AValue: TStrings);
@ -193,6 +221,8 @@ type
property Levels: TStrings read FLevels write SetLevels;
property ShowPrivate: boolean read FShowPrivate write SetShowPrivate;
property ShowProtected: boolean read FShowProtected write SetShowProtected;
property LevelFilterText[Level: TCodeBrowserLevel]: string read GetLevelFilterText write SetLevelFilterText;
property LevelFilterType[Level: TCodeBrowserLevel]: TCodeBrowserTextFilter read GetLevelFilterType write SetLevelFilterType;
property Modified: boolean read FModified write SetModified;
end;
@ -208,33 +238,77 @@ type
cbwsUpdateTreeView,
cbwsFinished
);
TExpandableNodeType = (
entPackage,
entUnit,
entClass
);
TCopyNodeType = (
cntIdentifier,
cntDescription
);
{ TCodeBrowserView }
TCodeBrowserView = class(TForm)
PackageFilterEdit: TEdit;
ShowIdentifiersCheckBox: TCheckBox;
ShowUnitsCheckBox: TCheckBox;
ShowPackagesCheckBox: TCheckBox;
ExpandAllPackagesMenuItem: TMenuItem;
CollapseAllPackagesMenuItem: TMenuItem;
ExpandAllUnitsMenuItem: TMenuItem;
CollapseAllUnitsMenuItem: TMenuItem;
ExpandAllClassesMenuItem: TMenuItem;
CollapseAllClassesMenuItem: TMenuItem;
AllPackagesSeparatorMenuItem: TMenuItem;
AllUnitsSeparatorMenuItem: TMenuItem;
LevelsGroupBox: TGroupBox;
AllClassesSeparatorMenuItem: TMenuItem;
ExportMenuItem: TMenuItem;
CopyDescriptionMenuItem: TMenuItem;
CopyIdentifierMenuItem: TMenuItem;
CopySeparatorMenuItem: TMenuItem;
PopupMenu1: TPopupMenu;
ShowProtectedCheckBox: TCheckBox;
ShowPrivateCheckBox: TCheckBox;
ImageList1: TImageList;
FilterGroupBox: TGroupBox;
LevelsCheckGroup: TCheckGroup;
OptionsGroupBox: TGroupBox;
ScopeWithRequiredPackagesCheckBox: TCheckBox;
ScopeComboBox: TComboBox;
ScopeGroupBox: TGroupBox;
BrowseTreeView: TTreeView;
PackageFilterBeginsSpeedButton: TSpeedButton;
PackageFilterContainsSpeedButton: TSpeedButton;
PackageFilterRegExSpeedButton: TSpeedButton;
StatusBar1: TStatusBar;
procedure BrowseTreeViewMouseDown(Sender: TOBject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure BrowseTreeViewShowHint(Sender: TObject; HintInfo: PHintInfo);
procedure CollapseAllPackagesMenuItemClick(Sender: TObject);
procedure CollapseAllUnitsMenuItemClick(Sender: TObject);
procedure CollapseAllClassesMenuItemClick(Sender: TObject);
procedure CopyDescriptionMenuItemClick(Sender: TObject);
procedure CopyIdentifierMenuItemClick(Sender: TObject);
procedure ExpandAllClassesMenuItemClick(Sender: TObject);
procedure ExpandAllPackagesMenuItemClick(Sender: TObject);
procedure ExpandAllUnitsMenuItemClick(Sender: TObject);
procedure ExportMenuItemClick(Sender: TObject);
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure LevelsCheckGroupItemClick(Sender: TObject; Index: integer);
procedure PopupMenu1Popup(Sender: TObject);
procedure ScopeComboBoxDropDown(Sender: TObject);
procedure ScopeComboBoxEditingDone(Sender: TObject);
procedure ScopeWithRequiredPackagesCheckBoxChange(Sender: TObject);
procedure OnIdle(Sender: TObject);
procedure ShowIdentifiersCheckBoxChange(Sender: TObject);
procedure ShowPackagesCheckBoxChange(Sender: TObject);
procedure ShowPrivateCheckBoxChange(Sender: TObject);
procedure ShowProtectedCheckBoxChange(Sender: TObject);
procedure ShowUnitsCheckBoxChange(Sender: TObject);
private
FIDEDescription: string;
FOptions: TCodeBrowserViewOptions;
@ -271,7 +345,7 @@ type
ImgIDPackage: Integer;
ImgIDProject: Integer;
procedure LoadOptions;
procedure LoadLevelsCheckGroup;
procedure LoadLevelsGroupBox;
procedure LoadFilterGroupbox;
procedure FillScopeComboBox;
procedure SetScannedBytes(const AValue: PtrInt);
@ -302,9 +376,14 @@ type
procedure InitImageList;
function GetNodeImage(CodeNode: TObject): integer;
function GetTVNodeHint(TVNode: TTreeNode): string;
procedure ExpandCollapseAllNodesInTreeView(NodeType: TExpandableNodeType;
Expand: boolean);
procedure CopyNode(TVNode: TTreeNode; NodeType: TCopyNodeType);
public
procedure BeginUpdate;
procedure EndUpdate;
function ExportTree: TModalResult;
function ExportTreeAsText(Filename: string): TModalResult;
property ParserRoot: TCodeBrowserUnitList read FParserRoot;
property WorkingParserRoot: TCodeBrowserUnitList read FWorkingParserRoot;
property ViewRoot: TObject read FViewRoot;// can be TCodeBrowserUnitList or TCodeBrowserUnit or TCodeBrowserNode
@ -326,10 +405,12 @@ function CompareUnitListOwners(Data1, Data2: Pointer): integer;
function ComparePAnsiStringWithUnitListOwner(Data1, Data2: Pointer): integer;
function CompareUnitFilenames(Data1, Data2: Pointer): integer;
function ComparePAnsiStringWithUnitFilename(Data1, Data2: Pointer): integer;
function CompareNodeDescriptions(Data1, Data2: Pointer): integer;
function ComparePAnsiStringWithNodeDescription(Data1, Data2: Pointer): integer;
function CompareNodeIdentifiers(Data1, Data2: Pointer): integer;
function ComparePAnsiStringWithNodeIdentifier(Data1, Data2: Pointer): integer;
function StringToCodeBrowserTextFilter(const s: string): TCodeBrowserTextFilter;
implementation
@ -357,16 +438,23 @@ begin
TCodeBrowserUnit(Data2).Filename);
end;
function CompareNodeDescriptions(Data1, Data2: Pointer): integer;
function CompareNodeIdentifiers(Data1, Data2: Pointer): integer;
begin
Result:=SysUtils.CompareText(TCodeBrowserNode(Data1).Description,
TCodeBrowserNode(Data2).Description);
Result:=SysUtils.CompareText(TCodeBrowserNode(Data1).Identifier,
TCodeBrowserNode(Data2).Identifier);
end;
function ComparePAnsiStringWithNodeDescription(Data1, Data2: Pointer): integer;
function ComparePAnsiStringWithNodeIdentifier(Data1, Data2: Pointer): integer;
begin
Result:=SysUtils.CompareText(PAnsiString(Data1)^,
TCodeBrowserNode(Data2).Description);
TCodeBrowserNode(Data2).Identifier);
end;
function StringToCodeBrowserTextFilter(const s: string): TCodeBrowserTextFilter;
begin
for Result:=Low(TCodeBrowserTextFilter) to High(TCodeBrowserTextFilter) do
if SysUtils.CompareText(CodeBrowserTextFilterNames[Result],s)=0 then exit;
Result:=cbtfBegins;
end;
@ -385,13 +473,22 @@ begin
ScopeGroupBox.Caption:='Scope';
ScopeWithRequiredPackagesCheckBox.Caption:='With required packages';
LevelsCheckGroup.Caption:='Levels';
LevelsCheckGroup.Items[0]:='Packages';
LevelsCheckGroup.Items[1]:='Units';
LevelsGroupBox.Caption:='Levels';
ShowPackagesCheckBox.Caption:='Show packages';
ShowUnitsCheckBox.Caption:='Show units';
ShowIdentifiersCheckBox.Caption:='Show identifiers';
FilterGroupBox.Caption:='Filter';
OptionsGroupBox.Caption:='Filter';
ShowPrivateCheckBox.Caption:='Private';
ShowProtectedCheckBox.Caption:='Protected';
ExpandAllPackagesMenuItem.Caption:='Expand all packages';
CollapseAllPackagesMenuItem.Caption:='Collapse all packages';
ExpandAllUnitsMenuItem.Caption:='Expand all units';
CollapseAllUnitsMenuItem.Caption:='Collapse all units';
ExpandAllClassesMenuItem.Caption:='Expand all classes';
CollapseAllClassesMenuItem.Caption:='Collapse all classes';
ExportMenuItem.Caption:='Export ...';
InitImageList;
LoadOptions;
@ -410,10 +507,44 @@ begin
FreeAndNil(FOptions);
end;
procedure TCodeBrowserView.LevelsCheckGroupItemClick(Sender: TObject;
Index: integer);
procedure TCodeBrowserView.PopupMenu1Popup(Sender: TObject);
var
TVNode: TTreeNode;
Node: TObject;
Identifier: String;
begin
fStage:=cbwsGetOptions;
ExpandAllPackagesMenuItem.Visible:=Options.HasLevel(cblPackages);
CollapseAllPackagesMenuItem.Visible:=ExpandAllPackagesMenuItem.Visible;
AllPackagesSeparatorMenuItem.Visible:=ExpandAllPackagesMenuItem.Visible;
ExpandAllUnitsMenuItem.Visible:=Options.HasLevel(cblUnits);
CollapseAllUnitsMenuItem.Visible:=ExpandAllUnitsMenuItem.Visible;
AllUnitsSeparatorMenuItem.Visible:=ExpandAllUnitsMenuItem.Visible;
ExpandAllClassesMenuItem.Visible:=Options.HasLevel(cblIdentifiers);
CollapseAllClassesMenuItem.Visible:=ExpandAllClassesMenuItem.Visible;
AllClassesSeparatorMenuItem.Visible:=ExpandAllClassesMenuItem.Visible;
TVNode:=BrowseTreeView.Selected;
Node:=nil;
if TVNode<>nil then
Node:=TOBject(TVNode.Data);
if Node<>nil then begin
if Node is TCodeBrowserNode then
Identifier:=TCodeBrowserNode(Node).Identifier
else
Identifier:='';
CopyDescriptionMenuItem.Caption:='Copy description to clipboard';
CopyIdentifierMenuItem.Caption:='Copy "'+Identifier+'" to clipboard';
CopyDescriptionMenuItem.Visible:=true;
CopyIdentifierMenuItem.Visible:=Identifier<>'';
CopySeparatorMenuItem.Visible:=true;
end else begin
CopyDescriptionMenuItem.Visible:=false;
CopyIdentifierMenuItem.Visible:=false;
CopySeparatorMenuItem.Visible:=false;
end;
end;
procedure TCodeBrowserView.ScopeComboBoxDropDown(Sender: TObject);
@ -442,6 +573,16 @@ begin
Work;
end;
procedure TCodeBrowserView.ShowIdentifiersCheckBoxChange(Sender: TObject);
begin
fStage:=cbwsGetOptions;
end;
procedure TCodeBrowserView.ShowPackagesCheckBoxChange(Sender: TObject);
begin
fStage:=cbwsGetOptions;
end;
procedure TCodeBrowserView.ShowPrivateCheckBoxChange(Sender: TObject);
begin
fStage:=cbwsGetOptions;
@ -452,22 +593,26 @@ begin
fStage:=cbwsGetOptions;
end;
procedure TCodeBrowserView.ShowUnitsCheckBoxChange(Sender: TObject);
begin
fStage:=cbwsGetOptions;
end;
procedure TCodeBrowserView.LoadOptions;
begin
BeginUpdate;
ScopeWithRequiredPackagesCheckBox.Checked:=Options.WithRequiredPackages;
ScopeComboBox.Text:=Options.Scope;
LoadLevelsCheckGroup;
LoadLevelsGroupBox;
LoadFilterGroupbox;
EndUpdate;
end;
procedure TCodeBrowserView.LoadLevelsCheckGroup;
var
i: Integer;
procedure TCodeBrowserView.LoadLevelsGroupBox;
begin
for i:=0 to LevelsCheckGroup.Items.Count-1 do
LevelsCheckGroup.Checked[i]:=Options.HasLevel(TCodeBrowserLevel(i));
ShowPackagesCheckBox.Checked:=Options.HasLevel(cblPackages);
ShowUnitsCheckBox.Checked:=Options.HasLevel(cblUnits);
ShowIdentifiersCheckBox.Checked:=Options.HasLevel(cblIdentifiers);
end;
procedure TCodeBrowserView.LoadFilterGroupbox;
@ -593,7 +738,6 @@ end;
procedure TCodeBrowserView.WorkGetOptions;
var
i: Integer;
NewLevels: TStringList;
begin
DebugLn(['TCodeBrowserView.WorkGetOptions START']);
@ -602,9 +746,12 @@ begin
Options.ShowPrivate:=ShowPrivateCheckBox.Checked;
Options.ShowProtected:=ShowProtectedCheckBox.Checked;
NewLevels:=TStringList.Create;
for i:=0 to LevelsCheckGroup.Items.Count-1 do
if LevelsCheckGroup.Checked[i] then
NewLevels.Add(CodeBrowserLevelNames[TCodeBrowserLevel(i)]);
if ShowPackagesCheckBox.Checked then
NewLevels.Add(CodeBrowserLevelNames[cblPackages]);
if ShowUnitsCheckBox.Checked then
NewLevels.Add(CodeBrowserLevelNames[cblUnits]);
if ShowIdentifiersCheckBox.Checked then
NewLevels.Add(CodeBrowserLevelNames[cblIdentifiers]);
Options.Levels:=NewLevels;
NewLevels.Free;
@ -1229,6 +1376,7 @@ procedure TCodeBrowserView.UpdateTreeView;
var
ShowPackages: boolean;
ShowUnits: boolean;
ShowIdentifiers: boolean;
ShowPrivate: boolean;
ShowProtected: boolean;
@ -1252,16 +1400,84 @@ var
if DestUnit=nil then
DestUnit:=TCodeBrowserUnit.Create('');
end;
function Shorten(const s: string): string;
begin
Result:=DbgStr(s);
if length(Result)>100 then Result:=copy(Result,1,100);
end;
procedure AddIdentifierNode(CTNode: TCodeTreeNode;
const Description: string);
procedure GetNodeDescription(CTNode: TCodeTreeNode;
out Description, Identifier: string);
const
ProcDescFlags = [phpWithStart,phpWithParameterNames,
phpWithVarModifiers,phpWithResultType,phpWithoutSemicolon];
ProcIdentifierFlags = [phpWithoutClassKeyword,phpWithParameterNames,
phpWithVarModifiers,phpWithResultType,phpWithoutSemicolon];
PropDescFlags = [phpWithoutClassKeyword,phpWithParameterNames,
phpWithVarModifiers,phpWithResultType];
NodeFlags = [];
var
Inheritance: String;
begin
case CTNode.Desc of
ctnProcedure:
begin
Identifier:=Tool.ExtractProcHead(CTNode,ProcIdentifierFlags);
Description:=Tool.ExtractProcHead(CTNode,ProcDescFlags);
end;
ctnVarDefinition:
begin
Identifier:=Tool.ExtractDefinitionName(CTNode);
Description:='var '+Identifier
+' : '+Shorten(Tool.ExtractDefinitionNodeType(CTNode));
end;
ctnConstDefinition:
begin
Identifier:=Tool.ExtractDefinitionName(CTNode);
Description:='const '+Identifier
+' = '+Shorten(Tool.ExtractNode(CTNode,NodeFlags));
end;
ctnTypeDefinition:
begin
Identifier:=Tool.ExtractDefinitionName(CTNode);
Description:='type '+Identifier;
if CTNode.FirstChild<>nil then begin
case CTNode.FirstChild.Desc of
ctnClass,ctnClassInterface:
begin
Description:=Description+' = class';
Inheritance:=Tool.ExtractClassInheritance(CTNode.FirstChild,[]);
if Inheritance<>'' then
Description:=Description+'('+Inheritance+')';
end;
ctnRecordType:
Description:=Description+' = record';
end;
end;
end;
ctnProperty:
begin
Identifier:=Tool.ExtractPropName(CTNode,false);
Description:='property '+Shorten(Tool.ExtractProperty(CTNode,PropDescFlags));
end;
ctnEnumIdentifier:
begin
Identifier:=Tool.ExtractIdentifier(CTNode.StartPos);
Description:='enum '+Identifier;
end;
end;
end;
procedure AddIdentifierNode(CTNode: TCodeTreeNode);
var
NewNode: TCodeBrowserNode;
ChildCTNode: TCodeTreeNode;
procedure AddChildNode(const ChildDescription: string);
procedure AddChildNode;
var
NewChildNode: TCodeBrowserNode;
ChildDescription, ChildIdentifier: string;
begin
//DebugLn(['AddChildNode ',ChildCTNode.DescAsString,' ',ChildDescription]);
if (ChildCTNode.Parent.Desc=ctnClassPrivate) and (not ShowPrivate) then
@ -1269,17 +1485,22 @@ var
if (ChildCTNode.Parent.Desc=ctnClassProtected) and (not ShowProtected)
then
exit;
NewChildNode:=NewNode.AddNode(ChildDescription);
GetNodeDescription(ChildCTNode,ChildDescription,ChildIdentifier);
NewChildNode:=NewNode.AddNode(ChildDescription,ChildIdentifier);
if NewChildNode<>nil then begin
NewChildNode.Desc:=ChildCTNode.Desc;
Tool.CleanPosToCodePos(ChildCTNode.StartPos,NewChildNode.FCodePos);
end;
end;
var
Description, Identifier: string;
begin
if not ShowIdentifiers then exit;
AddUnit;
//DebugLn(['AddIdentifierNode ',CTNode.DescAsString,' Description="',Description,'"']);
NewNode:=TCodeBrowserUnit(DestUnit).AddNode(Description);
GetNodeDescription(CTNode,Description,Identifier);
NewNode:=TCodeBrowserUnit(DestUnit).AddNode(Description,Identifier);
NewNode.Desc:=CTNode.Desc;
Tool.CleanPosToCodePos(CTNode.StartPos,NewNode.FCodePos);
//DebugLn(['AddIdentifierNode Code=',NewNode.FCodePos.Code<>nil,' P=',NewNode.FCodePos.P]);
@ -1293,19 +1514,10 @@ var
ChildCTNode:=CTNode.FirstChild;
while (ChildCTNode<>nil) and (ChildCTNode.StartPos<CTNode.EndPos) do
begin
case ChildCTNode.Desc of
ctnProcedure:
AddChildNode(Tool.ExtractProcHead(ChildCTNode,
[phpWithoutClassKeyword,phpWithParameterNames,
phpWithVarModifiers,phpWithResultType]));
ctnVarDefinition:
AddChildNode(Tool.ExtractDefinitionName(ChildCTNode));
ctnProperty:
AddChildNode(Tool.ExtractProperty(ChildCTNode,
[phpWithoutClassKeyword,phpWithParameterNames,
phpWithVarModifiers,phpWithResultType]));
ctnEnumIdentifier:
AddChildNode(Tool.ExtractIdentifier(ChildCTNode.StartPos));
if ChildCTNode.Desc in
[ctnProcedure,ctnVarDefinition,ctnProperty,ctnEnumIdentifier]
then begin
AddChildNode;
end;
if ChildCTNode.Desc=ctnProcedureHead then
ChildCTNode:=ChildCTNode.NextSkipChilds
@ -1330,12 +1542,10 @@ var
case CTNode.Desc of
ctnProcedure:
if not Tool.NodeIsMethodBody(CTNode) then
AddIdentifierNode(CTNode,Tool.ExtractProcHead(CTNode,
[phpWithoutClassKeyword,phpWithoutClassName,phpWithParameterNames,
phpWithVarModifiers,phpWithResultType]));
AddIdentifierNode(CTNode);
ctnVarDefinition,ctnConstDefinition,ctnTypeDefinition:
if not Tool.NodeIsForwardDeclaration(CTNode) then
AddIdentifierNode(CTNode,Tool.ExtractDefinitionName(CTNode));
AddIdentifierNode(CTNode);
end;
// go to next node
@ -1453,7 +1663,7 @@ var
TVNode:=BrowseTreeView.Items.AddChildObject(
ParentViewNode,ListName,CodeNode);
TVNode.ImageIndex:=GetNodeImage(CodeNode);
TVNode.StateIndex:=TVNode.ImageIndex;
TVNode.SelectedIndex:=TVNode.ImageIndex;
end;
if List.UnitLists<>nil then begin
Node:=List.UnitLists.FindLowest;
@ -1484,7 +1694,7 @@ var
TVNode:=BrowseTreeView.Items.AddChildObject(ParentViewNode,
CurUnitName,CodeNode);
TVNode.ImageIndex:=GetNodeImage(CodeNode);
TVNode.StateIndex:=TVNode.ImageIndex;
TVNode.SelectedIndex:=TVNode.ImageIndex;
end else begin
// do not add a tree node for this unit
TVNode:=ParentViewNode;
@ -1505,7 +1715,7 @@ var
TVNode:=BrowseTreeView.Items.AddChildObject(ParentViewNode,
CurNode.Description,CodeNode);
TVNode.ImageIndex:=GetNodeImage(CodeNode);
TVNode.StateIndex:=TVNode.ImageIndex;
TVNode.SelectedIndex:=TVNode.ImageIndex;
// create tree nodes for child code nodes
if CurNode.ChildNodes<>nil then begin
@ -1526,6 +1736,7 @@ var
begin
ShowPackages:=Options.HasLevel(cblPackages);
ShowUnits:=Options.HasLevel(cblUnits);
ShowIdentifiers:=Options.HasLevel(cblIdentifiers);
ShowPrivate:=Options.ShowPrivate;
ShowProtected:=Options.ShowProtected;
DebugLn(['TCodeBrowserView.UpdateTreeView ShowPackages=',ShowPackages,' ShowUnits=',ShowUnits]);
@ -1670,11 +1881,11 @@ begin
end else if NodeData is TCodeBrowserUnit then begin
CurUnit:=TCodeBrowserUnit(NodeData);
if CurUnit.Filename<>'' then
Result:=CurUnit.Filename;
Result:=TVNode.Text+#13+CurUnit.Filename;
end else if NodeData is TCodeBrowserNode then begin
Node:=TCodeBrowserNode(NodeData);
if Node.CodePos.Code<>nil then begin
Result:=Node.CodePos.Code.Filename;
Result:=TVNode.Text+#13+Node.CodePos.Code.Filename;
Node.CodePos.Code.AbsoluteToLineCol(Node.CodePos.P,Line,Column);
if Line>0 then
Result:=Result+' ('+IntToStr(Line)+','+IntToStr(Column)+')';
@ -1682,6 +1893,56 @@ begin
end;
end;
procedure TCodeBrowserView.ExpandCollapseAllNodesInTreeView(
NodeType: TExpandableNodeType; Expand: boolean);
var
Node: TTreeNode;
begin
BrowseTreeView.BeginUpdate;
Node:=BrowseTreeView.Items.GetFirstNode;
while Node<>nil do begin
if (Node.Data<>nil) then begin
case NodeType of
entPackage:
if TObject(Node.Data) is TCodeBrowserUnitList then
Node.Expanded:=Expand;
entUnit:
if TObject(Node.Data) is TCodeBrowserUnit then
Node.Expanded:=Expand;
entClass:
if (TObject(Node.Data) is TCodeBrowserNode) then
Node.Expanded:=Expand;
end;
end;
Node:=Node.GetNext;
end;
BrowseTreeView.EndUpdate;
end;
procedure TCodeBrowserView.CopyNode(TVNode: TTreeNode; NodeType: TCopyNodeType
);
var
Node: TCodeBrowserNode;
s: string;
begin
if (TVNode=nil) or (TVNode.Data=nil) then exit;
s:='';
if TObject(TVNode.Data) is TCodeBrowserUnitList then begin
s:=TVNode.Text;
end;
if TObject(TVNode.Data) is TCodeBrowserUnit then begin
s:=TVNode.Text;
end;
if (TObject(TVNode.Data) is TCodeBrowserNode) then begin
Node:=TCodeBrowserNode(TVNode.Data);
if NodeType=cntIdentifier then
s:=Node.Identifier
else
s:=Node.Description;
end;
Clipboard.AsText:=s;
end;
procedure TCodeBrowserView.BeginUpdate;
begin
inc(fUpdateCount);
@ -1694,6 +1955,73 @@ begin
BrowseTreeView.EndUpdate;
end;
function TCodeBrowserView.ExportTree: TModalResult;
var
SaveDialog: TSaveDialog;
begin
SaveDialog:=TSaveDialog.Create(nil);
try
InitIDEFileDialog(SaveDialog);
SaveDialog.Title:='Save tree as text (*.txt) ...';
SaveDialog.FileName:='identifiers.txt';
SaveDialog.DefaultExt:='txt';
if not SaveDialog.Execute then exit(mrCancel);
Result:=ExportTreeAsText(SaveDialog.FileName);
finally
StoreIDEFileDialog(SaveDialog);
SaveDialog.Free;
end;
end;
function TCodeBrowserView.ExportTreeAsText(Filename: string): TModalResult;
procedure WriteNode(List: TStrings; const Prefix: string; Node: TTreeNode);
var
Child: TTreeNode;
NewPrefix: String;
s: String;
begin
if Node=nil then exit;
NewPrefix:=Prefix;
if Node.Data<>nil then begin
s:=Node.Text;
if TObject(Node.Data) is TCodeBrowserUnitList then begin
List.Add(Prefix+s);
NewPrefix:=Prefix+' ';
end else if TObject(Node.Data) is TCodeBrowserUnit then begin
List.Add(Prefix+s);
NewPrefix:=Prefix+' ';
end else if TObject(Node.Data) is TCodeBrowserNode then begin
List.Add(Prefix+s);
NewPrefix:=Prefix+' ';
end;
end;
Child:=Node.GetFirstChild;
while Child<>nil do begin
WriteNode(List,NewPrefix,Child);
Child:=Child.GetNextSibling;
end;
end;
var
List: TStringList;
Node: TTreeNode;
begin
Filename:=CleanAndExpandFilename(Filename);
Result:=CheckCreatingFile(Filename,true,true,true);
if Result<>mrOk then exit;
List:=TStringList.Create;
try
Node:=BrowseTreeView.Items.GetFirstNode;
WriteNode(List,'',Node);
Result:=SaveStringToFile(Filename,List.Text,[],
'exporting identifiers as text');
finally
List.Free;
end;
end;
procedure TCodeBrowserView.FormClose(Sender: TObject;
var CloseAction: TCloseAction);
begin
@ -1718,6 +2046,51 @@ begin
HintInfo^.HintStr:=HintStr;
end;
procedure TCodeBrowserView.CollapseAllPackagesMenuItemClick(Sender: TObject);
begin
ExpandCollapseAllNodesInTreeView(entPackage,false);
end;
procedure TCodeBrowserView.CollapseAllUnitsMenuItemClick(Sender: TObject);
begin
ExpandCollapseAllNodesInTreeView(entUnit,false);
end;
procedure TCodeBrowserView.CollapseAllClassesMenuItemClick(Sender: TObject);
begin
ExpandCollapseAllNodesInTreeView(entClass,false);
end;
procedure TCodeBrowserView.CopyDescriptionMenuItemClick(Sender: TObject);
begin
CopyNode(BrowseTreeView.Selected,cntDescription);
end;
procedure TCodeBrowserView.CopyIdentifierMenuItemClick(Sender: TObject);
begin
CopyNode(BrowseTreeView.Selected,cntIdentifier);
end;
procedure TCodeBrowserView.ExpandAllClassesMenuItemClick(Sender: TObject);
begin
ExpandCollapseAllNodesInTreeView(entClass,true);
end;
procedure TCodeBrowserView.ExpandAllPackagesMenuItemClick(Sender: TObject);
begin
ExpandCollapseAllNodesInTreeView(entPackage,true);
end;
procedure TCodeBrowserView.ExpandAllUnitsMenuItemClick(Sender: TObject);
begin
ExpandCollapseAllNodesInTreeView(entUnit,true);
end;
procedure TCodeBrowserView.ExportMenuItemClick(Sender: TObject);
begin
ExportTree;
end;
procedure TCodeBrowserView.BrowseTreeViewMouseDown(Sender: TOBject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
@ -1748,7 +2121,7 @@ begin
// open package
APackage:=PackageGraph.FindAPackageWithName(List.Owner,nil);
if APackage<>nil then begin
PackageEditingInterface.DoOpenPackageFile(APackage.Filename,[]);
PackageEditingInterface.DoOpenPackageWithName(List.Owner,[]);
end;
end;
end else if NodeData is TCodeBrowserUnit then begin
@ -1771,11 +2144,12 @@ end;
{ TCodeBrowserNode }
constructor TCodeBrowserNode.Create(TheUnit: TCodeBrowserUnit;
TheParent: TCodeBrowserNode; const TheDescription: string);
TheParent: TCodeBrowserNode; const TheDescription, TheIdentifier: string);
begin
FCBUnit:=TheUnit;
FParentNode:=TheParent;
FDescription:=TheDescription;
FIdentifier:=TheIdentifier;
end;
destructor TCodeBrowserNode.Destroy;
@ -1791,11 +2165,12 @@ begin
FreeAndNil(FChildNodes);
end;
function TCodeBrowserNode.AddNode(const Description: string): TCodeBrowserNode;
function TCodeBrowserNode.AddNode(const Description,
Identifier: string): TCodeBrowserNode;
begin
Result:=TCodeBrowserNode.Create(nil,Self,Description);
Result:=TCodeBrowserNode.Create(nil,Self,Description,Identifier);
if FChildNodes=nil then
FChildNodes:=TAvgLvlTree.Create(@CompareNodeDescriptions);
FChildNodes:=TAvgLvlTree.Create(@CompareNodeIdentifiers);
FChildNodes.Add(Result);
end;
@ -1846,11 +2221,12 @@ begin
FreeAndNil(FChildNodes);
end;
function TCodeBrowserUnit.AddNode(const Description: string): TCodeBrowserNode;
function TCodeBrowserUnit.AddNode(const Description,
Identifier: string): TCodeBrowserNode;
begin
Result:=TCodeBrowserNode.Create(Self,nil,Description);
Result:=TCodeBrowserNode.Create(Self,nil,Description,Identifier);
if FChildNodes=nil then
FChildNodes:=TAvgLvlTree.Create(@CompareNodeDescriptions);
FChildNodes:=TAvgLvlTree.Create(@CompareNodeIdentifiers);
FChildNodes.Add(Result);
end;
@ -1978,6 +2354,34 @@ begin
FModified:=AValue;
end;
function TCodeBrowserViewOptions.GetLevelFilterText(Level: TCodeBrowserLevel
): string;
begin
Result:=FLevelFilterText[Level];
end;
function TCodeBrowserViewOptions.GetLevelFilterType(Level: TCodeBrowserLevel
): TCodeBrowserTextFilter;
begin
Result:=FLevelFilterType[Level];
end;
procedure TCodeBrowserViewOptions.SetLevelFilterText(Level: TCodeBrowserLevel;
const AValue: string);
begin
if FLevelFilterText[Level]=AValue then exit;
FLevelFilterText[Level]:=AValue;
Modified:=true;
end;
procedure TCodeBrowserViewOptions.SetLevelFilterType(Level: TCodeBrowserLevel;
const AValue: TCodeBrowserTextFilter);
begin
if FLevelFilterType[Level]=AValue then exit;
FLevelFilterType[Level]:=AValue;
Modified:=true;
end;
procedure TCodeBrowserViewOptions.SetScope(const AValue: string);
begin
if FScope=AValue then exit;
@ -2028,6 +2432,8 @@ begin
end;
procedure TCodeBrowserViewOptions.Clear;
var
l: TCodeBrowserLevel;
begin
FLevels.Clear;
FLevels.Text:=CodeBrowserLevelNames[cblPackages]+#13
@ -2036,11 +2442,18 @@ begin
ShowPrivate:=false;
ShowProtected:=true;
Scope:='Project';
for l:=Low(TCodeBrowserLevel) to High(TCodeBrowserLevel) do begin
FLevelFilterType[l]:=cbtfBegins;
FLevelFilterText[l]:='';
end;
Modified:=false;
end;
procedure TCodeBrowserViewOptions.LoadFromConfig(ConfigStore: TConfigStorage;
const Path: string);
var
l: TCodeBrowserLevel;
SubPath: String;
begin
Clear;
WithRequiredPackages:=
@ -2049,11 +2462,20 @@ begin
ShowPrivate:=ConfigStore.GetValue(Path+'ShowPrivate/Value',false);
ShowProtected:=ConfigStore.GetValue(Path+'ShowProtected/Value',true);
ConfigStore.GetValue(Path+'Levels/',FLevels);
for l:=Low(TCodeBrowserLevel) to High(TCodeBrowserLevel) do begin
SubPath:=Path+'LevelFilter/'+CodeBrowserLevelNames[l];
FLevelFilterType[l]:=StringToCodeBrowserTextFilter(
ConfigStore.GetValue(SubPath+'/Type',''));
FLevelFilterText[l]:=ConfigStore.GetValue(SubPath+'/Text','');
end;
Modified:=false;
end;
procedure TCodeBrowserViewOptions.SaveToConfig(ConfigStore: TConfigStorage;
const Path: string);
var
l: TCodeBrowserLevel;
SubPath: String;
begin
ConfigStore.SetDeleteValue(Path+'WithRequiredPackages/Value',
WithRequiredPackages,false);
@ -2061,6 +2483,13 @@ begin
ConfigStore.SetDeleteValue(Path+'ShowPrivate/Value',ShowPrivate,false);
ConfigStore.SetDeleteValue(Path+'ShowProtected/Value',ShowProtected,true);
ConfigStore.SetValue(Path+'Levels/',FLevels);
for l:=Low(TCodeBrowserLevel) to High(TCodeBrowserLevel) do begin
SubPath:=Path+'LevelFilter/'+CodeBrowserLevelNames[l];
ConfigStore.SetDeleteValue(SubPath+'/Type',
CodeBrowserTextFilterNames[FLevelFilterType[l]],
CodeBrowserTextFilterNames[cbtfBegins]);
ConfigStore.SetDeleteValue(SubPath+'/Text',FLevelFilterText[l],'');
end;
Modified:=false;
end;

View File

@ -74,7 +74,10 @@ function LoadStringListFromFile(const Filename, ListTitle: string;
function CreateEmptyFile(const Filename: string;
ErrorButtons: TMsgDlgButtons): TModalResult;
function CheckCreatingFile(const AFilename: string;
CheckReadable: boolean): TModalResult;
CheckReadable: boolean;
WarnOverwrite: boolean = false;
CreateBackup: boolean = false
): TModalResult;
function CheckFileIsWritable(const Filename: string;
ErrorButtons: TMsgDlgButtons): TModalResult;
function ForceDirectoryInteractive(Directory: string;
@ -295,14 +298,15 @@ begin
Result:=mrOk;
end;
function CheckCreatingFile(const AFilename: string; CheckReadable: boolean
function CheckCreatingFile(const AFilename: string;
CheckReadable: boolean; WarnOverwrite: boolean; CreateBackup: boolean
): TModalResult;
var
fs: TFileStream;
c: char;
begin
// create if not yet done
if not FileExists(AFilename) then begin
if not FileExistsCached(AFilename) then begin
try
InvalidateFileStateCache;
fs:=TFileStream.Create(AFilename,fmCreate);
@ -313,6 +317,21 @@ begin
mbCancel, mbAbort]);
exit;
end;
end else begin
// file already exists
if WarnOverwrite then begin
Result:=QuestionDlg(lisOverwriteFile,
Format(lisAFileAlreadyExistsReplaceIt, ['"', AFilename, '"', #13]),
mtConfirmation,
[mrYes, lisOverwriteFileOnDisk, mbCancel], 0);
if Result=mrCancel then exit;
end;
if CreateBackup then begin
Result:=BackupFileInteractive(AFilename);
if Result in [mrCancel,mrAbort] then exit;
Result:=CheckCreatingFile(AFilename,CheckReadable,false,false);
exit;
end;
end;
// check writable
try

View File

@ -37,8 +37,9 @@ type
TPkgSaveFlags = set of TPkgSaveFlag;
TPkgOpenFlag = (
pofAddToRecent,
pofRevert
pofAddToRecent, // add file to recent files
pofRevert, // reload file if already open
pofConvertMacros // replace macros in filename
);
TPkgOpenFlags = set of TPkgOpenFlag;
@ -69,6 +70,8 @@ type
TPackageEditingInterface = class(TComponent)
public
function DoOpenPackageWithName(const APackageName: string;
Flags: TPkgOpenFlags): TModalResult; virtual; abstract;
function DoOpenPackageFile(AFilename: string;
Flags: TPkgOpenFlags): TModalResult; virtual; abstract;
function DoSaveAllPackages(Flags: TPkgSaveFlags): TModalResult; virtual; abstract;

View File

@ -2302,14 +2302,17 @@ begin
debugln('[HandleGTKKeyUpDown] GDK_KEY_PRESS UTF8="',DbgStr(Character),'"');
{$ENDIF}
if Character <> ''
then begin
LCLObject := GetNearestLCLObject(TargetWidget);
if LCLObject is TWinControl
if not ABeforeEvent then begin
if Character <> ''
then begin
Result := TWinControl(LCLObject).IntfUTF8KeyPress(Character, 1, SysKey);
if Result or (Character = '')
then StopKeyEvent('key_press_event');
LCLObject := GetNearestLCLObject(TargetWidget);
if LCLObject is TWinControl
then begin
// send the key after navigation keys were handled
Result := TWinControl(LCLObject).IntfUTF8KeyPress(Character, 1, SysKey);
if Result or (Character = '')
then StopKeyEvent('key_press_event');
end;
end;
end;
@ -2330,7 +2333,7 @@ begin
if AEvent^.KeyVal < 128
then begin
// non ASCII key was pressed
// MWE: imo this is impossible since when eventlenght > 1 it contains
// MWE: imo this is impossible since when eventlength > 1 it contains
// a UTF char and that case keyval is never < 128
KeyPressesChar := chr(byte(AEvent^.KeyVal));
end;

View File

@ -105,7 +105,8 @@ type
// package editors
function DoNewPackage: TModalResult; virtual; abstract;
function DoOpenPackage(APackage: TLazPackage): TModalResult; virtual; abstract;
function DoOpenPackage(APackage: TLazPackage; Flags: TPkgOpenFlags
): TModalResult; virtual; abstract;
function DoSavePackage(APackage: TLazPackage;
Flags: TPkgSaveFlags): TModalResult; virtual; abstract;
@ -145,7 +146,8 @@ const
PkgOpenFlagNames: array[TPkgOpenFlag] of string = (
'pofAddToRecent',
'pofRevert'
'pofRevert',
'pofConvertMacros'
);
function PkgSaveFlagsToString(Flags: TPkgSaveFlags): string;

View File

@ -250,7 +250,10 @@ type
// package editors
function DoNewPackage: TModalResult; override;
function DoShowOpenInstalledPckDlg: TModalResult; override;
function DoOpenPackage(APackage: TLazPackage): TModalResult; override;
function DoOpenPackage(APackage: TLazPackage; Flags: TPkgOpenFlags
): TModalResult; override;
function DoOpenPackageWithName(const APackageName: string;
Flags: TPkgOpenFlags): TModalResult; override;
function DoOpenPackageFile(AFilename: string;
Flags: TPkgOpenFlags): TModalResult; override;
function DoSavePackage(APackage: TLazPackage;
@ -509,7 +512,7 @@ end;
procedure TPkgManager.IDEComponentPaletteOpenPackage(Sender: TObject);
begin
if (Sender=nil) or (not (Sender is TLazPackage)) then exit;
DoOpenPackage(TLazPackage(Sender));
DoOpenPackage(TLazPackage(Sender),[]);
end;
procedure TPkgManager.IDEComponentPaletteOpenUnit(Sender: TObject);
@ -649,7 +652,7 @@ var
begin
PkgFile:=GetPackageOfCurrentSourceEditor;
if PkgFile<>nil then
DoOpenPackage(PkgFile.LazPackage);
DoOpenPackage(PkgFile.LazPackage,[]);
end;
procedure TPkgManager.MainIDEitmPkgAddCurUnitToPkgClick(Sender: TObject);
@ -821,7 +824,7 @@ end;
function TPkgManager.OnPackageEditorOpenPackage(Sender: TObject;
APackage: TLazPackage): TModalResult;
begin
Result:=DoOpenPackage(APackage);
Result:=DoOpenPackage(APackage,[]);
end;
function TPkgManager.OnPackageEditorSavePackage(Sender: TObject;
@ -874,7 +877,7 @@ end;
function TPkgManager.PackageGraphExplorerOpenPackage(Sender: TObject;
APackage: TLazPackage): TModalResult;
begin
Result:=DoOpenPackage(APackage);
Result:=DoOpenPackage(APackage,[]);
end;
function TPkgManager.PackageGraphExplorerOpenProject(Sender: TObject;
@ -2190,19 +2193,52 @@ var
begin
Result:=ShowOpenInstalledPkgDlg(APackage);
if (Result<>mrOk) then exit;
Result:=DoOpenPackage(APackage);
Result:=DoOpenPackage(APackage,[]);
end;
function TPkgManager.DoOpenPackage(APackage: TLazPackage): TModalResult;
function TPkgManager.DoOpenPackage(APackage: TLazPackage;
Flags: TPkgOpenFlags): TModalResult;
var
CurEditor: TPackageEditorForm;
AFilename: String;
begin
AFilename:=APackage.Filename;
// revert: if possible and wanted
if (pofRevert in Flags) and (FileExistsCached(AFilename)) then begin
Result:=DoOpenPackageFile(AFilename,Flags);
exit;
end;
// open a package editor
CurEditor:=PackageEditors.OpenEditor(APackage);
CurEditor.ShowOnTop;
// add to recent packages
if (pofAddToRecent in Flags) then begin
AFilename:=APackage.Filename;
if FileExistsCached(AFilename) then begin
AddToRecentList(AFilename,EnvironmentOptions.RecentPackageFiles,
EnvironmentOptions.MaxRecentPackageFiles);
SetRecentPackagesMenu;
end;
end;
Result:=mrOk;
end;
function TPkgManager.DoOpenPackageWithName(const APackageName: string;
Flags: TPkgOpenFlags): TModalResult;
var
APackage: TLazPackage;
begin
APackage:=PackageGraph.FindAPackageWithName(APackageName,nil);
if APackage=nil then
Result:=mrCancel
else
Result:=DoOpenPackage(APackage,Flags);
end;
function TPkgManager.DoOpenPackageFile(AFilename: string; Flags: TPkgOpenFlags
): TModalResult;
var
@ -2210,6 +2246,11 @@ var
XMLConfig: TXMLConfig;
AlternativePkgName: String;
begin
// replace macros
if pofConvertMacros in Flags then begin
if not GlobalMacroList.SubstituteStr(AFilename) then exit(mrCancel);
end;
AFilename:=CleanAndExpandFilename(AFilename);
// check file extension
@ -2302,7 +2343,7 @@ begin
end;
end;
Result:=DoOpenPackage(APackage);
Result:=DoOpenPackage(APackage,[]);
end;
function TPkgManager.DoSavePackage(APackage: TLazPackage;
@ -3591,7 +3632,7 @@ begin
Result:=true;
if PackageGraph.OpenDependency(Dependency)<>lprSuccess then
exit;
DoOpenPackage(Dependency.RequiredPackage);
DoOpenPackage(Dependency.RequiredPackage,[]);
end;
function TPkgManager.OnProjectInspectorAddDependency(Sender: TObject;