[libmnemonicsetter-java] 01/03: Imported Upstream version 0.5

Felix Natter fnatter-guest at moszumanska.debian.org
Sat Apr 30 17:45:31 UTC 2016


This is an automated email from the git hooks/post-receive script.

fnatter-guest pushed a commit to branch master
in repository libmnemonicsetter-java.

commit 2cc8accadab7a8800a2fd0a2617dddd78688d556
Author: Felix Natter <fnatter at gmx.net>
Date:   Sat Apr 30 19:18:12 2016 +0200

    Imported Upstream version 0.5
---
 README.md                                          |  40 +++-
 build.gradle                                       |   2 +-
 ...MnemonicSetter.java => ItemMnemonicSetter.java} |  56 ++++--
 .../mnemonicsetter/MenuItemMnemonicHolder.java     |   2 +-
 .../mnemonicsetter/MenuMnemonicSetter.java         |  54 ------
 .../dpolivaev/mnemonicsetter/MnemonicSetter.java   | 212 +++++++--------------
 .../mnemonicsetter/UsedAltAcceleratorsFinder.java  |  48 +++++
 ...erShould.java => ItemMnemonicSetterShould.java} |  29 +--
 .../UsedAltAcceleratorsFinderShould.java           |  76 ++++++++
 9 files changed, 292 insertions(+), 227 deletions(-)

diff --git a/README.md b/README.md
index 7ba985f..5daf96e 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,39 @@
-# mnemonicsetter
\ No newline at end of file
+# mnemonicsetter
+ Automatically assigns mnemonics to menu items and toolbar elements.
+
+Use it just like `MnemonicSetter.INSTANCE.setComponentMnemonics(menubar, toolbar)`.
+All items belonging to given elements are given different mnemonic letters if possible.
+
+You can also attach `MnemonicSetter.INSTANCE` to a popup menu as a PopupMenuListener 
+so that mnemonics are automatically calculated when the popup menu becomes visible.
+
+### Maven configuration
+```
+<repository>
+	<snapshots>
+ 		<enabled>false</enabled>
+ 	</snapshots>
+	<id>bintray-freeplane-maven</id>
+	<name>bintray</name>
+	<url>https://dl.bintray.com/freeplane/freeplane</url>
+</repository>
+
+
+<dependency> 
+	<groupId>org.dpolivaev.mnemonicsetter</groupId> 
+	<artifactId>mnemonicsetter</artifactId> 
+	<version>0.4</version> 
+	<type>pom</type> 
+</dependency>
+```
+
+### Gradle configuration
+```
+repositories {
+		maven { url "http://dl.bintray.com/freeplane/freeplane" }
+}
+
+dependencies {		
+	compile 'org.dpolivaev.mnemonicsetter:mnemonicsetter:0.4'
+}	
+```
diff --git a/build.gradle b/build.gradle
index aee6c73..bf333d8 100644
--- a/build.gradle
+++ b/build.gradle
@@ -13,7 +13,7 @@ targetCompatibility='1.7'
 sourceCompatibility='1.7'
 
 group 'org.dpolivaev.mnemonicsetter'
