diff --git a/windows/src/developer/TIKE/project/Keyman.Developer.UI.Project.UfrmNewProjectParameters.dfm b/windows/src/developer/TIKE/project/Keyman.Developer.UI.Project.UfrmNewProjectParameters.dfm index d5958525ec..d6af8065fb 100644 --- a/windows/src/developer/TIKE/project/Keyman.Developer.UI.Project.UfrmNewProjectParameters.dfm +++ b/windows/src/developer/TIKE/project/Keyman.Developer.UI.Project.UfrmNewProjectParameters.dfm @@ -13,9 +13,9 @@ inherited frmNewProjectParameters: TfrmNewProjectParameters object lblFileName: TLabel Left = 12 Top = 275 - Width = 50 + Width = 64 Height = 13 - Caption = '&File Name:' + Caption = '&Keyboard ID:' FocusControl = editFileName end object lblPath: TLabel @@ -55,7 +55,7 @@ inherited frmNewProjectParameters: TfrmNewProjectParameters Top = 92 Width = 37 Height = 13 - Caption = '&Author:' + Caption = 'A&uthor:' FocusControl = editAuthor end object lblTargets: TLabel @@ -75,11 +75,12 @@ inherited frmNewProjectParameters: TfrmNewProjectParameters FocusControl = gridKeyboardLanguages end object editFileName: TEdit - Left = 64 + Left = 120 Top = 272 - Width = 205 + Width = 149 Height = 21 TabOrder = 10 + OnChange = editFileNameChange end object cmdBrowse: TButton Left = 275 @@ -88,13 +89,15 @@ inherited frmNewProjectParameters: TfrmNewProjectParameters Height = 21 Caption = '&Browse...' TabOrder = 11 + OnClick = cmdBrowseClick end object editPath: TEdit - Left = 64 + Left = 120 Top = 245 - Width = 289 + Width = 233 Height = 21 TabOrder = 9 + OnChange = editPathChange end object editKeyboardName: TEdit Left = 120 @@ -111,6 +114,7 @@ inherited frmNewProjectParameters: TfrmNewProjectParameters Height = 21 TabOrder = 1 Text = #169 + OnChange = editCopyrightChange end object editVersion: TEdit Left = 120 @@ -119,6 +123,7 @@ inherited frmNewProjectParameters: TfrmNewProjectParameters Height = 21 TabOrder = 2 Text = '1.0' + OnChange = editVersionChange end object editAuthor: TEdit Left = 120 @@ -126,6 +131,7 @@ inherited frmNewProjectParameters: TfrmNewProjectParameters Width = 205 Height = 21 TabOrder = 3 + OnChange = editAuthorChange end object cmdOK: TButton Left = 463 @@ -152,6 +158,7 @@ inherited frmNewProjectParameters: TfrmNewProjectParameters Top = 116 Width = 205 Height = 97 + OnClickCheck = clbTargetsClickCheck ItemHeight = 13 TabOrder = 4 end diff --git a/windows/src/developer/TIKE/project/Keyman.Developer.UI.Project.UfrmNewProjectParameters.pas b/windows/src/developer/TIKE/project/Keyman.Developer.UI.Project.UfrmNewProjectParameters.pas index 6313b09cad..045e37b8f4 100644 --- a/windows/src/developer/TIKE/project/Keyman.Developer.UI.Project.UfrmNewProjectParameters.pas +++ b/windows/src/developer/TIKE/project/Keyman.Developer.UI.Project.UfrmNewProjectParameters.pas @@ -56,6 +56,13 @@ type procedure cmdKeyboardEditLanguageClick(Sender: TObject); procedure cmdKeyboardRemoveLanguageClick(Sender: TObject); procedure FormDestroy(Sender: TObject); + procedure editCopyrightChange(Sender: TObject); + procedure editVersionChange(Sender: TObject); + procedure editAuthorChange(Sender: TObject); + procedure clbTargetsClickCheck(Sender: TObject); + procedure editPathChange(Sender: TObject); + procedure editFileNameChange(Sender: TObject); + procedure cmdBrowseClick(Sender: TObject); private pack: TKPSFile; FSetup: Integer; // Used temporarily for storing language list @@ -178,6 +185,33 @@ begin FreeAndNil(pack); end; +procedure TfrmNewProjectParameters.clbTargetsClickCheck(Sender: TObject); +begin + EnableControls; +end; + +procedure TfrmNewProjectParameters.cmdBrowseClick(Sender: TObject); +var + FPathName, FFolderName, FProjectName: string; +begin + inherited; + if dlgSave.Execute then + begin + FPathName := ExtractFilePath(ExtractFileDir(dlgSave.FileName)); + FFolderName := ExtractFileName(ExtractFileDir(dlgSave.FileName)); + FProjectName := ChangeFileExt(ExtractFileName(dlgSave.FileName), ''); + if not SameText(FFolderName, FProjectName) then + begin + if MessageDlg('The project will be saved at "'+FPathName+FFolderName+'\'+FProjectName+'\'+FProjectName+'.kpj". Continue?', + mtConfirmation, mbOkCancel, 0) = mrCancel then + Exit; + FPathName := FPathName+FFolderName; + end; + editPath.Text := ExcludeTrailingPathDelimiter(FPathName); + editFileName.Text := FProjectName; + end; +end; + procedure TfrmNewProjectParameters.cmdKeyboardAddLanguageClick( Sender: TObject); var @@ -257,11 +291,36 @@ begin ModalResult := mrOk; end; +procedure TfrmNewProjectParameters.editAuthorChange(Sender: TObject); +begin + EnableControls; +end; + +procedure TfrmNewProjectParameters.editCopyrightChange(Sender: TObject); +begin + EnableControls; +end; + +procedure TfrmNewProjectParameters.editFileNameChange(Sender: TObject); +begin + EnableControls; +end; + procedure TfrmNewProjectParameters.editKeyboardNameChange(Sender: TObject); begin - inherited; if not editFileName.Modified then editFileName.Text := TKeyboardUtils.CleanKeyboardID(Trim(editKeyboardName.Text)); + EnableControls; +end; + +procedure TfrmNewProjectParameters.editPathChange(Sender: TObject); +begin + EnableControls; +end; + +procedure TfrmNewProjectParameters.editVersionChange(Sender: TObject); +begin + EnableControls; end; procedure TfrmNewProjectParameters.EnableControls; @@ -270,7 +329,8 @@ var begin e := (Trim(editKeyboardName.Text) <> '') and (Trim(editPath.Text) <> '') and - (Trim(editFileName.Text) <> ''); + TKeyboardUtils.IsValidKeyboardID(Trim(editFileName.Text)) and + (GetTargets <> []); cmdOK.Enabled := e; e := gridKeyboardLanguages.RowCount > 1; diff --git a/windows/src/developer/kmconvert/Keyman.Developer.System.ImportWindowsKeyboard.pas b/windows/src/developer/kmconvert/Keyman.Developer.System.ImportWindowsKeyboard.pas index 8fa51e2868..4488833941 100644 --- a/windows/src/developer/kmconvert/Keyman.Developer.System.ImportWindowsKeyboard.pas +++ b/windows/src/developer/kmconvert/Keyman.Developer.System.ImportWindowsKeyboard.pas @@ -3,9 +3,13 @@ unit Keyman.Developer.System.ImportWindowsKeyboard; interface uses + System.SysUtils, + Keyman.Developer.System.KeyboardProjectTemplate; type + EImportWindowsKeyboard = class(Exception); + TImportWindowsKeyboard = class private FBaseKeyboardID: string; @@ -36,6 +40,7 @@ type IconFilename, TouchLayoutFilename: string); function ConvertOSKToTouchLayout(const OSKFilename, TouchLayoutFilename: string): Boolean; function FindBCP47TagForKLID: string; overload; + function GetProjectFilename: string; public function Execute: Boolean; overload; @@ -52,7 +57,7 @@ type property BCP47Tags: string read FBCP47Tags write SetBCP47Tags; property Author: string read FAuthor write SetAuthor; - property ProjectFilename: string read FProjectFilename; + property ProjectFilename: string read GetProjectFilename; end; implementation @@ -60,7 +65,6 @@ implementation uses System.Classes, System.Math, - System.SysUtils, System.Win.Registry, Vcl.Graphics, Winapi.Windows, @@ -73,7 +77,8 @@ uses KeyboardParser, kmxfileconsts, RegistryKeys, - UKeymanTargets; + UKeymanTargets, + utilfiletypes; { TImportWindowsKeyboard } @@ -110,6 +115,27 @@ begin Result := True; end; +function TImportWindowsKeyboard.GetProjectFilename: string; +var + FTemplate: TKeyboardProjectTemplate; +begin + if FProjectFilename = '' then + begin + // Lookup the KLID in the registry and read basic details + if not LoadKLIDDetails then + raise EImportWindowsKeyboard.Create('The keyboard identified by '+FSourceKLID+' could not be found.'); + + FTemplate := TKeyboardProjectTemplate.Create(FDestinationPath, Format(FKeyboardIDTemplate, [FBaseKeyboardID]), KMXKeymanTargets + [ktWeb]); + try + Result := FTemplate.ProjectFilename; + finally + FTemplate.Free; + end; + end + else + Result := FProjectFIlename; +end; + procedure TImportWindowsKeyboard.SetAuthor(const Value: string); begin FAuthor := Value; diff --git a/windows/src/developer/kmconvert/Keyman.Developer.System.KeyboardProjectTemplate.pas b/windows/src/developer/kmconvert/Keyman.Developer.System.KeyboardProjectTemplate.pas index c184f05faa..181ead514f 100644 --- a/windows/src/developer/kmconvert/Keyman.Developer.System.KeyboardProjectTemplate.pas +++ b/windows/src/developer/kmconvert/Keyman.Developer.System.KeyboardProjectTemplate.pas @@ -43,6 +43,7 @@ type procedure WriteRepositoryMetadata; procedure WriteDocumentation; procedure WriteKeyboardInfo; + function HasKMX: Boolean; function HasIcon: Boolean; procedure Transform(const SourceFile: string; DestFile: string = ''); function DataPath: string; @@ -164,19 +165,24 @@ begin Result := GetFilename(FTouchLayoutFilename); end; +function TKeyboardProjectTemplate.HasKMX: Boolean; +begin + Result := (KMXKeymanTargets+[ktAny]) * FTargets <> []; +end; + function TKeyboardProjectTemplate.HasKVKS: Boolean; begin - Result := KeymanTargetsUsingKVK * FTargets <> []; + Result := (KeymanTargetsUsingKVK+[ktAny]) * FTargets <> []; end; function TKeyboardProjectTemplate.HasTouchLayout: Boolean; begin - Result := TouchKeymanTargets * FTargets <> []; + Result := (TouchKeymanTargets+[ktAny]) * FTargets <> []; end; function TKeyboardProjectTemplate.HasIcon: Boolean; begin - Result := KMXKeymanTargets * FTargets <> []; + Result := (KMXKeymanTargets+[ktAny]) * FTargets <> []; end; procedure TKeyboardProjectTemplate.WriteDocumentation; @@ -276,9 +282,12 @@ begin kps.FileName := GetPackageFilename; // Add .kmx - f := TPackageContentFile.Create(kps); - f.FileName := FBasePath + FKeyboardID + '\build\' + FKeyboardID + Ext_KeymanFile; - kps.Files.Add(f); + if HasKMX then + begin + f := TPackageContentFile.Create(kps); + f.FileName := FBasePath + FKeyboardID + '\build\' + FKeyboardID + Ext_KeymanFile; + kps.Files.Add(f); + end; // Add .js if HasTouchLayout then diff --git a/windows/src/developer/kmconvert/Keyman.Developer.System.KeymanConvertMain.pas b/windows/src/developer/kmconvert/Keyman.Developer.System.KeymanConvertMain.pas index 5849624f18..9bfac62920 100644 --- a/windows/src/developer/kmconvert/Keyman.Developer.System.KeymanConvertMain.pas +++ b/windows/src/developer/kmconvert/Keyman.Developer.System.KeymanConvertMain.pas @@ -34,7 +34,15 @@ end; function DoImportWindowsKeyboard(FParameters: TKMConvertParameters): Boolean; var iwk: TImportWindowsKeyboard; + FTargetFolder: string; + v: Integer; begin + if not TryStrToInt('$'+FParameters.KLID, v) then + begin + writeln('ERROR: The format of the input parameter -klid '+FParameters.KLID+' is incorrect'); + Exit(False); + end; + iwk := TImportWindowsKeyboard.Create; try iwk.SourceKLID := FParameters.KLID; @@ -45,6 +53,14 @@ begin iwk.Version := FParameters.Version; iwk.BCP47Tags := FParameters.BCP47Tags; iwk.Author := FParameters.Author; + + FTargetFolder := ExtractFileDir(iwk.ProjectFilename); + if DirectoryExists(FTargetFolder) then + begin + writeln('ERROR: The directory "'+FTargetFolder+'" already exists.'); + Exit(False); + end; + Result := iwk.Execute; finally iwk.Free; @@ -54,6 +70,7 @@ end; function DoCreateKeyboardTemplate(FParameters: TKMConvertParameters): Boolean; var kpt: TKeyboardProjectTemplate; + FTargetFolder: string; begin kpt := TKeyboardProjectTemplate.Create(FParameters.Destination, FParameters.KeyboardID, FParameters.Targets); try @@ -62,6 +79,14 @@ begin kpt.Version := FParameters.Version; kpt.BCP47Tags := FParameters.BCP47Tags; kpt.Author := FParameters.Author; + + FTargetFolder := ExtractFileDir(kpt.ProjectFilename); + if DirectoryExists(FTargetFolder) then + begin + writeln('ERROR: The directory "'+FTargetFolder+'" already exists.'); + Exit(False); + end; + try kpt.Generate; except diff --git a/windows/src/global/delphi/general/BCP47Tag.pas b/windows/src/global/delphi/general/BCP47Tag.pas index 051ba84b6a..f3b25ee2dd 100644 --- a/windows/src/global/delphi/general/BCP47Tag.pas +++ b/windows/src/global/delphi/general/BCP47Tag.pas @@ -77,8 +77,12 @@ uses { TBCP47Tag } procedure TBCP47Tag.Canonicalize; +var + newTag: string; begin - SetTag(TCanonicalLanguageCodeUtils.FindBestTag(Tag)); + newTag := TCanonicalLanguageCodeUtils.FindBestTag(Tag); + if newTag <> '' then + SetTag(newTag); end; procedure TBCP47Tag.Clear;