mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-14 13:59:34 +02:00
codetools: searching include file of include file in directory of first include file
git-svn-id: trunk@10723 -
This commit is contained in:
parent
c64b39bc07
commit
e77c31ed38
@ -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;
|
||||
|
@ -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>
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
]);
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
]);
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user