-version='0.3'
+version='0.5'
 
 
 bintray {
diff --git a/src/main/java/org/dpolivaev/mnemonicsetter/MnemonicSetter.java b/src/main/java/org/dpolivaev/mnemonicsetter/ItemMnemonicSetter.java
similarity index 83%
copy from src/main/java/org/dpolivaev/mnemonicsetter/MnemonicSetter.java
copy to src/main/java/org/dpolivaev/mnemonicsetter/ItemMnemonicSetter.java
index 4b496f7..ed3c6c5 100644
--- a/src/main/java/org/dpolivaev/mnemonicsetter/MnemonicSetter.java
+++ b/src/main/java/org/dpolivaev/mnemonicsetter/ItemMnemonicSetter.java
@@ -18,30 +18,58 @@ package org.dpolivaev.mnemonicsetter;
 import java.awt.event.KeyEvent;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.regex.Pattern;
 
-public class MnemonicSetter {
+class ItemMnemonicSetter {
+	final static private Pattern CAN_HAVE_MNEMONICS = Pattern.compile("\\p{L}");
 	private final INameMnemonicHolder[] mnemonicHolders;
+	private Collection<Integer> blockedMnemonics;
+	
+	static ItemMnemonicSetter of(INameMnemonicHolder... mnemonicHolders) {
+		return of(Arrays.asList(mnemonicHolders));
+	}
+	
+	static ItemMnemonicSetter of(List<INameMnemonicHolder> mnemonicHolders) {
+		final ArrayList<INameMnemonicHolder> validHolders = new ArrayList<INameMnemonicHolder>(mnemonicHolders.size());
+		for(INameMnemonicHolder holder :mnemonicHolders)
+			if(canHaveMnemonics(holder))
+				validHolders.add(holder);
+		final INameMnemonicHolder[] array = validHolders.toArray(new INameMnemonicHolder[validHolders.size()]);
+		return new ItemMnemonicSetter(array);
+	}
+
+	private static boolean canHaveMnemonics(INameMnemonicHolder holder) {
+		final String text = holder.getText();
+		return text != null && CAN_HAVE_MNEMONICS.matcher(text).find();
+	}
 
-	private MnemonicSetter(INameMnemonicHolder[] mnemonicHolders) {
+
+	private ItemMnemonicSetter(INameMnemonicHolder[] mnemonicHolders) {
 		this.mnemonicHolders = mnemonicHolders;
+		blockedMnemonics = Collections.emptyList();
+
 	}
 
 	public void setMnemonics() {
 		final Map<Integer, INameMnemonicHolder> usedMnemonics = extractUsedMnemonics(mnemonicHolders);
-		if(usedMnemonics.size() < mnemonicHolders.length) {
+		if(usedMnemonics.size() - blockedMnemonics.size() < mnemonicHolders.length) {
 			final Map<Integer, INameMnemonicHolder> mnemonicSet = findMnemonics(usedMnemonics, 0, 0);
 			setMnemonics(mnemonicSet);
 		}
 	}
 
 	private void setMnemonics(final Map<Integer, INameMnemonicHolder> setMnemonics) {
-		for(Map.Entry<Integer, INameMnemonicHolder> holderMnemonic : setMnemonics.entrySet())
-			holderMnemonic.getValue().setMnemonic(holderMnemonic.getKey());
+		for(Map.Entry<Integer, INameMnemonicHolder> holderMnemonic : setMnemonics.entrySet()) {
+			final INameMnemonicHolder target = holderMnemonic.getValue();
+			if(target != null)
+				target.setMnemonic(holderMnemonic.getKey());
+		}
 	}
 
 	private Map<Integer, INameMnemonicHolder> findMnemonics(final Map<Integer, INameMnemonicHolder> usedMnemonics, int holderIndex, int characterIndex) {
@@ -77,6 +105,8 @@ public class MnemonicSetter {
 	}
 	private Map<Integer, INameMnemonicHolder> extractUsedMnemonics(INameMnemonicHolder... mnemonicHolders) {
 		final Map<Integer, INameMnemonicHolder> usedMnemonics = new MnemonicMap();
+		for(Integer blockedMnemonic : blockedMnemonics)
+			usedMnemonics.put(blockedMnemonic, null);
 		for(INameMnemonicHolder holder : mnemonicHolders){
 			final Integer mnemonic = holder.getMnemonic();
 			if(mnemonic != 0) {
@@ -118,19 +148,9 @@ public class MnemonicSetter {
 		return usedMnemonics;
 	}
 
-	final static private Pattern CAN_HAVE_MNEMONICS = Pattern.compile("\\p{L}");
-	
-	public static MnemonicSetter of(INameMnemonicHolder... mnemonicHolders) {
-		return of(Arrays.asList(mnemonicHolders));
-	}
-	
-	public static MnemonicSetter of(List<INameMnemonicHolder> mnemonicHolders) {
-		final ArrayList<INameMnemonicHolder> validHolders = new ArrayList<INameMnemonicHolder>(mnemonicHolders.size());
-		for(INameMnemonicHolder holder :mnemonicHolders)
-			if(CAN_HAVE_MNEMONICS.matcher(holder.getText()).find())
-				validHolders.add(holder);
-		final INameMnemonicHolder[] array = validHolders.toArray(new INameMnemonicHolder[validHolders.size()]);
-		return new MnemonicSetter(array);
+	public ItemMnemonicSetter notUsing(Collection<Integer> blockedMnemonics) {
+		this.blockedMnemonics = blockedMnemonics;
+		return this;
 	}
 }
 
diff --git a/src/main/java/org/dpolivaev/mnemonicsetter/MenuItemMnemonicHolder.java b/src/main/java/org/dpolivaev/mnemonicsetter/MenuItemMnemonicHolder.java
index c3ff029..5b6c6d8 100644
--- a/src/main/java/org/dpolivaev/mnemonicsetter/MenuItemMnemonicHolder.java
+++ b/src/main/java/org/dpolivaev/mnemonicsetter/MenuItemMnemonicHolder.java
@@ -17,7 +17,7 @@ package org.dpolivaev.mnemonicsetter;
 
 import javax.swing.JMenuItem;
 
-public class MenuItemMnemonicHolder extends ButtonNameMnemonicHolder {
+class MenuItemMnemonicHolder extends ButtonNameMnemonicHolder {
 
 	final private JMenuItem menuItem;
 
diff --git a/src/main/java/org/dpolivaev/mnemonicsetter/MenuMnemonicSetter.java b/src/main/java/org/dpolivaev/mnemonicsetter/MenuMnemonicSetter.java
deleted file mode 100644
index a53a997..0000000
--- a/src/main/java/org/dpolivaev/mnemonicsetter/MenuMnemonicSetter.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.dpolivaev.mnemonicsetter;
-
-import java.awt.Component;
-import java.awt.Container;
-import java.util.ArrayList;
-
-import javax.swing.AbstractButton;
-import javax.swing.JMenuItem;
-import javax.swing.event.PopupMenuEvent;
-import javax.swing.event.PopupMenuListener;
-
-import org.dpolivaev.mnemonicsetter.ButtonNameMnemonicHolder;
-import org.dpolivaev.mnemonicsetter.INameMnemonicHolder;
-import org.dpolivaev.mnemonicsetter.MenuItemMnemonicHolder;
-import org.dpolivaev.mnemonicsetter.MnemonicSetter;
-
-public class MenuMnemonicSetter implements PopupMenuListener{
-	final static private boolean IS_MAC_OS = System.getProperty("os.name").startsWith("Mac OS");
-	final static public MenuMnemonicSetter INSTANCE = new MenuMnemonicSetter();
-	
-
-	@Override
-	public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
-		final Container popupMenu = (Container) e.getSource();
-		setComponentMnemonics(popupMenu);
-	}
-
-	public void setComponentMnemonics(final Container menu) {
-		if(IS_MAC_OS)
-			return; // Mac OS generally does not support mnemonics
-		final Component[] components = menu.getComponents();
-		final ArrayList<INameMnemonicHolder> mnemonicHolders = new ArrayList<INameMnemonicHolder>(components.length);
-		for(Component component :components)
-			if(component instanceof JMenuItem) {
-				final JMenuItem item = (JMenuItem) component;
-				mnemonicHolders.add(new MenuItemMnemonicHolder(item));
-			}
-			else if(component instanceof AbstractButton) {
-				final AbstractButton button = (AbstractButton) component;
-				mnemonicHolders.add(new ButtonNameMnemonicHolder(button));
-			}
-		final MnemonicSetter mnemonicSetter = MnemonicSetter.of(mnemonicHolders);
-		mnemonicSetter.setMnemonics();
-	}
-
-	@Override
-	public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
-	}
-
-	@Override
-	public void popupMenuCanceled(PopupMenuEvent e) {
-	}
-
-}
diff --git a/src/main/java/org/dpolivaev/mnemonicsetter/MnemonicSetter.java b/src/main/java/org/dpolivaev/mnemonicsetter/MnemonicSetter.java
index 4b496f7..36f7926 100644
--- a/src/main/java/org/dpolivaev/mnemonicsetter/MnemonicSetter.java
+++ b/src/main/java/org/dpolivaev/mnemonicsetter/MnemonicSetter.java
@@ -1,162 +1,92 @@
 /*
- *  Copyright (C) 2016 Dimitry Polivaev
- *  
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *   you may not use this file except in compliance with the License.
- *   You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *   Unless required by applicable law or agreed to in writing, software
- *   distributed under the License is distributed on an "AS IS" BASIS,
- *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *   See the License for the specific language governing permissions and
- *   limitations under the License.
+   Copyright (C) 2016 Dimitry Polivaev
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
  */
+
 package org.dpolivaev.mnemonicsetter;
 
-import java.awt.event.KeyEvent;
+import java.awt.Component;
+import java.awt.Container;
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Pattern;
+import java.util.Collection;
+import java.util.HashSet;
 
-public class MnemonicSetter {
-	private final INameMnemonicHolder[] mnemonicHolders;
+import javax.swing.AbstractButton;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.event.PopupMenuEvent;
+import javax.swing.event.PopupMenuListener;
 
-	private MnemonicSetter(INameMnemonicHolder[] mnemonicHolders) {
-		this.mnemonicHolders = mnemonicHolders;
-	}
-
-	public void setMnemonics() {
-		final Map<Integer, INameMnemonicHolder> usedMnemonics = extractUsedMnemonics(mnemonicHolders);
-		if(usedMnemonics.size() < mnemonicHolders.length) {
-			final Map<Integer, INameMnemonicHolder> mnemonicSet = findMnemonics(usedMnemonics, 0, 0);
-			setMnemonics(mnemonicSet);
-		}
-	}
+import org.dpolivaev.mnemonicsetter.ButtonNameMnemonicHolder;
+import org.dpolivaev.mnemonicsetter.INameMnemonicHolder;
+import org.dpolivaev.mnemonicsetter.MenuItemMnemonicHolder;
+import org.dpolivaev.mnemonicsetter.ItemMnemonicSetter;
 
-	private void setMnemonics(final Map<Integer, INameMnemonicHolder> setMnemonics) {
-		for(Map.Entry<Integer, INameMnemonicHolder> holderMnemonic : setMnemonics.entrySet())
-			holderMnemonic.getValue().setMnemonic(holderMnemonic.getKey());
-	}
+/**
+ * Automatically assigns mnemonics to menu items and toolbar elements.
+ * 
+ * Use it just like MnemonicSetter.INSTANCE.setComponentMnemonics(menubar, toolbar).
+ * You can also attach it to a popup menu as a PopupMenuListener 
+ * so that mnemonics are automatically calculated when the popup menu becomes visible.
+ */
+public class MnemonicSetter implements PopupMenuListener{
+	final static private boolean IS_MAC_OS = System.getProperty("os.name").startsWith("Mac OS");
+	final static public MnemonicSetter INSTANCE = new MnemonicSetter();
+	
 
-	private Map<Integer, INameMnemonicHolder> findMnemonics(final Map<Integer, INameMnemonicHolder> usedMnemonics, int holderIndex, int characterIndex) {
-		if(holderIndex >= mnemonicHolders.length)
-			return usedMnemonics;
-		final INameMnemonicHolder holder = mnemonicHolders[holderIndex];
-		final boolean holderHasNoMnemonics = ! usedMnemonics.containsKey(holder.getMnemonic());
-		if(holderHasNoMnemonics) {
-			final String text = holder.getText();
-			if(text.length() > characterIndex) {
-				return findUnsetMnemonics(usedMnemonics, holderIndex, characterIndex);
-			}
-			return findMnemonics(usedMnemonics, holderIndex + 1, 0);
-		}
-		return findMnemonics(usedMnemonics, holderIndex + 1, 0);
+	@Override
+	public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
+		final Container popupMenu = (Container) e.getSource();
+		setComponentMnemonics(popupMenu);
 	}
 
-	private Map<Integer, INameMnemonicHolder> findUnsetMnemonics(final Map<Integer, INameMnemonicHolder> usedMnemonics, int holderIndex, int characterIndex) {
-		final INameMnemonicHolder holder = mnemonicHolders[holderIndex];
-		final String text = holder.getText();
-		final char character = text.charAt(characterIndex);
-		final int keyCode = KeyEvent.getExtendedKeyCodeForChar(character);
-		if(! usedMnemonics.containsKey(keyCode) && Character.isAlphabetic(character)
-				&& text.toLowerCase().indexOf(Character.toLowerCase(character)) == characterIndex) {
-			final Map<Integer, INameMnemonicHolder> mnemonicsWithNewCharacter = new MnemonicMap(usedMnemonics);
-			mnemonicsWithNewCharacter.put(keyCode, holder);
-			final Map<Integer, INameMnemonicHolder> allMnemonics = findMnemonics(mnemonicsWithNewCharacter, holderIndex + 1, 0);
-			return allMnemonics;
-		} else {
-			final Map<Integer, INameMnemonicHolder> allMnemonics = findMnemonics(usedMnemonics, holderIndex, characterIndex + 1);
-			return allMnemonics;
+	public void setComponentMnemonics(final Container... containers) {
+		if(IS_MAC_OS)
+			return; // Mac OS generally does not support mnemonics
+		int componentCount = 0;
+		for(Container container : containers) {
+			componentCount += container.getComponentCount();
 		}
-	}
-	private Map<Integer, INameMnemonicHolder> extractUsedMnemonics(INameMnemonicHolder... mnemonicHolders) {
-		final Map<Integer, INameMnemonicHolder> usedMnemonics = new MnemonicMap();
-		for(INameMnemonicHolder holder : mnemonicHolders){
-			final Integer mnemonic = holder.getMnemonic();
-			if(mnemonic != 0) {
-				if(! usedMnemonics.containsKey(mnemonic))
-					usedMnemonics.put(mnemonic, holder);
-				else {
-					holder.setMnemonic(0);
-					holder.setDisplayedMnemonicIndex(-1);
-				}
+		final Collection<Integer> keyCodesUsedInMenus = new HashSet<>();
+		final ArrayList<INameMnemonicHolder> mnemonicHolders = new ArrayList<INameMnemonicHolder>(componentCount);
+		for(Container container : containers) {
+			if(container instanceof JMenuBar) {
+				final Collection<Integer> keyCodesUsedInMenu = UsedAltAcceleratorsFinder.INSTANCE.findUsedKeyCodes((JMenuBar) container);
+				keyCodesUsedInMenus.addAll(keyCodesUsedInMenu);
 			}
+				
+			final Component[] components = container.getComponents();
+			for(Component component :components)
+				if(component instanceof JMenuItem) {
+					final JMenuItem item = (JMenuItem) component;
+					mnemonicHolders.add(new MenuItemMnemonicHolder(item));
+				}
+				else if(component instanceof AbstractButton) {
+					final AbstractButton button = (AbstractButton) component;
+					mnemonicHolders.add(new ButtonNameMnemonicHolder(button));
+				}
 		}
-		
-		Arrays.sort(mnemonicHolders, new Comparator<INameMnemonicHolder>() {
-			@Override
-			public int compare(INameMnemonicHolder o1, INameMnemonicHolder o2) {
-				boolean o1HasMnemonics = o1.getMnemonic() > 0;
-				boolean o2HasMnemonics = o2.getMnemonic() > 0;
-				if(o1HasMnemonics)
-					if(o2HasMnemonics)
-						return 0;
-					else
-						return -1;
-				else
-					if(o2HasMnemonics)
-						return 1;
-					else {
-						boolean o1HasAccelerator = o1. hasAccelerator();
-						boolean o2HasAccelerator = o2. hasAccelerator();
-						if(o1HasAccelerator && ! o2HasAccelerator)
-								return 1;
-						else if(! o1HasAccelerator && o2HasAccelerator)
-								return -1;
-						else
-							return o1.getText().length() - o2.getText().length();
-					}
-			}
-		});
-		
-		return usedMnemonics;
-	}
-
-	final static private Pattern CAN_HAVE_MNEMONICS = Pattern.compile("\\p{L}");
-	
-	public static MnemonicSetter of(INameMnemonicHolder... mnemonicHolders) {
-		return of(Arrays.asList(mnemonicHolders));
-	}
-	
-	public static MnemonicSetter of(List<INameMnemonicHolder> mnemonicHolders) {
-		final ArrayList<INameMnemonicHolder> validHolders = new ArrayList<INameMnemonicHolder>(mnemonicHolders.size());
-		for(INameMnemonicHolder holder :mnemonicHolders)
-			if(CAN_HAVE_MNEMONICS.matcher(holder.getText()).find())
-				validHolders.add(holder);
-		final INameMnemonicHolder[] array = validHolders.toArray(new INameMnemonicHolder[validHolders.size()]);
-		return new MnemonicSetter(array);
-	}
-}
-
- at SuppressWarnings("serial")
-class MnemonicMap extends LinkedHashMap<Integer, INameMnemonicHolder> {
-
-	public MnemonicMap() {
-		super();
+		final ItemMnemonicSetter mnemonicSetter = ItemMnemonicSetter.of(mnemonicHolders).notUsing(keyCodesUsedInMenus);
+		mnemonicSetter.setMnemonics();
 	}
 
-	public MnemonicMap(Map<? extends Integer, ? extends INameMnemonicHolder> m) {
-		super(m);
+	@Override
+	public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
 	}
 
 	@Override
-	public String toString() {
-		final StringBuilder stringBuilder = new StringBuilder("MnemonicMap"
-				 + "(" + size() + ") {");
-		for(Map.Entry<Integer, INameMnemonicHolder> entry : entrySet()){
-			stringBuilder
-			.append(entry.getValue().getText())
-			.append(" -> ")
-			.append(KeyEvent.getKeyText(entry.getKey()))
-			.append("\n");
-		}
-		return stringBuilder.append("}").toString();
+	public void popupMenuCanceled(PopupMenuEvent e) {
 	}
-}
 
+}
diff --git a/src/main/java/org/dpolivaev/mnemonicsetter/UsedAltAcceleratorsFinder.java b/src/main/java/org/dpolivaev/mnemonicsetter/UsedAltAcceleratorsFinder.java
new file mode 100644
index 0000000..18604b6
--- /dev/null
+++ b/src/main/java/org/dpolivaev/mnemonicsetter/UsedAltAcceleratorsFinder.java
@@ -0,0 +1,48 @@
+package org.dpolivaev.mnemonicsetter;
+
+import java.awt.Component;
+import java.awt.event.KeyEvent;
+import java.util.Collection;
+import java.util.HashSet;
+
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.KeyStroke;
+
+public class UsedAltAcceleratorsFinder {
+
+	private HashSet<Integer> hashSet;
+	
+	static public UsedAltAcceleratorsFinder INSTANCE = new UsedAltAcceleratorsFinder();
+
+	public Collection<Integer> findUsedKeyCodes(JMenuBar menuBar) {
+		hashSet = new HashSet<>();
+		for(int i = 0; i < menuBar.getMenuCount(); i++) {
+			final JMenu menu = menuBar.getMenu(i);
+			findUsedMenuCodes(menu);
+		}
+		return hashSet;
+	}
+
+	private void findUsedMenuCodes(JMenu menu) {
+		for(int i = 0; i < menu.getMenuComponentCount(); i++) {
+			final Component menuComponent = menu.getMenuComponent(i);
+			if(menuComponent instanceof JMenu){
+				findUsedMenuCodes((JMenu) menuComponent);
+			}
+			if(menuComponent instanceof JMenuItem){
+				final KeyStroke accelerator = ((JMenuItem)menuComponent).getAccelerator();
+				if(accelerator != null) {
+					final int keyCode = accelerator.getKeyCode();
+					if (keyCode >= KeyEvent.VK_A && keyCode <= KeyEvent.VK_Z 
+							&&(accelerator.getModifiers() & (KeyEvent.ALT_DOWN_MASK 
+									| KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK | KeyEvent.META_DOWN_MASK)) == KeyEvent.ALT_DOWN_MASK) {
+						hashSet.add(keyCode);
+					}
+				}
+			}
+		}
+	}
+
+}
diff --git a/src/test/java/org/dpolivaev/mnemonicsetter/MnemonicSetterShould.java b/src/test/java/org/dpolivaev/mnemonicsetter/ItemMnemonicSetterShould.java
similarity index 81%
rename from src/test/java/org/dpolivaev/mnemonicsetter/MnemonicSetterShould.java
rename to src/test/java/org/dpolivaev/mnemonicsetter/ItemMnemonicSetterShould.java
index 977d5a0..5f0046d 100644
--- a/src/test/java/org/dpolivaev/mnemonicsetter/MnemonicSetterShould.java
+++ b/src/test/java/org/dpolivaev/mnemonicsetter/ItemMnemonicSetterShould.java
@@ -18,11 +18,12 @@ package org.dpolivaev.mnemonicsetter;
 import static org.junit.Assert.assertThat;
 
 import java.awt.event.KeyEvent;
+import java.util.Collections;
 
 import org.hamcrest.CoreMatchers;
 import org.junit.Test;
 
-public class MnemonicSetterShould {
+public class ItemMnemonicSetterShould {
 	static class MnemonicHolder implements INameMnemonicHolder{
 
 		private String text;
@@ -91,7 +92,7 @@ public class MnemonicSetterShould {
 	@Test
 	public void assignsFirstLetter() throws Exception {
 		final MnemonicHolder mnemonicHolderA = new MnemonicHolder("A");
-		MnemonicSetter.of(mnemonicHolderA).setMnemonics();
+		ItemMnemonicSetter.of(mnemonicHolderA).setMnemonics();
 		assertMnemonic(mnemonicHolderA, 'A');
 	}
 
@@ -99,7 +100,7 @@ public class MnemonicSetterShould {
 	@Test
 	public void skipsSpaces() throws Exception {
 		final MnemonicHolder mnemonicHolderA = new MnemonicHolder(" A");
-		MnemonicSetter.of(mnemonicHolderA).setMnemonics();
+		ItemMnemonicSetter.of(mnemonicHolderA).setMnemonics();
 		assertMnemonic(mnemonicHolderA, 'A');
 	}
 	
@@ -107,17 +108,23 @@ public class MnemonicSetterShould {
 	public void assignsSecondLetter_IfFirstLetterIsAlreadyAssigned() throws Exception {
 		final MnemonicHolder mnemonicHolderAB = new MnemonicHolder("AB");
 		final MnemonicHolder mnemonicHolderA = new MnemonicHolder("A", 'A');
-		MnemonicSetter.of(mnemonicHolderAB, mnemonicHolderA).setMnemonics();
+		ItemMnemonicSetter.of(mnemonicHolderAB, mnemonicHolderA).setMnemonics();
 		assertMnemonic(mnemonicHolderA, 'A');
 		assertMnemonic(mnemonicHolderAB, 'B');
 	}
 
+	@Test
+	public void assignsSecondLetter_IfFirstLetterIsAlreadyUsed() throws Exception {
+		final MnemonicHolder mnemonicHolderAB = new MnemonicHolder("AB");
+		ItemMnemonicSetter.of(mnemonicHolderAB).notUsing(Collections.singleton(KeyEvent.VK_A)).setMnemonics();
+		assertMnemonic(mnemonicHolderAB, 'B');
+	}
 
 	@Test
 	public void assignsSecondLetter_IfFirstLetterLowerCaseIsAlreadyAssigned() throws Exception {
 		final MnemonicHolder mnemonicHolderAB = new MnemonicHolder("ab");
 		final MnemonicHolder mnemonicHolderA = new MnemonicHolder("A", 'A');
-		MnemonicSetter.of(mnemonicHolderAB, mnemonicHolderA).setMnemonics();
+		ItemMnemonicSetter.of(mnemonicHolderAB, mnemonicHolderA).setMnemonics();
 		assertMnemonic(mnemonicHolderA, 'A');
 		assertMnemonic(mnemonicHolderAB, 'B');
 	}
@@ -126,7 +133,7 @@ public class MnemonicSetterShould {
 	public void assignsFirstLetter_ifItIsNotAssignedYet() throws Exception {
 		final MnemonicHolder mnemonicHolderAB = new MnemonicHolder("AB");
 		final MnemonicHolder mnemonicHolderA = new MnemonicHolder("C");
-		MnemonicSetter.of(mnemonicHolderAB, mnemonicHolderA).setMnemonics();
+		ItemMnemonicSetter.of(mnemonicHolderAB, mnemonicHolderA).setMnemonics();
 		assertMnemonic(mnemonicHolderAB, 'A');
 	}
 	
@@ -134,7 +141,7 @@ public class MnemonicSetterShould {
 	public void assignsFirstLetter_toSecondHolder() throws Exception {
 		final MnemonicHolder mnemonicHolderAB = new MnemonicHolder("AB");
 		final MnemonicHolder mnemonicHolderC = new MnemonicHolder("C");
-		MnemonicSetter.of(mnemonicHolderAB, mnemonicHolderC).setMnemonics();
+		ItemMnemonicSetter.of(mnemonicHolderAB, mnemonicHolderC).setMnemonics();
 		assertMnemonic(mnemonicHolderAB, 'A');
 		assertMnemonic(mnemonicHolderC, 'C');
 	}
@@ -143,7 +150,7 @@ public class MnemonicSetterShould {
 	public void assignsSecondLetter_toSecondHolder() throws Exception {
 		final MnemonicHolder mnemonicHolderAB = new MnemonicHolder("AB");
 		final MnemonicHolder mnemonicHolderAC = new MnemonicHolder("AC");
-		MnemonicSetter.of(mnemonicHolderAB, mnemonicHolderAC).setMnemonics();
+		ItemMnemonicSetter.of(mnemonicHolderAB, mnemonicHolderAC).setMnemonics();
 		assertMnemonic(mnemonicHolderAB, 'A');
 		assertMnemonic(mnemonicHolderAC, 'C');
 	}
@@ -152,7 +159,7 @@ public class MnemonicSetterShould {
 	public void assignsNoLetter_ifAllLettersAreAlreadyAssigned() throws Exception {
 		final MnemonicHolder mnemonicHolderA1 = new MnemonicHolder("a");
 		final MnemonicHolder mnemonicHolderA2 = new MnemonicHolder("a", 'A');
-		MnemonicSetter.of(mnemonicHolderA1, mnemonicHolderA2).setMnemonics();
+		ItemMnemonicSetter.of(mnemonicHolderA1, mnemonicHolderA2).setMnemonics();
 		assertMnemonic(mnemonicHolderA1, '\0');
 		assertMnemonic(mnemonicHolderA2, 'A');
 	}
@@ -161,7 +168,7 @@ public class MnemonicSetterShould {
 	public void assignsSecondLetter_toFirstHolder() throws Exception {
 		final MnemonicHolder mnemonicHolderAB = new MnemonicHolder("AB");
 		final MnemonicHolder mnemonicHolderA = new MnemonicHolder("A");
-		MnemonicSetter.of(mnemonicHolderAB, mnemonicHolderA).setMnemonics();
+		ItemMnemonicSetter.of(mnemonicHolderAB, mnemonicHolderA).setMnemonics();
 		assertMnemonic(mnemonicHolderAB, 'B');
 		assertMnemonic(mnemonicHolderA, 'A');
 	}
@@ -170,7 +177,7 @@ public class MnemonicSetterShould {
 	public void assignsNoLetter_toSecondHolder() throws Exception {
 		final MnemonicHolder mnemonicHolderA1 = new MnemonicHolder("a");
 		final MnemonicHolder mnemonicHolderA2 = new MnemonicHolder("a");
-		MnemonicSetter.of(mnemonicHolderA1, mnemonicHolderA2).setMnemonics();
+		ItemMnemonicSetter.of(mnemonicHolderA1, mnemonicHolderA2).setMnemonics();
 		assertMnemonic(mnemonicHolderA1, 'A');
 		assertMnemonic(mnemonicHolderA2, '\0');
 	}
diff --git a/src/test/java/org/dpolivaev/mnemonicsetter/UsedAltAcceleratorsFinderShould.java b/src/test/java/org/dpolivaev/mnemonicsetter/UsedAltAcceleratorsFinderShould.java
new file mode 100644
index 0000000..f28bfac
--- /dev/null
+++ b/src/test/java/org/dpolivaev/mnemonicsetter/UsedAltAcceleratorsFinderShould.java
@@ -0,0 +1,76 @@
+package org.dpolivaev.mnemonicsetter;
+
+import static org.junit.Assert.assertTrue;
+
+import java.awt.event.KeyEvent;
+import java.util.Arrays;
+
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.KeyStroke;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class UsedAltAcceleratorsFinderShould {
+	private UsedAltAcceleratorsFinder usedAltAcceleratorsFinder;
+	private JMenuBar menuBar;
+	private JMenu menu;
+	private JMenuItem menuItem;
+
+	@Before
+	public void setup() {
+		usedAltAcceleratorsFinder = new UsedAltAcceleratorsFinder();
+		menuBar = new JMenuBar();
+		menu = new JMenu();
+		menuBar.add(menu);
+		menuItem = new JMenuItem();
+		menu.add(menuItem);
+	}
+	
+	@Test
+	public void returnsEmptyCollectionIfNoAcceleratorsAreFound() throws Exception {
+		assertTrue(usedAltAcceleratorsFinder.findUsedKeyCodes(menuBar).isEmpty());
+	}
+	@Test
+	public void returnsFoundAcceleratorIfAcceleratorsAreFound() throws Exception {
+		JMenuItem menuItem2 = new JMenuItem();
+		JMenu menu2 = new JMenu();
+		menu2.add(menuItem2);
+		menu.add(menu2);
+		JMenu menu3 = new JMenu();
+		JMenuItem menuItem3 = new JMenuItem();
+		menu3.add(menuItem3);
+		menuBar.add(menu3);
+		JMenuItem menuItem4 = new JMenuItem();
+		menu.add(menuItem4);
+
+		menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.ALT_DOWN_MASK));
+		menuItem2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B, KeyEvent.ALT_DOWN_MASK));
+		menuItem3.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.ALT_DOWN_MASK));
+		menuItem4.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, KeyEvent.ALT_DOWN_MASK));
+		assertTrue(usedAltAcceleratorsFinder.findUsedKeyCodes(menuBar).containsAll(Arrays.asList(KeyEvent.VK_A, KeyEvent.VK_B, KeyEvent.VK_C, KeyEvent.VK_D)));
+	}
+	
+	@Test
+	public void returnsFoundAcceleratorIfShiftIsRequired() throws Exception {
+		final int extendedKeyCodeForCharA = KeyEvent.getExtendedKeyCodeForChar('A');
+		menuItem.setAccelerator(KeyStroke.getKeyStroke(extendedKeyCodeForCharA, KeyEvent.ALT_DOWN_MASK|KeyEvent.SHIFT_DOWN_MASK));
+		assertTrue(usedAltAcceleratorsFinder.findUsedKeyCodes(menuBar).isEmpty());
+	}
+
+	@Test
+	public void returnsFoundAcceleratorIfControlIsRequired() throws Exception {
+		final int extendedKeyCodeForCharA = KeyEvent.getExtendedKeyCodeForChar('A');
+		menuItem.setAccelerator(KeyStroke.getKeyStroke(extendedKeyCodeForCharA, KeyEvent.ALT_DOWN_MASK|KeyEvent.CTRL_DOWN_MASK));
+		assertTrue(usedAltAcceleratorsFinder.findUsedKeyCodes(menuBar).isEmpty());
+	}
+
+	@Test
+	public void returnsFoundAcceleratorIfMetaIsRequired() throws Exception {
+		final int extendedKeyCodeForCharA = KeyEvent.getExtendedKeyCodeForChar('A');
+		menuItem.setAccelerator(KeyStroke.getKeyStroke(extendedKeyCodeForCharA, KeyEvent.ALT_DOWN_MASK|KeyEvent.META_DOWN_MASK));
+		assertTrue(usedAltAcceleratorsFinder.findUsedKeyCodes(menuBar).isEmpty());
+	}
+}

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/libmnemonicsetter-java.git



More information about the pkg-java-commits mailing list