From 133b0c4350d311bd603e6468a6a47086bbc50b13 Mon Sep 17 00:00:00 2001
From: tcarver <tjc>
Date: Wed, 7 Sep 2011 10:43:22 +0100
Subject: [PATCH] shortcut changed in Preferences are saved between sessions
---
.../sanger/artemis/components/EntryEdit.java | 4 +-
.../artemis/components/SelectionMenu.java | 67 +++++----
uk/ac/sanger/artemis/components/ShortCut.java | 134 ++++++++++++++++++
3 files changed, 177 insertions(+), 28 deletions(-)
create mode 100644 uk/ac/sanger/artemis/components/ShortCut.java
diff --git a/uk/ac/sanger/artemis/components/EntryEdit.java b/uk/ac/sanger/artemis/components/EntryEdit.java
index d494c909c..a8ff85429 100644
--- a/uk/ac/sanger/artemis/components/EntryEdit.java
+++ b/uk/ac/sanger/artemis/components/EntryEdit.java
@@ -1546,9 +1546,7 @@ public class EntryEdit extends JFrame
{
JMenu menu = EntryEdit.super.getJMenuBar().getMenu(i);
if(menu instanceof SelectionMenu &&
- ( menu instanceof SelectMenu ||
- menu instanceof EditMenu ||
- menu instanceof ViewMenu ))
+ ((SelectionMenu)menu).isEditableShortCutMenu() )
shortcut_pane.add(menu.getText()+" Menu", ((SelectionMenu)menu).getShortCuts());
}
diff --git a/uk/ac/sanger/artemis/components/SelectionMenu.java b/uk/ac/sanger/artemis/components/SelectionMenu.java
index 1caa66cf0..5eeb9c74e 100644
--- a/uk/ac/sanger/artemis/components/SelectionMenu.java
+++ b/uk/ac/sanger/artemis/components/SelectionMenu.java
@@ -30,6 +30,7 @@ import uk.ac.sanger.artemis.*;
import java.awt.event.*;
import javax.swing.*;
+
import java.awt.*;
import java.util.Vector;
@@ -49,7 +50,7 @@ public class SelectionMenu extends JMenu
private static final long serialVersionUID = 1L;
/** The Selection that was passed to the constructor. */
- /* final */ private Selection selection;
+ private Selection selection;
/** The JFrame reference that was passed to the constructor. */
private JFrame frame = null;
@@ -405,34 +406,25 @@ public class SelectionMenu extends JMenu
else
{
char c[] = ((String)combo.getSelectedItem()).toCharArray();
- int modifier = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
-
- if( ((String)mod_combo.getSelectedItem()).equals("Alt") )
- modifier = InputEvent.ALT_MASK;
- else if( ((String)mod_combo.getSelectedItem()).equals("Ctrl") )
- modifier = InputEvent.CTRL_MASK;
- else if( ((String)mod_combo.getSelectedItem()).equals("Shift") )
- modifier = InputEvent.SHIFT_MASK;
-
+ int modifier = getModifierFromString((String)mod_combo.getSelectedItem());
mi.setAccelerator(KeyStroke.getKeyStroke(c[0], modifier));
- mi.setText(mi.getText());
- mi.revalidate();
- mi.repaint();
}
- }
-/* public void getAccelerators()
+ if(ShortCut.usingCache())
+ new ShortCut(getText(), mi.getText(), mi.getAccelerator());
+ }
+
+ private int getModifierFromString(String modStr)
{
- Hashtable keyStrokeHash = new Hashtable();
- Component menus[] = getMenuComponents();
- for(int i = 0; i < menus.length; i++)
- {
- JMenuItem menu = (JMenuItem)menus[i];
- KeyStroke ks = menu.getAccelerator();
- if(ks != null)
- keyStrokeHash.put(menu.getText(), ks);
- }
- }*/
+ int modifier = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
+ if( modStr.equals("Alt") )
+ modifier = InputEvent.ALT_MASK;
+ else if( modStr.equals("Ctrl") )
+ modifier = InputEvent.CTRL_MASK;
+ else if( modStr.equals("Shift") )
+ modifier = InputEvent.SHIFT_MASK;
+ return modifier;
+ }
public static String getKeyText(int keyCode)
{
@@ -461,5 +453,30 @@ public class SelectionMenu extends JMenu
return "unknown(0x" + Integer.toString(keyCode, 16) + ")";
}
+
+ /**
+ * True if this menu has editable shortcuts
+ * @return
+ */
+ protected boolean isEditableShortCutMenu()
+ {
+ if(this instanceof SelectMenu ||
+ this instanceof EditMenu ||
+ this instanceof ViewMenu )
+ return true;
+ return false;
+ }
+
+ /**
+ * Override to apply any cached shortcuts
+ */
+ public JMenuItem add(JMenuItem menuItem)
+ {
+ JMenuItem mi = super.add(menuItem);
+ if(isEditableShortCutMenu() && ShortCut.usingCache())
+ ShortCut.applyShortCutFromCache(getText(), menuItem);
+ return mi;
+ }
+
}
diff --git a/uk/ac/sanger/artemis/components/ShortCut.java b/uk/ac/sanger/artemis/components/ShortCut.java
new file mode 100644
index 000000000..5529f53e2
--- /dev/null
+++ b/uk/ac/sanger/artemis/components/ShortCut.java
@@ -0,0 +1,134 @@
+/* ShortCut.java
+ *
+ * This file is part of Artemis
+ *
+ * Copyright(C) 2011 Genome Research Limited
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or(at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+package uk.ac.sanger.artemis.components;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+
+import javax.swing.JMenuItem;
+import javax.swing.KeyStroke;
+
+import uk.ac.sanger.artemis.Options;
+import uk.ac.sanger.artemis.components.database.DatabaseJPanel;
+
+/**
+ * Used to cache shortcut keystroke between sessions
+ */
+class ShortCut implements Serializable
+{
+ private static final long serialVersionUID = 1L;
+ private String shortCutName;
+ private String menuName;
+ private KeyStroke ks;
+ private static org.apache.log4j.Logger logger4j =
+ org.apache.log4j.Logger.getLogger(DatabaseJPanel.class);
+ private static String SHORTCUT_CACHE_PATH = Options.CACHE_PATH + File.separatorChar + "MenuShortCuts";
+ private static String REGEXP_REPLACE = "[ /]";
+
+ ShortCut(final String menuName, final String shortCutName, final KeyStroke ks)
+ {
+ this.menuName = menuName;
+ this.shortCutName = shortCutName;
+ this.ks = ks;
+ writeCache();
+ }
+
+ private void writeCache()
+ {
+ try
+ {
+ File dir = new File(SHORTCUT_CACHE_PATH);
+ if(!dir.exists())
+ dir.mkdirs();
+ FileOutputStream fos = new FileOutputStream(SHORTCUT_CACHE_PATH +
+ File.separatorChar + menuName + ":" + shortCutName.replaceAll(REGEXP_REPLACE, "_"));
+ ObjectOutputStream out = new ObjectOutputStream(fos);
+ out.writeObject(ShortCut.this);
+ out.close();
+ }
+ catch(Exception ex)
+ {
+ ex.getMessage();
+ }
+ }
+
+ /**
+ * Return true if shortcut_cache flag is set.
+ * @return
+ */
+ protected static boolean usingCache()
+ {
+ return Options.getOptions().getPropertyTruthValue("shortcut_cache");
+ }
+
+ private static File[] getCachedShortCuts()
+ {
+ File cacheDir = new File(SHORTCUT_CACHE_PATH);
+ if(cacheDir.exists())
+ return cacheDir.listFiles();
+ return null;
+ }
+
+ protected static void applyShortCutFromCache(final String menuName, final JMenuItem menuItem)
+ {
+ File[] shorts = getCachedShortCuts();
+ if(shorts != null)
+ {
+ String shortCutName = menuItem.getText();
+ for(int i=0; i<shorts.length; i++)
+ {
+ if(shorts[i].getName().equals(menuName + ":" + shortCutName.replaceAll(REGEXP_REPLACE, "_")))
+ {
+ try
+ {
+ FileInputStream fis = new FileInputStream(shorts[i]);
+ ObjectInputStream in = new ObjectInputStream(fis);
+ ShortCut sc = (ShortCut) in.readObject();
+ in.close();
+ menuItem.setAccelerator(sc.ks);
+
+ logger4j.debug("USING CACHED SHORTCUT ("+menuItem.getText()+
+ ") FROM: "+shorts[i].getAbsolutePath());
+ }
+ catch (FileNotFoundException e)
+ {
+ System.err.println(e.getMessage());
+ }
+ catch (IOException e)
+ {
+ System.err.println(e.getMessage());
+ }
+ catch (ClassNotFoundException e)
+ {
+ System.err.println(e.getMessage());
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
--
GitLab