[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