diff --git a/src/main/kotlin/app/termora/CustomizeToolBarDialog.kt b/src/main/kotlin/app/termora/CustomizeToolBarDialog.kt index 52683e3..fb54b6b 100644 --- a/src/main/kotlin/app/termora/CustomizeToolBarDialog.kt +++ b/src/main/kotlin/app/termora/CustomizeToolBarDialog.kt @@ -1,10 +1,9 @@ package app.termora import app.termora.Application.ohMyJson - +import app.termora.actions.MultipleAction import com.jgoodies.forms.builder.FormBuilder import com.jgoodies.forms.layout.FormLayout -import kotlinx.serialization.encodeToString import org.apache.commons.lang3.StringUtils import org.jdesktop.swingx.action.ActionManager import java.awt.Component @@ -20,6 +19,7 @@ import kotlin.math.min class CustomizeToolBarDialog( owner: Window, + private val windowScope: WindowScope, private val toolbar: TermoraToolBar ) : DialogWrapper(owner) { @@ -147,9 +147,7 @@ class CustomizeToolBarDialog( leftList.model.removeAllElements() rightList.model.removeAllElements() for (action in toolbar.getAllActions()) { - actionManager.getAction(action.id)?.let { - rightList.model.addElement(ActionHolder(action.id, it)) - } + getActionHolder(action.id)?.let { rightList.model.addElement(it) } } } @@ -259,14 +257,11 @@ class CustomizeToolBarDialog( override fun windowOpened(e: WindowEvent) { removeWindowListener(this) - for (action in toolbar.getActions()) { if (action.visible) { - actionManager.getAction(action.id) - ?.let { rightList.model.addElement(ActionHolder(action.id, it)) } + getActionHolder(action.id)?.let { rightList.model.addElement(it) } } else { - actionManager.getAction(action.id) - ?.let { leftList.model.addElement(ActionHolder(action.id, it)) } + getActionHolder(action.id)?.let { leftList.model.addElement(it) } } } @@ -274,6 +269,17 @@ class CustomizeToolBarDialog( }) } + private fun getActionHolder(actionId: String): ActionHolder? { + var action = actionManager.getAction(actionId) + if (action == null) { + if (actionId == MultipleAction.MULTIPLE) { + action = MultipleAction.getInstance(windowScope) + } + } + if (action == null) return null + return ActionHolder(actionId, action) + } + private fun resetMoveButtons() { val indices = rightList.selectedIndices if (indices.isEmpty()) { diff --git a/src/main/kotlin/app/termora/TerminalTabbed.kt b/src/main/kotlin/app/termora/TerminalTabbed.kt index 243546f..73871b2 100644 --- a/src/main/kotlin/app/termora/TerminalTabbed.kt +++ b/src/main/kotlin/app/termora/TerminalTabbed.kt @@ -423,13 +423,10 @@ class TerminalTabbed( val popupMenu = FlatPopupMenu() popupMenu.add(I18n.getString("termora.toolbar.customize-toolbar")).addActionListener { val owner = SwingUtilities.getWindowAncestor(this@TerminalTabbed) - val dialog = CustomizeToolBarDialog( - owner, - termoraToolBar - ) + val dialog = CustomizeToolBarDialog(owner, windowScope, termoraToolBar) dialog.setLocationRelativeTo(owner) if (dialog.open()) { - termoraToolBar.rebuild() + TermoraToolBar.rebuild() } } popupMenu.show(event.component, event.x, event.y) diff --git a/src/main/kotlin/app/termora/TermoraFrame.kt b/src/main/kotlin/app/termora/TermoraFrame.kt index 292ddfe..a204fd7 100644 --- a/src/main/kotlin/app/termora/TermoraFrame.kt +++ b/src/main/kotlin/app/termora/TermoraFrame.kt @@ -38,7 +38,7 @@ class TermoraFrame : JFrame(), DataProvider { private val id = UUID.randomUUID().toString() private val windowScope = ApplicationScope.forWindowScope(this) private val tabbedPane = MyTabbedPane() - private val toolbar = TermoraToolBar(windowScope, this, tabbedPane) + private val toolbar = TermoraToolBar(windowScope, this) private val terminalTabbed = TerminalTabbed(windowScope, toolbar, tabbedPane) private val dataProviderSupport = DataProviderSupport() private val welcomePanel = WelcomePanel(windowScope) diff --git a/src/main/kotlin/app/termora/TermoraToolBar.kt b/src/main/kotlin/app/termora/TermoraToolBar.kt index 6b8b446..bc23c81 100644 --- a/src/main/kotlin/app/termora/TermoraToolBar.kt +++ b/src/main/kotlin/app/termora/TermoraToolBar.kt @@ -5,7 +5,6 @@ import app.termora.actions.* import app.termora.findeverywhere.FindEverywhereAction import app.termora.snippet.SnippetAction import com.formdev.flatlaf.FlatClientProperties -import com.formdev.flatlaf.extras.components.FlatTabbedPane import com.formdev.flatlaf.util.SystemInfo import kotlinx.serialization.Serializable import org.apache.commons.lang3.StringUtils @@ -26,10 +25,21 @@ data class ToolBarAction( class TermoraToolBar( private val windowScope: WindowScope, private val frame: TermoraFrame, - private val tabbedPane: FlatTabbedPane ) { + + companion object { + fun rebuild() { + for (frame in TermoraFrameManager.getInstance().getWindows()) { + val toolbars = SwingUtils.getDescendantsOfClass(MyToolBar::class.java, frame) + for (toolbar in toolbars) { + toolbar.rebuild() + } + } + } + } + private val properties by lazy { Database.getDatabase().properties } - private val toolbar by lazy { MyToolBar().apply { rebuild(this) } } + private val toolbar by lazy { MyToolBar().apply { rebuild() } } fun getJToolBar(): JToolBar { @@ -87,63 +97,6 @@ class TermoraToolBar( return storageActions } - fun rebuild() { - rebuild(this.toolbar) - } - - private fun rebuild(toolbar: JToolBar) { - val actionManager = ActionManager.getInstance() - val actionContainerFactory = ActionContainerFactory(actionManager) - - toolbar.removeAll() - - toolbar.add(actionContainerFactory.createButton(object : AnAction(StringUtils.EMPTY, Icons.add) { - override fun actionPerformed(evt: AnActionEvent) { - actionManager.getAction(FindEverywhereAction.FIND_EVERYWHERE)?.actionPerformed(evt) - } - - override fun isEnabled(): Boolean { - return actionManager.getAction(FindEverywhereAction.FIND_EVERYWHERE)?.isEnabled ?: false - } - })) - - toolbar.add(Box.createHorizontalGlue()) - - if (SystemInfo.isLinux || SystemInfo.isWindows) { - toolbar.add(Box.createHorizontalStrut(16)) - } - - - // update btn - val updateBtn = actionContainerFactory.createButton(actionManager.getAction(Actions.APP_UPDATE)) - updateBtn.isVisible = updateBtn.isEnabled - updateBtn.addChangeListener { updateBtn.isVisible = updateBtn.isEnabled } - toolbar.add(updateBtn) - - - // 获取显示的Action,如果不是 false 那么就是显示出来 - for (action in getActions()) { - if (action.visible) { - val ac = actionManager.getAction(action.id) - if (ac == null) { - if (action.id == MultipleAction.MULTIPLE) { - toolbar.add(actionContainerFactory.createButton(MultipleAction.getInstance(windowScope))) - } - } else { - toolbar.add(actionContainerFactory.createButton(ac)) - } - } - } - - - if (toolbar is MyToolBar) { - toolbar.adjust() - } - - toolbar.revalidate() - toolbar.repaint() - } - private inner class MyToolBar : JToolBar() { init { // 监听窗口大小变动,然后修改边距避开控制按钮 @@ -179,5 +132,60 @@ class TermoraToolBar( } } } + + + fun rebuild() { + val toolbar: JToolBar = this + val actionManager = ActionManager.getInstance() + val actionContainerFactory = ActionContainerFactory(actionManager) + + toolbar.removeAll() + + toolbar.add(actionContainerFactory.createButton(object : AnAction(StringUtils.EMPTY, Icons.add) { + override fun actionPerformed(evt: AnActionEvent) { + actionManager.getAction(FindEverywhereAction.FIND_EVERYWHERE)?.actionPerformed(evt) + } + + override fun isEnabled(): Boolean { + return actionManager.getAction(FindEverywhereAction.FIND_EVERYWHERE)?.isEnabled ?: false + } + })) + + toolbar.add(Box.createHorizontalGlue()) + + if (SystemInfo.isLinux || SystemInfo.isWindows) { + toolbar.add(Box.createHorizontalStrut(16)) + } + + + // update btn + val updateBtn = actionContainerFactory.createButton(actionManager.getAction(Actions.APP_UPDATE)) + updateBtn.isVisible = updateBtn.isEnabled + updateBtn.addChangeListener { updateBtn.isVisible = updateBtn.isEnabled } + toolbar.add(updateBtn) + + + // 获取显示的Action,如果不是 false 那么就是显示出来 + for (action in getActions()) { + if (action.visible) { + val ac = actionManager.getAction(action.id) + if (ac == null) { + if (action.id == MultipleAction.MULTIPLE) { + toolbar.add(actionContainerFactory.createButton(MultipleAction.getInstance(windowScope))) + } + } else { + toolbar.add(actionContainerFactory.createButton(ac)) + } + } + } + + + if (toolbar is MyToolBar) { + toolbar.adjust() + } + + toolbar.revalidate() + toolbar.repaint() + } } } \ No newline at end of file