From cfc7ce27d5abdbeef58d3a8570f9c8289ddb85c5 Mon Sep 17 00:00:00 2001 From: Mark van Renswoude Date: Tue, 16 Feb 2010 12:39:29 +0000 Subject: [PATCH] Added: ProjectSwitcher Added: D2007 package --- Lib/D2007/UnitSwitcherD2007.bpl | Bin 0 -> 163840 bytes Packages/D2007/UnitSwitcher.bdsproj | 175 ++++++++++++++++++++ Packages/D2007/UnitSwitcher.dpk | 64 +++++++ Packages/D2007/UnitSwitcher.dproj | 90 ++++++++++ Packages/D2007/UnitSwitcher.res | Bin 0 -> 5056 bytes Resources/ProjectBDS.ico | Bin 0 -> 894 bytes Source/BaseSwClient.pas | 29 +++- Source/BaseSwDialog.dfm | 30 ++-- Source/BaseSwDialog.pas | 54 ++++-- Source/CmpSwClient.pas | 42 ++--- Source/CmpSwDialog.dfm | 54 +++--- Source/ProjSwClient.pas | 129 +++++++++++++++ Source/ProjSwDialog.dfm | 163 ++++++++++++++++++ Source/ProjSwDialog.pas | 130 +++++++++++++++ Source/ProjSwObjects.pas | 58 +++++++ Source/ProjSwSettings.pas | 247 ++++++++++++++++++++++++++++ Source/UnSwDialog.dfm | 154 ++--------------- Source/UnSwReg.pas | 13 +- 18 files changed, 1220 insertions(+), 212 deletions(-) create mode 100644 Lib/D2007/UnitSwitcherD2007.bpl create mode 100644 Packages/D2007/UnitSwitcher.bdsproj create mode 100644 Packages/D2007/UnitSwitcher.dpk create mode 100644 Packages/D2007/UnitSwitcher.dproj create mode 100644 Packages/D2007/UnitSwitcher.res create mode 100644 Resources/ProjectBDS.ico create mode 100644 Source/ProjSwClient.pas create mode 100644 Source/ProjSwDialog.dfm create mode 100644 Source/ProjSwDialog.pas create mode 100644 Source/ProjSwObjects.pas create mode 100644 Source/ProjSwSettings.pas diff --git a/Lib/D2007/UnitSwitcherD2007.bpl b/Lib/D2007/UnitSwitcherD2007.bpl new file mode 100644 index 0000000000000000000000000000000000000000..e94f262b1040f13e7b0f40934f538acd5208f726 GIT binary patch literal 163840 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 Udk`vzG3~TCs^-@e;ecKL57~B6T>t<8 literal 0 HcmV?d00001 diff --git a/Packages/D2007/UnitSwitcher.bdsproj b/Packages/D2007/UnitSwitcher.bdsproj new file mode 100644 index 0000000..6039fbf --- /dev/null +++ b/Packages/D2007/UnitSwitcher.bdsproj @@ -0,0 +1,175 @@ + + + + + + + + + + + + UnitSwitcher.dpk + + + 7.0 + + + 8 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + True + True + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; + + False + + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + False + False + False + True + True + True + True + True + True + + + + 0 + 0 + False + 1 + False + False + False + 16384 + 1048576 + 4194304 + UnitSwitcher + + + + ..\..\Lib\D2006 + ..\..\Lib\D2006 + + + + + + False + + + + + + False + + + True + False + + + True + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1043 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + UnitSwitcher + + + + + diff --git a/Packages/D2007/UnitSwitcher.dpk b/Packages/D2007/UnitSwitcher.dpk new file mode 100644 index 0000000..e72b6d7 --- /dev/null +++ b/Packages/D2007/UnitSwitcher.dpk @@ -0,0 +1,64 @@ +package UnitSwitcher; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO ON} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'UnitSwitcher'} +{$LIBSUFFIX 'D2007'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + rtl, + designide, + vcl, + xmlrtl, + vclactnband, + vclx; + +contains + UnSwClient in '..\..\Source\UnSwClient.pas', + UnSwObjects in '..\..\Source\UnSwObjects.pas', + UnSwDialog in '..\..\Source\UnSwDialog.pas' {frmUnSwDialog}, + UnSwFilters in '..\..\Source\UnSwFilters.pas', + UnSwConfiguration in '..\..\Source\UnSwConfiguration.pas' {frmUnSwConfiguration}, + UnSwSettings in '..\..\Source\UnSwSettings.pas', + UnSwShortcuts in '..\..\Source\UnSwShortcuts.pas' {frmUnSwShortcuts}, + CmpSwClient in '..\..\Source\CmpSwClient.pas', + BaseSwClient in '..\..\Source\BaseSwClient.pas', + BaseSwDialog in '..\..\Source\BaseSwDialog.pas' {frmBaseSwDialog}, + BaseSwFilters in '..\..\Source\BaseSwFilters.pas', + BaseSwObjects in '..\..\Source\BaseSwObjects.pas', + UnSwReg in '..\..\Source\UnSwReg.pas', + CmpSwDialog in '..\..\Source\CmpSwDialog.pas' {frmCmpSwDialog}, + CmpSwObjects in '..\..\Source\CmpSwObjects.pas', + CmpSwFilters in '..\..\Source\CmpSwFilters.pas', + CmpSwSettings in '..\..\Source\CmpSwSettings.pas', + BaseSwSettings in '..\..\Source\BaseSwSettings.pas', + CmpSwConfiguration in '..\..\Source\CmpSwConfiguration.pas' {frmCmpSwConfiguration}, + CmpSwFilterConfiguration in '..\..\Source\CmpSwFilterConfiguration.pas' {frmCmpSwFilterConfiguration}, + ProjSwClient in '..\..\Source\ProjSwClient.pas', + ProjSwDialog in '..\..\Source\ProjSwDialog.pas' {frmProjSwDialog}, + ProjSwObjects in '..\..\Source\ProjSwObjects.pas', + ProjSwSettings in '..\..\Source\ProjSwSettings.pas'; + +end. diff --git a/Packages/D2007/UnitSwitcher.dproj b/Packages/D2007/UnitSwitcher.dproj new file mode 100644 index 0000000..36895d3 --- /dev/null +++ b/Packages/D2007/UnitSwitcher.dproj @@ -0,0 +1,90 @@ + + + {9dce4f2a-aaf1-4f8e-aca7-c36afc829e47} + UnitSwitcher.dpk + Debug + AnyCPU + DCC32 + ..\..\Lib\D2007\UnitSwitcherD2007.bpl + + + 7.0 + False + False + 0 + ..\..\Lib\D2006 + ..\..\Lib\D2006 + ..\..\Lib\D2006 + ..\..\Lib\D2006 + RELEASE + + + 7.0 + ..\..\Lib\D2007 + ..\..\Lib\D2007 + ..\..\Lib\D2007 + ..\..\Lib\D2007 + + + Delphi.Personality + Package + +FalseTrueFalseUnitSwitcherFalseTrueFalseD2007TrueFalse1000FalseFalseFalseFalseFalse104312521.0.0.01.0.0.0 + + + UnitSwitcher + UnitSwitcher.dpk + + + + + MainSource + + + +

frmBaseSwDialog + + + + + + +
frmCmpSwConfiguration
+
+ +
frmCmpSwDialog
+
+ +
frmCmpSwFilterConfiguration
+
+ + + + + +
frmProjSwDialog
+
+ + + + +
frmUnSwConfiguration
+
+ +
frmUnSwDialog
+
+ + + + + +
frmUnSwShortcuts
+
+ + + + + + + + \ No newline at end of file diff --git a/Packages/D2007/UnitSwitcher.res b/Packages/D2007/UnitSwitcher.res new file mode 100644 index 0000000000000000000000000000000000000000..9f716014ef5fa480e86c4caec3875580f31cdcdb GIT binary patch literal 5056 zcmbW5zi%8>5XZ-fC8)qssA$eY2q7295$P91h!hD3B3#;)1tCNvP83W*wf;{o1wv>G z{sXkGkt>uE$tmbbNr70tpP4tidzW*tS!r(Gk9qU`e&@Y?cRDk(ZCT%ksk!w0w3YK0 z6|>=UTU(blGw5wKwq@_hHoT>V*8JaRUeE3D@X*?(aZfw#hsTd?Ud@e|@H>e5()nF|eueP-nH1gM0Noj(p1F_4hT@e`nx|epIrKM_Qk+(%xtu}t4+RhYLsm?O? z#5C7-tR+UK{B!zUtOp+qG>7iidc|Zv@Rhrf3HRvtBacUa+qB-N-qvUzh^fI&4)}t* zge?yAHJA8kB{$xAbVWNkH8!t9x5sob1_%1=zhf_iJ%guwEk9#j=(lF79ef#c4SODW zp8fh`aOi@Azq5_<$gBomXY9BiFzLh9@fV6AwwABLsE_McKG(Z|gW8?2F|E(q_b1w~ z?ujJ_IDr}10*E^Cxb+&v6HYem@)FP>;Io(SjJ&zd>u^pmySiU$5Wm zuUw8ibH<4 zvt||F`?~A=yCX4X$^4NKwL;dZ59hqIko|?U+ z+^-5_Cag-BeSdVZf6dHxWqtpOeQfXBb^Ap2f!&bLXZpVe|7Pg_jO}gzSA%~+HtgVn z`9B+?hVOs(sVP&?i=wRwKo{PQ33g)tJjDw=vWWijGi z|M<-ZZrXu8vb(l#ckG({J-e;U`}UPRP}I*JvujuEvb`&{SHuBEZz$V_v_7!=_R#he z|GiZ2sdsw-*zuUmc~vvt+82)XP?&eMc7KT7wU-s0v9}caNYP`=WqU{HX^9Wd1CQMo z_PrGbZ#n))n!n?-uze_=sJ&xfYh^sabBz035qtKf*4>wXWZ#HMJ`sDP{{1Sj3`IZ60#s4Dq)f|9H0fC&%iKDQ5V1u{^Dov}7RCf)BV(Sw4LYFX)%W22 zhSvqS0(df5!h=!kKjXX9N-1M77PAJjACZl-7f3ZCx|`?Y z{^cv`#3CQ{Re>$LeALf)+mkwGEM|PB9QkAA$m>_z=*^&v9|zkyP5jxY{IR$HuU+#r X|8=i_GGFdMjdzQVc@hijK16^O)Ua?) literal 0 HcmV?d00001 diff --git a/Source/BaseSwClient.pas b/Source/BaseSwClient.pas index 25f467d..2e23ad7 100644 --- a/Source/BaseSwClient.pas +++ b/Source/BaseSwClient.pas @@ -29,6 +29,8 @@ type private FHookedActions: TList; protected + function GetIDEActionList: TCustomActionList; + function GetHookedActionIndex(AAction: TContainedAction): Integer; function GetHookedAction(AAction: TContainedAction): PHookedAction; @@ -76,6 +78,20 @@ begin end; +function TBaseSwitcherHook.GetIDEActionList: TCustomActionList; +var + ntaServices: INTAServices; + +begin + Assert(Assigned(BorlandIDEServices), 'BorlandIDEServices not available.'); + Assert(Supports(BorlandIDEServices, INTAServices, ntaServices), + 'BorlandIDEServices does not support the ' + + 'INTAServices interface.'); + + Result := ntaServices.ActionList; +end; + + function TBaseSwitcherHook.GetHookedActionIndex(AAction: TContainedAction): Integer; var actionIndex: Integer; @@ -132,20 +148,17 @@ end; function TBaseSwitcherHook.HookIDEAction(const AName: String; AOnExecute, AOnUpdate: TNotifyEvent): TContainedAction; var + actionList: TCustomActionList; actionIndex: Integer; - ntaServices: INTAServices; action: TContainedAction; begin - Result := nil; - Assert(Assigned(BorlandIDEServices), 'BorlandIDEServices not available.'); - Assert(Supports(BorlandIDEServices, INTAServices, ntaServices), - 'BorlandIDEServices does not support the ' + - 'INTAServices interface.'); + Result := nil; + actionList := GetIDEActionList; - for actionIndex := 0 to Pred(ntaServices.ActionList.ActionCount) do + for actionIndex := 0 to Pred(actionList.ActionCount) do begin - action := ntaServices.ActionList.Actions[actionIndex]; + action := actionList.Actions[actionIndex]; if action.Name = AName then begin Result := action; diff --git a/Source/BaseSwDialog.dfm b/Source/BaseSwDialog.dfm index 28087b6..47761ef 100644 --- a/Source/BaseSwDialog.dfm +++ b/Source/BaseSwDialog.dfm @@ -1,10 +1,10 @@ object frmBaseSwDialog: TfrmBaseSwDialog Left = 284 Top = 120 - Width = 320 - Height = 425 BorderIcons = [biSystemMenu] Caption = 'UnitSwitcher' + ClientHeight = 389 + ClientWidth = 304 Color = clBtnFace Constraints.MinHeight = 240 Constraints.MinWidth = 290 @@ -32,8 +32,8 @@ object frmBaseSwDialog: TfrmBaseSwDialog TextHeight = 13 object sbStatus: TStatusBar Left = 0 - Top = 379 - Width = 312 + Top = 370 + Width = 304 Height = 19 Panels = < item @@ -43,8 +43,8 @@ object frmBaseSwDialog: TfrmBaseSwDialog object pnlMain: TPanel Left = 0 Top = 0 - Width = 312 - Height = 343 + Width = 304 + Height = 334 Align = alClient BevelOuter = bvNone BorderWidth = 4 @@ -52,13 +52,13 @@ object frmBaseSwDialog: TfrmBaseSwDialog object pnlSearch: TPanel Left = 4 Top = 24 - Width = 304 + Width = 296 Height = 25 Align = alTop BevelOuter = bvNone TabOrder = 0 DesignSize = ( - 304 + 296 25) object cmbSearch: TComboBox Left = 0 @@ -78,8 +78,8 @@ object frmBaseSwDialog: TfrmBaseSwDialog object lstItems: TListBox Left = 4 Top = 49 - Width = 304 - Height = 290 + Width = 296 + Height = 281 Style = lbVirtualOwnerDraw Align = alClient ItemHeight = 20 @@ -95,14 +95,14 @@ object frmBaseSwDialog: TfrmBaseSwDialog object pnlSubFilters: TPanel Left = 4 Top = 4 - Width = 304 + Width = 296 Height = 20 Align = alTop BevelOuter = bvNone TabOrder = 2 Visible = False DesignSize = ( - 304 + 296 20) object lblSubFilters: TLabel Left = 0 @@ -117,14 +117,14 @@ object frmBaseSwDialog: TfrmBaseSwDialog end object pnlButtons: TPanel Left = 0 - Top = 343 - Width = 312 + Top = 334 + Width = 304 Height = 36 Align = alBottom BevelOuter = bvNone TabOrder = 1 DesignSize = ( - 312 + 304 36) object btnCancel: TButton Left = 233 diff --git a/Source/BaseSwDialog.pas b/Source/BaseSwDialog.pas index 5b14098..7051737 100644 --- a/Source/BaseSwDialog.pas +++ b/Source/BaseSwDialog.pas @@ -119,6 +119,7 @@ type procedure SaveSettings(); virtual; procedure SettingsChanged(); virtual; + procedure SelectItem(AItemIndex: Integer); procedure DrawItemText(ACanvas: TCanvas; AItem: TBaseSwItem; ARect: TRect; AState: TOwnerDrawState); virtual; protected property ActiveItem: TBaseSwItem read FActiveItem write FActiveItem; @@ -313,14 +314,21 @@ begin activeUnit := activeUnits[itemIndex]; listIndex := FInputFilteredList.IndexOf(activeUnit); if listIndex > -1 then - lstItems.Selected[listIndex] := True; + SelectItem(listIndex); end; finally FreeAndNil(activeUnits); end; - if lstItems.SelCount = 0 then - lstItems.Selected[0] := True; + if lstItems.MultiSelect then + begin + if lstItems.SelCount = 0 then + SelectItem(0); + end else + begin + if lstItems.ItemIndex = -1 then + SelectItem(0); + end; end; if Assigned(lstItems.OnClick) then @@ -382,24 +390,38 @@ end; function TfrmBaseSwDialog.GetActiveItems(): TBaseSwItemList; var itemIndex: Integer; + hasSelection: Boolean; begin Result := nil; + if lstItems.MultiSelect then + hasSelection := (lstItems.SelCount > 0) + else + hasSelection := (lstItems.ItemIndex > -1); + if Assigned(ActiveItem) then begin Result := CreateItemList(); Result.OwnsObjects := False; Result.Add(ActiveItem); ActiveItem := nil; - end else if lstItems.SelCount > 0 then + end else if hasSelection then begin Result := CreateItemList(); Result.OwnsObjects := False; - - for itemIndex := 0 to Pred(lstItems.Items.Count) do - if lstItems.Selected[itemIndex] then + + if lstItems.MultiSelect then + begin + for itemIndex := 0 to Pred(lstItems.Items.Count) do + if lstItems.Selected[itemIndex] then + Result.Add(FInputFilteredList[itemIndex]); + end else + begin + itemIndex := lstItems.ItemIndex; + if itemIndex > -1 then Result.Add(FInputFilteredList[itemIndex]); + end; end; end; @@ -451,8 +473,11 @@ var iItem: Integer; begin - for iItem := Pred(lstItems.Count) downto 0 do - lstItems.Selected[iItem] := not lstItems.Selected[iItem]; + if lstItems.MultiSelect then + begin + for iItem := Pred(lstItems.Count) downto 0 do + lstItems.Selected[iItem] := not lstItems.Selected[iItem]; + end; end; @@ -558,6 +583,15 @@ begin end; +procedure TfrmBaseSwDialog.SelectItem(AItemIndex: Integer); +begin + if lstItems.MultiSelect then + lstItems.Selected[AItemIndex] := True + else + lstItems.ItemIndex := AItemIndex; +end; + + procedure TfrmBaseSwDialog.DrawItemText(ACanvas: TCanvas; AItem: TBaseSwItem; ARect: TRect; AState: TOwnerDrawState); var text: String; @@ -627,7 +661,7 @@ begin if (itemIndex > -1) and (not lstItems.Selected[itemIndex]) then begin lstItems.ClearSelection; - lstItems.Selected[itemIndex] := True; + SelectItem(itemIndex); UpdateItemActions(); end; end; diff --git a/Source/CmpSwClient.pas b/Source/CmpSwClient.pas index daf06dd..b5ec9de 100644 --- a/Source/CmpSwClient.pas +++ b/Source/CmpSwClient.pas @@ -90,28 +90,32 @@ begin begin formComponent := formEditor.GetRootComponent; itemList := TBaseSwItemList.Create(); - - for componentIndex := Pred(formComponent.GetComponentCount) downto 0 do - begin - component := formComponent.GetComponent(componentIndex); - item := TCmpSwComponent.TryCreate(component); - - if Assigned(item) then - itemList.Add(item); - end; - - if itemList.Count > 0 then - begin - selectedItems := TfrmCmpSwDialog.Execute(itemList); - - if Assigned(selectedItems) then + try + for componentIndex := Pred(formComponent.GetComponentCount) downto 0 do begin - for componentIndex := 0 to Pred(selectedItems.Count) do - begin - item := TCmpSwComponent(selectedItems[componentIndex]); - item.Activate(componentIndex = 0); + component := formComponent.GetComponent(componentIndex); + item := TCmpSwComponent.TryCreate(component); + + if Assigned(item) then + itemList.Add(item); + end; + + if itemList.Count > 0 then + begin + selectedItems := TfrmCmpSwDialog.Execute(itemList); + if Assigned(selectedItems) then + try + for componentIndex := 0 to Pred(selectedItems.Count) do + begin + item := TCmpSwComponent(selectedItems[componentIndex]); + item.Activate(componentIndex = 0); + end; + finally + FreeAndNil(selectedItems); end; end; + finally + FreeAndNil(itemList); end; end; end; diff --git a/Source/CmpSwDialog.dfm b/Source/CmpSwDialog.dfm index 3dae2ba..b0032fa 100644 --- a/Source/CmpSwDialog.dfm +++ b/Source/CmpSwDialog.dfm @@ -1,47 +1,63 @@ inherited frmCmpSwDialog: TfrmCmpSwDialog - Width = 358 - Height = 557 Caption = 'ComponentSwitcher' + ClientHeight = 521 + ClientWidth = 342 + ExplicitWidth = 358 + ExplicitHeight = 557 PixelsPerInch = 96 TextHeight = 13 inherited sbStatus: TStatusBar - Top = 511 - Width = 350 + Top = 502 + Width = 342 + ExplicitTop = 502 + ExplicitWidth = 342 end inherited pnlMain: TPanel - Width = 350 - Height = 402 + Width = 342 + Height = 393 + ExplicitWidth = 342 + ExplicitHeight = 393 inherited pnlSearch: TPanel - Width = 342 + Width = 334 TabOrder = 1 + ExplicitWidth = 334 inherited cmbSearch: TComboBox Width = 342 + ExplicitWidth = 342 end end inherited lstItems: TListBox - Width = 342 - Height = 349 + Width = 334 + Height = 340 TabOrder = 2 + ExplicitWidth = 334 + ExplicitHeight = 340 end inherited pnlSubFilters: TPanel - Width = 342 + Width = 334 TabOrder = 0 + ExplicitWidth = 334 inherited lblSubFilters: TLabel Width = 343 + ExplicitWidth = 343 end end end inherited pnlButtons: TPanel - Top = 475 - Width = 350 + Top = 466 + Width = 342 TabOrder = 2 + ExplicitTop = 466 + ExplicitWidth = 342 inherited btnCancel: TButton - Left = 271 + Left = 263 TabOrder = 2 + ExplicitLeft = 263 end inherited btnOK: TButton - Left = 190 + Left = 182 TabOrder = 1 + ExplicitLeft = 182 end object btnConfiguration: TButton Left = 4 @@ -55,8 +71,8 @@ inherited frmCmpSwDialog: TfrmCmpSwDialog end object pnlFilters: TPanel [3] Left = 0 - Top = 402 - Width = 350 + Top = 393 + Width = 342 Height = 73 Align = alBottom BevelOuter = bvNone @@ -65,15 +81,15 @@ inherited frmCmpSwDialog: TfrmCmpSwDialog object gbFilters: TGroupBox Left = 4 Top = 4 - Width = 342 + Width = 334 Height = 65 Align = alClient TabOrder = 0 DesignSize = ( - 342 + 334 65) object btnMoreFilters: TButton - Left = 304 + Left = 296 Top = 32 Width = 31 Height = 25 diff --git a/Source/ProjSwClient.pas b/Source/ProjSwClient.pas new file mode 100644 index 0000000..f4336ef --- /dev/null +++ b/Source/ProjSwClient.pas @@ -0,0 +1,129 @@ +{: Connects ProjectSwitcher to the IDE. + + Last changed: $Date$ + Revision: $Rev$ + Author: $Author$ +} +unit ProjSwClient; + + +interface +uses + ActnList, + Classes, + Dialogs, + SysUtils, + ToolsAPI, + + BaseSwClient; + + +type + TProjectSwitcherHook = class(TBaseSwitcherHook) + private + FSwitchAction: TAction; + protected + procedure SwitchExecute(Sender: TObject); + public + constructor Create; + destructor Destroy; override; + end; + + +implementation +uses + Menus, + Windows, + + BaseSwObjects, + ProjSwDialog, + ProjSwObjects; + + +{ TProjectSwitcherHook} +constructor TProjectSwitcherHook.Create; +var + actionList: TCustomActionList; + +begin + inherited; + + actionList := GetIDEActionList; + FSwitchAction := TAction.Create(actionList); + + FSwitchAction.Caption := 'ProjectSwitcher'; + FSwitchAction.ShortCut := ShortCut(VK_F12, [ssCtrl, ssAlt, ssShift]); + FSwitchAction.OnExecute := SwitchExecute; + FSwitchAction.ActionList := actionList; +end; + + +destructor TProjectSwitcherHook.Destroy; +begin + FreeAndNil(FSwitchAction); + + inherited; +end; + + +function SortByName(Item1, Item2: Pointer): Integer; +begin + Result := CompareText(TProjSwProject(Item1).Name, TProjSwProject(Item2).Name) +end; + + +procedure TProjectSwitcherHook.SwitchExecute(Sender: TObject); +var + projectList: TBaseSwItemList; + activeItem: TProjSwProject; + projectItem: TProjSwProject; + moduleServices: IOTAModuleServices; + project: IOTAProject; + activeProject: IOTAProject; + projectIndex: Integer; + selectedItems: TBaseSwItemList; + +begin + projectList := TBaseSwItemList.Create; + try + activeItem := nil; + moduleServices := (BorlandIDEServices as IOTAModuleServices); + + if not Assigned(moduleServices.MainProjectGroup) then + Exit; + + activeProject := moduleServices.GetActiveProject; + + for projectIndex := Pred(moduleServices.MainProjectGroup.ProjectCount) downto 0 do + begin + project := moduleServices.MainProjectGroup.Projects[projectIndex]; + projectItem := TProjSwProject.Create(project); + + if project = activeProject then + activeItem := projectItem; + + projectList.Add(projectItem); + end; + + if projectList.Count > 0 then + begin + projectList.Sort(SortByName); + + selectedItems := TfrmProjSwDialog.Execute(projectList, activeItem); + if Assigned(selectedItems) then + try + if selectedItems.Count > 0 then + begin + projectItem := TProjSwProject(selectedItems[0]); + projectItem.Activate(True); + end; + finally + FreeAndNil(selectedItems); + end; + end; + finally + FreeAndNil(projectList); + end; +end; + +end. diff --git a/Source/ProjSwDialog.dfm b/Source/ProjSwDialog.dfm new file mode 100644 index 0000000..ab2e995 --- /dev/null +++ b/Source/ProjSwDialog.dfm @@ -0,0 +1,163 @@ +inherited frmProjSwDialog: TfrmProjSwDialog + Caption = 'ProjectSwitcher' + ExplicitHeight = 425 + PixelsPerInch = 96 + TextHeight = 13 + inherited pnlMain: TPanel + inherited lstItems: TListBox + MultiSelect = False + PopupMenu = nil + end + end + inherited pnlButtons: TPanel + inherited btnCancel: TButton + Left = 225 + ExplicitLeft = 225 + end + inherited btnOK: TButton + Left = 144 + ExplicitLeft = 144 + end + end + inherited ilsTypes: TImageList + Bitmap = { + 494C010101000400040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000400000001000000001002000000000000010 + 000000000000000000000000000000000000000000000000000000000000A5A5 + A500636363006363630063636300636363006363630063636300A5A5A5000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000006363 + 6300DEFFFF00DEFFFF00DEFFFF00DEFFFF00DEFFFF00DEFFFF00636363000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000A5A5A500636363006363 + 6300DEFFFF00A5A5A500737373007373730073737300DEFFFF00636363000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000063636300DEFFFF006363 + 6300DEFFFF00DEFFFF00DEFFFF00DEFFFF00DEFFFF00DEFFFF00636363000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000063636300DEFFFF006363 + 6300DEFFFF00A5A5A500737373007373730073737300DEFFFF0063636300A5A5 + A5006363630063636300A5A5A500000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000063636300DEFFFF006363 + 6300DEFFFF00DEFFFF00DEFFFF00DEFFFF00DEFFFF00DEFFFF0063636300A5F7 + FF00A5F7FF00A5F7FF0063636300000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000063636300DEFFFF006363 + 6300DEFFFF00A5A5A500737373007373730073737300DEFFFF0063636300DEFF + FF00DEFFFF00A5F7FF0063636300000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000063636300DEFFFF006363 + 6300DEFFFF00DEFFFF00DEFFFF00DEFFFF00DEFFFF00DEFFFF0063636300DEFF + FF00DEFFFF00A5F7FF0063636300000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000063636300DEFFFF00A5A5 + A500636363006363630063636300636363006363630063636300A5A5A500DEFF + FF00DEFFFF00A5F7FF0063636300000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000063636300DEFFFF00DEFF + FF00DEFFFF00DEFFFF00DEFFFF00DEFFFF0063636300DEFFFF00DEFFFF00DEFF + FF00DEFFFF00A5F7FF0063636300000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000A5A5A500636363006363 + 630063636300636363006363630063636300A5A5A500DEFFFF00DEFFFF00DEFF + FF00DEFFFF00A5F7FF0063636300000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000A5A5 + A500DEFFFF00DEFFFF00DEFFFF00DEFFFF00DEFFFF00DEFFFF00DEFFFF00DEFF + FF00DEFFFF00A5F7FF0063636300000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000006331 + 6300636363006363630063636300636363006363630063636300636363006363 + 6300636363006363630063636300000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000006331 + 6300633163006331630063316300633163006331630063316300633163006331 + 6300633163006331630063636300000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000CE73 + CE00CE73CE00CE73CE00CE73CE00CE73CE00CE73CE00CE73CE00CE73CE00CE73 + CE00CE73CE00CE73CE00CE73CE00000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000040000000100000000100010000000000800000000000000000000000 + 000000000000000000000000FFFFFF00E01F000000000000E01F000000000000 + 801F000000000000801F00000000000080010000000000008001000000000000 + 8001000000000000800100000000000080010000000000008001000000000000 + 8001000000000000E001000000000000E001000000000000E001000000000000 + E001000000000000FFFF00000000000000000000000000000000000000000000 + 000000000000} + end +end diff --git a/Source/ProjSwDialog.pas b/Source/ProjSwDialog.pas new file mode 100644 index 0000000..0d740e4 --- /dev/null +++ b/Source/ProjSwDialog.pas @@ -0,0 +1,130 @@ +unit ProjSwDialog; + +interface +uses + ActnList, + Classes, + ComCtrls, + Contnrs, + Controls, + ExtCtrls, + Graphics, + ImgList, + IniFiles, + Menus, + StdCtrls, + Windows, + + BaseSwDialog, + BaseSwObjects; + + +type + TProjSwStyleVisitor = class(TBaseSwStyleVisitor) + protected + procedure VisitItem(const AItem: TBaseSwItem); override; + end; + + + TfrmProjSwDialog = class(TfrmBaseSwDialog) + protected + function InternalExecute: TBaseSwItemList; override; + + function CreateStyleVisitor: TBaseSwStyleVisitor; override; + + function AllowEmptyResult: Boolean; override; + function ColorsEnabled: Boolean; override; + function Wildchars: Boolean; override; + + procedure LoadSettings; override; + procedure SaveSettings; override; + end; + + +implementation +uses + SysUtils, + ToolsAPI, + + ProjSwObjects, + ProjSwSettings; + + +{$R *.dfm} + + +{ TProjSwStyleVisitor } +procedure TProjSwStyleVisitor.VisitItem(const AItem: TBaseSwItem); +begin + ImageIndex := 0; +end; + + +{ TfrmProjSwDialog } +function TfrmProjSwDialog.InternalExecute: TBaseSwItemList; +begin + Result := inherited InternalExecute; +end; + + +function TfrmProjSwDialog.CreateStyleVisitor: TBaseSwStyleVisitor; +begin + Result := TProjSwStyleVisitor.Create; +end; + + +procedure TfrmProjSwDialog.LoadSettings; +begin + Self.ClientWidth := Settings.Dialog.Width; + Self.ClientHeight := Settings.Dialog.Height; + MRUList.Assign(Settings.Dialog.MRUList); + + inherited LoadSettings; +end; + + +procedure TfrmProjSwDialog.SaveSettings; +begin + // #ToDo2 (MvR) 12-12-2007: save 'sort by ...' + + Settings.Dialog.Width := Self.ClientWidth; + Settings.Dialog.Height := Self.ClientHeight; + Settings.Dialog.MRUList.Assign(MRUList); + Settings.Save; + + inherited SaveSettings; +end; + + + +function TfrmProjSwDialog.AllowEmptyResult: Boolean; +begin + Result := Settings.Filter.AllowEmptyResult; +end; + + +function TfrmProjSwDialog.ColorsEnabled: Boolean; +begin + Result := inherited ColorsEnabled; +end; + + +function TfrmProjSwDialog.Wildchars: Boolean; +begin + Result := Settings.Filter.Wildchars; +end; + + +(* +procedure TfrmProjSwDialog.btnConfigurationClick(Sender: TObject); +begin + if TfrmProjSwConfiguration.Execute then + begin + SettingsChanged; + UpdateClassFilter; + UpdateSubFilters; + end; +end; +*) + +end. diff --git a/Source/ProjSwObjects.pas b/Source/ProjSwObjects.pas new file mode 100644 index 0000000..ed54341 --- /dev/null +++ b/Source/ProjSwObjects.pas @@ -0,0 +1,58 @@ +unit ProjSwObjects; + +interface +uses + ToolsAPI, + + BaseSwObjects; + + +type + TProjSwProject = class(TBaseSwItem) + private + FProject: IOTAProject; + FName: String; + protected + function GetName: String; override; + public + constructor Create(AProject: IOTAProject); + + procedure Activate(const AClearSelection: Boolean); + end; + + +implementation +uses + SysUtils, Dialogs; + + +{ TProjSwProject } +constructor TProjSwProject.Create(AProject: IOTAProject); +begin + inherited Create; + + FProject := AProject; + FName := ExtractFileName(FProject.ProjectOptions.TargetName); +end; + + +procedure TProjSwProject.Activate(const AClearSelection: Boolean); +var + moduleServices: IOTAModuleServices; + projectGroup: IOTAProjectGroup; + +begin + moduleServices := (BorlandIDEServices as IOTAModuleServices); + projectGroup := moduleServices.MainProjectGroup; + + if Assigned(projectGroup) then + projectGroup.ActiveProject := FProject; +end; + + +function TProjSwProject.GetName: String; +begin + Result := FName; +end; + +end. diff --git a/Source/ProjSwSettings.pas b/Source/ProjSwSettings.pas new file mode 100644 index 0000000..db551d6 --- /dev/null +++ b/Source/ProjSwSettings.pas @@ -0,0 +1,247 @@ +{: Encapsulates the ProjectSwitcher settings. + + Last changed: $Date$ + Revision: $Rev$ + Author: $Author$ +} +unit ProjSwSettings; + +interface +uses + Classes, + Registry, + + BaseSwSettings; + + +type + TProjSwDialogSettings = class(TBaseSwSettings) + private + FHeight: Integer; + FMRUList: TStrings; + FWidth: Integer; + protected + procedure Load(const ARegistry: TRegistry); override; + procedure Save(const ARegistry: TRegistry); override; + public + constructor Create; + destructor Destroy; override; + public + property Height: Integer read FHeight write FHeight; + property MRUList: TStrings read FMRUList write FMRUList; + property Width: Integer read FWidth write FWidth; + end; + + + TProjSwFilterSettings = class(TBaseSwSettings) + private + FAllowEmptyResult: Boolean; + FWildchars: Boolean; + protected + procedure Load(const ARegistry: TRegistry); override; + procedure Save(const ARegistry: TRegistry); override; + public + property AllowEmptyResult: Boolean read FAllowEmptyResult write FAllowEmptyResult; + property Wildchars: Boolean read FWildchars write FWildchars; + end; + + + TProjSwSettings = class(TObject) + private + FDialog: TProjSwDialogSettings; + FFilter: TProjSwFilterSettings; + + FRegistryKey: String; + protected + procedure Load; + public + constructor Create; + destructor Destroy; override; + + procedure ResetDefaults; + procedure Save; + + property Dialog: TProjSwDialogSettings read FDialog write FDialog; + property Filter: TProjSwFilterSettings read FFilter write FFilter; + end; + + function Settings: TProjSwSettings; + + +implementation +uses + SysUtils, + ToolsAPI, + Windows; + + +var + GSettings: TProjSwSettings; + + +function Settings: TProjSwSettings; +begin + if not Assigned(GSettings) then + GSettings := TProjSwSettings.Create; + + Result := GSettings; +end; + + +{ TProjSwDialogSettings } +constructor TProjSwDialogSettings.Create; +begin + inherited Create; + + FMRUList := TStringList.Create; + TStringList(FMRUList).CaseSensitive := False +end; + + +destructor TProjSwDialogSettings.Destroy; +begin + FreeAndNil(FMRUList); + + inherited; +end; + + +procedure TProjSwDialogSettings.Load(const ARegistry: TRegistry); +var + sMRU: String; + +begin + ReadIntegerDef(ARegistry, FWidth, 'Width'); + ReadIntegerDef(ARegistry, FHeight, 'Height'); + + if ARegistry.ValueExists(GetKeyName('MRU')) then + begin + SetLength(sMRU, ARegistry.GetDataSize(GetKeyName('MRU'))); + if Length(sMRU) > 0 then + begin + ARegistry.ReadBinaryData(GetKeyName('MRU'), PChar(sMRU)^, Length(sMRU)); + FMRUList.Text := Trim(sMRU); + end; + end; +end; + + +procedure TProjSwDialogSettings.Save(const ARegistry: TRegistry); +var + sMRU: String; + +begin + WriteInteger(ARegistry, FWidth, 'Width'); + WriteInteger(ARegistry, FHeight, 'Height'); + + if FMRUList.Count > 0 then + begin + sMRU := FMRUList.Text; + ARegistry.WriteBinaryData(GetKeyName('MRU'), PChar(sMRU)^, Length(sMRU)); + end else + ARegistry.DeleteValue(GetKeyName('MRU')); +end; + + +{ TProjSwFilterSettings } +procedure TProjSwFilterSettings.Load(const ARegistry: TRegistry); +begin + ReadBoolDef(ARegistry, FAllowEmptyResult, 'AllowEmptyResult'); + ReadBoolDef(ARegistry, FWildchars, 'Wildchars'); +end; + + +procedure TProjSwFilterSettings.Save(const ARegistry: TRegistry); +begin + WriteBool(ARegistry, FAllowEmptyResult, 'AllowEmptyResult'); + WriteBool(ARegistry, FWildchars, 'Wildchars'); +end; + + +{ TProjSwSettings } +constructor TProjSwSettings.Create; +begin + inherited; + + FRegistryKey := (BorlandIDEServices as IOTAServices).GetBaseRegistryKey + + '\ComponentSwitcher'; + + FDialog := TProjSwDialogSettings.Create; + FFilter := TProjSwFilterSettings.Create; + + ResetDefaults; + Load; +end; + + +destructor TProjSwSettings.Destroy; +begin + FreeAndNil(FFilter); + FreeAndNil(FDialog); + + inherited; +end; + + +procedure TProjSwSettings.Load; +var + ideRegistry: TRegistry; + +begin + ideRegistry := TRegistry.Create; + with ideRegistry do + try + RootKey := HKEY_CURRENT_USER; + + if OpenKey(FRegistryKey, False) then + begin + FDialog.Load(ideRegistry); + FFilter.Load(ideRegistry); + + CloseKey; + end; + finally + Free; + end; +end; + + +procedure TProjSwSettings.ResetDefaults; +begin + Filter.AllowEmptyResult := True; + Filter.Wildchars := True; + + Dialog.Width := 350; + Dialog.Height := 530; +end; + + +procedure TProjSwSettings.Save; +var + ideRegistry: TRegistry; + +begin + ideRegistry := TRegistry.Create; + with ideRegistry do + try + RootKey := HKEY_CURRENT_USER; + + if OpenKey(FRegistryKey, True) then + begin + FDialog.Save(ideRegistry); + FFilter.Save(ideRegistry); + + CloseKey; + end; + finally + Free; + end; +end; + + +initialization +finalization + FreeAndNil(GSettings); + +end. + diff --git a/Source/UnSwDialog.dfm b/Source/UnSwDialog.dfm index 158b77e..168c193 100644 --- a/Source/UnSwDialog.dfm +++ b/Source/UnSwDialog.dfm @@ -2,15 +2,23 @@ inherited frmUnSwDialog: TfrmUnSwDialog PixelsPerInch = 96 TextHeight = 13 inherited pnlMain: TPanel - Height = 307 + Height = 298 + ExplicitHeight = 298 inherited lstItems: TListBox - Height = 254 + Height = 245 + ExplicitHeight = 245 end end inherited pnlButtons: TPanel TabOrder = 2 + inherited btnCancel: TButton + Left = 225 + ExplicitLeft = 225 + end inherited btnOK: TButton + Left = 144 TabOrder = 2 + ExplicitLeft = 144 end object btnConfiguration: TButton Left = 4 @@ -24,8 +32,8 @@ inherited frmUnSwDialog: TfrmUnSwDialog end object pnlIncludeTypes: TPanel [3] Left = 0 - Top = 307 - Width = 312 + Top = 298 + Width = 304 Height = 36 Align = alBottom BevelOuter = bvNone @@ -70,135 +78,7 @@ inherited frmUnSwDialog: TfrmUnSwDialog inherited ilsTypes: TImageList Bitmap = { 494C010106000900040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 - 0000000000003600000028000000400000003000000001002000000000000030 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000003600000028000000400000002000000001002000000000000020 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -456,12 +336,8 @@ inherited frmUnSwDialog: TfrmUnSwDialog 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000424D3E000000000000003E000000 - 2800000040000000300000000100010000000000800100000000000000000000 - 000000000000000000000000FFFFFF0000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000003FFC3000000000003FF8100000000 + 2800000040000000200000000100010000000000000100000000000000000000 + 000000000000000000000000FFFFFF000003FFC3000000000003FF8100000000 0003FF00000000000000FF00000000000000FF00000000000000FF0000000000 0000FF81000000000000FFC3000000000000FFFF000000000000FFFF00000000 0000FFFF000000000003FFFF000000000003FFFF000000000003FFFF00000000 diff --git a/Source/UnSwReg.pas b/Source/UnSwReg.pas index b21832f..21de7f7 100644 --- a/Source/UnSwReg.pas +++ b/Source/UnSwReg.pas @@ -1,24 +1,33 @@ unit UnSwReg; +{$I BaseSwDefines.inc} + interface implementation uses SysUtils, CmpSwClient, + ProjSwClient, UnSwClient; var GComponentSwitcher: TComponentSwitcherHook; GUnitSwitcher: TUnitSwitcherHook; + GProjectSwitcher: TProjectSwitcherHook; initialization - GComponentSwitcher := TComponentSwitcherHook.Create(); - GUnitSwitcher := TUnitSwitcherHook.Create(); + GComponentSwitcher := TComponentSwitcherHook.Create; + GUnitSwitcher := TUnitSwitcherHook.Create; + + {$IFNDEF DELPHI7ORLOWER} + GProjectSwitcher := TProjectSwitcherHook.Create; + {$ENDIF} finalization + FreeAndNil(GProjectSwitcher); FreeAndNil(GUnitSwitcher); FreeAndNil(GComponentSwitcher);