unit fNewProjectForm; {----------------------------------------------------------------------------} { RemObjects SDK Library - Delphi IDE Integration { { compiler: Delphi 5 and up { platform: Win32 { { (c)opyright RemObjects Software. all rights reserved. { { Using this code requires a valid license of the RemObjects SDK { which can be obtained at http://www.remobjects.com. {----------------------------------------------------------------------------} {$I ..\RemObjects.inc} interface uses Windows, Messages, SysUtils, {$IFDEF DELPHI6UP} Variants, {$ENDIF} Classes, Graphics, Controls, Forms, ExtCtrls, Dialogs, StdCtrls, Buttons, ComCtrls, ImgList, uROIDEPrjWizard, fServerProjectOptions; type TNewProjectForm = class(TForm) Bevel1: TBevel; Image2: TImage; Bevel2: TBevel; Panel1: TPanel; btn_Ok: TBitBtn; btn_Cancel: TBitBtn; Bevel3: TBevel; cb_CreateClientAndGroup: TCheckBox; Label1: TLabel; cb_GuideWizard: TCheckBox; btn_AdvancedOptions: TBitBtn; lbl_CreateClientAndGroup: TLabel; lbl_GuideWizard: TLabel; Label5: TLabel; ed_ProjectFolder: TComboBox; btn_Browse: TBitBtn; Label2: TLabel; ed_ProjectName: TEdit; procedure btn_AdvancedOptionsClick(Sender: TObject); procedure cb_CreateClientAndGroupClick(Sender: TObject); procedure ed_ProjectFolderChange(Sender: TObject); procedure btn_BrowseClick(Sender: TObject); procedure ed_ProjectNameChange(Sender: TObject); private fOptions: TServerProjectOptions; public constructor Create(const aTemplateDir : string); reintroduce; destructor Destroy; override; end; var NewProjectForm: TNewProjectForm; function PromptProjectOptions( const aTemplateDir : string; out someProjectOptions : TROIDEProjectOptions) : boolean; implementation uses IniFiles, uRODLGenTools, uROClient, uROServer, uROIDETools, uEWHelpers; {$R *.dfm} const MAX_FOLDER_HISTORY = 10; function PromptProjectOptions(const aTemplateDir : string; out someProjectOptions : TROIDEProjectOptions) : boolean; var i: integer; begin with TNewProjectForm.Create(aTemplateDir) do try cb_GuideWizard.Enabled := fOptions.fWizardAvailable; cb_GuideWizard.Checked := fOptions.fWizardAvailable; lbl_GuideWizard.Enabled := fOptions.fWizardAvailable; cb_CreateClientAndGroup.Enabled := fOptions.cbCreateClientAndGroup.Enabled; lbl_CreateClientAndGroup.Enabled := fOptions.cbCreateClientAndGroup.Enabled; if not cb_CreateClientAndGroup.Enabled then cb_CreateClientAndGroup.Checked := false; ed_ProjectFolder.Text := fOptions.ePrjDir.Text; ed_ProjectFolder.Items := fOptions.fProjectFolders; ed_ProjectName.Text := fOptions.ePrjName.Text; ed_ProjectFolderChange(nil); ed_ProjectNameChange(nil); result := (ShowModal=mrOK); if result then with someProjectOptions do begin TemplateDir := aTemplateDir; ServiceLibraryName := StringReplace(fOptions.eSvcLibName.Text, ' ', '_', [rfReplaceAll]); ServiceName := StringReplace(fOptions.eSvcName.Text, ' ', '_', [rfReplaceAll]); ProjectName := StringReplace(ChangeFileExt(ExtractFileName(fOptions.ePrjName.Text), ''), ' ', '_', [rfReplaceAll]); ProjectDir := IncludeTrailingBackslash(fOptions.ePrjDir.Text); MessageClassName := Copy(fOptions.cbMessageClass.Text,4,Length(fOptions.cbMessageClass.Text)); ServerClassName := Copy(fOptions.cbServerClass.Text,4,Length(fOptions.cbServerClass.Text)); with TMemIniFile.Create(GetTemplateOptionsFileName) do try if fOptions.fFixedChannel <> '' then begin ChannelClassName := fOptions.fFixedChannel; end else begin ChannelClassName := StringReplace(someProjectOptions.ServerClassName, 'Server', 'Channel', []); ChannelClassName := ReadString('ServerToChannelMapping',ServerClassName,ChannelClassName); end; ServerUnitName := ReadString('ComponentToUnitMapping', ServerClassName, 'uRO'+ServerClassName); ChannelUnitName := ReadString('ComponentToUnitMapping', ChannelClassName, 'uRO'+ChannelClassName); MessageUnitName := ReadString('ComponentToUnitMapping', MessageClassName, 'uRO'+MessageClassName); finally Free; end; CreateClientAndGroup := cb_CreateClientAndGroup.Checked; WizardEnabled := cb_GuideWizard.Checked; // Update Project Folder History i := fOptions.fProjectFolders.IndexOf(ed_ProjectFolder.Text); case i of -1: begin if fOptions.fProjectFolders.Count >= MAX_FOLDER_HISTORY then fOptions.fProjectFolders.Delete(fOptions.fProjectFolders.Count-1); fOptions.fProjectFolders.Insert(0, ed_ProjectFolder.Text); end; 0: { noop } else begin fOptions.fProjectFolders.Delete(i); fOptions.fProjectFolders.Insert(0, ed_ProjectFolder.Text); end; end; // Saves last path entered with TIniFile.Create(GetTemplateConfigFileName) do try WriteString(sect_ProjectGeneration, id_PrjDir, ExtractFilePath(ProjectDir)); EraseSection(sect_ProjectFolderHistory); for i := 0 to fOptions.fProjectFolders.Count-1 do WriteString(sect_ProjectFolderHistory, fOptions.fProjectFolders[i], IntToStr(i)); finally Free; end; end; finally Free; end; end; { TNewProjectForm } constructor TNewProjectForm.Create(const aTemplateDir: string); begin inherited Create(nil); fOptions := TServerProjectOptions.Create(aTemplateDir); end; destructor TNewProjectForm.Destroy; begin FreeAndnil(fOptions); inherited; end; procedure TNewProjectForm.btn_AdvancedOptionsClick(Sender: TObject); begin fOptions.ShowModal(); cb_CreateClientAndGroup.Checked := fOptions.cbCreateClientAndGroup.Checked; ed_ProjectFolder.Text := fOptions.ePrjDir.Text; ed_ProjectName.Text := fOptions.ePrjName.Text; end; procedure TNewProjectForm.cb_CreateClientAndGroupClick(Sender: TObject); begin fOptions.cbCreateClientAndGroup.Checked := cb_CreateClientAndGroup.Checked; end; procedure TNewProjectForm.ed_ProjectFolderChange(Sender: TObject); begin fOptions.ePrjDir.Text := ed_ProjectFolder.Text; btn_Ok.Enabled := (ed_ProjectFolder.Text <> '') and (ed_ProjectName.Text <> ''); end; procedure TNewProjectForm.ed_ProjectNameChange(Sender: TObject); begin fOptions.ePrjName.Text := ed_ProjectName.Text; btn_Ok.Enabled := (ed_ProjectFolder.Text <> '') and (ed_ProjectName.Text <> ''); end; procedure TNewProjectForm.btn_BrowseClick(Sender: TObject); var dir : string; begin dir := ed_ProjectFolder.Text; if SelectDirectory(Application.Handle, 'Select Project Folder','', Dir) then ed_ProjectFolder.Text := Dir; ed_ProjectFolderChange(nil); end; end.