diff src/name/blackcap/clipman/Menus.kt @ 27:8aa2dfac27eb

Big reorg; compiled but untested.
author David Barts <n5jrn@me.com>
date Wed, 29 Jan 2020 10:50:07 -0800
parents
children f1fcc1281dad
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/name/blackcap/clipman/Menus.kt	Wed Jan 29 10:50:07 2020 -0800
@@ -0,0 +1,166 @@
+/*
+ * Menu-related stuff, pertaining to both the menu bar and popup menus.
+ */
+package name.blackcap.clipman
+
+import java.awt.Toolkit
+import java.awt.event.ActionEvent
+import java.awt.event.ActionListener
+import java.awt.event.KeyEvent
+import java.util.LinkedList
+import javax.swing.*
+
+/**
+ * Listen to actionEvents from both menu bar and popup menu selections.
+ */
+class MenuItemListener: ActionListener {
+    override fun actionPerformed(e: ActionEvent) {
+        when (e.actionCommand) {
+            "File.Quit" -> System.exit(0)
+            "Edit.Clone" -> onlyIfSelected { queue.v.add(it) }
+            "Edit.Coerce" -> onlyIfSelected { doCoerceFonts(it) }
+            "Edit.Delete" -> onlyIfSelected {
+                queue.v.delete(it)
+                SelectionRequired.disable()
+            }
+            "Edit.Find" -> searchDialog.setVisible(true)
+            "Edit.FindAgain" -> searchDialog.find()
+            else -> throw RuntimeException("unexpected actionCommand!")
+        }
+    }
+
+    private fun onlyIfSelected(block: (QueueItem) -> Unit) {
+        val selected = queue.v.getSelected()
+        if (selected == null) {
+            JOptionPane.showMessageDialog(frame.v,
+                "No item selected.",
+                "Error",
+                JOptionPane.ERROR_MESSAGE);
+         } else {
+            block(selected)
+        }
+    }
+
+    private fun doCoerceFonts(item: QueueItem) {
+        /* not finished */
+    }
+}
+
+val menuItemListener = MenuItemListener()
+
+/**
+ * Our menu bar. What we display depends somewhat on the system type, as
+ * the Mac gives us a gratuitous menu bar entry for handling some stuff.
+ */
+class MyMenuBar: JMenuBar() {
+    init {
+        if (OS.type != OS.MAC) {
+            add(JMenu("File").apply {
+                add(JMenuItem("Quit").apply {
+                    actionCommand = "File.Quit"
+                    addActionListener(menuItemListener)
+                    makeShortcut(KeyEvent.VK_Q)
+                })
+            })
+        }
+        add(JMenu("Edit").apply {
+            add(SelectionRequired.add(JMenuItem("Clone").apply {
+                setEnabled(false)
+                actionCommand = "Edit.Clone"
+                addActionListener(menuItemListener)
+                makeShortcut(KeyEvent.VK_C)
+            }))
+            add(SelectionRequired.add(JMenuItem("Coerce…").apply {
+                setEnabled(false)
+                actionCommand = "Edit.Coerce"
+                addActionListener(menuItemListener)
+                makeShortcut(KeyEvent.VK_K)
+            }))
+            add(SelectionRequired.add(JMenuItem("Delete").apply {
+                setEnabled(false)
+                actionCommand = "Edit.Delete"
+                addActionListener(menuItemListener)
+                setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0))
+            }))
+            add(JMenuItem("Find…").apply {
+                actionCommand = "Edit.Find"
+                addActionListener(menuItemListener)
+                makeShortcut(KeyEvent.VK_F)
+            })
+            add(JMenuItem("Find Again").apply {
+                setEnabled(false)
+                actionCommand = "Edit.FindAgain"
+                addActionListener(menuItemListener)
+                makeShortcut(KeyEvent.VK_G)
+            })
+        })
+        if (OS.type != OS.MAC) {
+            add(JMenu("Help").apply {
+                add(JMenuItem("About ClipMan…").apply {
+                    actionCommand = "Help.About"
+                    addActionListener(menuItemListener)
+                })
+            })
+        }
+    }
+
+    fun getMenu(name: String): JMenu? {
+        subElements.forEach {
+            val jmenu = it.component as? JMenu
+            if (jmenu?.text == name) {
+                return jmenu
+            }
+        }
+        return null
+    }
+}
+
+val menuBar = MyMenuBar()
+
+/**
+ * The popup menu we display when the user requests so atop a clipboard
+ * item.
+ */
+class MyPopupMenu: JPopupMenu() {
+    init {
+        add(SelectionRequired.add(JMenuItem("Clone").apply {
+            actionCommand = "Edit.Clone"
+            addActionListener(menuItemListener)
+        }))
+        add(SelectionRequired.add(JMenuItem("Coerce…").apply {
+            actionCommand = "Edit.Coerce"
+            addActionListener(menuItemListener)
+        }))
+        add(SelectionRequired.add(JMenuItem("Delete").apply {
+            actionCommand = "Edit.Delete"
+            addActionListener(menuItemListener)
+        }))
+    }
+}
+
+val popupMenu = MyPopupMenu()
+
+/**
+ * Track menu items that require something to be selected in order
+ * to work, and allow them to be enabled and disabled en masse.
+ */
+object SelectionRequired {
+    private val cache = LinkedList<JMenuItem>()
+
+    fun add(item: JMenuItem): JMenuItem {
+        cache.add(item)
+        return item
+    }
+
+    fun enable() {
+        cache.forEach {
+            it.setEnabled(true)
+        }
+    }
+
+    fun disable() {
+        cache.forEach {
+            it.setEnabled(false)
+        }
+    }
+}
\ No newline at end of file