Skip to content

Editor UI - #99

Draft
NateIsStalling wants to merge 41 commits into
mainfrom
editor-ui
Draft

NateIsStalling wants to merge 41 commits into
mainfrom
editor-ui

Conversation

@NateIsStalling

Copy link
Copy Markdown
Owner

No description provided.

# 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

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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<>();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants