diff --git a/src/main/kotlin/app/termora/JSplitPaneWithZeroSizeDivider.kt b/src/main/kotlin/app/termora/JSplitPaneWithZeroSizeDivider.kt index eda3825..68e32e1 100644 --- a/src/main/kotlin/app/termora/JSplitPaneWithZeroSizeDivider.kt +++ b/src/main/kotlin/app/termora/JSplitPaneWithZeroSizeDivider.kt @@ -94,6 +94,7 @@ class JSplitPaneWithZeroSizeDivider( synchronized(treeLock) { for (c in components) { if (c == divider) { + c.isVisible = splitPane.leftComponent.isVisible c.setBounds( splitPane.dividerLocation - w, topOffset.get(), @@ -109,8 +110,10 @@ class JSplitPaneWithZeroSizeDivider( override fun paint(g: Graphics) { super.paint(g) - g.color = UIManager.getColor("controlShadow") - g.fillRect(splitPane.dividerLocation, 0, 1, topOffset.get()) + if (divider.isVisible) { + g.color = UIManager.getColor("controlShadow") + g.fillRect(splitPane.dividerLocation, 0, 1, topOffset.get()) + } } } diff --git a/src/main/kotlin/app/termora/TermoraFencePanel.kt b/src/main/kotlin/app/termora/TermoraFencePanel.kt index 918bb89..5f732ec 100644 --- a/src/main/kotlin/app/termora/TermoraFencePanel.kt +++ b/src/main/kotlin/app/termora/TermoraFencePanel.kt @@ -1,13 +1,20 @@ package app.termora +import app.termora.actions.AnAction +import app.termora.actions.AnActionEvent import app.termora.tree.NewHostTree import com.formdev.flatlaf.extras.components.FlatTabbedPane +import com.formdev.flatlaf.extras.components.FlatToolBar import com.formdev.flatlaf.util.SystemInfo import java.awt.BorderLayout import java.awt.Dimension import java.awt.Font +import java.awt.event.ComponentAdapter +import java.awt.event.ComponentEvent +import java.awt.event.KeyEvent import java.awt.event.MouseAdapter import javax.swing.* +import kotlin.math.max class TermoraFencePanel( @@ -24,6 +31,8 @@ class TermoraFencePanel( private val leftTreePanel = LeftTreePanel() private val mySplitPane = JSplitPaneWithZeroSizeDivider(splitPane) { tabbed.tabHeight } private val enableManager get() = EnableManager.getInstance() + private val toolbar = FlatToolBar().apply { isFloatable = false } + private var dividerLocation = 0 init { initView() @@ -44,12 +53,39 @@ class TermoraFencePanel( tabbed.tabType = FlatTabbedPane.TabType.underlined tabbed.tabAreaInsets = null + // macOS 避开控制栏 + if (SystemInfo.isMacOS) { + toolbar.add(Box.createHorizontalStrut(76)) + } + + toolbar.add(createColspanAction()) + tabbed.leadingComponent = toolbar + toolbar.isVisible = false + add(mySplitPane, BorderLayout.CENTER) } private fun initEvents() { Disposer.register(this, leftTreePanel) splitPane.addPropertyChangeListener("dividerLocation") { mySplitPane.doLayout() } + + leftTreePanel.addComponentListener(object : ComponentAdapter() { + override fun componentHidden(e: ComponentEvent) { + toolbar.isVisible = true + } + + override fun componentShown(e: ComponentEvent) { + toolbar.isVisible = false + } + }) + + actionMap.put("toggle", createColspanAction()) + getInputMap(WHEN_IN_FOCUSED_WINDOW).put( + KeyStroke.getKeyStroke( + KeyEvent.VK_B, + toolkit.menuShortcutKeyMaskEx or KeyEvent.SHIFT_DOWN_MASK + ), "toggle" + ) } private inner class LeftTreePanel : JPanel(BorderLayout()), Disposable { @@ -70,9 +106,14 @@ class TermoraFencePanel( val label = JLabel(Application.getName()) label.foreground = UIManager.getColor("textInactiveText") label.font = label.font.deriveFont(Font.BOLD) + // 与最后一个按钮对冲,使其宽度和谐 + box.add(JButton(Icons.empty)) box.add(Box.createHorizontalGlue()) - if (SystemInfo.isMacOS.not()) box.add(label) + if (SystemInfo.isMacOS.not()) { + box.add(label) + } box.add(Box.createHorizontalGlue()) + box.add(createColspanAction()) if (SystemInfo.isMacOS || SystemInfo.isLinux) { box.addMouseListener(moveMouseAdapter) @@ -95,8 +136,24 @@ class TermoraFencePanel( } } + private fun createColspanAction(): Action { + return object : AnAction(Icons.dataColumn) { + init { + val text = I18n.getString("termora.welcome.toggle-sidebar") + putValue(SHORT_DESCRIPTION, "$text (${if (SystemInfo.isMacOS) '⌘' else "Ctrl"} + Shift + B)") + } + + override fun actionPerformed(evt: AnActionEvent) { + if (leftTreePanel.isVisible) dividerLocation = splitPane.dividerLocation + leftTreePanel.isVisible = leftTreePanel.isVisible.not() + if (leftTreePanel.isVisible) splitPane.dividerLocation = dividerLocation + } + } + } + + override fun dispose() { - enableManager.setFlag("Termora.Fence.dividerLocation", splitPane.dividerLocation) + enableManager.setFlag("Termora.Fence.dividerLocation", max(splitPane.dividerLocation, 10)) } fun getHostTree(): NewHostTree { diff --git a/src/main/resources/i18n/messages.properties b/src/main/resources/i18n/messages.properties index 42bed4e..02b6f44 100644 --- a/src/main/resources/i18n/messages.properties +++ b/src/main/resources/i18n/messages.properties @@ -154,6 +154,7 @@ termora.find-everywhere.quick-command.local-terminal=Local Terminal # Welcome termora.welcome.my-hosts=My hosts +termora.welcome.toggle-sidebar=Toggle Sidebar termora.welcome.contextmenu.connect=Connect termora.welcome.contextmenu.connect-with=Connect with termora.welcome.contextmenu.open-in-new-window=${termora.tabbed.contextmenu.open-in-new-window} diff --git a/src/main/resources/i18n/messages_zh_CN.properties b/src/main/resources/i18n/messages_zh_CN.properties index c37b690..d1f7cda 100644 --- a/src/main/resources/i18n/messages_zh_CN.properties +++ b/src/main/resources/i18n/messages_zh_CN.properties @@ -149,6 +149,7 @@ termora.settings.sftp.preserve-time=保留原始文件修改时间 # Welcome termora.welcome.my-hosts=我的主机 +termora.welcome.toggle-sidebar=显示/隐藏侧边栏 termora.welcome.contextmenu.connect=连接 termora.welcome.contextmenu.connect-with=连接到 termora.welcome.contextmenu.copy=${termora.copy} diff --git a/src/main/resources/i18n/messages_zh_TW.properties b/src/main/resources/i18n/messages_zh_TW.properties index 4201612..716e930 100644 --- a/src/main/resources/i18n/messages_zh_TW.properties +++ b/src/main/resources/i18n/messages_zh_TW.properties @@ -148,6 +148,7 @@ termora.settings.account.login-failed=登入失敗,請稍後再試 # Welcome termora.welcome.my-hosts=我的主機 +termora.welcome.toggle-sidebar=顯示/隱藏側邊欄 termora.welcome.contextmenu.connect=連接 termora.welcome.contextmenu.connect-with=連接到 termora.welcome.contextmenu.copy=複製