Editor UI - #99
Draft
NateIsStalling wants to merge 41 commits into
Draft
Editor UI#99NateIsStalling wants to merge 41 commits into
NateIsStalling wants to merge 41 commits into
Conversation
# Conflicts: # language-adapter/build.gradle
# Conflicts: # app/src/main/java/com/basic4gl/desktop/Theme.java
# Conflicts: # app-spi/src/main/java/com/basic4gl/desktop/spi/language/IndexedSymbol.java # app-spi/src/main/java/com/basic4gl/desktop/spi/language/LanguageSupport.java # app/src/main/java/com/basic4gl/desktop/ExportDialog.java # app/src/main/java/com/basic4gl/desktop/MainWindow.java # app/src/main/java/com/basic4gl/desktop/content/FileEditor.java # app/src/main/java/com/basic4gl/desktop/language/Basic4GLFoldParser.java # app/src/main/java/com/basic4gl/desktop/language/SymbolIndexer.java # app/src/main/java/org/fife/ui/rtextarea/MultiHeaderGutter.java # app/src/test/java/com/basic4gl/desktop/ExportDialogTest.java # language-adapter/src/main/antlr/Basic4GL.g4 # language-adapter/src/main/java/com/basic4gl/language/adapter/Basic4GLEditorPluginAdapter.java # language-adapter/src/main/java/com/basic4gl/language/adapter/Basic4GLLanguageService.java # language-adapter/src/main/java/com/basic4gl/language/adapter/Basic4GLLanguageSupport.java # language-adapter/src/main/java/com/basic4gl/language/adapter/util/LanguageUtil.java # language-adapter/src/test/java/com/basic4gl/language/adapter/LanguageServiceTest.java
Contributor
There was a problem hiding this comment.
Pull request overview
This PR introduces a new “content” and “file viewer” subsystem to the Basic4GLj desktop IDE, enabling embedded documentation/samples, richer viewer types (HTML/Markdown/images/audio/etc.), and related UI updates.
Changes:
- Adds a content SPI (sources/providers/descriptors) plus app-side catalog/materialization and Swing renderers for Markdown/HTML/plain text documentation.
- Introduces a ServiceLoader-based file viewer framework and multiple viewer implementations/providers, plus a documentation viewer with navigation.
- Updates editor UI/utilities (split pane styling, recent workspaces, default “Untitled” naming, icon helpers) and expands test coverage; updates dependencies (CommonMark, JavaFX, JUnit).
Reviewed changes
Copilot reviewed 123 out of 123 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| language-adapter/src/test/java/com/basic4gl/language/adapter/Basic4GLContentResourcesTest.java | Verifies embedded Basic4GL docs/samples classpath content is indexed and readable. |
| language-adapter/src/main/java/com/basic4gl/language/adapter/Basic4GLEditorPluginAdapter.java | Registers built-in docs/samples content providers during plugin load. |
| app/src/test/java/com/basic4gl/desktop/content/TemplateInstantiatorTest.java | Tests template instantiation behavior and entry point handling. |
| app/src/test/java/com/basic4gl/desktop/content/render/ContentRendererTest.java | Tests Markdown/HTML/plain text rendering behaviors and link/image rewriting. |
| app/src/test/java/com/basic4gl/desktop/content/FileEditorDefaultNameTest.java | Tests new “Untitled” default naming and suffix selection logic. |
| app/src/test/java/com/basic4gl/desktop/content/ContentMaterializerTest.java | Tests caching/materialization/version cleanup and unsafe path rejection. |
| app/src/test/java/com/basic4gl/desktop/content/ContentDocumentViewerTest.java | Tests documentation viewer navigation history and pinning behavior. |
| app/src/test/java/com/basic4gl/desktop/content/catalog/ContentPanelModelTest.java | Tests derived scopes, browsing hierarchy, searching, and summary labels/actions. |
| app/src/test/java/com/basic4gl/desktop/content/catalog/ContentCatalogTest.java | Tests provider registration/unregistration rules and search indexing. |
| app/src/META-INF/services/com.basic4gl.desktop.spi.content.FileViewerProvider | Registers built-in FileViewer providers for ServiceLoader discovery. |
| app/src/main/java/com/basic4gl/desktop/vmview/VirtualMachineViewDialog.java | Applies split-pane handle hiding to variables view split pane. |
| app/src/main/java/com/basic4gl/desktop/util/SwingUtil.java | Adds shared Swing utilities (smooth scrolling, split pane styling, colors). |
| app/src/main/java/com/basic4gl/desktop/util/SwingIconUtil.java | Adds icon tinting and scaled/thumbnail icon helpers. |
| app/src/main/java/com/basic4gl/desktop/util/RoundedCardPanel.java | Adds reusable rounded panel component. |
| app/src/main/java/com/basic4gl/desktop/util/KeyStrokeUtil.java | Updates shortcut string formatting logic. |
| app/src/main/java/com/basic4gl/desktop/util/HtmlUtil.java | Adds HTML escaping and Markdown-to-HTML helper (CommonMark). |
| app/src/main/java/com/basic4gl/desktop/util/FileUtil.java | Adds file type labeling, relative path formatting, and OS “reveal/open” helpers. |
| app/src/main/java/com/basic4gl/desktop/util/BasicDialogService.java | Adds a simple DialogService implementation using JOptionPane. |
| app/src/main/java/com/basic4gl/desktop/ProjectSettingsDialog.java | Applies split-pane handle hiding in project settings. |
| app/src/main/java/com/basic4gl/desktop/panels/IEditorPanelProvider.java | Adds an SPI-like contract for editor panels/layout integration. |
| app/src/main/java/com/basic4gl/desktop/panels/EditorLayout.java | Adds layout enum for editor panels. |
| app/src/main/java/com/basic4gl/desktop/FileManager.java | Removes old FileManager from root package (moved to content package). |
| app/src/main/java/com/basic4gl/desktop/ExportDialog.java | Switches to new FileEditor location and delegates literal extraction to LanguageService. |
| app/src/main/java/com/basic4gl/desktop/EmptyTabPanel.java | Adds “Open Folder” and recent workspaces UI and callbacks. |
| app/src/main/java/com/basic4gl/desktop/editor/IFileViewer.java | Introduces a unified interface for tab/viewer management and viewer types. |
| app/src/main/java/com/basic4gl/desktop/editor/IFileEditorActionListener.java | Adds bookmark-change callback. |
| app/src/main/java/com/basic4gl/desktop/editor/IEditorPresenter.java | Moves/exports presenter interface and adds compile/doc-preview hooks. |
| app/src/main/java/com/basic4gl/desktop/editor/ApMode.java | Moves ApMode enum into editor package and makes it public. |
| app/src/main/java/com/basic4gl/desktop/debugger/IDebugPresenter.java | Adds a debug presenter abstraction for debugger UI coordination. |
| app/src/main/java/com/basic4gl/desktop/content/TextFileViewer.java | Wraps FileEditor behind IFileViewer to support the new viewer model. |
| app/src/main/java/com/basic4gl/desktop/content/TemplateInstantiator.java | Adds safe template materialization into destination directory with entry point validation. |
| app/src/main/java/com/basic4gl/desktop/content/SimpleTextViewerProvider.java | Adds a ServiceLoader provider for SimpleTextViewer. |
| app/src/main/java/com/basic4gl/desktop/content/SimpleTextViewer.java | Adds a simple read-only text viewer implementation (SPI FileViewer). |
| app/src/main/java/com/basic4gl/desktop/content/render/UnsupportedContentRenderer.java | Adds fallback renderer for unknown media types with HTML-escaped messaging. |
| app/src/main/java/com/basic4gl/desktop/content/render/RendererSupport.java | Adds shared renderer helpers (media type normalize, safe path resolve, hyperlink handling). |
| app/src/main/java/com/basic4gl/desktop/content/render/PlainTextContentRenderer.java | Adds a plain text renderer for documentation viewer. |
| app/src/main/java/com/basic4gl/desktop/content/render/MarkdownContentRenderer.java | Adds Markdown renderer with image/link rewriting and safety limits. |
| app/src/main/java/com/basic4gl/desktop/content/render/HtmlContentRenderer.java | Adds HTML renderer for documentation viewer. |
| app/src/main/java/com/basic4gl/desktop/content/render/ContentRenderRequest.java | Adds a normalized render request record for content rendering. |
| app/src/main/java/com/basic4gl/desktop/content/render/ContentRenderer.java | Introduces content renderer interface. |
| app/src/main/java/com/basic4gl/desktop/content/render/ContentNavigationHandler.java | Adds navigation interface for internal/external link handling. |
| app/src/main/java/com/basic4gl/desktop/content/MarkdownViewerProvider.java | Adds a ServiceLoader provider for markdown viewing. |
| app/src/main/java/com/basic4gl/desktop/content/MarkdownViewer.java | Adds a Markdown viewer built atop the HTML viewer pipeline. |
| app/src/main/java/com/basic4gl/desktop/content/MarkdownHtmlSupport.java | Adds shared HTML shell/styling for rendered markdown content. |
| app/src/main/java/com/basic4gl/desktop/content/ImageFileViewer.java | Adds an image viewer implementation for IFileViewer-based tabs. |
| app/src/main/java/com/basic4gl/desktop/content/IFileManagerListener.java | Moves listener interface into content package. |
| app/src/main/java/com/basic4gl/desktop/content/HexFileViewer.java | Adds a hex viewer implementation for IFileViewer-based tabs. |
| app/src/main/java/com/basic4gl/desktop/content/FileViewerWrapper.java | Adds a bridge wrapper to keep compatibility with FileEditor-centric code paths. |
| app/src/main/java/com/basic4gl/desktop/content/FileViewerRegistry.java | Adds ServiceLoader discovery and selection logic for SPI FileViewer providers. |
| app/src/main/java/com/basic4gl/desktop/content/FileViewerManager.java | Adds convenience facade for viewer discovery and file loading. |
| app/src/main/java/com/basic4gl/desktop/content/FileViewerFactory.java | Adds viewer selection/creation logic for IFileViewer-based tabs. |
| app/src/main/java/com/basic4gl/desktop/content/FileManager.java | Reintroduces FileManager under content package and adds runnable-file tracking. |
| app/src/main/java/com/basic4gl/desktop/content/FileEditor.java | Moves FileEditor, adds “Untitled” naming, bookmark listing, and go-to-line. |
| app/src/main/java/com/basic4gl/desktop/content/DefaultImageViewerProvider.java | Adds default image SPI viewer provider. |
| app/src/main/java/com/basic4gl/desktop/content/DefaultImageViewer.java | Adds default image SPI viewer implementation. |
| app/src/main/java/com/basic4gl/desktop/content/DefaultAudioViewerProvider.java | Adds default audio SPI viewer provider. |
| app/src/main/java/com/basic4gl/desktop/content/ContentMaterializer.java | Adds safe caching/materialization for content bundles and version cleanup. |
| app/src/main/java/com/basic4gl/desktop/content/ContentDocumentViewer.java | Adds documentation viewer with back/forward/home navigation. |
| app/src/main/java/com/basic4gl/desktop/content/catalog/TemplateCatalogEntry.java | Adds catalog entry record for templates. |
| app/src/main/java/com/basic4gl/desktop/content/catalog/DocumentCatalogEntry.java | Adds catalog entry record for documents. |
| app/src/main/java/com/basic4gl/desktop/content/catalog/DefaultContentService.java | Adds app-side ContentService implementation that registers into catalog. |
| app/src/main/java/com/basic4gl/desktop/content/catalog/ContentSelectionSummary.java | Adds summary record for selected content item display/action text. |
| app/src/main/java/com/basic4gl/desktop/content/catalog/ContentSearchResult.java | Adds search result record for indexed content queries. |
| app/src/main/java/com/basic4gl/desktop/content/catalog/ContentSearchIndex.java | Adds scoring/search implementation across documents/templates. |
| app/src/main/java/com/basic4gl/desktop/content/catalog/ContentScope.java | Adds scope model driven by tags (“All Documentation”, per-tag scopes). |
| app/src/main/java/com/basic4gl/desktop/content/catalog/ContentPanelModel.java | Adds model for listing/browsing/searching catalog items and computing summaries. |
| app/src/main/java/com/basic4gl/desktop/content/catalog/ContentPanelItem.java | Adds UI item model for catalog entries. |
| app/src/main/java/com/basic4gl/desktop/content/catalog/ContentGlobalId.java | Adds stable global ID model for content items. |
| app/src/main/java/com/basic4gl/desktop/content/catalog/ContentCatalogListener.java | Adds listener interface for catalog change events. |
| app/src/main/java/com/basic4gl/desktop/content/catalog/ContentCatalog.java | Adds synchronized catalog for providers, uniqueness rules, and listener notifications. |
| app/src/main/java/com/basic4gl/desktop/content/catalog/ContentBrowseNode.java | Adds browse tree node for hierarchical category display. |
| app/src/main/java/com/basic4gl/desktop/content/AudioFileViewer.java | Adds an audio viewer UI shell for IFileViewer-based tabs. |
| app/src/main/java/com/basic4gl/desktop/content/AssetService.java | Introduces a new asset-related service placeholder tied to FileManager. |
| app/build.gradle | Adds CommonMark + JavaFX deps, updates JUnit, adjusts Spotless excludes. |
| app-spi/src/test/java/com/basic4gl/desktop/spi/content/ContentSourceTest.java | Tests ContentSource implementations (map/dir/zip/jar) and normalization. |
| app-spi/src/test/java/com/basic4gl/desktop/spi/content/ContentPathsTest.java | Tests path normalization/resolution and rejection of unsafe paths. |
| app-spi/src/test/java/com/basic4gl/desktop/spi/content/ContentHelperProviderTest.java | Tests directory-based providers and classpath indexing behavior. |
| app-spi/src/test/java/com/basic4gl/desktop/spi/content/ContentDescriptorTest.java | Tests descriptor validation/defensive copying and request copying. |
| app-spi/src/main/java/com/basic4gl/desktop/spi/PluginContext.java | Adds content access plus editor/debug/command services to PluginContext. |
| app-spi/src/main/java/com/basic4gl/desktop/spi/EditorCommandsService.java | Adds editor command surface for viewer/file/bookmark/workspace actions. |
| app-spi/src/main/java/com/basic4gl/desktop/spi/DialogService.java | Redefines dialog service API to message + input dialogs. |
| app-spi/src/main/java/com/basic4gl/desktop/spi/DebugController.java | Adds a minimal debug control surface to SPI. |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/ZipContentSource.java | Adds ZIP-based content source with optional root prefix. |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/TemplateProvider.java | Adds template provider SPI for indexed templates and instantiation. |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/TemplateDescriptor.java | Adds immutable template descriptor implementing IndexedContent. |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/TemplateCreationRequest.java | Adds request model for template instantiation. |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/Template.java | Keeps legacy Template model (deprecated). |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/MapContentSource.java | Adds in-memory content source with normalization/duplicate checks. |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/ManifestDocumentProvider.java | Adds descriptor-driven document provider over a ContentSource. |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/LegacyTemplateProvider.java | Adds adapter to expose legacy Template as TemplateProvider (deprecated). |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/LegacyContentDocumentProvider.java | Adds adapter to expose legacy Content as DocumentProvider (deprecated). |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/JarContentSource.java | Adds JAR content source specialization of ZipContentSource. |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/IndexedContent.java | Adds common indexing interface for documents/templates. |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/FileViewerProvider.java | Adds SPI provider interface for FileViewer discovery. |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/FileViewerMetadata.java | Adds metadata model for viewer discovery and compatibility. |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/FileViewerException.java | Adds a checked exception type for viewer load failures. |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/FileViewer.java | Adds the core SPI for viewer implementations. |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/DocumentProvider.java | Adds document provider SPI for indexed docs and opening documents. |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/DocumentDescriptor.java | Adds immutable document descriptor implementing IndexedContent. |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/DirectoryTemplateProvider.java | Adds directory-based template provider with shared-resource copying rules. |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/DirectoryDocumentProvider.java | Adds directory-based document provider that infers titles/tags/categories. |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/DirectoryContentSource.java | Adds filesystem content source with realpath safety checks. |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/ContentValidation.java | Adds internal validation/copy helpers for descriptors/requests. |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/ContentSource.java | Adds base content source SPI. |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/ContentService.java | Adds SPI service for registering document/template providers. |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/ContentResource.java | Adds content resource path record. |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/ContentRegistration.java | Adds closeable registration token for provider registration. |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/ContentPaths.java | Adds normalized content path utilities with unsafe-path rejection. |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/ContentMetadata.java | Keeps legacy content metadata model (deprecated). |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/ContentDocument.java | Adds document model (media type + ContentSource + entry path). |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/Content.java | Keeps legacy content model (deprecated). |
| app-spi/src/main/java/com/basic4gl/desktop/spi/content/ClasspathContentSource.java | Adds classpath-backed content source driven by an index resource. |
| app-spi/src/main/java/com/basic4gl/desktop/spi/BookmarkInfo.java | Adds bookmark info record exposed via SPI. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
+26
to
+35
| if ((modifiers & toolkit.getMenuShortcutKeyMask()) != 0 | ||
| || (modifiers & toolkit.getMenuShortcutKeyMaskEx()) == 0) { | ||
| if (System.getProperty("os.name").toLowerCase().contains("mac")) { | ||
| modifierSymbol.add("⌘"); // Command symbol for macOS | ||
| } else { | ||
| modifierSymbol.add("Ctrl"); // Control for Windows/Linux | ||
| } | ||
| } | ||
|
|
||
| return modifierSymbol + " " + KeyEvent.getKeyText(keyCode); | ||
| return String.join(" + ", modifierSymbol) + " " + KeyEvent.getKeyText(keyCode); |
Comment on lines
+92
to
+96
| case IMAGE_VIEWER: | ||
| if (file != null && isImageFile(file.getName().toLowerCase(Locale.ROOT))) { | ||
| return new ImageFileViewer(file); | ||
| } | ||
| case HEX_VIEWER: |
Comment on lines
+211
to
+212
| @Override | ||
| public void openExternal(URI uri) {} |
Comment on lines
+14
to
+17
| @Override | ||
| public FileViewer createViewer() { | ||
| return new SimpleTextViewer(); | ||
| } |
| */ | ||
| public class FileViewerRegistry { | ||
|
|
||
| private final Map<String, com.basic4gl.desktop.spi.content.FileViewerProvider> providers = new HashMap<>(); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.