[Developer] Add concept of closing project to bring up welcome. Step 1.

This commit is contained in:
Marc Durdin 2019-09-25 09:49:39 +10:00
parent ccaeab9889
commit 609649d00c
7 changed files with 193 additions and 46 deletions

View file

@ -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

View file

@ -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.

View file

@ -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

View file

@ -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';

View file

@ -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;

View file

@ -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);

View file

@ -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 }