lazarus/ide/useprojunitdlg.pas
2011-01-11 23:30:17 +00:00

130 lines
3.3 KiB
ObjectPascal

unit UseProjUnitDlg;
{$mode objfpc}{$H+}
interface
uses
Classes, LCLProc, Forms, Controls, ComCtrls, StdCtrls, ExtCtrls, Buttons,
ButtonPanel, Dialogs,
SrcEditorIntf, LazIDEIntf, IDEImagesIntf, LazarusIDEStrConsts,
ProjectIntf, Project, CodeCache, CodeToolManager;
type
{ TUseProjUnitDialog }
TUseProjUnitDialog = class(TForm)
ButtonPanel1: TButtonPanel;
UnitsListBox: TListBox;
SectionRadioGroup: TRadioGroup;
private
procedure AddItems(AItems: TStrings);
procedure SelectFirst;
function SelectedUnit: string;
function InterfaceSelected: Boolean;
public
end;
function ShowUseProjUnitDialog: TModalResult;
implementation
{$R *.lfm}
function ShowUseProjUnitDialog: TModalResult;
var
UseProjUnitDlg: TUseProjUnitDialog;
SrcEdit: TSourceEditorInterface;
Code: TCodeBuffer;
CurFile: TUnitInfo;
MainUsedUnits, ImplUsedUnits: TStrings;
AvailUnits: TStringList;
s: String;
CTRes: Boolean;
begin
Result:=mrOk;
if not LazarusIDE.BeginCodeTools then exit;
// get cursor position
SrcEdit:=SourceEditorManagerIntf.ActiveEditor;
if SrcEdit=nil then exit;
Code:=TCodeBuffer(SrcEdit.CodeToolsBuffer);
if Code=nil then exit;
UseProjUnitDlg:=nil;
MainUsedUnits:=nil;
ImplUsedUnits:=nil;
AvailUnits:=TStringList.Create;
try
if not CodeToolBoss.FindUsedUnitNames(Code,MainUsedUnits,ImplUsedUnits) then begin
DebugLn(['ShowUseProjUnitDialog CodeToolBoss.FindUsedUnitNames failed']);
LazarusIDE.DoJumpToCodeToolBossError;
exit(mrCancel);
end;
TStringList(MainUsedUnits).CaseSensitive:=False;
TStringList(ImplUsedUnits).CaseSensitive:=False;
// Create dialog and add available unit names there.
UseProjUnitDlg:=TUseProjUnitDialog.Create(nil);
CurFile:=Project1.FirstPartOfProject;
while CurFile<>nil do begin
s:=CurFile.Unit_Name;
if (MainUsedUnits.IndexOf(s)<0) and (ImplUsedUnits.IndexOf(s)<0) then
AvailUnits.Add(s);
CurFile:=CurFile.NextPartOfProject;
end;
// Show the dialog.
if AvailUnits.Count>0 then begin
AvailUnits.Sorted:=True;
UseProjUnitDlg.AddItems(AvailUnits);
UseProjUnitDlg.SelectFirst;
if UseProjUnitDlg.ShowModal=mrOk then begin
s:=UseProjUnitDlg.SelectedUnit;
if s<>'' then begin
if UseProjUnitDlg.InterfaceSelected then
CTRes:=CodeToolBoss.AddUnitToMainUsesSection(Code, s, '')
else
CTRes:=CodeToolBoss.AddUnitToImplementationUsesSection(Code, s, '');
if not CTRes then begin
LazarusIDE.DoJumpToCodeToolBossError;
exit(mrCancel);
end;
end;
end;
end
else
ShowMessage('No unused items are available in this project.');
finally
CodeToolBoss.SourceCache.ClearAllSourceLogEntries;
UseProjUnitDlg.Free;
ImplUsedUnits.Free;
MainUsedUnits.Free;
AvailUnits.Free;
end;
end;
{ TUseProjUnitDialog }
procedure TUseProjUnitDialog.AddItems(AItems: TStrings);
begin
UnitsListBox.Items.Assign(AItems);
end;
procedure TUseProjUnitDialog.SelectFirst;
begin
UnitsListBox.Selected[0]:=True;
end;
function TUseProjUnitDialog.SelectedUnit: string;
begin
Result:=UnitsListBox.Items[UnitsListBox.ItemIndex];
end;
function TUseProjUnitDialog.InterfaceSelected: Boolean;
begin
Result:=SectionRadioGroup.ItemIndex=0;
end;
end.