diff --git a/Packages/D7/UnitSwitcher.cfg b/Packages/D7/UnitSwitcher.cfg new file mode 100644 index 0000000..50eb60d --- /dev/null +++ b/Packages/D7/UnitSwitcher.cfg @@ -0,0 +1,39 @@ +-$A8 +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L+ +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-LE"..\..\Lib\D7" +-LN"c:\program files\borland\delphi7\Projects\Bpl" +-Z +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/Packages/D7/UnitSwitcher.dof b/Packages/D7/UnitSwitcher.dof new file mode 100644 index 0000000..effad62 --- /dev/null +++ b/Packages/D7/UnitSwitcher.dof @@ -0,0 +1,143 @@ +[FileVersion] +Version=7.0 +[Compiler] +A=8 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=0 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +NamespacePrefix= +SymbolDeprecated=1 +SymbolLibrary=1 +SymbolPlatform=1 +UnitLibrary=1 +UnitPlatform=1 +UnitDeprecated=1 +HResultCompat=1 +HidingMember=1 +HiddenVirtual=1 +Garbage=1 +BoundsError=1 +ZeroNilCompat=1 +StringConstTruncated=1 +ForLoopVarVarPar=1 +TypedConstVarPar=1 +AsgToTypedConst=1 +CaseLabelRange=1 +ForVariable=1 +ConstructingAbstract=1 +ComparisonFalse=1 +ComparisonTrue=1 +ComparingSignedUnsigned=1 +CombiningSignedUnsigned=1 +UnsupportedConstruct=1 +FileOpen=1 +FileOpenUnitSrc=1 +BadGlobalSymbol=1 +DuplicateConstructorDestructor=1 +InvalidDirective=1 +PackageNoLink=1 +PackageThreadVar=1 +ImplicitImport=1 +HPPEMITIgnored=1 +NoRetVal=1 +UseBeforeDef=1 +ForLoopVarUndef=1 +UnitNameMismatch=1 +NoCFGFileFound=1 +MessageDirective=1 +ImplicitVariants=1 +UnicodeToLocale=1 +LocaleToUnicode=1 +ImagebaseMultiple=1 +SuspiciousTypecast=1 +PrivatePropAccessor=1 +UnsafeType=0 +UnsafeCode=0 +UnsafeCast=0 +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription=UnitSwitcher +[Directories] +OutputDir= +UnitOutputDir= +PackageDLLOutputDir=..\..\Lib\D7 +PackageDCPOutputDir= +SearchPath= +Packages= +Conditionals= +DebugSourceDirs= +UsePackages=0 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +ProjectLang= +RootDir= +[Version Info] +IncludeVerInfo=1 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1043 +CodePage=1252 +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +[HistoryLists\hlBPLOutput] +Count=2 +Item0=..\..\Lib\D7 +Item1=..\Lib\D7 diff --git a/Packages/D7/UnitSwitcher.dpk b/Packages/D7/UnitSwitcher.dpk new file mode 100644 index 0000000..ace3c7d --- /dev/null +++ b/Packages/D7/UnitSwitcher.dpk @@ -0,0 +1,40 @@ +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 'D7'} +{$DESIGNONLY} +{$IMPLICITBUILD OFF} + +requires + rtl, + designide; + +contains + UnSwClient in '..\..\Source\UnSwClient.pas', + UnSwObjects in '..\..\Source\UnSwObjects.pas', + UnSwDialog in '..\..\Source\UnSwDialog.pas' {frmUnSwDialog}, + UnSwFilters in '..\..\Source\UnSwFilters.pas'; + +end. diff --git a/Packages/D7/UnitSwitcher.res b/Packages/D7/UnitSwitcher.res new file mode 100644 index 0000000..9f71601 Binary files /dev/null and b/Packages/D7/UnitSwitcher.res differ diff --git a/Source/UnSwClient.pas b/Source/UnSwClient.pas index 6cf20ab..a3498dd 100644 --- a/Source/UnSwClient.pas +++ b/Source/UnSwClient.pas @@ -1,6 +1,13 @@ {$ASSERTIONS ON} unit UnSwClient; +// Since Delphi 7 is the lowest supported version at this point, assume +// all other versions support the IOTAModuleServices.GetActiveProject method... +{$UNDEF PROJWORKAROUND} +{$IFDEF VER150} + {$DEFINE PROJWORKAROUND} +{$ENDIF} + interface implementation uses @@ -22,6 +29,9 @@ type FViewFormAction: TContainedAction; protected function ActiveFileName(): String; + function ActiveGroup(): IOTAProjectGroup; + function ActiveProject(): IOTAProject; + procedure NewExecute(Sender: TObject); virtual; public constructor Create(); @@ -45,6 +55,9 @@ begin Assert(Supports(BorlandIDEServices, IOTAModuleServices), 'BorlandIDEServices does not support the ' + 'IOTAModuleServices interface.'); + Assert(Supports(BorlandIDEServices, IOTAActionServices), + 'BorlandIDEServices does not support the ' + + 'IOTAActionServices interface.'); for iAction := 0 to Pred(ifNTA.ActionList.ActionCount) do begin @@ -98,6 +111,53 @@ begin end; end; +function TUnitSwitcherHook.ActiveGroup(): IOTAProjectGroup; +var + ifModule: IOTAModule; + ifModules: IOTAModuleServices; + iModule: Integer; + +begin + Result := nil; + ifModules := (BorlandIDEServices as IOTAModuleServices); + for iModule := 0 to Pred(ifModules.ModuleCount) do + begin + ifModule := ifModules.Modules[iModule]; + if Supports(ifModule, IOTAProjectGroup, Result) then + break; + end; +end; + +function TUnitSwitcherHook.ActiveProject(): IOTAProject; +{$IFDEF PROJWORKAROUND} +var + ifGroup: IOTAProjectGroup; + ifModule: IOTAModule; + ifModules: IOTAModuleServices; + iModule: Integer; +{$ENDIF} + +begin + {$IFDEF PROJWORKAROUND} + Result := nil; + ifGroup := ActiveGroup(); + if not Assigned(ifGroup) then + begin + ifModules := (BorlandIDEServices as IOTAModuleServices); + for iModule := 0 to Pred(ifModules.ModuleCount) do + begin + ifModule := ifModules.Modules[iModule]; + if Supports(ifModule, IOTAProject, Result) then + break; + end; + end else + Result := ifGroup.ActiveProject; + {$ELSE} + Result := (BorlandIDEServices as IOTAModuleServices).GetActiveProject + {$ENDIF} +end; + + procedure TUnitSwitcherHook.NewExecute(Sender: TObject); var iActive: Integer; @@ -107,7 +167,7 @@ var pUnits: TUnSwUnitList; begin - ifProject := (BorlandIDEServices as IOTAModuleServices).GetActiveProject; + ifProject := ActiveProject(); if not Assigned(ifProject) then exit; diff --git a/Source/UnSwDialog.dfm b/Source/UnSwDialog.dfm index 3d42823..3ac9572 100644 --- a/Source/UnSwDialog.dfm +++ b/Source/UnSwDialog.dfm @@ -1,10 +1,10 @@ object frmUnSwDialog: TfrmUnSwDialog Left = 187 Top = 83 + Width = 307 + Height = 454 BorderIcons = [biSystemMenu] Caption = 'UnitSwitcher - it almosts makes coffee.' - ClientHeight = 427 - ClientWidth = 299 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText @@ -34,8 +34,6 @@ object frmUnSwDialog: TfrmUnSwDialog BevelOuter = bvNone BorderWidth = 4 TabOrder = 0 - ExplicitWidth = 297 - ExplicitHeight = 368 object pnlSearch: TPanel Left = 4 Top = 4 @@ -49,7 +47,6 @@ object frmUnSwDialog: TfrmUnSwDialog Top = 0 Width = 291 Height = 21 - Align = alTop TabOrder = 0 OnChange = edtSearchChange OnKeyDown = edtSearchKeyDown @@ -142,7 +139,7 @@ object frmUnSwDialog: TfrmUnSwDialog Left = 8 Top = 32 Bitmap = { - 494C010105000900040010001000FFFFFFFFFF00FFFFFFFFFFFFFFFF424D3600 + 494C010105000900040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 0000000000003600000028000000400000003000000001002000000000000030 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -542,6 +539,7 @@ object frmUnSwDialog: TfrmUnSwDialog E000E0000000AC0FE000E0000000BF3FE000E0000000FFFFE000600000001000 E000200000001000E00000000000B000E00020000000F000E00060000000F000 E000E0000000F000E000E0000000F000E000E0000000F000E001E0010000F000 - E003E003FFFFF000E007E007FFFFF000} + E003E003FFFFF000E007E007FFFFF00000000000000000000000000000000000 + 000000000000} end end diff --git a/Source/UnSwObjects.pas b/Source/UnSwObjects.pas index 757f983..b9631d4 100644 --- a/Source/UnSwObjects.pas +++ b/Source/UnSwObjects.pas @@ -24,7 +24,7 @@ type procedure AcceptVisitor(const AVisitor: IUnSwVisitor); end; - + TUnSwNoRefIntfObject = class(TPersistent, IInterface) protected // IInterface @@ -38,6 +38,8 @@ type protected function GetName(): String; virtual; function GetFileName(): String; virtual; + + procedure OpenFile(const AFileName: String; const ASource: Boolean); virtual; public // IUnSwVisited procedure AcceptVisitor(const AVisitor: IUnSwVisitor); virtual; abstract; @@ -165,6 +167,13 @@ begin end; +procedure TUnSwUnit.OpenFile(const AFileName: String; const ASource: Boolean); +begin + (BorlandIDEServices as IOTAActionServices).OpenFile(AFileName); + // #ToDo1 (MvR) 6-1-2006: show source for forms +end; + + { TUnSwModuleUnit } constructor TUnSwModuleUnit.Create(const AModule: IOTAModuleInfo); begin @@ -180,10 +189,7 @@ var begin ifModule := FModule.OpenModule(); if Assigned(ifModule) then - if ASource then - ifModule.ShowFilename(ifModule.FileName) - else - ifModule.Show(); + OpenFile(ifModule.FileName, ASource); end; procedure TUnSwModuleUnit.AcceptVisitor(const AVisitor: IUnSwVisitor); @@ -229,7 +235,7 @@ end; procedure TUnSwProjectUnit.Activate(const ASource: Boolean); begin - FProject.ShowFilename(FProject.FileName); + OpenFile(FProject.FileName, ASource); end; procedure TUnSwProjectUnit.AcceptVisitor(const AVisitor: IUnSwVisitor);