From 609649d00cf8e8d2441fb1fc3d03412a124c88bc Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Wed, 25 Sep 2019 09:49:39 +1000 Subject: [PATCH] [Developer] Add concept of closing project to bring up welcome. Step 1. --- .../developer/TIKE/actions/dmActionsMain.dfm | 15 ++- .../developer/TIKE/actions/dmActionsMain.pas | 119 ++++++++++++++---- windows/src/developer/TIKE/main/UfrmMain.dfm | 7 +- windows/src/developer/TIKE/main/UfrmMain.pas | 30 +++-- .../src/developer/TIKE/main/UfrmMessages.pas | 6 +- .../Keyman.Developer.UI.Project.ProjectUI.pas | 6 + ...eyman.Developer.UI.Project.UfrmProject.pas | 56 +++++++-- 7 files changed, 193 insertions(+), 46 deletions(-) diff --git a/windows/src/developer/TIKE/actions/dmActionsMain.dfm b/windows/src/developer/TIKE/actions/dmActionsMain.dfm index 4dfbc800da..1b0679bbed 100644 --- a/windows/src/developer/TIKE/actions/dmActionsMain.dfm +++ b/windows/src/developer/TIKE/actions/dmActionsMain.dfm @@ -22,6 +22,7 @@ object modActionsMain: TmodActionsMain ImageIndex = 0 ShortCut = 16462 OnExecute = actFileNewExecute + OnUpdate = actFileNewUpdate end object actViewCharacterIdentifier: TAction Category = 'View' @@ -39,6 +40,7 @@ object modActionsMain: TmodActionsMain ImageIndex = 1 ShortCut = 16463 OnAccept = actFileOpenAccept + OnUpdate = actFileOpenUpdate end object actFileSave: TAction Category = 'File' @@ -260,6 +262,7 @@ object modActionsMain: TmodActionsMain Hint = 'Save Project As|Saves the current project with a new name' BeforeExecute = actProjectSaveAsBeforeExecute OnAccept = actProjectSaveAsAccept + OnUpdate = actProjectSaveAsUpdate end object actProjectAddCurrentEditorFile: TAction Category = 'Project' @@ -278,6 +281,7 @@ object modActionsMain: TmodActionsMain ImageIndex = 30 ShortCut = 16463 OnAccept = actProjectAddFilesAccept + OnUpdate = actProjectAddFilesUpdate end object actProjectSettings: TAction Category = 'Project' @@ -285,6 +289,7 @@ object modActionsMain: TmodActionsMain Hint = 'Project Settings|Edit settings for this project' ImageIndex = 31 OnExecute = actProjectSettingsExecute + OnUpdate = actProjectSettingsUpdate end object actToolsCustomise: TAction Category = 'Tools' @@ -466,6 +471,12 @@ object modActionsMain: TmodActionsMain OnExecute = actViewCodeExecute OnUpdate = actViewCodeUpdate end + object actProjectClose: TAction + Category = 'Project' + Caption = '&Close Project' + OnExecute = actProjectCloseExecute + OnUpdate = actProjectCloseUpdate + end end object ActionManager1: TActionManager ActionBars = < @@ -484,7 +495,7 @@ object modActionsMain: TmodActionsMain Left = 304 Top = 236 Bitmap = { - 494C01010A000E00840010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 494C01010A000E00880010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 0000000000003600000028000000400000003000000001002000000000000030 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -893,7 +904,7 @@ object modActionsMain: TmodActionsMain Left = 124 Top = 116 Bitmap = { - 494C010112004801B00020002000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 494C010112004801B40020002000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 000000000000360000002800000080000000A000000001002000000000000040 0100000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000A8CAFF00A8CA diff --git a/windows/src/developer/TIKE/actions/dmActionsMain.pas b/windows/src/developer/TIKE/actions/dmActionsMain.pas index c5632cc060..049966c068 100644 --- a/windows/src/developer/TIKE/actions/dmActionsMain.pas +++ b/windows/src/developer/TIKE/actions/dmActionsMain.pas @@ -133,6 +133,7 @@ type actViewDesign: TAction; // I4678 actViewCode: TAction; // I4678 actViewCharacterIdentifier: TAction; // I4807 + actProjectClose: TAction; procedure actFileNewExecute(Sender: TObject); procedure DataModuleCreate(Sender: TObject); procedure actFileOpenAccept(Sender: TObject); @@ -163,7 +164,6 @@ type procedure actToolsOptionsExecute(Sender: TObject); procedure actToolsVirtualKeyIdentifierExecute(Sender: TObject); procedure actProjectNewExecute(Sender: TObject); - procedure actProjectSaveExecute(Sender: TObject); procedure actProjectSaveAsBeforeExecute(Sender: TObject); procedure actProjectAddCurrentEditorFileExecute(Sender: TObject); procedure actProjectSettingsExecute(Sender: TObject); @@ -222,9 +222,18 @@ type var CanClose: Boolean); procedure actProjectSaveAsSaveDialogCanClose(Sender: TObject; var CanClose: Boolean); // I4807 + procedure actProjectCloseExecute(Sender: TObject); + procedure actProjectCloseUpdate(Sender: TObject); + procedure actProjectSaveAsUpdate(Sender: TObject); + procedure actProjectAddFilesUpdate(Sender: TObject); + procedure actProjectSettingsUpdate(Sender: TObject); + procedure actFileNewUpdate(Sender: TObject); + procedure actFileOpenUpdate(Sender: TObject); private procedure AboutShowStartup(Sender: TObject); function CheckFilenameConventions(FileName: string): Boolean; + function SaveAndCloseAllFiles: Boolean; + procedure CloseProject; public procedure NewProject(pt: TProjectType); procedure OpenProject(FileName: WideString); @@ -309,6 +318,11 @@ begin end; end; +procedure TmodActionsMain.actFileNewUpdate(Sender: TObject); +begin + actFileNew.Enabled := IsGlobalProjectUIReady; +end; + procedure TmodActionsMain.actFileOpenAccept(Sender: TObject); var i: Integer; @@ -317,10 +331,15 @@ begin frmKeymanDeveloper.OpenFile(actFileOpen.Dialog.Files[i], True); end; +procedure TmodActionsMain.actFileOpenUpdate(Sender: TObject); +begin + actFileOpen.Enabled := IsGlobalProjectUIReady; +end; + procedure TmodActionsMain.actFilePageSetupUpdate(Sender: TObject); begin with frmKeymanDeveloper do - actFilePageSetup.Enabled := Assigned(ActiveChild) and Supports(ActiveChild, IKMDPrintActions) and (Printer.Printers.Count > 0); + actFilePageSetup.Enabled := IsGlobalProjectUIReady and Assigned(ActiveChild) and Supports(ActiveChild, IKMDPrintActions) and (Printer.Printers.Count > 0); end; procedure TmodActionsMain.actFilePrintExecute(Sender: TObject); @@ -331,7 +350,7 @@ end; procedure TmodActionsMain.actFilePrintUpdate(Sender: TObject); begin with frmKeymanDeveloper do - actFilePrint.Enabled := Assigned(ActiveChild) and Supports(ActiveChild, IKMDPrintActions) and (Printer.Printers.Count > 0); + actFilePrint.Enabled := IsGlobalProjectUIReady and Assigned(ActiveChild) and Supports(ActiveChild, IKMDPrintActions) and (Printer.Printers.Count > 0); end; procedure TmodActionsMain.actFilePrintPreviewExecute(Sender: TObject); @@ -342,7 +361,7 @@ end; procedure TmodActionsMain.actFilePrintPreviewUpdate(Sender: TObject); begin with frmKeymanDeveloper do - actFilePrintPreview.Enabled := Assigned(ActiveChild) and Supports(ActiveChild, IKMDPrintPreviewActions) and (Printer.Printers.Count > 0); + actFilePrintPreview.Enabled := IsGlobalProjectUIReady and Assigned(ActiveChild) and Supports(ActiveChild, IKMDPrintPreviewActions) and (Printer.Printers.Count > 0); end; procedure TmodActionsMain.actFileRevertExecute(Sender: TObject); @@ -355,7 +374,7 @@ end; procedure TmodActionsMain.actFileRevertUpdate(Sender: TObject); begin with frmKeymanDeveloper do - actFileRevert.Enabled := Assigned(ActiveEditor); + actFileRevert.Enabled := IsGlobalProjectUIReady and Assigned(ActiveEditor); end; procedure TmodActionsMain.actFileSaveAsAccept(Sender: TObject); @@ -377,6 +396,8 @@ end; function TmodActionsMain.CheckFilenameConventions(FileName: string): Boolean; begin + if not IsGlobalProjectUIReady then Exit(True); + if not FGlobalProject.Options.CheckFilenameConventions then Exit(True); if (GetFileTypeFromFileName(FileName) in [ftKeymanSource, ftPackageSource]) or @@ -407,7 +428,7 @@ end; procedure TmodActionsMain.actFileSaveAsUpdate(Sender: TObject); begin with frmKeymanDeveloper do - actFileSaveAs.Enabled := Assigned(ActiveEditor); + actFileSaveAs.Enabled := IsGlobalProjectUIReady and Assigned(ActiveEditor); end; procedure TmodActionsMain.actFileSaveCopyAsExecute(Sender: TObject); @@ -432,7 +453,7 @@ end; procedure TmodActionsMain.actFileSaveCopyAsUpdate(Sender: TObject); begin with frmKeymanDeveloper do - actFileSaveCopyAs.Enabled := Assigned(ActiveEditor); + actFileSaveCopyAs.Enabled := IsGlobalProjectUIReady and Assigned(ActiveEditor); end; procedure TmodActionsMain.actFileSaveExecute(Sender: TObject); @@ -455,7 +476,7 @@ end; procedure TmodActionsMain.actFileSaveUpdate(Sender: TObject); begin with frmKeymanDeveloper do - actFileSave.Enabled := Assigned(ActiveEditor) and ActiveEditor.Modified; + actFileSave.Enabled := IsGlobalProjectUIReady and Assigned(ActiveEditor) and ActiveEditor.Modified; end; procedure TmodActionsMain.AboutShowStartup(Sender: TObject); @@ -511,6 +532,7 @@ end; procedure TmodActionsMain.actProjectAddCurrentEditorFileUpdate(Sender: TObject); begin actProjectAddCurrentEditorFile.Enabled := + IsGlobalProjectUIReady and Assigned(frmKeymanDeveloper.ActiveEditor) and not frmKeymanDeveloper.ActiveEditor.Untitled and (not Assigned(frmKeymanDeveloper.ActiveEditor.ProjectFile) or @@ -528,6 +550,21 @@ begin frmKeymanDeveloper.ShowProject; end; +procedure TmodActionsMain.actProjectAddFilesUpdate(Sender: TObject); +begin + actProjectAddFiles.Enabled := IsGlobalProjectUIReady; +end; + +procedure TmodActionsMain.actProjectCloseExecute(Sender: TObject); +begin + CloseProject; +end; + +procedure TmodActionsMain.actProjectCloseUpdate(Sender: TObject); +begin + actProjectClose.Enabled := IsGlobalProjectUIReady; +end; + procedure TmodActionsMain.actProjectNewExecute(Sender: TObject); begin if not frmKeymanDeveloper.BeforeOpenProject then @@ -550,7 +587,7 @@ begin Exit; end; - FGlobalProject.Save; + if not SaveAndCloseAllFiles then Exit; FreeGlobalProjectUI; LoadGlobalProjectUI(ptUnknown, FileName); // I4687 frmKeymanDeveloper.ProjectMRU.Add(FGlobalProject.FileName); @@ -560,13 +597,21 @@ end; procedure TmodActionsMain.NewProject(pt: TProjectType); begin - FGlobalProject.Save; + if not SaveAndCloseAllFiles then Exit; FreeGlobalProjectUI; NewGlobalProjectUI(pt); frmKeymanDeveloper.ShowProject; frmKeymanDeveloper.UpdateCaption; end; +procedure TmodActionsMain.CloseProject; +begin + if not SaveAndCloseAllFiles then Exit; + FreeGlobalProjectUI; + frmKeymanDeveloper.ShowProject; + frmKeymanDeveloper.UpdateCaption; +end; + procedure TmodActionsMain.actProjectSaveAsAccept(Sender: TObject); begin FGlobalProject.FileName := actProjectSaveAs.Dialog.FileName; @@ -585,11 +630,9 @@ begin CanClose := CheckFilenameConventions((Sender as TSaveDialog).FileName); end; -procedure TmodActionsMain.actProjectSaveExecute(Sender: TObject); +procedure TmodActionsMain.actProjectSaveAsUpdate(Sender: TObject); begin - if FGlobalProject.Untitled - then actProjectSaveAs.Execute - else FGlobalProject.Save; + actProjectSaveAs.Enabled := IsGlobalProjectUIReady; end; procedure TmodActionsMain.actProjectSettingsExecute(Sender: TObject); @@ -602,6 +645,11 @@ begin end; end; +procedure TmodActionsMain.actProjectSettingsUpdate(Sender: TObject); +begin + actProjectSettings.Enabled := IsGlobalProjectUIReady; +end; + procedure TmodActionsMain.actSearchFindBeforeExecute(Sender: TObject; var Cancel: Boolean); begin @@ -627,7 +675,7 @@ end; procedure TmodActionsMain.actToolsFileFormatUpdate(Sender: TObject); begin - actToolsFileFormat.Enabled := Assigned(frmKeymanDeveloper.ActiveChild) and + actToolsFileFormat.Enabled := IsGlobalProjectUIReady and Assigned(frmKeymanDeveloper.ActiveChild) and frmKeymanDeveloper.ActiveChild.CanTextFileFormatClick; frmKeymanDeveloper.Reloadwithencoding1.Enabled := Assigned(frmKeymanDeveloper.ActiveChild) and // I3082 // I3502 frmKeymanDeveloper.ActiveChild.CanReloadAsTextFileFormatClick; // because linking to the action causes the dropdown menu to break... @@ -935,19 +983,48 @@ end; procedure TmodActionsMain.DataModuleCreate(Sender: TObject); begin actFileOpen.Dialog.Filter := - 'Keyman source files|*.kmn;*.kps;*.kpp;*.txt;*.bmp;*.kpj;*.kvk;*.kct|'+ + 'Keyman source files|*.kmn;*.kps;*.txt;*.bmp;*.ico;*.kpj;*.kvk;*.kvks;*.model.ts;*.tsv|'+ + 'Projects files (*.kpj)|*.kpj|'+ 'Keyboard files (*.kmn)|*.kmn|'+ 'Package files (*.kps)|*.kps|'+ - 'Product files (*.kpp)|*.kpp|'+ - 'Customisation files (*.kct)|*.kct|'+ + 'Model files (*.model.ts)|*.model.ts|'+ + 'Wordlist files (*.tsv)|*.tsv|'+ 'Text files (*.txt)|*.txt|'+ - 'Virtual keyboard files (*.kvk)|*.kvk|'+ - 'Bitmap files (*.bmp)|*.bmp|'+ - 'TIKE projects (*.kpj)|*.kpj|'+ + 'Virtual keyboard files (*.kvk, *.kvks)|*.kvk;*.kvks|'+ + 'Icon files (*.bmp, *.ico)|*.bmp;*.ico|'+ 'Compiled keyboard files (*.kmx)|*.kmx|'+ + 'Javascript files (*.js)|*.js|'+ + 'Stylesheet files (*.css)|*.css|'+ 'HTML files (*.htm, *.html)|*.htm?|'+ 'XML files (*.xml)|*.xml|'+ 'All files (*.*)|*.*'; end; +function TmodActionsMain.SaveAndCloseAllFiles: Boolean; +var + i: Integer; +begin + FGlobalProject.Save; + for i := 0 to frmKeymanDeveloper.ChildWindows.Count - 1 do + begin + if frmKeymanDeveloper.ChildWindows[i] is TfrmProject then + Continue; + + if not frmKeymanDeveloper.ChildWindows[i].CloseQuery then + Exit(False); + end; + + for i := 0 to frmKeymanDeveloper.ChildWindows.Count - 1 do + begin + if frmKeymanDeveloper.ChildWindows[i] is TfrmProject then + Continue; + + frmKeymanDeveloper.ChildWindows[i].Visible := False; + frmKeymanDeveloper.ChildWindows[i].Parent := nil; + frmKeymanDeveloper.ChildWindows[i].Release; + end; + + Result := True; +end; + end. diff --git a/windows/src/developer/TIKE/main/UfrmMain.dfm b/windows/src/developer/TIKE/main/UfrmMain.dfm index 1d142676b6..eec3529d0e 100644 --- a/windows/src/developer/TIKE/main/UfrmMain.dfm +++ b/windows/src/developer/TIKE/main/UfrmMain.dfm @@ -301,7 +301,7 @@ inherited frmKeymanDeveloper: TfrmKeymanDeveloper Left = 304 Top = 236 Bitmap = { - 494C01010A000E00FC0010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 494C01010A000E00000110001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 0000000000003600000028000000400000003000000001002000000000000030 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -710,7 +710,7 @@ inherited frmKeymanDeveloper: TfrmKeymanDeveloper Left = 236 Top = 236 Bitmap = { - 494C01013B004000FC0010001000C0C0C000FF10FFFFFFFFFFFFFFFF424D3600 + 494C01013B004000000110001000C0C0C000FF10FFFFFFFFFFFFFFFF424D3600 000000000000360000002800000040000000F0000000010020000000000000F0 000000000000000000000000000000000000C0C0C000C0C0C000C0C0C000C0C0 C000C0C0C000C6C6C600F7730000CE5A0000CE5A0000F7730000C6C6C600C0C0 @@ -2922,6 +2922,9 @@ inherited frmKeymanDeveloper: TfrmKeymanDeveloper object SaveProjectAs1: TMenuItem Action = modActionsMain.actProjectSaveAs end + object CloseProject1: TMenuItem + Action = modActionsMain.actProjectClose + end object N25: TMenuItem Caption = '-' end diff --git a/windows/src/developer/TIKE/main/UfrmMain.pas b/windows/src/developer/TIKE/main/UfrmMain.pas index f9e5cc2349..3f3950697c 100644 --- a/windows/src/developer/TIKE/main/UfrmMain.pas +++ b/windows/src/developer/TIKE/main/UfrmMain.pas @@ -268,6 +268,7 @@ type ReloadasUTF161: TMenuItem; DebugTests1: TMenuItem; CrashTest1: TMenuItem; + CloseProject1: TMenuItem; procedure FormCreate(Sender: TObject); procedure FormShow(Sender: TObject); procedure mnuFileClick(Sender: TObject); @@ -580,7 +581,7 @@ begin FChildWindows[i].Release; // I2595, probably not necessary end; - if Assigned(FGlobalProject) then + if IsGlobalProjectUIReady then with TRegistryErrorControlled.Create do // I2890 try if FGlobalProject.Untitled @@ -1178,6 +1179,12 @@ function TfrmKeymanDeveloper.OpenEditor(FFileName: string; frmClass: TfrmTikeEdi var i, n: Integer; begin + if not IsGlobalProjectUIReady then + begin + // This can happen if we get a file opened via Explorer. + NewGlobalProjectUI(ptKeyboard); + end; + for i := 0 to FChildWindows.Count - 1 do if FChildWindows[i] is TfrmTikeEditor then with FChildWindows[i] as TfrmTikeEditor do @@ -1236,7 +1243,7 @@ procedure TfrmKeymanDeveloper.AddMRU(FileName: string); begin // Add the filename to the top of the MRU. - if FileName = '' then Exit; + if (FileName = '') or not IsGlobalProjectUIReady then Exit; if LowerCase(ExtractFileExt(FileName)) <> '.kpj' then // Don't add project files to project MRU @@ -1251,13 +1258,16 @@ begin for i := 0 to mnuFileRecent.Count - 1 do mnuFileRecent.Items[0].Free; - for i := 0 to FGlobalProject.MRU.FileCount - 1 do + if IsGlobalProjectUIReady then begin - m := TMenuItem.Create(Self); - m.Caption := '&'+IntToStr(i+1)+' '+FGlobalProject.MRU.EllipsisFile(i); - m.Hint := FGlobalProject.MRU.Files[i]; - m.OnClick := mnuFileRecentFileClick; - mnuFileRecent.Add(m); + for i := 0 to FGlobalProject.MRU.FileCount - 1 do + begin + m := TMenuItem.Create(Self); + m.Caption := '&'+IntToStr(i+1)+' '+FGlobalProject.MRU.EllipsisFile(i); + m.Hint := FGlobalProject.MRU.Files[i]; + m.OnClick := mnuFileRecentFileClick; + mnuFileRecent.Add(m); + end; end; end; @@ -1439,7 +1449,9 @@ end; procedure TfrmKeymanDeveloper.UpdateCaption; begin - if FGlobalProject.Untitled + if not IsGlobalProjectUIReady then + Caption := 'Keyman Developer' + else if FGlobalProject.Untitled then Caption := '(Untitled project) - Keyman Developer' else Caption := ChangeFileExt(ExtractFileName(FGlobalProject.FileName), '') + ' - Keyman Developer'; diff --git a/windows/src/developer/TIKE/main/UfrmMessages.pas b/windows/src/developer/TIKE/main/UfrmMessages.pas index cfa76b84ec..df6a88a82d 100644 --- a/windows/src/developer/TIKE/main/UfrmMessages.pas +++ b/windows/src/developer/TIKE/main/UfrmMessages.pas @@ -96,7 +96,8 @@ uses dmActionsMain, Keyman.Developer.System.Project.Project, Keyman.Developer.System.Project.ProjectFile, - Keyman.Developer.UI.Project.ProjectFileUI; + Keyman.Developer.UI.Project.ProjectFileUI, + Keyman.Developer.UI.Project.ProjectUI; {$R *.DFM} @@ -145,6 +146,9 @@ var FFilename: string; line: Integer; begin + if not IsGlobalProjectUIReady then + Exit; + line := SelLine; if line < 0 then Exit; SelLine := line; diff --git a/windows/src/developer/TIKE/project/Keyman.Developer.UI.Project.ProjectUI.pas b/windows/src/developer/TIKE/project/Keyman.Developer.UI.Project.ProjectUI.pas index 421f53f1a8..a62ae6ec13 100644 --- a/windows/src/developer/TIKE/project/Keyman.Developer.UI.Project.ProjectUI.pas +++ b/windows/src/developer/TIKE/project/Keyman.Developer.UI.Project.ProjectUI.pas @@ -28,6 +28,7 @@ function GetGlobalProjectUI: TProjectUI; function LoadGlobalProjectUI(pt: TProjectType; AFilename: string; ALoadPersistedUntitledProject: Boolean = False): TProjectUI; function NewGlobalProjectUI(pt: TProjectType): TProjectUI; procedure FreeGlobalProjectUI; +function IsGlobalProjectUIReady: Boolean; implementation @@ -41,6 +42,11 @@ begin Result := FGlobalProject as TProjectUI; end; +function IsGlobalProjectUIReady: Boolean; +begin + Result := Assigned(FGlobalProject); +end; + procedure FreeGlobalProjectUI; begin FreeAndNil(FGlobalProject); diff --git a/windows/src/developer/TIKE/project/Keyman.Developer.UI.Project.UfrmProject.pas b/windows/src/developer/TIKE/project/Keyman.Developer.UI.Project.UfrmProject.pas index afa92c6463..dccf63dd70 100644 --- a/windows/src/developer/TIKE/project/Keyman.Developer.UI.Project.UfrmProject.pas +++ b/windows/src/developer/TIKE/project/Keyman.Developer.UI.Project.UfrmProject.pas @@ -87,6 +87,8 @@ type function DoNavigate(URL: string): Boolean; procedure ClearMessages; function ShouldHandleNavigation(URL: string): Boolean; + procedure WebCommandProject(Command: WideString; Params: TStringList); + procedure WebCommandWelcome(Command: WideString; Params: TStringList); protected function GetHelpTopic: string; override; public @@ -175,8 +177,12 @@ begin inherited; FNextCommandParams := TStringList.Create; - GetGlobalProjectUI.OnRefresh := ProjectRefresh; // I4687 - GetGlobalProjectUI.OnRefreshCaption := ProjectRefreshCaption; // I4687 + + if IsGlobalProjectUIReady then + begin + GetGlobalProjectUI.OnRefresh := ProjectRefresh; // I4687 + GetGlobalProjectUI.OnRefreshCaption := ProjectRefreshCaption; // I4687 + end; cef := TframeCEFHost.Create(Self); cef.Parent := Self; @@ -189,12 +195,17 @@ end; procedure TfrmProject.RefreshHTML; begin - if GetGlobalProjectUI.Refreshing then // I4687 - tmrRefresh.Enabled := True - else + if IsGlobalProjectUIReady then begin - cef.Navigate(modWebHttpServer.GetAppURL('project/?path='+URLEncode(GetGlobalProjectUI.FileName))); - end; + if GetGlobalProjectUI.Refreshing then // I4687 + tmrRefresh.Enabled := True + else + begin + cef.Navigate(modWebHttpServer.GetAppURL('project/?path='+URLEncode(GetGlobalProjectUI.FileName))); + end; + end + else + cef.Navigate(modWebHttpServer.GetAppURL('project/welcome')); RefreshCaption; end; @@ -214,8 +225,16 @@ procedure TfrmProject.RefreshCaption; var s: string; begin - Hint := FGlobalProject.FileName; - s := GetGlobalProjectUI.DisplayFileName; // I4687 + if IsGlobalProjectUIReady then + begin + Hint := FGlobalProject.FileName; + s := GetGlobalProjectUI.DisplayFileName; // I4687 + end + else + begin + Hint := 'Welcome'; + s := 'Welcome'; + end; Caption := s; end; @@ -227,7 +246,9 @@ end; procedure TfrmProject.SetGlobalProject; begin - if not Assigned(GetGlobalProjectUI.OnRefresh) then // I4687 + if not IsGlobalProjectUIReady then + ProjectRefresh(nil) + else if not Assigned(GetGlobalProjectUI.OnRefresh) then // I4687 begin GetGlobalProjectUI.OnRefresh := ProjectRefresh; // I4687 GetGlobalProjectUI.OnRefreshCaption := ProjectRefreshCaption; // I4687 @@ -240,7 +261,7 @@ end; procedure TfrmProject.FormDestroy(Sender: TObject); begin inherited; - if GetGlobalProjectUI <> nil then + if IsGlobalProjectUIReady then begin GetGlobalProjectUI.OnRefresh := nil; // I4687 GetGlobalProjectUI.OnRefreshCaption := nil; // I4687 @@ -327,6 +348,18 @@ begin end; procedure TfrmProject.WebCommand(Command: WideString; Params: TStringList); +begin + if not IsGlobalProjectUIReady + then WebCommandWelcome(Command, Params) + else WebCommandProject(Command, Params); +end; + +procedure TfrmProject.WebCommandWelcome(Command: WideString; Params: TStringList); +begin + // TODO +end; + +procedure TfrmProject.WebCommandProject(Command: WideString; Params: TStringList); function FileTypeFromParamType: TKMFileType; begin if Params.Values['type'] = 'keyboard' then Result := ftKeymanSource @@ -365,6 +398,7 @@ var begin pf := nil; + if Command = 'fileaddnew' then begin { create a new file, add it to the project }