Fixes#10146.
Some developers may wish to stick with kpj-1.0 for now, and the prompt
to upgrade would annoying because it cannot be hidden. This resolves
that.
Note that I haven't at this point renamed UrlRenderer.pas, although it
may be worth considering in the future.
Refactor the file-opening code so it can be used by Keyman Developer UI
as well as command-line, and then add support for opening files in
per-project instances from File|Open and friends.
Also moves the initialization code out of tike.dpr into
Keyman.Developer.System.Main.pas, which makes it easier to maintain and
read.
This is a bit of an omnibus commit, apologies for that. This commit
moves Keyman Developer to a proper multi-process model, where editing
files from multiple projects is handled much more cleanly, with each
project loaded in a separate process.
Files that are edited outside of a project structure are loaded into a
'temporary project' in a single process, which provides a pathway for
existing users who may have legacy files outside the normal Keyman
Developer project model.
There are several components to this:
1. Inter-process communication (Multiprocess, CopyDataHelper units and
multiprocess test project). These modules establish a method of
enumerating running Keyman Developer instances (with EnumWindow),
recording relevant metadata for each instance (by thread id) in the
registry (registry used because it manages contention without
additional effort from us), and communicating between processes with
WM_COPYDATA.
2. Command-line parsing (TikeCommandLine). Determines project ownership
(ProjectOwningFile) for each filename passed on the command-line, and
passes these over to existing instances of Keyman Developer that have
that project loaded, or starts new instances as needed.
3. Temporary project management. Mostly in ProjectUI.
Also, moved GlobalProjectStateWnd management out of ProjectFile.pas and
into Project.pas, alongside other global project variables.
A follow-up will add functionality to determine if a file opened within
the Keyman Developer UI should open in the same instance or in a
separate instance (see TfrmKeymanDeveloper.OpenFileInProject). This will
use the same methodology as TikeCommandLine does now, so may involve
further refactoring.
This commit establishes the idea of 'keyman.kpj' as a future default
filename for Keyman Developer projects, but does not enable it, in
ProjectOwningFile. It is planned to introduce this fixed filename in
version 18.0 (see #10113).
Reverts some of the version 2.0 project functionality, as there are a
number of challenges around populating files for folders that don't have
project definitions, particularly if user attempts to load a folder that
is not a project folder after all but happens, e.g. to have a source
folder in it.
For batch builds (e.g. project/compile all) of v2.0 projects, we only
want to build files that are listed in the project's $SOURCEPATH, so
that the project can contain extra folders with source file types that
won't break a project-level build.
Any source file types in extra folders can still be built one-by-one,
which is helpful for investigation and test for keyboard authors, but
will not be built if project build is selected.
This commit also formalizes the source/ SourcePath for upgraded projects
which contain a source/ folder. If the project to be upgraded does not
contain the source/ folder, then no SourcePath is assigned, and any
source file in any folder will be built.
Identifies .xml keyboards when building file list, then shows those
appropriately in the keyboard list. Also enables grouped actions such
as keyboard_compileall for those keyboards.
Relates to #9948. Starts basic support for v2.0 projects.
For all operating modes:
- Remove blank projects / untitled projects mode
- Add Open Project Folder buttons and links
- Remove Project Save As
- Render uses in-memory XML
- Upgrade to v2.0 project file (along with checks)
For v2.0 projects:
- Remove 'Add File to Project'
- Populate Files to list all files in folder (note: consider efficiency
here as currently files are parsed for subfile data)
- Version 2.0 project options and defaults