unit uIdeMenuSelectUnitProject;

interface

uses
  Classes, SysUtils, Dialogs, Forms, Windows, ToolsApi, uIdeMenuObject;

type

  TIdeMenuSelectUnitProject = class(TIdeMenuObject)
    function ItemName: String; override;
    function Caption: String; override;
    function ShortCut: String; override;
    function Order: Integer; override;

    procedure Execute(Sender: TObject); override;
  end;

implementation

function TIdeMenuSelectUnitProject.ItemName: String;
begin
  Result := 'SelectProjectOfCurrentUnit';
end;

function TIdeMenuSelectUnitProject.Caption: String;
begin
  Result := 'Select project of cu&rrent unit';
end;

function TIdeMenuSelectUnitProject.ShortCut: String;
begin
  Result := 'Ctrl+Shift+\';
end;

function TIdeMenuSelectUnitProject.Order: Integer;
begin
  Result := 0;
end;

procedure TIdeMenuSelectUnitProject.Execute(Sender: TObject);
var
  ProjectGroup       : IOTAProjectGroup;
  ModuleProjectIndex : Integer;
  Module             : IOTAModule;
  p                  : Integer;
  m                  : Integer;

  function GetProjectGroup: IOTAProjectGroup;
  var
    ModuleServices : IOTAModuleServices;
    i              : Integer;
  begin
    // Standaard resultaat
    Result := nil;

    // Verkrijg een referentie naar de moduloe services
    ModuleServices := (BorlandIDEServices as IOTAModuleServices);

    // Loop door de modules
    for i := 0 to ModuleServices.ModuleCount - 1 do
    begin
      // Als een van de modules het IOTAProjectGroup interface implementeert,
      // dan is er een project group gevonden
      if (ModuleServices.Modules[i].QueryInterface(IOTAProjectGroup, Result) = S_OK) then
        Break;
    end;

    // Laat referentie naar het interface los
    ModuleServices := nil;
  end;

begin
  // Verkrijg een referentie naar de huidige module en de huidige project group
  Module       := (BorlandIDEServices as IOTAModuleServices).CurrentModule;
  ProjectGroup := GetProjectGroup;

  // Alleen als er referenties gevonden zijn dan moet er actie worden ondernomen
  if Assigned(Module) and Assigned(ProjectGroup) then
  begin
    // Tot dusverre is er geen project gevonden waarin de huidige module
    // zich bevindt
    ModuleProjectIndex := -1;

    // Loop door alle projecten van de projectgroup
    for p := 0 to ProjectGroup.ProjectCount - 1 do
    begin

      // Loop door alle modules van het project
      for m := 0 to ProjectGroup.Projects[p].GetModuleCount - 1 do
      begin

        // Als de filename van de module module overeenkomst met de filename
        // van de huidige module dan wordt het project als gevonden beschouwd
        if SameText(ProjectGroup.Projects[p].GetModule(m).FileName, Module.FileName) then
        begin
          // Onthoud index
          ModuleProjectIndex := p;

          // Stop loop
          Break;
        end;

      end;

      // Als er iets gevonden is, stop dan de loop
      if ModuleProjectIndex <> -1 then
        Break;

    end;

    // Als er een project gevonden is, selecteer het dan
    if ModuleProjectIndex <> -1 then
    begin
      // Maak het project van de module het active project
      ProjectGroup.ActiveProject := ProjectGroup.Projects[ModuleProjectIndex];
    end;

  end;
end;

end.
