mirror of
https://github.com/keymanapp/keyman.git
synced 2026-09-14 11:37:43 +00:00
Also fixes an inadvertent issue where F1 was not opening context help in the text editor anywhere in Keyman Developer. This means that pressing F1 while a keyword is highlighted in a .kmn keyboard will not re-open the context help for that keyword once more (yay!)
387 lines
10 KiB
ObjectPascal
387 lines
10 KiB
ObjectPascal
unit Keyman.Developer.UI.Project.UfrmNewLDMLKeyboardProjectParameters;
|
|
|
|
interface
|
|
|
|
uses
|
|
System.Classes,
|
|
System.SysUtils,
|
|
System.UITypes,
|
|
System.Variants,
|
|
Winapi.Messages,
|
|
Winapi.Windows,
|
|
Vcl.CheckLst,
|
|
Vcl.Controls,
|
|
Vcl.Dialogs,
|
|
Vcl.Forms,
|
|
Vcl.Graphics,
|
|
Vcl.Grids,
|
|
Vcl.StdCtrls,
|
|
|
|
Browse4Folder,
|
|
|
|
UfrmTike,
|
|
utilfiletypes;
|
|
|
|
type
|
|
TfrmNewLDMLKeyboardProjectParameters = class(TTikeForm)
|
|
lblFileName: TLabel;
|
|
lblPath: TLabel;
|
|
editKeyboardID: TEdit;
|
|
cmdBrowse: TButton;
|
|
editPath: TEdit;
|
|
lblKeyboardName: TLabel;
|
|
editKeyboardName: TEdit;
|
|
lblCoypright: TLabel;
|
|
editCopyright: TEdit;
|
|
lblVersion: TLabel;
|
|
editVersion: TEdit;
|
|
lblAuthor: TLabel;
|
|
editAuthor: TEdit;
|
|
cmdOK: TButton;
|
|
cmdCancel: TButton;
|
|
lblKeyboardLanguages: TLabel;
|
|
lblProjectFilename: TLabel;
|
|
editProjectFilename: TEdit;
|
|
Label1: TLabel;
|
|
editFullCopyright: TEdit;
|
|
Label2: TLabel;
|
|
memoDescription: TMemo;
|
|
memoLanguages: TMemo;
|
|
Label3: TLabel;
|
|
Label4: TLabel;
|
|
procedure cmdOKClick(Sender: TObject);
|
|
procedure editKeyboardNameChange(Sender: TObject);
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure editCopyrightChange(Sender: TObject);
|
|
procedure editVersionChange(Sender: TObject);
|
|
procedure editAuthorChange(Sender: TObject);
|
|
procedure editPathChange(Sender: TObject);
|
|
procedure editKeyboardIDChange(Sender: TObject);
|
|
procedure cmdBrowseClick(Sender: TObject);
|
|
procedure editFullCopyrightChange(Sender: TObject);
|
|
procedure memoDescriptionChange(Sender: TObject);
|
|
procedure memoLanguagesChange(Sender: TObject);
|
|
private
|
|
dlgBrowse: TBrowse4Folder;
|
|
function GetAuthor: string;
|
|
function GetBasePath: string;
|
|
function GetCopyright: string;
|
|
function GetKeyboardID: string;
|
|
function GetKeyboardName: string;
|
|
function GetBCP47Tags: string;
|
|
function GetVersion: string;
|
|
function Validate: Boolean;
|
|
procedure EnableControls;
|
|
procedure SetBCP47Tags(const Value: string);
|
|
procedure SetKeyboardID(const Value: string);
|
|
procedure SetKeyboardName(const Value: string);
|
|
procedure UpdateProjectFilename;
|
|
function GetFullCopyright: string;
|
|
function GetDescription: string;
|
|
protected
|
|
function GetHelpTopic: string; override;
|
|
public
|
|
property Copyright: string read GetCopyright;
|
|
property FullCopyright: string read GetFullCopyright;
|
|
property Version: string read GetVersion;
|
|
property Author: string read GetAuthor;
|
|
property BCP47Tags: string read GetBCP47Tags write SetBCP47Tags;
|
|
property BasePath: string read GetBasePath;
|
|
|
|
property Description: string read GetDescription;
|
|
|
|
property KeyboardName: string read GetKeyboardName write SetKeyboardName;
|
|
property KeyboardID: string read GetKeyboardID write SetKeyboardID;
|
|
end;
|
|
|
|
function ShowNewLDMLKeyboardProjectParameters(Owner: TComponent): Boolean;
|
|
|
|
implementation
|
|
|
|
uses
|
|
System.RegularExpressions,
|
|
|
|
Keyman.System.CanonicalLanguageCodeUtils,
|
|
Keyman.System.LanguageCodeUtils,
|
|
BCP47Tag,
|
|
utilstr,
|
|
KeymanDeveloperOptions,
|
|
Keyman.Developer.System.HelpTopics,
|
|
Keyman.Developer.System.Project.Project,
|
|
Keyman.Developer.System.Project.ProjectFile,
|
|
Keyman.Developer.System.LDMLKeyboardProjectTemplate,
|
|
Keyman.Developer.System.ProjectTemplate,
|
|
Keyman.System.KeyboardUtils,
|
|
UfrmMain;
|
|
|
|
// 1. project filename
|
|
// 2. location
|
|
|
|
// 3. keyboard3.locale
|
|
// 4. locales additional/alternate locales
|
|
// 5. info.name = keyboard name
|
|
// 6. info.author
|
|
// skip: 7. info.layout
|
|
// skip: 8. info.indicator
|
|
|
|
// Package metadata
|
|
// 1. copyright
|
|
// 2. description
|
|
|
|
{$R *.dfm}
|
|
|
|
function ShowNewLDMLKeyboardProjectParameters(Owner: TComponent): Boolean;
|
|
var
|
|
f: TfrmNewLDMLKeyboardProjectParameters;
|
|
pt: TLDMLKeyboardProjectTemplate;
|
|
begin
|
|
f := TfrmNewLDMLKeyboardProjectParameters.Create(Owner);
|
|
try
|
|
Result := f.ShowModal = mrOk;
|
|
if not Result then
|
|
Exit;
|
|
|
|
pt := TLDMLKeyboardProjectTemplate.Create(f.BasePath, f.KeyboardID);
|
|
try
|
|
pt.Name := f.KeyboardName;
|
|
pt.Copyright := f.Copyright;
|
|
pt.FullCopyright := f.FullCopyright;
|
|
pt.Author := f.Author;
|
|
pt.Version := f.Version;
|
|
pt.Description := f.Description;
|
|
pt.BCP47Tags := f.BCP47Tags;
|
|
|
|
try
|
|
pt.Generate;
|
|
except
|
|
on E:EFOpenError do
|
|
begin
|
|
ShowMessage('Unable to create project: '+E.Message);
|
|
Exit(False);
|
|
end;
|
|
end;
|
|
|
|
frmKeymanDeveloper.OpenProject(pt.ProjectFilename);
|
|
Result := True;
|
|
|
|
finally
|
|
pt.Free;
|
|
end;
|
|
finally
|
|
f.Free;
|
|
end;
|
|
end;
|
|
|
|
{ TfrmNewLDMLKeyboardProjectParameters }
|
|
|
|
procedure TfrmNewLDMLKeyboardProjectParameters.FormCreate(Sender: TObject);
|
|
begin
|
|
inherited;
|
|
editPath.Text := FKeymanDeveloperOptions.DefaultProjectPath;
|
|
editFullCopyright.Text := 'Copyright '+Char($00A9 {copyright})+' '+FormatDateTime('yyyy', Now)+' ';
|
|
|
|
dlgBrowse := TBrowse4Folder.Create(Self);
|
|
dlgBrowse.InitialDir := editPath.Text;
|
|
dlgBrowse.Options := [OnlySelectFileSysDir, ShowEditBox, UseNewDialogStyle];
|
|
dlgBrowse.Root := Desktop;
|
|
dlgBrowse.Title := 'Select folder to save project to';
|
|
|
|
EnableControls;
|
|
end;
|
|
|
|
procedure TfrmNewLDMLKeyboardProjectParameters.cmdBrowseClick(Sender: TObject);
|
|
begin
|
|
dlgBrowse.InitialDir := editPath.Text;
|
|
|
|
if dlgBrowse.Execute and (dlgBrowse.FileName <> '') then
|
|
editPath.Text := ExcludeTrailingPathDelimiter(dlgBrowse.FileName);
|
|
end;
|
|
|
|
procedure TfrmNewLDMLKeyboardProjectParameters.cmdOKClick(Sender: TObject);
|
|
begin
|
|
if Validate then
|
|
ModalResult := mrOk;
|
|
end;
|
|
|
|
procedure TfrmNewLDMLKeyboardProjectParameters.editAuthorChange(Sender: TObject);
|
|
begin
|
|
EnableControls;
|
|
if not editCopyright.Modified then
|
|
editCopyright.Text := 'Copyright '+Char($00A9 {copyright})+' '+Author;
|
|
if not editFullCopyright.Modified then
|
|
editFullCopyright.Text := 'Copyright '+Char($00A9 {copyright})+' '+FormatDateTime('yyyy', Now)+' '+Author;
|
|
end;
|
|
|
|
procedure TfrmNewLDMLKeyboardProjectParameters.editCopyrightChange(Sender: TObject);
|
|
begin
|
|
EnableControls;
|
|
end;
|
|
|
|
procedure TfrmNewLDMLKeyboardProjectParameters.editFullCopyrightChange(Sender: TObject);
|
|
begin
|
|
EnableControls;
|
|
end;
|
|
|
|
procedure TfrmNewLDMLKeyboardProjectParameters.editKeyboardIDChange(Sender: TObject);
|
|
begin
|
|
UpdateProjectFilename;
|
|
EnableControls;
|
|
end;
|
|
|
|
procedure TfrmNewLDMLKeyboardProjectParameters.editKeyboardNameChange(Sender: TObject);
|
|
begin
|
|
if not editKeyboardID.Modified then
|
|
editKeyboardID.Text := TKeyboardUtils.CleanKeyboardID(Trim(editKeyboardName.Text));
|
|
EnableControls;
|
|
end;
|
|
|
|
procedure TfrmNewLDMLKeyboardProjectParameters.editPathChange(Sender: TObject);
|
|
begin
|
|
UpdateProjectFilename;
|
|
EnableControls;
|
|
end;
|
|
|
|
procedure TfrmNewLDMLKeyboardProjectParameters.editVersionChange(Sender: TObject);
|
|
begin
|
|
EnableControls;
|
|
end;
|
|
|
|
function IsValidSemanticVersion(const s: string): Boolean;
|
|
begin
|
|
// For now, only supports triplet version due to limits in .kps
|
|
Result := TRegEx.Create('^\d+\.\d+\.\d+$').IsMatch(s);
|
|
end;
|
|
|
|
procedure TfrmNewLDMLKeyboardProjectParameters.EnableControls;
|
|
var
|
|
e: Boolean;
|
|
begin
|
|
e := (Trim(editKeyboardName.Text) <> '') and
|
|
(Trim(editPath.Text) <> '') and
|
|
TKeyboardUtils.IsValidKeyboardID(Trim(editKeyboardID.Text), True) and
|
|
IsValidSemanticVersion(Trim(editVersion.Text)) and
|
|
(Trim(memoDescription.Text) <> '') and
|
|
(Trim(memoLanguages.Text) <> '');
|
|
|
|
cmdOK.Enabled := e;
|
|
end;
|
|
|
|
function TfrmNewLDMLKeyboardProjectParameters.GetAuthor: string;
|
|
begin
|
|
Result := Trim(editAuthor.Text);
|
|
end;
|
|
|
|
function TfrmNewLDMLKeyboardProjectParameters.GetBasePath: string;
|
|
begin
|
|
Result := Trim(editPath.Text);
|
|
end;
|
|
|
|
function TfrmNewLDMLKeyboardProjectParameters.GetCopyright: string;
|
|
begin
|
|
Result := Trim(editCopyright.Text);
|
|
end;
|
|
|
|
function TfrmNewLDMLKeyboardProjectParameters.GetDescription: string;
|
|
begin
|
|
Result := Trim(memoDescription.Text);
|
|
end;
|
|
|
|
function TfrmNewLDMLKeyboardProjectParameters.GetFullCopyright: string;
|
|
begin
|
|
Result := Trim(editFullCopyright.Text);
|
|
end;
|
|
|
|
function TfrmNewLDMLKeyboardProjectParameters.GetHelpTopic: string;
|
|
begin
|
|
Result := SHelpTopic_Context_NewLdmlProjectParameters;
|
|
end;
|
|
|
|
function TfrmNewLDMLKeyboardProjectParameters.GetKeyboardID: string;
|
|
begin
|
|
Result := Trim(LowerCase(editKeyboardID.Text));
|
|
end;
|
|
|
|
function TfrmNewLDMLKeyboardProjectParameters.GetKeyboardName: string;
|
|
begin
|
|
Result := Trim(editKeyboardName.Text);
|
|
end;
|
|
|
|
function TfrmNewLDMLKeyboardProjectParameters.GetBCP47Tags: string;
|
|
begin
|
|
Result := memoLanguages.Text;
|
|
Result := Result.Replace(#13#10, ' ');
|
|
Result := Result.Trim;
|
|
end;
|
|
|
|
function TfrmNewLDMLKeyboardProjectParameters.GetVersion: string;
|
|
begin
|
|
Result := Trim(editVersion.Text);
|
|
end;
|
|
|
|
function TfrmNewLDMLKeyboardProjectParameters.Validate: Boolean;
|
|
var
|
|
ProjectFolder: string;
|
|
begin
|
|
Result := TKeyboardUtils.IsValidKeyboardID(Trim(editKeyboardID.Text), True);
|
|
|
|
if Result then
|
|
begin
|
|
if not DirectoryExists(editPath.Text) then
|
|
begin
|
|
if MessageDlg('The target folder '+editPath.Text+' does not exist. Create it now?', mtConfirmation, mbOkCancel, 0) = mrCancel then
|
|
Exit(False);
|
|
end;
|
|
|
|
ProjectFolder := IncludeTrailingPathDelimiter(editPath.Text) + editKeyboardID.Text;
|
|
if DirectoryExists(ProjectFolder) then
|
|
begin
|
|
if MessageDlg('The project folder '+ProjectFolder+' already exists. Are you sure you want to overwrite it?', mtWarning,
|
|
mbOkCancel, 0) = mrCancel then
|
|
Exit(False);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
{ Languages Grid }
|
|
|
|
procedure TfrmNewLDMLKeyboardProjectParameters.SetBCP47Tags(const Value: string);
|
|
begin
|
|
memoLanguages.Text := Value.Replace(' ', #13#10);
|
|
EnableControls;
|
|
end;
|
|
|
|
procedure TfrmNewLDMLKeyboardProjectParameters.SetKeyboardID(const Value: string);
|
|
begin
|
|
editKeyboardID.Text := Value;
|
|
EnableControls;
|
|
end;
|
|
|
|
procedure TfrmNewLDMLKeyboardProjectParameters.SetKeyboardName(const Value: string);
|
|
begin
|
|
editKeyboardName.Text := Value;
|
|
EnableControls;
|
|
end;
|
|
|
|
procedure TfrmNewLDMLKeyboardProjectParameters.memoDescriptionChange(Sender: TObject);
|
|
begin
|
|
EnableControls;
|
|
end;
|
|
|
|
procedure TfrmNewLDMLKeyboardProjectParameters.memoLanguagesChange(
|
|
Sender: TObject);
|
|
begin
|
|
EnableControls;
|
|
end;
|
|
|
|
procedure TfrmNewLDMLKeyboardProjectParameters.UpdateProjectFilename;
|
|
begin
|
|
editProjectFilename.Text :=
|
|
IncludeTrailingPathDelimiter(BasePath) +
|
|
KeyboardID + PathDelim +
|
|
KeyboardID + Ext_ProjectSource;
|
|
// Scroll to the end of the control to show the filename
|
|
editProjectFilename.Perform(EM_SETSEL, Length(editProjectFilename.Text), Length(editProjectFilename.Text));
|
|
editProjectFilename.Perform(EM_SCROLLCARET, 0, 0);
|
|
end;
|
|
|
|
end.
|