From 3653997f965b902048b814cdcf977e49b04dede3 Mon Sep 17 00:00:00 2001 From: Oleg Samarin Date: Sat, 25 Apr 2026 20:05:47 +0300 Subject: [PATCH] Removed Claude indicator from the NetBeans status bar Duplicated the stop/switch button already present in the session tab's own status bar. Removed ClaudeCodeStatusLineElement entirely. Co-Authored-By: Claude Sonnet 4.6 --- CHANGELOG.md | 1 + pom.xml | 2 +- .../netbeans/ClaudeCodeStatusLineElement.java | 150 ------------------ 3 files changed, 2 insertions(+), 151 deletions(-) delete mode 100644 src/main/java/org/openbeans/claude/netbeans/ClaudeCodeStatusLineElement.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 95024e77..ab6e6c11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- Removed Claude indicator from the NetBeans status bar (duplicated the stop button in the session tab) - Fixed diff dialog appearing as a detached tab with disabled Cancel/Accept-All buttons when Claude edits a file outside its current working directory (e.g. after cd into a subdirectory) - Fixed choice menu not recognizing the Ultraplan "Tell Claude what to change" option as a text input field - Added "Bypass Permissions" edit mode: automatically detected when Claude is launched with `--dangerously-skip-permissions`; auto-allows all file edits without showing a diff dialog diff --git a/pom.xml b/pom.xml index ffe475e7..cc7da735 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ io.github.nbclaudecodegui netbeans-claude-code-gui - 0.22.24-SNAPSHOT + 0.22.25-SNAPSHOT nbm Netbeans Claude Code GUI NetBeans plugin that provides a GUI for Claude Code CLI — run claude code sessions directly inside the IDE. diff --git a/src/main/java/org/openbeans/claude/netbeans/ClaudeCodeStatusLineElement.java b/src/main/java/org/openbeans/claude/netbeans/ClaudeCodeStatusLineElement.java deleted file mode 100644 index a00a6e62..00000000 --- a/src/main/java/org/openbeans/claude/netbeans/ClaudeCodeStatusLineElement.java +++ /dev/null @@ -1,150 +0,0 @@ -package org.openbeans.claude.netbeans; - -import io.github.nbclaudecodegui.model.SavedSession; -import io.github.nbclaudecodegui.model.SessionMode; -import io.github.nbclaudecodegui.process.ClaudeSessionStore; -import io.github.nbclaudecodegui.settings.ClaudeCodePreferences; -import io.github.nbclaudecodegui.settings.ClaudeProfile; -import io.github.nbclaudecodegui.settings.ClaudeProfileStore; -import io.github.nbclaudecodegui.ui.ClaudeSessionTab; -import io.github.nbclaudecodegui.ui.SaveAndSwitchDialog; -import java.awt.Component; -import java.awt.Frame; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.io.File; -import java.nio.file.Path; -import javax.swing.JLabel; -import javax.swing.SwingUtilities; -import javax.swing.WindowConstants; -import org.openide.awt.StatusLineElementProvider; -import org.openide.util.Lookup; -import org.openide.util.lookup.ServiceProvider; -import org.openide.windows.TopComponent; -import org.openide.windows.WindowManager; - -/** - * Status bar element for Claude Code integration status. - * Shows a visual indicator in the NetBeans status bar with tooltip information. - */ -@ServiceProvider(service = StatusLineElementProvider.class, position = 100) -public class ClaudeCodeStatusLineElement implements StatusLineElementProvider { - - private JLabel statusLabel; - private ClaudeCodeStatusService statusService; - - /** Creates the status line element; called by the NetBeans service provider framework. */ - public ClaudeCodeStatusLineElement() { - statusService = Lookup.getDefault().lookup(ClaudeCodeStatusService.class); - initializeStatusLabel(); - } - - private void initializeStatusLabel() { - statusLabel = new JLabel(); - statusLabel.setText("Claude"); - statusLabel.setToolTipText("Claude Code: Initializing..."); - - statusLabel.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.HAND_CURSOR)); - statusLabel.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - onStatusLabelClicked(); - } - - @Override - public void mouseEntered(MouseEvent e) { - updateTooltip(); - } - }); - - updateStatusDisplay(); - } - - private void updateStatusDisplay() { - if (statusService != null) { - boolean isRunning = statusService.isServerRunning(); - boolean lockValid = statusService.isLockFileValid(); - - if (isRunning && lockValid) { - statusLabel.setText("Claude ✓"); - } else if (isRunning) { - statusLabel.setText("Claude ~"); - } else { - statusLabel.setText("Claude ✗"); - } - - updateTooltip(); - } - } - - private void updateTooltip() { - if (statusService != null) { - String status = statusService.getStatus(); - statusLabel.setToolTipText("" + status.replace("\n", "
") + ""); - } else { - statusLabel.setToolTipText("Claude Code: Service not available"); - } - } - - @Override - public Component getStatusLineElement() { - return statusLabel; - } - - /** - * Updates the status display. Can be called by other components - * when status changes. - */ - public void refresh() { - updateStatusDisplay(); - } - - private void onStatusLabelClicked() { - // Find the active ClaudeSessionTab - ClaudeSessionTab activeTab = null; - for (TopComponent tc : WindowManager.getDefault().getRegistry().getOpened()) { - if (tc instanceof ClaudeSessionTab tab && tab.isSessionActive()) { - activeTab = tab; - break; - } - } - if (activeTab == null) return; - - File workingDir = activeTab.getWorkingDirectory(); - if (workingDir == null) return; - - // Resolve claude config dir from the active profile - String profileName = activeTab.getSelectedProfileName(); - Path claudeConfigDir = null; - if (profileName != null && !ClaudeProfile.DEFAULT_NAME.equals(profileName)) { - ClaudeProfile profile = ClaudeProfileStore.findByName(profileName); - if (profile != null) { - claudeConfigDir = ClaudeProfileStore.resolveStorageDir( - profile, ClaudeCodePreferences.getProfilesDir()); - } - } - - // Get current session display name - SavedSession recent = ClaudeSessionStore.findMostRecent( - workingDir.toPath(), claudeConfigDir); - String currentName = recent != null ? recent.displayName() : ""; - String currentId = recent != null ? recent.sessionId() : null; - - final ClaudeSessionTab tab = activeTab; - final Path configDir = claudeConfigDir; - - Frame mainFrame = WindowManager.getDefault().getMainWindow(); - SaveAndSwitchDialog dialog = new SaveAndSwitchDialog( - mainFrame, - currentName, - currentId, - workingDir.toPath(), - configDir, - io.github.nbclaudecodegui.model.SessionMode.CLOSE_ONLY, - (name, mode, resumeId) -> - SwingUtilities.invokeLater(() -> tab.onSaveAndSwitch(name, mode, resumeId)) - ); - dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); - dialog.setVisible(true); - } -} \ No newline at end of file