lazarus/ide/projectopts.pp
2009-08-03 11:07:58 +00:00

1020 lines
33 KiB
ObjectPascal

{ /***************************************************************************
projectopts.pp - Lazarus IDE unit
-----------------------------------
***************************************************************************/
***************************************************************************
* *
* This source is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This code is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* General Public License for more details. *
* *
* A copy of the GNU General Public License is available on the World *
* Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also *
* obtain it by writing to the Free Software Foundation, *
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
***************************************************************************
Author: Mattias Gaertner
Abstract:
Project options dialog
}
unit ProjectOpts;
{$mode objfpc}{$H+}
interface
uses
Arrow, Buttons, StdCtrls, SysUtils, LCLProc, Classes, CodeToolManager,
Controls, Dialogs, LCLIntf, LResources, ExtCtrls, Forms, Graphics, Spin,
FileUtil, IDEContextHelpEdit, EnvironmentOpts, LCLType,
IDEWindowIntf, IDEImagesIntf, ProjectIntf, IDEDialogs,
IDEOptionDefs, LazarusIDEStrConsts, Project, IDEProcs, W32VersionInfo,
VersionInfoAdditionalInfo, W32Manifest, ApplicationBundle, ExtDlgs,
ButtonPanel, ComCtrls, Math, PackageDefs;
type
{ TProjectOptionsDialog }
TProjectOptionsDialog = class(TForm)
AdditionalInfoButton: TBitBtn;
Bevel1: TBevel;
BuildSpinEdit : TSpinEdit;
ButtonPanel: TButtonPanel;
ClearIconButton: TBitBtn;
IconTrackLabel: TLabel;
SaveIconButton: TBitBtn;
LoadIconButton: TBitBtn;
CopyrightLabel: TLabel;
CreateAppBundleButton: TBitBtn;
DescriptionLabel: TLabel;
FormsAddToAutoCreatedFormsBtn: TSpeedButton;
FormsMoveAutoCreatedFormsDownBtn: TSpeedButton;
FormsMoveAutoCreatedFormUpBtn: TSpeedButton;
FormsRemoveFromAutoCreatedFormsBtn: TSpeedButton;
IconLabel: TLabel;
IconImage: TImage;
LazDocAddPathButton: TBitBtn;
LazDocDeletePathButton: TBitBtn;
Notebook: TNotebook;
ApplicationPage: TPage;
FormsPage: TPage;
MiscPage: TPage;
LazDocPage: TPage;
IconPanel: TPanel;
OpenPictureDialog1: TOpenPictureDialog;
SavePage: TPage;
SavePictureDialog1: TSavePictureDialog;
TitleLabel: TLabel;
IconTrack: TTrackBar;
VersionInfoPage: TPage;
i18nPage: TPage;
// General
AppSettingsGroupBox: TGroupBox;
OutputSettingsGroupBox: TGroupBox;
SelectDirectoryDialog: TSelectDirectoryDialog;
TitleEdit: TEdit;
TargetFileLabel: TLabel;
TargetFileEdit: TEdit;
UseAppBundleCheckBox: TCheckBox;
UseXPManifestCheckBox: TCheckBox;
// Forms
FormsAutoCreatedLabel: TLabel;
FormsAutoCreatedListBox: TListBox;
FormsAvailFormsLabel: TLabel;
FormsAvailFormsListBox: TListBox;
FormsMoveAutoCreatedFormDownBtn: TArrow;
FormsAutoCreateNewFormsCheckBox: TCheckBox;
// Misc
MainUnitIsPascalSourceCheckBox: TCheckBox;
MainUnitHasUsesSectionForAllUnitsCheckBox: TCheckBox;
MainUnitHasCreateFormStatementsCheckBox: TCheckBox;
MainUnitHasTitleStatementCheckBox: TCheckBox;
RunnableCheckBox: TCheckBox;
AlwaysBuildCheckBox: TCheckBox;
LRSInOutputDirCheckBox: TCheckBox;
// Lazdoc settings
LazDocBrowseButton: TButton;
LazDocPathEdit: TEdit;
LazDocPathsGroupBox: TGroupBox;
LazDocListBox: TListBox;
// Session
SaveClosedUnitInfoCheckBox: TCheckBox;
SaveOnlyProjectUnitInfoCheckBox: TCheckBox;
SaveSessionLocationRadioGroup: TRadioGroup;
// VersionInfo
UseVersionInfoCheckBox: TCheckBox;
VersionInfoGroupBox: TGroupBox;
VersionLabel: TLabel;
MajorRevisionLabel: TLabel;
MinorRevisionLabel: TLabel;
BuildLabel: TLabel;
VersionSpinEdit: TSpinEdit;
MajorRevisionSpinEdit: TSpinEdit;
MinorRevisionSpinEdit: TSpinEdit;
AutomaticallyIncreaseBuildCheckBox: TCheckBox;
LanguageSettingsGroupBox: TGroupBox;
LanguageSelectionLabel: TLabel;
CharacterSetLabel: TLabel;
LanguageSelectionComboBox: TComboBox;
CharacterSetComboBox: TComboBox;
OtherInfoGroupBox: TGroupBox;
DescriptionEdit: TEdit;
CopyrightEdit: TEdit;
AdditionalInfoForm: TVersionInfoAdditinalInfoForm;
// i18n
POOutDirButton: TButton;
POOutDirEdit: TEdit;
EnableI18NCheckBox: TCheckBox;
I18NGroupBox: TGroupBox;
PoOutDirLabel: TLabel;
procedure AdditionalInfoButtonClick(Sender: TObject);
procedure ClearIconButtonClick(Sender: TObject);
procedure CreateAppBundleButtonClick(Sender: TObject);
procedure EnableI18NCheckBoxChange(Sender: TObject);
procedure FormsPageResize(Sender: TObject);
procedure HelpButtonClick(Sender: TObject);
procedure IconImagePictureChanged(Sender: TObject);
procedure IconTrackChange(Sender: TObject);
procedure LazDocAddPathButtonClick(Sender: TObject);
procedure LazDocBrowseButtonClick(Sender: TObject);
procedure LazDocDeletePathButtonClick(Sender: TObject);
procedure LoadIconButtonClick(Sender: TObject);
procedure ProjectOptionsClose(Sender: TObject;
var CloseAction: TCloseAction);
procedure FormsAddToAutoCreatedFormsBtnClick(Sender: TObject);
procedure FormsRemoveFromAutoCreatedFormsBtnClick(Sender: TObject);
procedure FormsMoveAutoCreatedFormUpBtnClick(Sender: TObject);
procedure FormsMoveAutoCreatedFormDownBtnClick(Sender: TObject);
procedure POOutDirButtonClick(Sender: TObject);
procedure SaveIconButtonClick(Sender: TObject);
procedure UseVersionInfoCheckBoxChange(Sender: TObject);
private
FProject: TProject;
procedure SetProject(AProject: TProject);
procedure SetupApplicationPage(PageIndex: Integer);
procedure SetupFormsPage(PageIndex: Integer);
procedure SetupLazDocPage(PageIndex: Integer);
procedure SetupSavePage(PageIndex: Integer);
procedure SetupVersionInfoPage(PageIndex: Integer);
procedure SetupI18NPage(PageIndex: Integer);
procedure SetupMiscPage(PageIndex: Integer);
procedure EnableVersionInfo(UseVersionInfo: boolean);
procedure Enablei18nInfo(Usei18n: boolean);
procedure FillAutoCreateFormsListbox;
procedure FillAvailFormsListBox;
function IndexOfAutoCreateForm(FormName: String): Integer;
function FirstAutoCreateFormSelected: Integer;
function FirstAvailFormSelected: Integer;
procedure SelectOnlyThisAutoCreateForm(Index: Integer);
function GetAutoCreatedFormsList: TStrings;
function GetProjectTitle: String;
function SetAutoCreateForms: Boolean;
function SetProjectTitle: Boolean;
procedure SetIconFromStream(Value: TStream);
function GetIconAsStream: TStream;
public
constructor Create(TheOwner: TComponent); override;
property Project: TProject read FProject write SetProject;
end;
function ShowProjectOptionsDialog(AProject: TProject): TModalResult;
function CreateProjectApplicationBundle(AProject: TProject): Boolean;
function ProjectSessionStorageToLocalizedName(s: TProjectSessionStorage): string;
function LocalizedNameToProjectSessionStorage(
const s: string): TProjectSessionStorage;
implementation
function ShowProjectOptionsDialog(AProject: TProject): TModalResult;
begin
with TProjectOptionsDialog.Create(Nil) do
try
Project := AProject;
Result := ShowModal;
finally
Free;
end;
end;
function CreateProjectApplicationBundle(AProject: TProject): Boolean;
var
TargetExeName: String;
begin
Result := False;
if AProject.MainUnitInfo = nil then Exit;
if AProject.IsVirtual then
TargetExeName := EnvironmentOptions.GetTestBuildDirectory
+ ExtractFilename(AProject.MainUnitInfo.Filename)
else
TargetExeName := AProject.CompilerOptions.CreateTargetFilename(AProject.MainFilename);
if not (CreateApplicationBundle(TargetExeName, AProject.Title,true) in [mrOk,mrIgnore])
then exit;
if not (CreateAppBundleSymbolicLink(TargetExeName,true) in [mrOk,mrIgnore]) then exit;
Result := True;
end;
function ProjectSessionStorageToLocalizedName(s: TProjectSessionStorage
): string;
begin
case s of
pssInProjectInfo: Result:=lisPOSaveInLpiFil;
pssInProjectDir: Result:=lisPOSaveInLpsFileInProjectDirectory;
pssInIDEConfig: Result:=lisPOSaveInIDEConfigDirectory;
pssNone: Result:=lisPODoNotSaveAnySessionInfo;
else
RaiseGDBException('');
end;
end;
function LocalizedNameToProjectSessionStorage(const s: string
): TProjectSessionStorage;
begin
for Result:=Low(TProjectSessionStorage) to High(TProjectSessionStorage) do
if ProjectSessionStorageToLocalizedName(Result)=s then exit;
Result:=pssInProjectInfo;
end;
{ TProjectOptionsDialog }
constructor TProjectOptionsDialog.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
Caption := dlgProjectOptions;
ButtonPanel.HelpButton.OnClick := @HelpButtonClick;
NoteBook.PageIndex := 0;
SetupApplicationPage(0);
SetupFormsPage(1);
SetupLazDocPage(2);
SetupSavePage(3);
SetupVersionInfoPage(4);
SetupI18NPage(5);
SetupMiscPage(6);
IDEDialogLayoutList.ApplyLayout(Self, 430, 375);
end;
procedure TProjectOptionsDialog.SetupApplicationPage(PageIndex: Integer);
begin
NoteBook.Page[PageIndex].Caption := dlgPOApplication;
AppSettingsGroupBox.Caption := dlgApplicationSettings;
TitleLabel.Caption := dlgPOTitle;
TitleEdit.Text := '';
OutputSettingsGroupBox.Caption := dlgPOOutputSettings;
TargetFileLabel.Caption := dlgPOTargetFileName;
TargetFileEdit.Text := '';
UseAppBundleCheckBox.Caption := dlgPOUseAppBundle;
UseAppBundleCheckBox.Checked := False;
UseXPManifestCheckBox.Caption := dlgPOUseManifest;
UseXPManifestCheckBox.Checked := False;
CreateAppBundleButton.Caption := dlgPOCreateAppBundle;
CreateAppBundleButton.LoadGlyphFromLazarusResource('pkg_compile');
// icon
IconLabel.Caption := dlgPOIcon;
LoadIconButton.Caption := dlgPOLoadIcon;
SaveIconButton.Caption := dlgPOSaveIcon;
ClearIconButton.Caption := dlgPOClearIcon;
LoadIconButton.LoadGlyphFromStock(idButtonOpen);
if LoadIconButton.Glyph.Empty then
LoadIconButton.LoadGlyphFromLazarusResource('laz_open');
SaveIconButton.LoadGlyphFromStock(idButtonSave);
if SaveIconButton.Glyph.Empty then
SaveIconButton.LoadGlyphFromLazarusResource('laz_save');
ClearIconButton.LoadGlyphFromLazarusResource('menu_clean');
IconImagePictureChanged(nil);
end;
procedure TProjectOptionsDialog.SetupLazDocPage(PageIndex: Integer);
begin
NoteBook.Page[PageIndex].Caption := lisFPDocEditor;
LazDocPathsGroupBox.Caption := lisCodeHelpPathsGroupBox;
LazDocAddPathButton.Caption := lisCodeHelpAddPathButton;
LazDocDeletePathButton.Caption := lisCodeHelpDeletePathButton;
LazDocDeletePathButton.LoadGlyphFromLazarusResource('laz_delete');
LazDocAddPathButton.LoadGlyphFromLazarusResource('laz_add');
LazDocPathEdit.Clear;
end;
procedure TProjectOptionsDialog.SetupSavePage(PageIndex: Integer);
var
s: TProjectSessionStorage;
begin
NoteBook.Page[PageIndex].Caption := dlgPOSaveSession;
SaveClosedUnitInfoCheckBox.Caption := dlgSaveEditorInfo;
SaveOnlyProjectUnitInfoCheckBox.Caption := dlgSaveEditorInfoProject;
SaveSessionLocationRadioGroup.Caption:=lisPOSaveSessionInformationIn;
for s:=Low(TProjectSessionStorage) to High(TProjectSessionStorage) do
SaveSessionLocationRadioGroup.Items.Add(
ProjectSessionStorageToLocalizedName(s));
end;
procedure TProjectOptionsDialog.SetupFormsPage(PageIndex: Integer);
begin
NoteBook.Page[PageIndex].Caption := dlgPOFroms;
FormsAutoCreatedLabel.Caption := dlgAutoCreateForms;
FormsAvailFormsLabel.Caption := dlgAvailableForms;
FormsAutoCreateNewFormsCheckBox.Caption := dlgAutoCreateNewForms;
FormsMoveAutoCreatedFormUpBtn.LoadGlyphFromLazarusResource('arrow_up');
FormsMoveAutoCreatedFormsDownBtn.LoadGlyphFromLazarusResource('arrow_down');
FormsAddToAutoCreatedFormsBtn.LoadGlyphFromLazarusResource('arrow_left');
FormsRemoveFromAutoCreatedFormsBtn.LoadGlyphFromLazarusResource('arrow_right');
end;
procedure TProjectOptionsDialog.SetupMiscPage(PageIndex: Integer);
begin
NoteBook.Page[PageIndex].Caption := dlgPOMisc;
MainUnitIsPascalSourceCheckBox.Caption := lisMainUnitIsPascalSource;
MainUnitHasUsesSectionForAllUnitsCheckBox.Caption := lisMainUnitHasUsesSectionContainingAllUnitsOfProject;
MainUnitHasCreateFormStatementsCheckBox.Caption := lisMainUnitHasApplicationCreateFormStatements;
MainUnitHasTitleStatementCheckBox.Caption := lisMainUnitHasApplicationTitleStatements;
RunnableCheckBox.Caption := lisProjectIsRunnable;
AlwaysBuildCheckBox.Caption := lisProjOptsAlwaysBuildEvenIfNothingChanged;
LRSInOutputDirCheckBox.Caption := lisPutLrsFilesInOutputDirectory;
end;
procedure TProjectOptionsDialog.SetupVersionInfoPage(PageIndex: Integer);
begin
NoteBook.Page[PageIndex].Caption := VersionInfoTitle;
UseVersionInfoCheckBox.Caption := rsIncludeVersionInfoInExecutable;
VersionInfoGroupBox.Caption := rsVersionNumbering;
VersionLabel.Caption := rsVersion;
MajorRevisionLabel.Caption := rsMajorRevision;
MinorRevisionLabel.Caption := rsMinorRevision;
BuildLabel.Caption := rsBuild;
AutomaticallyIncreaseBuildCheckBox.Caption := rsAutomaticallyIncreaseBuildNumber;
LanguageSettingsGroupBox.Caption := rsLanguageOptions;
LanguageSelectionLabel.Caption := rsLanguageSelection;
CharacterSetLabel.Caption := rsCharacterSet;
OtherInfoGroupBox.Caption := rsOtherInfo;
DescriptionLabel.Caption := lisCodeToolsDefsDescription;
CopyrightLabel.Caption := rsCopyright;
AdditionalInfoButton.Caption := rsAdditionalInfo;
AdditionalInfoButton.LoadGlyphFromLazarusResource('laz_add');
end;
procedure TProjectOptionsDialog.SetupI18NPage(PageIndex: Integer);
begin
NoteBook.Page[PageIndex].Caption := dlgPOI18n;
EnableI18NCheckBox.Caption := rsEnableI18n;
I18NGroupBox.Caption := rsI18nOptions;
PoOutDirLabel.Caption := rsPOOutputDirectory;
end;
procedure TProjectOptionsDialog.EnableVersionInfo(UseVersionInfo: boolean);
begin
VersionInfoGroupBox.Enabled := UseVersionInfo;
LanguageSettingsGroupBox.Enabled := UseVersionInfo;
OtherInfoGroupBox.Enabled := UseVersionInfo;
end;
procedure TProjectOptionsDialog.Enablei18nInfo(Usei18n: boolean);
begin
I18NGroupBox.Enabled := Usei18n;
end;
procedure TProjectOptionsDialog.SetProject(AProject: TProject);
var
AFilename: String;
AStream: TStream;
begin
FProject := AProject;
if AProject = Nil then
exit;
with AProject do
begin
TitleEdit.Text := Title;
TargetFileEdit.Text := TargetFilename;
UseAppBundleCheckBox.Checked := UseAppBundle;
UseXPManifestCheckBox.Checked := Resources.XPManifest.UseManifest;
UseVersionInfoCheckBox.Checked := Resources.VersionInfo.UseVersionInfo;
AStream := Resources.ProjectIcon.GetStream;
try
SetIconFromStream(AStream);
finally
AStream.Free;
end;
end;
FillAutoCreateFormsListbox;
FillAvailFormsListBox;
FormsAutoCreateNewFormsCheckBox.Checked := Project.AutoCreateForms;
SaveClosedUnitInfoCheckBox.Checked := (pfSaveClosedUnits in AProject.Flags);
SaveOnlyProjectUnitInfoCheckBox.Checked :=
(pfSaveOnlyProjectUnits in AProject.Flags);
SaveSessionLocationRadioGroup.ItemIndex:=ord(AProject.SessionStorage);
MainUnitIsPascalSourceCheckBox.Checked :=
(pfMainUnitIsPascalSource in AProject.Flags);
MainUnitHasUsesSectionForAllUnitsCheckBox.Checked :=
(pfMainUnitHasUsesSectionForAllUnits in AProject.Flags);
MainUnitHasCreateFormStatementsCheckBox.Checked :=
(pfMainUnitHasCreateFormStatements in AProject.Flags);
MainUnitHasTitleStatementCheckBox.Checked :=
(pfMainUnitHasTitleStatement in AProject.Flags);
RunnableCheckBox.Checked := (pfRunnable in AProject.Flags);
AlwaysBuildCheckBox.Checked := (pfAlwaysBuild in AProject.Flags);
LRSInOutputDirCheckBox.Checked := (pfLRSFilesInOutputDirectory in AProject.Flags);
// lazdoc
SplitString(Project.LazDocPaths,';',LazDocListBox.Items,true);
// i18n
AFilename:=Project.POOutputDirectory;
Project.ShortenFilename(AFilename);
POOutDirEdit.Text:=AFilename;
EnableI18NCheckBox.Checked := Project.Enablei18n;
Enablei18nInfo( Project.Enablei18n );
// VersionInfo
VersionSpinEdit.Value := Project.Resources.VersionInfo.VersionNr;
MajorRevisionSpinEdit.Value := Project.Resources.VersionInfo.MajorRevNr;
MinorRevisionSpinEdit.Value := Project.Resources.VersionInfo.MinorRevNr;
BuildSpinEdit.Value := Project.Resources.VersionInfo.BuildNr;
EnableVersionInfo(Project.Resources.VersionInfo.UseVersionInfo);
if Project.Resources.VersionInfo.AutoIncrementBuild then
AutomaticallyIncreaseBuildCheckBox.Checked := true;
LanguageSelectionComboBox.Items.Assign(MSLanguages);
LanguageSelectionComboBox.ItemIndex :=
MSHexLanguages.IndexOf(Project.Resources.VersionInfo.HexLang);
LanguageSelectionComboBox.Sorted := True;
CharacterSetComboBox.Items.Assign(MSCharacterSets);
CharacterSetComboBox.ItemIndex :=
MSHexCharacterSets.IndexOf(Project.Resources.VersionInfo.HexCharSet);
CharacterSetComboBox.Sorted := True;
DescriptionEdit.Text := Project.Resources.VersionInfo.DescriptionString;
CopyrightEdit.Text := Project.Resources.VersionInfo.CopyrightString;
end;
procedure TProjectOptionsDialog.ProjectOptionsClose(Sender: TObject;
var CloseAction: TCloseAction);
var
NewFlags: TProjectFlags;
AFilename: String;
AStream: TStream;
procedure SetProjectFlag(AFlag: TProjectFlag; AValue: Boolean);
begin
if AValue then
Include(NewFlags, AFlag)
else
Exclude(NewFlags, AFlag);
end;
begin
if ModalResult = mrOk then
begin
Project.Title := TitleEdit.Text;
AStream := GetIconAsStream;
try
Project.Resources.ProjectIcon.SetStream(AStream);
finally
AStream.Free;
end;
Project.TargetFilename := TargetFileEdit.Text;
Project.UseAppBundle := UseAppBundleCheckBox.Checked;
Project.Resources.XPManifest.UseManifest := UseXPManifestCheckBox.Checked;
// flags
NewFlags := Project.Flags;
SetProjectFlag(pfSaveClosedUnits, SaveClosedUnitInfoCheckBox.Checked);
SetProjectFlag(pfSaveOnlyProjectUnits,
SaveOnlyProjectUnitInfoCheckBox.Checked);
SetProjectFlag(pfMainUnitIsPascalSource,
MainUnitIsPascalSourceCheckBox.Checked);
SetProjectFlag(pfMainUnitHasUsesSectionForAllUnits,
MainUnitHasUsesSectionForAllUnitsCheckBox.Checked);
SetProjectFlag(pfMainUnitHasCreateFormStatements,
MainUnitHasCreateFormStatementsCheckBox.Checked);
SetProjectFlag(pfMainUnitHasTitleStatement,
MainUnitHasTitleStatementCheckBox.Checked);
SetProjectFlag(pfRunnable, RunnableCheckBox.Checked);
SetProjectFlag(pfAlwaysBuild, AlwaysBuildCheckBox.Checked);
SetProjectFlag(pfLRSFilesInOutputDirectory, LRSInOutputDirCheckBox.Checked);
Project.Flags := NewFlags;
if SaveSessionLocationRadioGroup.ItemIndex>=0 then
Project.SessionStorage:=LocalizedNameToProjectSessionStorage(
SaveSessionLocationRadioGroup.Items[
SaveSessionLocationRadioGroup.ItemIndex]);
Project.AutoCreateForms := FormsAutoCreateNewFormsCheckBox.Checked;
SetAutoCreateForms;
SetProjectTitle;
// lazdoc
Project.LazDocPaths:=StringListToText(LazDocListBox.Items,';',true);
// i18n
AFilename:=TrimFilename(POOutDirEdit.Text);
Project.LongenFilename(AFilename);
Project.POOutputDirectory:=AFilename;
Project.EnableI18N := EnableI18NCheckBox.Checked;
// VersionInfo
Project.Resources.VersionInfo.UseVersionInfo:=UseVersionInfoCheckBox.Checked;
Project.Resources.VersionInfo.AutoIncrementBuild:=AutomaticallyIncreaseBuildCheckBox.Checked;
Project.Resources.VersionInfo.VersionNr:=VersionSpinEdit.Value;
Project.Resources.VersionInfo.MajorRevNr:=MajorRevisionSpinEdit.Value;
Project.Resources.VersionInfo.MinorRevNr:=MinorRevisionSpinEdit.Value;
Project.Resources.VersionInfo.BuildNr:=BuildSpinEdit.Value;
Project.Resources.VersionInfo.DescriptionString:=DescriptionEdit.Text;
Project.Resources.VersionInfo.CopyrightString:=CopyrightEdit.Text;
Project.Resources.VersionInfo.HexLang:=MSLanguageToHex(LanguageSelectionComboBox.Text);
Project.Resources.VersionInfo.HexCharSet:=MSCharacterSetToHex(CharacterSetComboBox.Text);
//debugln(['TProjectOptionsDialog.ProjectOptionsClose Project.Resources.Modified=',Project.Resources.Modified]);
// extend include path
Project.AutoAddOutputDirToIncPath;
if Project.Resources.Modified and (Project.MainUnitID >= 0) then
begin
if not Project.Resources.Regenerate(Project.MainFilename, True, False) then
MessageDlg(Project.Resources.Messages.Text, mtWarning, [mbOk], 0);
end;
end;
IDEDialogLayoutList.SaveLayout(Self);
end;
procedure TProjectOptionsDialog.LazDocAddPathButtonClick(Sender: TObject);
begin
if LazDocPathEdit.Text <> '' then
LazDocListBox.Items.Add(LazDocPathEdit.Text);
end;
procedure TProjectOptionsDialog.HelpButtonClick(Sender: TObject);
begin
ShowContextHelpForIDE(Self);
end;
procedure TProjectOptionsDialog.IconImagePictureChanged(Sender: TObject);
var
HasIcon: Boolean;
cx, cy: integer;
begin
HasIcon := (IconImage.Picture.Graphic <> nil) and
(not IconImage.Picture.Graphic.Empty);
IconTrack.Enabled := HasIcon;
if HasIcon then
begin
IconTrack.Min := 0;
IconTrack.Max := IconImage.Picture.Icon.Count - 1;
IconTrack.Position := IconImage.Picture.Icon.Current;
IconImage.Picture.Icon.GetSize(cx, cy);
IconTrackLabel.Caption := Format(dlgPOIconDesc, [cx, cy, PIXELFORMAT_BPP[IconImage.Picture.Icon.PixelFormat]]);
end
else
IconTrackLabel.Caption := dlgPOIconDescNone;
end;
procedure TProjectOptionsDialog.IconTrackChange(Sender: TObject);
begin
IconImage.Picture.Icon.Current := Max(0, Min(IconImage.Picture.Icon.Count - 1, IconTrack.Position));
end;
procedure TProjectOptionsDialog.FormsPageResize(Sender: TObject);
begin
with FormsAutoCreatedListBox do
begin
Width := (FormsPage.Width - Left * 2 - 6) div 2;
end;
with FormsAvailFormsLabel do
Left := FormsAvailFormsListBox.Left;
end;
procedure TProjectOptionsDialog.AdditionalInfoButtonClick(Sender: TObject);
var
InfoModified: Boolean;
begin
InfoModified:=false;
ShowVersionInfoAdditionailInfoForm(Project.Resources.VersionInfo,InfoModified);
if InfoModified then
Project.Modified:=true;
end;
procedure TProjectOptionsDialog.ClearIconButtonClick(Sender: TObject);
begin
IconImage.Picture.Clear;
end;
procedure TProjectOptionsDialog.CreateAppBundleButtonClick(Sender: TObject);
begin
CreateProjectApplicationBundle(Project);
end;
procedure TProjectOptionsDialog.EnableI18NCheckBoxChange(Sender: TObject);
begin
Enablei18nInfo(EnableI18NCheckBox.Checked);
end;
procedure TProjectOptionsDialog.LazDocBrowseButtonClick(Sender: TObject);
begin
if SelectDirectoryDialog.Execute then
LazDocPathEdit.Text := SelectDirectoryDialog.FileName;
end;
procedure TProjectOptionsDialog.LazDocDeletePathButtonClick(Sender: TObject);
begin
if (LazDocListBox.ItemIndex >= 0) then
LazDocListBox.Items.Delete(LazDocListBox.ItemIndex);
end;
procedure TProjectOptionsDialog.LoadIconButtonClick(Sender: TObject);
begin
if OpenPictureDialog1.Execute then
IconImage.Picture.LoadFromFile(OpenPictureDialog1.FileName);
end;
function TProjectOptionsDialog.GetAutoCreatedFormsList: TStrings;
var
i, j: Integer;
begin
if (FProject <> Nil) and (FProject.MainUnitID >= 0) then
begin
Result := CodeToolBoss.ListAllCreateFormStatements(
FProject.MainUnitInfo.Source);
if Result <> Nil then
for i := 0 to Result.Count - 1 do
begin
j := Pos(':', Result[i]);
if j > 0 then
if 't' + lowercase(copy(Result[i], 1, j - 1)) = lowercase(
copy(Result[i], j + 1, length(Result[i]) - j)) then
Result[i] := copy(Result[i], 1, j - 1);
end// shorten lines of type 'FormName:TFormName' to simply 'FormName'
;
end
else
Result := Nil;
end;
function TProjectOptionsDialog.GetProjectTitle: String;
begin
Result := '';
if (FProject = Nil) or (FProject.MainUnitID < 0) then
exit;
CodeToolBoss.GetApplicationTitleStatement(
FProject.MainUnitInfo.Source, Result);
end;
procedure TProjectOptionsDialog.FillAutoCreateFormsListbox;
var
sl: TStrings;
begin
sl := GetAutoCreatedFormsList;
FormsAutoCreatedListBox.Items.BeginUpdate;
FormsAutoCreatedListBox.Items.Clear;
if sl <> Nil then
begin
FormsAutoCreatedListBox.Items.Assign(sl);
sl.Free;
end;
FormsAutoCreatedListBox.Items.EndUpdate;
end;
procedure TProjectOptionsDialog.FillAvailFormsListBox;
var
sl: TStringList;
i: Integer;
begin
FormsAvailFormsListBox.Items.BeginUpdate;
FormsAvailFormsListBox.Items.Clear;
if (FProject <> Nil) then
begin
sl := TStringList.Create;
try
for i := 0 to FProject.UnitCount - 1 do
if (FProject.Units[i].IsPartOfProject) and
(FProject.Units[i].ComponentName <> '') and
(FProject.Units[i].ResourceBaseClass in [pfcbcForm, pfcbcDataModule]) and
(IndexOfAutoCreateForm(FProject.Units[i].ComponentName) < 0) then
sl.Add(FProject.Units[i].ComponentName);
sl.Sort;
FormsAvailFormsListBox.Items.Assign(sl);
finally
sl.Free;
end;
end;
FormsAvailFormsListBox.Items.EndUpdate;
end;
function TProjectOptionsDialog.IndexOfAutoCreateForm(FormName:
String): Integer;
var
p: Integer;
begin
p := Pos(':', FormName);
if p > 0 then
FormName := copy(FormName, 1, p - 1);
Result := FormsAutoCreatedListBox.Items.Count - 1;
while (Result >= 0) do
begin
p := Pos(':', FormsAutoCreatedListBox.Items[Result]);
if p < 1 then
p := length(FormsAutoCreatedListBox.Items[Result]) + 1;
if AnsiCompareText(copy(FormsAutoCreatedListBox.Items[Result], 1, p - 1)
, FormName) = 0 then
exit;
dec(Result);
end;
end;
function TProjectOptionsDialog.FirstAutoCreateFormSelected: Integer;
begin
Result := 0;
while (Result < FormsAutoCreatedListBox.Items.Count) and
(not FormsAutoCreatedListBox.Selected[Result]) do
inc(Result);
if Result = FormsAutoCreatedListBox.Items.Count then
Result := -1;
end;
function TProjectOptionsDialog.FirstAvailFormSelected: Integer;
begin
Result := 0;
while (Result < FormsAvailFormsListBox.Items.Count) and
(not FormsAvailFormsListBox.Selected[Result]) do
inc(Result);
if Result = FormsAvailFormsListBox.Items.Count then
Result := -1;
end;
procedure TProjectOptionsDialog.FormsAddToAutoCreatedFormsBtnClick(
Sender: TObject);
var
i: Integer;
NewFormName: String;
begin
FormsAutoCreatedListBox.Items.BeginUpdate;
with FormsAvailFormsListBox do
begin
Items.BeginUpdate;
i := 0;
while i < Items.Count do
if Selected[i] then
begin
NewFormName := Items[i];
Items.Delete(i);
FormsAutoCreatedListBox.Items.Add(NewFormName);
end
else
inc(i);
Items.EndUpdate;
end;
FormsAutoCreatedListBox.Items.EndUpdate;
end;
procedure TProjectOptionsDialog.FormsRemoveFromAutoCreatedFormsBtnClick(
Sender: TObject);
var
i, NewPos, cmp: Integer;
OldFormName: String;
begin
FormsAutoCreatedListBox.Items.BeginUpdate;
FormsAvailFormsListBox.Items.BeginUpdate;
i := 0;
while i < FormsAutoCreatedListBox.Items.Count do
if FormsAutoCreatedListBox.Selected[i] then
begin
OldFormName := FormsAutoCreatedListBox.Items[i];
FormsAutoCreatedListBox.Items.Delete(i);
NewPos := 0;
cmp := 1;
while (NewPos < FormsAvailFormsListBox.Items.Count) do
begin
cmp := AnsiCompareText(FormsAvailFormsListBox.Items[NewPos], OldFormName);
if cmp < 0 then
inc(NewPos)
else
break;
end;
if cmp = 0 then
continue;
FormsAvailFormsListBox.Items.Insert(NewPos, OldFormName);
end
else
inc(i);
FormsAvailFormsListBox.Items.EndUpdate;
FormsAutoCreatedListBox.Items.EndUpdate;
end;
procedure TProjectOptionsDialog.FormsMoveAutoCreatedFormUpBtnClick(
Sender: TObject);
var
i: Integer;
h: String;
begin
i := FirstAutoCreateFormSelected;
if i < 1 then
exit;
with FormsAutoCreatedListBox do
begin
Items.BeginUpdate;
h := Items[i];
Items[i] := Items[i - 1];
Items[i - 1] := h;
Items.EndUpdate;
end;
SelectOnlyThisAutoCreateForm(i - 1);
end;
procedure TProjectOptionsDialog.FormsMoveAutoCreatedFormDownBtnClick(
Sender: TObject);
var
i: Integer;
h: String;
begin
i := FirstAutoCreateFormSelected;
if (i < 0) or (i >= FormsAutoCreatedListBox.Items.Count - 1) then
exit;
with FormsAutoCreatedListBox do
begin
Items.BeginUpdate;
h := Items[i];
Items[i] := Items[i + 1];
Items[i + 1] := h;
Items.EndUpdate;
end;
SelectOnlyThisAutoCreateForm(i + 1);
end;
procedure TProjectOptionsDialog.POOutDirButtonClick(Sender: TObject);
var
NewDirectory: string;
begin
NewDirectory:=LazSelectDirectory(lisPOChoosePoFileDirectory,
Project.ProjectDirectory);
if NewDirectory='' then exit;
Project.ShortenFilename(NewDirectory);
POOutDirEdit.Text:=NewDirectory;
end;
procedure TProjectOptionsDialog.SaveIconButtonClick(Sender: TObject);
begin
if SavePictureDialog1.Execute then
IconImage.Picture.SaveToFile(SavePictureDialog1.FileName);
end;
procedure TProjectOptionsDialog.UseVersionInfoCheckBoxChange(Sender: TObject);
begin
EnableVersionInfo(UseVersionInfoCheckBox.Checked);
end;
procedure TProjectOptionsDialog.SelectOnlyThisAutoCreateForm(Index: Integer);
var
i: Integer;
begin
with FormsAutoCreatedListBox do
for i := 0 to Items.Count - 1 do
Selected[i] := (i = Index);
end;
function TProjectOptionsDialog.SetAutoCreateForms: Boolean;
var
i: Integer;
OldList: TStrings;
begin
Result := True;
if (Project.MainUnitID < 0) or
(not (pfMainUnitHasUsesSectionForAllUnits in Project.Flags)) then
exit;
OldList := GetAutoCreatedFormsList;
if (OldList = Nil) then
exit;
try
if OldList.Count = FormsAutoCreatedListBox.Items.Count then
begin
{ Just exit if the form list is the same }
i := OldList.Count - 1;
while (i >= 0) and
(CompareText(OldList[i], FormsAutoCreatedListBox.Items[i]) = 0) do
dec(i);
if i < 0 then
Exit;
end;
if not CodeToolBoss.SetAllCreateFromStatements(
Project.MainUnitInfo.Source, FormsAutoCreatedListBox.Items) then
begin
MessageDlg(lisProjOptsError,
Format(lisProjOptsUnableToChangeTheAutoCreateFormList, [LineEnding]),
mtWarning, [mbCancel], 0);
Result := False;
exit;
end;
finally
OldList.Free;
end;
end;
function TProjectOptionsDialog.SetProjectTitle: Boolean;
var
OldTitle: String;
begin
Result := True;
if (Project.MainUnitID < 0) or
(not (pfMainUnitHasTitleStatement in Project.Flags)) then
exit;
OldTitle := GetProjectTitle;
if (OldTitle = '') and Project.TitleIsDefault then
exit;
if (OldTitle <> Project.Title) and (not Project.TitleIsDefault) then
if not CodeToolBoss.SetApplicationTitleStatement(
Project.MainUnitInfo.Source, Project.Title) then
begin
MessageDlg(lisProjOptsError,
'Unable to change project title in source.'#13 +
CodeToolBoss.ErrorMessage,
mtWarning, [mbCancel], 0);
Result := False;
exit;
end;// set Application.Title:= statement
if (OldTitle <> '') and Project.TitleIsDefault then
if not CodeToolBoss.RemoveApplicationTitleStatement(
Project.MainUnitInfo.Source) then
begin
MessageDlg(lisProjOptsError,
'Unable to remove project title from source.'#13 +
CodeToolBoss.ErrorMessage,
mtWarning, [mbCancel], 0);
Result := False;
exit;
end;// delete title
end;
procedure TProjectOptionsDialog.SetIconFromStream(Value: TStream);
begin
IconImage.Picture.Clear;
if Value <> nil then
try
IconImage.Picture.Icon.LoadFromStream(Value);
except
on E: Exception do
MessageDlg(E.Message, mtError, [mbOk], 0);
end;
end;
function TProjectOptionsDialog.GetIconAsStream: TStream;
begin
Result := nil;
if not ((IconImage.Picture.Graphic = nil) or IconImage.Picture.Graphic.Empty) then
begin
Result := TMemoryStream.Create;
IconImage.Picture.Icon.SaveToStream(Result);
Result.Position := 0;
end;
end;
initialization
{$I projectopts.lrs}
end.