From a165fc1f1df35e1a35996665207548946568f776 Mon Sep 17 00:00:00 2001 From: hexaredecimal Date: Wed, 14 May 2025 13:21:08 +0200 Subject: [PATCH] piccasso: Bug fixes from the CodeRabbit AI code review. --- src/main/java/org/editor/CodeEditor.java | 3 +- src/main/java/org/editor/EditorWindow.java | 43 ++++++++++--------- .../java/org/editor/events/AccessEvents.java | 12 +++++- .../java/org/editor/events/ListAction.java | 18 +++++--- .../java/org/editor/events/MenuEvents.java | 15 ++++++- src/main/java/org/editor/fs/FileFilter.java | 1 - .../org/editor/panels/DashboardPanel.java | 5 +-- 7 files changed, 61 insertions(+), 36 deletions(-) diff --git a/src/main/java/org/editor/CodeEditor.java b/src/main/java/org/editor/CodeEditor.java index e554135..035e6e2 100644 --- a/src/main/java/org/editor/CodeEditor.java +++ b/src/main/java/org/editor/CodeEditor.java @@ -157,7 +157,8 @@ public void setIsTmp(boolean isTmp) { public boolean saveFileAs() { var fileChooser = new JFileChooser("."); - fileChooser.setFileFilter(FileFilter.mdFilter); + fileChooser.addChoosableFileFilter(FileFilter.mdFilter); + fileChooser.addChoosableFileFilter(FileFilter.picsFilter); fileChooser.setFileFilter(FileFilter.picsFilter); int status = fileChooser.showSaveDialog(EditorWindow.win); diff --git a/src/main/java/org/editor/EditorWindow.java b/src/main/java/org/editor/EditorWindow.java index 1afc5c9..27aa158 100644 --- a/src/main/java/org/editor/EditorWindow.java +++ b/src/main/java/org/editor/EditorWindow.java @@ -2,15 +2,10 @@ import org.editor.panels.DashboardPanel; import com.formdev.flatlaf.FlatLightLaf; -import com.vlsolutions.swing.docking.DockKey; -import com.vlsolutions.swing.docking.DockView; import com.vlsolutions.swing.docking.Dockable; -import com.vlsolutions.swing.docking.DockableState; import com.vlsolutions.swing.docking.DockingConstants; import com.vlsolutions.swing.docking.DockingDesktop; import com.vlsolutions.swing.docking.DockingPreferences; -import com.vlsolutions.swing.docking.event.DockableStateWillChangeEvent; -import com.vlsolutions.swing.docking.event.DockableStateWillChangeListener; import com.vlsolutions.swing.docking.ui.DockingUISettings; import java.awt.BorderLayout; import java.awt.Color; @@ -36,7 +31,6 @@ import javax.swing.JRootPane; import javax.swing.JScrollPane; import javax.swing.JSeparator; -import javax.swing.JSplitPane; import javax.swing.JTabbedPane; import javax.swing.JToolBar; import javax.swing.SwingConstants; @@ -113,7 +107,7 @@ public EditorWindow() { if (current == null) { return; } - + if (current.getDockable() instanceof CodeEditor ed) { if (event.getFutureState().isClosed()) { if (removeIfDirty(ed.tabIndex, ed) == false) { @@ -123,7 +117,6 @@ public EditorWindow() { } }); - JPanel main_panel = new JPanel(new BorderLayout()); //main_panel.add(desk, BorderLayout.CENTER); JToolBar tool_bar = makeToolBar( @@ -140,7 +133,7 @@ public EditorWindow() { null, Actions.exitAction ); - main_panel.add(tool_bar, BorderLayout.PAGE_START); + // main_panel.add(tool_bar, BorderLayout.PAGE_START); current_file = new JLabel("[NONE]"); line_info = new JLabel(); @@ -153,7 +146,6 @@ public EditorWindow() { new Component[]{current_file, null}, new Component[]{line_info, line_perc, seekBar, null, charset} ); - main_panel.add(bottom_bar, BorderLayout.PAGE_END); Action[] app_actions = { Actions.showFileTreeAction, @@ -211,7 +203,7 @@ public EditorWindow() { dashboard = new DockablePanel(new BorderLayout(), "Piccasso DashBoard", "DashBoard", "Home page", "file"); dashboard.add(new JScrollPane(new DashboardPanel()), BorderLayout.CENTER); getContentPane().add(access_panel, BorderLayout.EAST); - + desk.addDockable(dashboard); desk.addDockable(cool_bar); desk.setAutoHide(cool_bar, true); @@ -338,17 +330,17 @@ public static void removeTab() { return; } - CodeEditor selected = getSelectedEditor(); - if (selected == null) { + var focused = getSelectedEditor(); + if (focused == null) { return; } - Integer index = getEditorIndex(selected); + Integer index = getEditorIndex(focused); if (index == null) { return; } - removeIfDirty(index, selected); + removeIfDirty(index, focused); } public static void removeAllTabs() { @@ -372,12 +364,12 @@ private static boolean removeIfDirty(Integer index, CodeEditor ed) { win.desk.remove((Dockable) ed); // Actual removal from docking layout tabEditors.remove(index); migrateIndexes(); - + return true; } private static boolean isDocked(Dockable d) { - for (var state: win.desk.getDockables()) { + for (var state : win.desk.getDockables()) { var dockable = state.getDockable(); if (dockable == d || dockable.equals(d)) { return true; @@ -385,7 +377,7 @@ private static boolean isDocked(Dockable d) { } return false; } - + private static Integer getEditorIndex(CodeEditor ed) { for (var entry : tabEditors.entrySet()) { if (entry.getValue() == ed) { @@ -493,7 +485,12 @@ public void searchEvent(SearchEvent se) { SearchEvent.Type type = se.getType(); SearchContext context = se.getSearchContext(); SearchResult result; - var textArea = getSelectedEditor().textArea; + var ed = getSelectedEditor(); + if (ed == null) { + return; + } + + var textArea = ed.textArea; switch (type) { default: // Prevent FindBugs warning later @@ -522,7 +519,11 @@ public void searchEvent(SearchEvent se) { @Override public String getSelectedText() { - return getSelectedEditor().textArea.getSelectedText(); + var ed = getSelectedEditor(); + if (ed == null) { + return ""; + } + return ed.textArea.getSelectedText(); } private void customizeDock() { @@ -530,7 +531,7 @@ private void customizeDock() { UIManager.put("DockTabbedPane.close", (Icon) Icons.getIcon("close")); UIManager.put("DockViewTitleBar.isFloatButtonDisplayed", true); - var font = (Font)UIManager.get("DockViewTitleBar.titleFont"); + var font = (Font) UIManager.get("DockViewTitleBar.titleFont"); UIManager.put("DockViewTitleBar.titleFont", new Font(font.getName(), font.getStyle(), 11)); } diff --git a/src/main/java/org/editor/events/AccessEvents.java b/src/main/java/org/editor/events/AccessEvents.java index 911277b..ed7b049 100644 --- a/src/main/java/org/editor/events/AccessEvents.java +++ b/src/main/java/org/editor/events/AccessEvents.java @@ -12,13 +12,21 @@ public class AccessEvents { public static void compileAndRender(ActionEvent e) { - var code = EditorWindow.getSelectedEditor().textArea.getText(); + var ed = EditorWindow.getSelectedEditor(); + if (ed == null) { + return; + } + var code = ed.textArea.getText(); AccessFrame.writeSuccess("Compilation started: "); Compiler.compile(code, true); } public static void compile(ActionEvent e) { - var code = EditorWindow.getSelectedEditor().textArea.getText(); + var ed = EditorWindow.getSelectedEditor(); + if (ed == null) { + return; + } + var code = ed.textArea.getText(); AccessFrame.writeSuccess("Compilation started: "); Compiler.compile(code, false); } diff --git a/src/main/java/org/editor/events/ListAction.java b/src/main/java/org/editor/events/ListAction.java index 9742d13..991ad64 100644 --- a/src/main/java/org/editor/events/ListAction.java +++ b/src/main/java/org/editor/events/ListAction.java @@ -7,9 +7,14 @@ import java.awt.event.*; import javax.swing.*; - -// Reference: https://stackoverflow.com/questions/4344682/double-click-event-on-jlist-element -public class ListAction implements MouseListener { +/** + * Adapted from Stack Overflow answer by [Sandro Marques] + * https://stackoverflow.com/a/4344682 Licensed under CC BY-SA 4.0 + * (https://creativecommons.org/licenses/by-sa/4.0/) + * + * URL: https://stackoverflow.com/questions/4344682/double-click-event-on-jlist-element + */ +public final class ListAction implements MouseListener { private static final KeyStroke ENTER = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0); @@ -37,8 +42,8 @@ public ListAction(JList list, Action action, KeyStroke keyStroke) { // Add the Action to the ActionMap setAction(action); - // Handle mouse double click - list.addMouseListener(this); + var self = this; // Java wont shut up about "leaking "this" in constructor" + list.addMouseListener(self); } /* @@ -51,6 +56,9 @@ public void setAction(Action action) { // Implement MouseListener interface public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { + if (list.getSelectedIndex() == -1) + return; + Action action = list.getActionMap().get(keyStroke); if (action != null) { diff --git a/src/main/java/org/editor/events/MenuEvents.java b/src/main/java/org/editor/events/MenuEvents.java index 31774f5..2628a6f 100644 --- a/src/main/java/org/editor/events/MenuEvents.java +++ b/src/main/java/org/editor/events/MenuEvents.java @@ -33,7 +33,12 @@ public static void gotoLineEvent(ActionEvent e) { replaceDialog.setVisible(false); } GoToDialog dialog = new GoToDialog(EditorWindow.win); - var textArea = EditorWindow.getSelectedEditor().textArea; + + var ed = EditorWindow.getSelectedEditor(); + if (ed == null) { + return; + } + var textArea = ed.textArea; dialog.setMaxLineNumberAllowed(textArea.getLineCount()); dialog.setVisible(true); int line = dialog.getLineNumber(); @@ -94,10 +99,13 @@ static void openFile(ActionEvent e) { } static void saveFile(ActionEvent e) { - if (EditorWindow.tabsCount() == 1) { + if (EditorWindow.tabsCount() == 0) { return; } var ed = EditorWindow.getSelectedEditor(); + if (ed == null) { + return; + } ed.saveFile(); } @@ -106,6 +114,9 @@ static void saveFileAs(ActionEvent e) { return; } var ed = EditorWindow.getSelectedEditor(); + if (ed == null) { + return; + } ed.saveFileAs(); } diff --git a/src/main/java/org/editor/fs/FileFilter.java b/src/main/java/org/editor/fs/FileFilter.java index cc946a7..22e70ee 100644 --- a/src/main/java/org/editor/fs/FileFilter.java +++ b/src/main/java/org/editor/fs/FileFilter.java @@ -9,5 +9,4 @@ public class FileFilter { public static final FileNameExtensionFilter picsFilter = new FileNameExtensionFilter("Piccasso Script Files", "pics"); public static final FileNameExtensionFilter mdFilter = new FileNameExtensionFilter("Markdown Files", "md"); - public static final FileNameExtensionFilter allFilter = new FileNameExtensionFilter("All Files (*.*)", "*"); } diff --git a/src/main/java/org/editor/panels/DashboardPanel.java b/src/main/java/org/editor/panels/DashboardPanel.java index 4936b7e..80fb7c6 100644 --- a/src/main/java/org/editor/panels/DashboardPanel.java +++ b/src/main/java/org/editor/panels/DashboardPanel.java @@ -1,7 +1,3 @@ -/* - * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license - * Click nbfs://nbhost/SystemFileSystem/Templates/GUIForms/JPanel.java to edit this template - */ package org.editor.panels; import java.awt.Component; @@ -197,6 +193,7 @@ private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRS }//GEN-LAST:event_jButton1ActionPerformed private void loadPersistedState() { + filesModel.clear(); FilePersistance .getRecentFiles() .forEach(item -> {