Ticket #2445: theme-pack.patch

File theme-pack.patch, 113.6 KB (added by tanya, 15 years ago)
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/file/SaveBookItem.java

    ### Eclipse Workspace Patch 1.0
    #P sophie
     
    44 
    55import javax.swing.KeyStroke; 
    66 
     7import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    78import org.sophie2.base.commons.util.OSUtil; 
    89import org.sophie2.base.connectivity.resources.DelegatingServerAccess; 
    910import org.sophie2.base.skins.SkinElementId; 
     
    2728        private static void defineSkin(ElementPartCreator part) { 
    2829                part.add(TITLE_PROP_ID, "Save Book"); 
    2930                part.add(TOOL_TIP_PROP_ID, "Save the changes made to the current book"); 
    30                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_S); 
     31                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_S)); 
    3132                part.add(ACCELERATOR_PROP_ID, KeyStroke.getKeyStroke(KeyEvent.VK_S, OSUtil.getDefaultMask())); 
    3233        } 
    3334 
  • modules/org.sophie2.base.skins/src/main/java/org/sophie2/base/skins/value/loaders/PointValueLoader.java

     
     1package org.sophie2.base.skins.value.loaders; 
     2 
     3import org.sophie2.base.commons.util.position.ImmPoint; 
     4 
     5/** 
     6 * Extension of the extension point defined with {@link SkinValueLoader} interface. 
     7 * Processes records which kind is <b>point</b> 
     8 *  
     9 * @author tanya 
     10 */ 
     11public class PointValueLoader implements SkinValueLoader { 
     12 
     13        private static String KIND = "point"; 
     14         
     15        public Object createValue(String value, String path) { 
     16                String trimedPath = path.trim(); 
     17                String[] values = trimedPath.split(","); 
     18                 
     19                float x = Float.parseFloat(values[0].trim()); 
     20                float y = Float.parseFloat(values[1].trim()); 
     21                 
     22                ImmPoint res = new ImmPoint(x, y); 
     23                 
     24                return res; 
     25        } 
     26 
     27        public String getKind() { 
     28                return KIND; 
     29        } 
     30 
     31} 
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/window/CascadeItem.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.skins.SkinElementId; 
    67import org.sophie2.base.visual.skins.ElementPartCreator; 
    78import org.sophie2.base.visual.skins.SkinPartDef; 
     
    2021        private static void defineSkin(ElementPartCreator part) { 
    2122                part.add(TITLE_PROP_ID, "Cascade"); 
    2223                part.add(TOOL_TIP_PROP_ID, "Stack the book windows so that each title bar is visible"); 
    23                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_C); 
     24                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_C)); 
    2425        } 
    2526         
    2627        @Override 
  • modules/org.sophie2.base.skins/src/main/java/org/sophie2/base/skins/value/loaders/SizeValueLoader.java

     
     1package org.sophie2.base.skins.value.loaders; 
     2 
     3import org.sophie2.base.commons.util.position.ImmSize; 
     4 
     5/** 
     6 * Extension of the extension point defined with {@link SkinValueLoader} interface. 
     7 * Processes records which kind is <b>size</b> 
     8 *  
     9 * @author tanya 
     10 */ 
     11public class SizeValueLoader implements SkinValueLoader { 
     12 
     13        private static String KIND = "size"; 
     14         
     15        public Object createValue(String value, String path) { 
     16                 
     17                String trimedPath = path.trim(); 
     18                String[] values = trimedPath.split(","); 
     19                 
     20                float width = Float.parseFloat(values[0].trim()); 
     21                float height = Float.parseFloat(values[1].trim()); 
     22                 
     23                ImmSize res = new ImmSize(width, height); 
     24                 
     25                return res; 
     26        } 
     27 
     28        public String getKind() { 
     29                return KIND; 
     30        } 
     31 
     32} 
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/edit/CopyItem.java

     
    44 
    55import javax.swing.KeyStroke; 
    66 
     7import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    78import org.sophie2.base.commons.util.OSUtil; 
    89import org.sophie2.base.visual.skins.ElementPartCreator; 
    910import org.sophie2.base.visual.skins.SkinPartDef; 
     
    2728                part.add(TITLE_PROP_ID, "Copy"); 
    2829                part.add(TOOL_TIP_PROP_ID, "Copy the current selection"); 
    2930                part.add(ACCELERATOR_PROP_ID, KeyStroke.getKeyStroke(KeyEvent.VK_C, OSUtil.getDefaultMask())); 
    30                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_C); 
     31                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_C)); 
    3132        } 
    3233 
    3334        @Override 
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/file/ExitItem.java

     
    44 
    55import javax.swing.KeyStroke; 
    66 
     7import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    78import org.sophie2.base.commons.util.OSUtil; 
    89import org.sophie2.base.skins.SkinElementId; 
    910import org.sophie2.base.visual.skins.ElementPartCreator; 
     
    2324        private static void defineSkin(ElementPartCreator part) { 
    2425                part.add(TITLE_PROP_ID, "Quit Sophie2"); 
    2526                part.add(TOOL_TIP_PROP_ID, "Exit Sophie"); 
    26                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_Q); 
     27                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_Q)); 
    2728                part.add(ACCELERATOR_PROP_ID, KeyStroke.getKeyStroke(KeyEvent.VK_Q, OSUtil.getDefaultMask())); 
    2829        } 
    2930         
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/window/WindowMenu.java

     
    44import java.util.ArrayList; 
    55import java.util.List; 
    66 
     7import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    78import org.sophie2.base.layout.model.DocView; 
    89import org.sophie2.base.menus.MenuMember; 
    910import org.sophie2.base.skins.SkinElementId; 
     
    4243        private static void defineSkin(ElementPartCreator part) { 
    4344                part.add(TITLE_PROP_ID, "Window"); 
    4445                part.add(TOOL_TIP_PROP_ID, "Window menu (Alt+W)"); 
    45                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_W); 
     46                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_W)); 
    4647        } 
    4748         
    4849        @Override 
  • modules/org.sophie2.main.func.templates/src/main/java/org/sophie2/main/func/templates/book/SaveBookAsTemplateItem.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.skins.SkinElementId; 
    67import org.sophie2.base.visual.skins.ElementPartCreator; 
    78import org.sophie2.base.visual.skins.SkinPartDef; 
     
    2122        private static void defineSkin(ElementPartCreator part) { 
    2223                part.add(TITLE_PROP_ID, "Save As Template"); 
    2324                part.add(TOOL_TIP_PROP_ID, "Save current book as template"); 
    24                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_T); 
     25                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_T)); 
    2526        } 
    2627 
    2728 
  • modules/org.sophie2.base.menus/src/main/java/org/sophie2/base/menus/MenuMember.java

     
    55import javax.swing.JMenuItem; 
    66import javax.swing.KeyStroke; 
    77 
     8import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    89import org.sophie2.base.commons.util.ImmImage; 
    910import org.sophie2.base.visual.BaseVisualElement; 
    1011import org.sophie2.core.prolib.impl.AutoProperty; 
     
    7576         *  
    7677         * @return The property. 
    7778         */ 
    78         public Prop<Integer> mnemonic() { 
    79                 class mnemonic extends AutoProperty<Integer> { 
     79        public Prop<MenuMemberMnemonic> mnemonic() { 
     80                class mnemonic extends AutoProperty<MenuMemberMnemonic> { 
    8081                         
    8182                        @SuppressWarnings("synthetic-access") 
    8283                        @Override 
    83                         protected Integer compute() { 
    84                                 return getSkinValue(MNEMONIC_PROP_ID, Integer.class); 
     84                        protected MenuMemberMnemonic compute() { 
     85                                return getSkinValue(MNEMONIC_PROP_ID, MenuMemberMnemonic.class); 
    8586                        } 
    8687                } 
    8788                return getBean().makeProp(mnemonic.class); 
  • modules/org.sophie2.base.commons/src/main/java/org/sophie2/base/commons/util/ImageUtil.java

     
    4444        public static ImmImage loadIcon(String iconName) { 
    4545                Profiler.hit(); 
    4646                String iconPath = ICON_HOME + iconName; 
     47                 
     48                ImmImage res = loadIconByPath(iconPath); 
     49 
     50                assert res != null : "Cannot find the following icon: " + iconPath; 
     51                 
     52                return res; 
     53        } 
     54         
     55        /** 
     56         * Loads an icon which is defined with its absolute path according to the 
     57         * distrib directory of the application. 
     58         *  
     59         * @param iconPath 
     60         *            The absolute path of the icon according to the distrib 
     61         *            directory of the application. 
     62         * @return  
     63         *                      The loaded icon. Can be null. 
     64         */ 
     65        public static ImmImage loadIconByPath(String iconPath) { 
     66                Profiler.hit(); 
     67 
    4768                BufferedImage image; 
    4869                URL iconURL = FileEntryManager.get().getReadableFileEntry(iconPath); 
    4970 
    50                 assert iconURL != null : "Cannot find the following icon: " + iconPath; 
    51                 try { 
    52                         image = ImageIO.read(iconURL); 
    53                 } catch (IOException e) { 
    54                         SophieLog.error("Cannot load icon", e); 
    55                         throw new RuntimeException("Cannot load icon!", e); 
     71                if (iconURL != null) { 
     72                        try { 
     73                                image = ImageIO.read(iconURL); 
     74                        } catch (IOException e) { 
     75                                SophieLog.error("Cannot load icon", e); 
     76                                throw new RuntimeException("Cannot load icon!", e); 
     77                        } 
     78 
     79                        ImmImage res = new ImmImage(image); 
     80                        SophieLog.tracef("loadIcon(%s): %s(w=%d, h=%d)", iconPath, res, res 
     81                                        .getWidth(), res.getHeight()); 
     82                        return res; 
    5683                } 
    57                 ImmImage res = new ImmImage(image); 
    58                 SophieLog.tracef("loadIcon(%s): %s(w=%d, h=%d)", iconPath, 
    59                                 res, res.getWidth(), res.getHeight()); 
    60                 return res; 
     84                return null; 
    6185        } 
    6286         
    6387        /** 
  • modules/org.sophie2.extra.comment/src/main/java/org/sophie2/extra/comment/view/InsertCommentItem.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.menus.MenuItem; 
    67import org.sophie2.base.skins.SkinElementId; 
    78import org.sophie2.base.visual.skins.ElementPartCreator; 
     
    2223        private static void defineSkin(ElementPartCreator part) { 
    2324                part.add(TITLE_PROP_ID, "Comment"); 
    2425                part.add(TOOL_TIP_PROP_ID, "Add a comment frame to the current page."); 
    25                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_C); 
     26                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_C)); 
    2627        } 
    2728         
    2829        @Override 
  • modules/org.sophie2.extra.func.print/src/main/java/org/sophie2/extra/func/print/pdf/export/ExportToPDFItem.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.skins.SkinElementId; 
    67import org.sophie2.base.visual.skins.ElementPartCreator; 
    78import org.sophie2.base.visual.skins.SkinPartDef; 
     
    2122        private static void defineSkin(ElementPartCreator part) { 
    2223                part.add(TITLE_PROP_ID, "PDF..."); 
    2324                part.add(TOOL_TIP_PROP_ID, "Export the book as a PDF"); 
    24                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_P); 
     25                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_P)); 
    2526        } 
    2627 
    2728        /** 
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/view/FullScreenItem.java

     
    44 
    55import javax.swing.KeyStroke; 
    66 
     7import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    78import org.sophie2.base.commons.util.ImageUtil; 
    89import org.sophie2.base.commons.util.ImmImage; 
    910import org.sophie2.base.layout.model.MainWindowOptions.ScreenMode; 
     
    2930        private static void defineSkin(ElementPartCreator part) { 
    3031                part.add(BaseVisualElement.TITLE_PROP_ID, "Full Screen Mode"); 
    3132                part.add(BaseVisualElement.TOOL_TIP_PROP_ID, "Use Sophie in full-screen mode"); 
    32                 part.add(MenuMember.MNEMONIC_PROP_ID, KeyEvent.VK_F); 
     33                part.add(MenuMember.MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_F)); 
    3334                part.add(MenuMember.ACCELERATOR_PROP_ID, KeyStroke.getKeyStroke(KeyEvent.VK_F11, 0)); 
    3435                part.add(ICON_PROP_ID, ImageUtil.loadIcon("tick.png")); 
    3536        } 
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/edit/PasteItem.java

     
    44 
    55import javax.swing.KeyStroke; 
    66 
     7import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    78import org.sophie2.base.commons.util.OSUtil; 
    89import org.sophie2.base.visual.skins.ElementPartCreator; 
    910import org.sophie2.base.visual.skins.SkinPartDef; 
     
    2425                part.add(TITLE_PROP_ID, "Paste"); 
    2526                part.add(TOOL_TIP_PROP_ID, "Paste the contets of the clipboard"); 
    2627                part.add(ACCELERATOR_PROP_ID, KeyStroke.getKeyStroke(KeyEvent.VK_V, OSUtil.getDefaultMask())); 
    27                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_P); 
     28                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_P)); 
    2829        } 
    2930 
    3031        @Override 
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/skins/SkinsMenu.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.skins.SkinElementId; 
    67import org.sophie2.base.visual.skins.ElementPartCreator; 
    78import org.sophie2.base.visual.skins.SkinPartDef; 
     
    2122        private static void defineSkin(ElementPartCreator part) { 
    2223                part.add(TITLE_PROP_ID, "Skin"); 
    2324                part.add(TOOL_TIP_PROP_ID, "Skins Menu (Alt+S)"); 
    24                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_S); 
     25                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_S)); 
    2526        } 
    2627 
    2728        @Override 
  • modules/org.sophie2.extra.func.embedded/src/main/java/org/sophie2/extra/func/embedded/view/InsertBookItem.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.skins.SkinElementId; 
    67import org.sophie2.base.visual.skins.ElementPartCreator; 
    78import org.sophie2.base.visual.skins.SkinPartDef; 
     
    5051        private static void defineSkin(ElementPartCreator part) { 
    5152                part.add(TITLE_PROP_ID, "Book..."); 
    5253                part.add(TOOL_TIP_PROP_ID, "Add a Sophie book to the current page"); 
    53                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_B); 
     54                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_B)); 
    5455        } 
    5556 
    5657        @Override 
  • modules/org.sophie2.base.skins/src/main/java/org/sophie2/base/skins/BaseSkinsModule.java

     
    55import org.sophie2.base.config.ConfigKey; 
    66import org.sophie2.base.skins.providers.SimpleSkinPartsProvider; 
    77import org.sophie2.base.skins.providers.SkinPartsProvider; 
     8import org.sophie2.base.skins.value.loaders.IconValueLoader; 
    89import org.sophie2.base.skins.value.loaders.SkinValueLoader; 
    910import org.sophie2.base.skins.value.loaders.TextValueLoader; 
    1011import org.sophie2.core.modularity.SimpleSophieExtension; 
     
    8586        } 
    8687         
    8788 
    88         private SkinValueLoaderPoint skinEntryValuePoint = null; 
     89        private SkinValueLoaderPoint skinValueLoaderPoint = null; 
    8990 
    9091        /** 
    9192         * Creates an extension point with interface {@link SkinValueLoader}. 
     
    107108         *                       An extension point. 
    108109         */ 
    109110        public SkinValueLoaderPoint getSkinValueLoaderPoint() { 
    110                 if (this.skinEntryValuePoint == null) { 
    111                         this.skinEntryValuePoint = new SkinValueLoaderPoint(); 
     111                if (this.skinValueLoaderPoint == null) { 
     112                        this.skinValueLoaderPoint = new SkinValueLoaderPoint(); 
    112113                } 
    113114                 
    114                 return this.skinEntryValuePoint; 
     115                return this.skinValueLoaderPoint; 
    115116        } 
    116117         
    117118         
     
    140141        protected void defineExtensions(List<SophieExtension<?>> res) { 
    141142                res.add(getSimpleSkinPartsProvider().asExtension()); 
    142143                res.add(new TextValueLoader().asExtension()); 
     144                res.add(new IconValueLoader().asExtension()); 
    143145                res.add(new SimpleSophieExtension<ConfigKey>(ConfigKey.class, SkinManager.CURRENT_LANGUAGE_PACK)); 
     146                res.add(new SimpleSophieExtension<ConfigKey>(ConfigKey.class, SkinManager.CURRENT_THEME_PACK)); 
     147                res.add(new SimpleSophieExtension<ConfigKey>(ConfigKey.class, SkinManager.CURRENT_INTERACTION_PACK)); 
    144148        } 
    145149} 
  • modules/org.sophie2.base.skins/src/main/java/org/sophie2/base/skins/utils/IconValueLoaderUtil.java

     
     1package org.sophie2.base.skins.utils; 
     2 
     3import org.sophie2.base.commons.util.ImageUtil; 
     4 
     5/** 
     6 * Utilities related to loading records of the skin which value is a path to an 
     7 * icon. 
     8 *  
     9 * @author tanya 
     10 */ 
     11public class IconValueLoaderUtil { 
     12 
     13        /** 
     14         * Loads an icon. Gets value of the record and path to the skin home 
     15         * directory. The value of the record is the path - absolute or relative to 
     16         * an icon. It can be absolute according to the distrib directory of the 
     17         * application and can be relative to the skin home directory. 
     18         *  
     19         * @param value 
     20         *            The value of the record. Absolute or relative path to and 
     21         *            icon. If the value starts with "/", then tha path is absolute. 
     22         *            Otherwise, the path is relative. 
     23         * @param skinHome 
     24         *            The skin home directory of the skin which requires the icon to be loaded. 
     25         * @return 
     26         *              Loaded icon. 
     27         */ 
     28        public static Object value (String value, String skinHome) { 
     29                if (value.startsWith("/")) { 
     30                        String real = value.substring(1); 
     31                        return ImageUtil.loadIconByPath(real);  
     32                } 
     33                 
     34                return ImageUtil.loadIconByPath(skinHome+value); 
     35        } 
     36} 
  • modules/org.sophie2.base.skins/src/main/java/org/sophie2/base/skins/BaseSkinPart.java

     
    3737 
    3838        public RwProp<String> skinName() { 
    3939                return getBean().makeValueProp("skinName", String.class, 
    40                                 SkinManager.DEFAULT_NAME); 
     40                                SkinManager.THEME_PACK_NAME); 
    4141        } 
    4242 
    4343        /** 
  • modules/org.sophie2.extra.func.browser/src/main/java/org/sophie2/extra/func/browser/flash/view/InsertFlashItem.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.skins.SkinElementId; 
    67import org.sophie2.base.visual.skins.ElementPartCreator; 
    78import org.sophie2.base.visual.skins.SkinPartDef; 
     
    2223        private static void defineSkin(ElementPartCreator part) { 
    2324                part.add(TITLE_PROP_ID, "Flash..."); 
    2425                part.add(TOOL_TIP_PROP_ID, "Add a flash frame to the current page."); 
    25                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_F); 
     26                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_F)); 
    2627        } 
    2728         
    2829        @Override 
  • modules/org.sophie2.main.func.text/src/main/java/org/sophie2/main/func/text/InsertTextItem.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.skins.SkinElementId; 
    67import org.sophie2.base.visual.skins.ElementPartCreator; 
    78import org.sophie2.base.visual.skins.SkinPartDef; 
     
    2324        private static void defineSkin(ElementPartCreator part) { 
    2425                part.add(TITLE_PROP_ID, "Text"); 
    2526                part.add(TOOL_TIP_PROP_ID, "Add an empty text frame to the current page"); 
    26                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_T); 
     27                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_T)); 
    2728        } 
    2829 
    2930        @Override 
  • modules/org.sophie2.base.skins/src/main/java/org/sophie2/base/skins/value/loaders/IntegerValueLoader.java

     
     1package org.sophie2.base.skins.value.loaders; 
     2 
     3/** 
     4 * Extension of the extension point defined with {@link SkinValueLoader} interface. 
     5 * Processes records which kind is <b>integer</b> 
     6 *  
     7 * @author tanya 
     8 */ 
     9public class IntegerValueLoader implements SkinValueLoader { 
     10         
     11        private static String KIND = "Integer"; 
     12         
     13        public Object createValue(String value, String path) { 
     14                return Integer.parseInt(value);  
     15        } 
     16 
     17        public String getKind() { 
     18                return KIND; 
     19        } 
     20 
     21} 
  • modules/org.sophie2.extra.func.pdf/src/main/java/org/sophie2/extra/func/pdf/view/InsertPDFItem.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.skins.SkinElementId; 
    67import org.sophie2.base.visual.skins.ElementPartCreator; 
    78import org.sophie2.base.visual.skins.SkinPartDef; 
     
    2122        private static void defineSkin(ElementPartCreator part) { 
    2223                part.add(TITLE_PROP_ID, "Pdf..."); 
    2324                part.add(TOOL_TIP_PROP_ID, "Add a PDF to the current page"); 
    24                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_P); 
     25                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_P)); 
    2526        } 
    2627         
    2728        @Override 
  • modules/org.sophie2.base.skins/src/main/java/org/sophie2/base/skins/providers/SkinPartsProvider.java

     
    44import org.sophie2.core.prolib.interfaces.ListProp; 
    55 
    66/** 
    7  * Extension point providing a list of base skin parts which are to be used in 
    8  * the current skin. 
     7 * Interface of an extension point that provides a list of base skin parts which are to be used in 
     8 * the current skin.  
    99 *  
    1010 * @author tanya 
    1111 */ 
  • modules/org.sophie2.base.skins/src/main/java/org/sophie2/base/skins/value/loaders/BooleanValueLoader.java

     
     1package org.sophie2.base.skins.value.loaders; 
     2 
     3/** 
     4 * Extension of the extension point defined with {@link SkinValueLoader} interface. 
     5 * Processes records which kind is <b>boolean</b> 
     6 *  
     7 * @author tanya 
     8 */ 
     9public class BooleanValueLoader implements SkinValueLoader { 
     10 
     11        private static String KIND = "boolean"; 
     12         
     13        public Object createValue(String value, String path) { 
     14                String valueString = value.toLowerCase(); 
     15                String trueString = Boolean.TRUE.toString().toLowerCase(); 
     16         
     17                return valueString.equals(trueString) ? true : false; 
     18        } 
     19 
     20        public String getKind() { 
     21                return KIND; 
     22        } 
     23} 
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/file/SaveBookAsItem.java

     
    55 
    66import javax.swing.KeyStroke; 
    77 
     8import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    89import org.sophie2.base.commons.util.OSUtil; 
    910import org.sophie2.base.skins.SkinElementId; 
    1011import org.sophie2.base.visual.skins.ElementPartCreator; 
     
    2728        private static void defineSkin(ElementPartCreator part) { 
    2829                part.add(TITLE_PROP_ID, "Save Book As..."); 
    2930                part.add(TOOL_TIP_PROP_ID, "Save the current book with a new name"); 
    30                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_A); 
     31                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_A)); 
    3132                part.add(ACCELERATOR_PROP_ID, KeyStroke.getKeyStroke(KeyEvent.VK_S, 
    3233                                OSUtil.getDefaultMask() | InputEvent.SHIFT_MASK)); 
    3334        } 
  • modules/org.sophie2.base.skins/src/main/java/org/sophie2/base/skins/SkinManager.java

     
    7272        }; 
    7373         
    7474        /** 
    75          * Config key for current language skin. 
     75         * Config key for current language pack. 
    7676         */ 
    7777        public static final ConfigKey<String> CURRENT_LANGUAGE_PACK = ConfigKey.makeKey( 
    7878                        String.class, "currentLanguagePack", "skins.config", SkinManager.LANGUAGE_PACK_NAME); 
     79         
     80        /** 
     81         * Config key for current  theme pack. 
     82         */ 
     83        public static final ConfigKey<String> CURRENT_THEME_PACK = ConfigKey.makeKey( 
     84                        String.class, "currentThemePack", "skins.config", SkinManager.THEME_PACK_NAME); 
     85         
     86        /** 
     87         * Config key for current interaction pack. 
     88         */ 
     89        public static final ConfigKey<String> CURRENT_INTERACTION_PACK = ConfigKey.makeKey( 
     90                        String.class, "currentInteractionPack", "skins.config", SkinManager.INTERACTION_PACK_NAME); 
    7991 
    8092         
    8193        private Skin defaultLanguagePack = null; 
    82         private Skin defaultPack = null; 
     94        private Skin defaultThemePack = null; 
     95        private Skin defaultInteractionPack = null; 
    8396 
    8497        /** 
    85          * The name of the default skin. 
     98         * The name of the default language pack. 
    8699         */ 
    87         public final static String DEFAULT_NAME = "default:en"; 
    88  
     100        public final static String LANGUAGE_PACK_NAME = "language:default"; 
     101         
     102        /** 
     103         * The name of the default theme pack. 
     104         */ 
     105        public final static String THEME_PACK_NAME = "theme:default";  
     106         
    89107        /** 
    90          * The name of the default language skin. 
     108         * The name of the default interaction pack. 
    91109         */ 
    92         public final static String LANGUAGE_PACK_NAME = "language:default";  
     110        public final static String INTERACTION_PACK_NAME = "interaction:default"; 
    93111         
    94112        /** 
    95113         * Singleton method to return an instance of the default language skin. 
     
    99117         */ 
    100118        public Skin getDefaultLanguagePack() { 
    101119                if (this.defaultLanguagePack == null) { 
    102                         this.defaultLanguagePack = new Skin(SkinManager.LANGUAGE_PACK_NAME, getDefaultPack()); 
     120                        this.defaultLanguagePack = new Skin(SkinManager.LANGUAGE_PACK_NAME, null); 
    103121                } 
    104122                 
    105123                return this.defaultLanguagePack; 
    106124        } 
    107125         
    108126        /** 
    109          * Singleton method to return an instance of the default skin. 
     127         * Singleton method to return an instance of the default theme pack. 
    110128         *  
    111129         * @return  
    112          *                      An instance of the default skin. 
     130         *                      An instance of the default theme pack. 
    113131         */ 
    114         public Skin getDefaultPack() { 
    115                 if (this.defaultPack == null) { 
    116                         this.defaultPack = new Skin(SkinManager.DEFAULT_NAME, null); 
     132        public Skin getDefaultThemePack() { 
     133                if (this.defaultThemePack == null) { 
     134                        this.defaultThemePack = new Skin(SkinManager.THEME_PACK_NAME, null); 
    117135                } 
    118136                 
    119                 return this.defaultPack; 
     137                return this.defaultThemePack; 
    120138        } 
    121139         
    122140        /** 
    123          * Property for synchronizing skins. 
     141         * Singleton method to return an instance of the default interaction pack. 
     142         *  
     143         * @return  
     144         *                      An instance of the default interaction pack. 
     145         */ 
     146        public Skin getDefaultInteractionPack() { 
     147                if (this.defaultInteractionPack == null) { 
     148                        this.defaultInteractionPack = new Skin(SkinManager.INTERACTION_PACK_NAME, null); 
     149                } 
     150                 
     151                return this.defaultInteractionPack; 
     152        } 
     153         
     154        /** 
     155         * Property for synchronizing language packs. 
    124156         * @return  
    125157         *                      The property 
    126158         */ 
    127         public Prop<Void> syncSkin() { 
    128                 class syncSkin extends ResourceProperty<Void> { 
     159        public Prop<Void> syncLanguagePack() { 
     160                class syncLanguagePack extends ResourceProperty<Void> { 
    129161 
    130162                        @Override 
    131163                        protected Void create() { 
     
    143175 
    144176                                String currentLanguage = ConfigurationManager.get().getValue(CURRENT_LANGUAGE_PACK); 
    145177                                 
    146                                 SophieLog.info("Loading skin " + currentLanguage); 
     178                                SophieLog.info("Loading language pack " + currentLanguage); 
    147179 
    148180                                SimpleSkinPartsProvider provider = BaseSkinsModule.get() 
    149181                                                .getSimpleSkinPartsProvider(); 
    150                                 Skin skin = createSkin(currentLanguage, provider.parts().get(), SkinManager.LANGUAGE_PACK_NAME); 
     182                                Skin skin = createSkin(currentLanguage, provider.parts().get()); 
    151183                                currentLanguagePack().set(skin); 
    152184                        } 
    153185                } 
    154                 return getBean().makeProp(syncSkin.class); 
     186                return getBean().makeProp(syncLanguagePack.class); 
     187        } 
     188         
     189        /** 
     190         * Property for synchronizing theme packs. 
     191         * @return  
     192         *                      The property 
     193         */ 
     194        public Prop<Void> syncThemePack() { 
     195                class syncThemePack extends ResourceProperty<Void> { 
     196 
     197                        @Override 
     198                        protected Void create() { 
     199                                return null; 
     200                        } 
     201 
     202                        @Override 
     203                        protected void destroy(Void res) { 
     204                                //TODO 
     205                        } 
     206 
     207                        @SuppressWarnings("synthetic-access") 
     208                        @Override 
     209                        protected void setup(Void res) { 
     210 
     211                                String currentTheme = ConfigurationManager.get().getValue(CURRENT_THEME_PACK); 
     212                                 
     213                                SimpleSkinPartsProvider provider = BaseSkinsModule.get() 
     214                                                .getSimpleSkinPartsProvider(); 
     215                                Skin skin = createSkin(currentTheme, provider.parts().get()); 
     216                                currentThemePack().set(skin); 
     217                        } 
     218                } 
     219                return getBean().makeProp(syncThemePack.class); 
     220        } 
     221         
     222        /** 
     223         * Property for synchronizing interaction packs. 
     224         * @return  
     225         *                      The property 
     226         */ 
     227        public Prop<Void> syncInteractionPack() { 
     228                class syncInteractionPack extends ResourceProperty<Void> { 
     229 
     230                        @Override 
     231                        protected Void create() { 
     232                                return null; 
     233                        } 
     234 
     235                        @Override 
     236                        protected void destroy(Void res) { 
     237                                //TODO 
     238                        } 
     239 
     240                        @SuppressWarnings("synthetic-access") 
     241                        @Override 
     242                        protected void setup(Void res) { 
     243 
     244                                String currentInteraction = ConfigurationManager.get().getValue(CURRENT_INTERACTION_PACK); 
     245                                 
     246                                SophieLog.info("Loading interaction pack " + currentInteraction); 
     247 
     248                                SimpleSkinPartsProvider provider = BaseSkinsModule.get() 
     249                                                .getSimpleSkinPartsProvider(); 
     250                                Skin skin = createSkin(currentInteraction, provider.parts().get()); 
     251                                 
     252                                currentInteractionPack().set(skin); 
     253                        } 
     254                } 
     255                return getBean().makeProp(syncInteractionPack.class); 
    155256        } 
    156257         
    157258        /** 
     
    164265         * @return 
    165266         *                      The new skin created. 
    166267         */ 
    167         private static Skin createSkin(String skinName, List<SkinPart> parts, String packName) { 
     268        private static Skin createSkin(String skinName, List<SkinPart> parts) { 
    168269 
    169270                if (SkinManager.skinCache.containsKey(skinName)) { 
    170271                        SophieLog.trace("Skin loaded from cache " + skinName); 
     
    176277                SophieLog.trace(skinDef); 
    177278 
    178279                if (skinDef == null) { 
    179                         return SkinManager.skinCache.get(packName); 
     280                        return SkinManager.skinCache.get(NONE_SKIN_VALUE); 
    180281                } 
    181282 
    182283                loadSkinParts(skinName, parts); 
    183284                 
    184285                String fallbackName = getFallbackSkinName(skinDef); 
    185                 Skin fallbackSkin = createSkin(fallbackName, parts, packName); 
     286                Skin fallbackSkin = createSkin(fallbackName, parts); 
    186287                 
    187288                Skin skin = new Skin(skinName, fallbackSkin); 
    188289                SkinManager.skinCache.put(skinName, skin); 
     
    208309            String begin = skinName.substring(0, index); 
    209310            String end = skinName.substring(index + 1); 
    210311            String languagePackDir = begin + "_" + end;  
    211                  
    212                 List<String> partEntries = FileEntryManager.get().listFileEntries("skins/" + languagePackDir); 
     312                String path = "skins/" + languagePackDir; 
     313                List<String> partEntries = FileEntryManager.get().listFileEntries(path); 
    213314                for (String part : partEntries) { 
    214315                         
    215                         SophieLog.trace("Loading part " + part); 
     316                        SophieLog.trace("Loading pack " + part); 
    216317                         
    217318                        int relativeIndex = part.lastIndexOf("skins"); 
    218319                        String relativePath = part.substring(relativeIndex); 
     
    220321                        URL partFile = FileEntryManager.get().getReadableFileEntry(relativePath); 
    221322                         
    222323                        BaseSkinPart skinPart = new BaseSkinPart(skinName); 
    223                         loadPart(skinName, partFile, skinPart); 
     324                        loadPart(skinName, partFile, skinPart, path); 
    224325                        parts.add(skinPart); 
    225326                } 
    226327        } 
    227328 
    228329        private static void loadPart(String skinName, URL partFile, 
    229                         BaseSkinPart skinPart) { 
     330                        BaseSkinPart skinPart, String path) { 
    230331                 
    231332                BufferedReader input = null; 
    232333 
     
    238339                        while ((line = input.readLine()) != null) { 
    239340                                String trimmed = line.trim(); 
    240341                                if (!trimmed.equals("") && !trimmed.startsWith("#")) { 
    241                                         initRecord(skinName, skinPart, line); 
     342                                        initRecord(skinName, skinPart, line, path); 
    242343                                } 
    243344                        } 
    244345 
     
    255356                } 
    256357        } 
    257358                 
    258         private static void initRecord(String skinName, SkinPart part, String toPart) { 
     359        private static void initRecord(String skinName, SkinPart part, String toPart, String path) { 
    259360                 
    260361                String[] idParts = toPart.trim().split(" : ", PARTS_NUMBER); 
    261362                 
    262363                if (idParts.length == PARTS_NUMBER) { 
    263                         Object value = createValue(idParts[1], idParts[2], skinName); 
     364                        Object value = createValue(idParts[1], idParts[2], skinName, path); 
    264365 
    265366                        if (value != null) { 
    266367                                part.records().get().add( 
     
    273374        } 
    274375         
    275376        private static final Object createValue(String kind, String value, 
    276                         String skinName) { 
     377                        String skinName, String path) { 
    277378 
    278379                assert kind != null && kind != "" : "The kind of the value that is to be created should " + 
    279380                                "not be null and should not be an empty string"; 
     
    283384 
    284385                for (SophieExtension<SkinValueLoader> entry : extensions) { 
    285386                        if (kind.equals(entry.getObject().getKind())) { 
    286                                 Object res = entry.getObject().createValue(value); 
     387                                Object res = entry.getObject().createValue(value, path); 
    287388                                return res; 
    288389                        } 
    289390                } 
    290391 
    291392                return null; 
    292         }        
     393        } 
    293394         
    294395        /** 
    295          * The current Skin that is in use. 
     396         * The current language skin pack that is in use. 
    296397         *  
    297          * @return  
    298          *              The property. 
     398         * @return 
     399         *                      The property. 
    299400         */ 
    300         public RwProp<Skin> currentSkin() { 
    301                 return getBean().makeValueProp("currentSkin", Skin.class); 
     401        public RwProp<Skin> currentLanguagePack() { 
     402                return getBean().makeValueProp("currentLanguagePack", Skin.class); 
    302403        } 
    303404         
    304405        /** 
    305          * The current skin that is in use. 
     406         * The current theme skin pack that is in use. 
    306407         *  
    307408         * @return 
    308409         *                      The property. 
    309410         */ 
    310         public RwProp<Skin> currentLanguagePack() { 
    311                 return getBean().makeValueProp("currentLanguagePack", Skin.class); 
     411        public RwProp<Skin> currentThemePack() { 
     412                return getBean().makeValueProp("currentThemePack", Skin.class); 
     413        } 
     414         
     415        /** 
     416         * The current interaction skin pack that is in use. 
     417         *  
     418         * @return 
     419         *                      The property. 
     420         */ 
     421        public RwProp<Skin> currentInteractionPack() { 
     422                return getBean().makeValueProp("currentInteractionPack", Skin.class); 
    312423        } 
    313424 
    314425        /** 
     
    324435 
    325436                        @Override 
    326437                        protected LookAndFeel compute() { 
    327                                 Skin currentSkin = currentSkin().get(); 
    328  
    329                                 LookAndFeel lookAndFeel = currentSkin.getValue(LOOK_AND_FEEL_SKIN_ID, 
    330                                                 LookAndFeel.class); 
     438                                Skin currentSkin = currentThemePack().get(); 
     439                                LookAndFeel lookAndFeel = currentSkin.getValue(LOOK_AND_FEEL_SKIN_ID, LookAndFeel.class);  
    331440 
    332441                                if (lookAndFeel != null) { 
    333442                                        try { 
     
    365474        // XXX: singleton 
    366475        private SkinManager() { 
    367476                skinCache.put(NONE_SKIN_VALUE, null); 
     477                skinCache.put(SkinManager.INTERACTION_PACK_NAME, getDefaultInteractionPack()); 
     478                skinCache.put(SkinManager.LANGUAGE_PACK_NAME, getDefaultLanguagePack()); 
     479                skinCache.put(SkinManager.THEME_PACK_NAME, getDefaultThemePack()); 
     480 
     481                currentThemePack().set(getDefaultThemePack()); 
    368482                currentLanguagePack().set(getDefaultLanguagePack()); 
    369                 currentSkin().set(getDefaultPack()); 
     483                currentInteractionPack().set(getDefaultInteractionPack()); 
    370484        } 
    371485 
    372486        private static SkinManager instance = null; 
  • modules/org.sophie2.main.func.help/src/main/java/org/sophie2/main/func/help/menuitems/AboutItem.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.menus.MenuMember; 
    67import org.sophie2.base.skins.SkinElementId; 
    78import org.sophie2.base.visual.BaseVisualElement; 
     
    2324                part.add(BaseVisualElement.TITLE_PROP_ID, "About"); 
    2425                part.add(BaseVisualElement.TOOL_TIP_PROP_ID, 
    2526                                "Show version and license information"); 
    26                 part.add(MenuMember.MNEMONIC_PROP_ID, KeyEvent.VK_A); 
     27                part.add(MenuMember.MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_A)); 
    2728                part.add(MenuMember.ACCELERATOR_PROP_ID, null); 
    2829        } 
    2930 
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/edit/ShowConnectionsItem.java

     
    11package org.sophie2.main.app.menus.edit; 
    22 
     3import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    34import org.sophie2.base.commons.util.ImageUtil; 
    45import org.sophie2.base.commons.util.ImmImage; 
    56import org.sophie2.base.skins.SkinElementId; 
     
    1819        private static void defineSkin(ElementPartCreator part) { 
    1920                part.add(TITLE_PROP_ID, "{generated}"); 
    2021                part.add(TOOL_TIP_PROP_ID, "Toggle the display of text frame chain connections"); 
    21                 part.add(MNEMONIC_PROP_ID, 0); 
     22                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(0)); 
    2223                part.add(ACCELERATOR_PROP_ID, null); 
    2324                part.add(ICON_PROP_ID, ImageUtil.loadIcon("tick.png")); 
    2425        } 
  • modules/org.sophie2.base.skins/src/main/java/org/sophie2/base/skins/value/loaders/TextValueLoader.java

     
    33import org.sophie2.core.modularity.SimpleSophieExtension; 
    44 
    55/** 
    6  * Extension for the extension point defined with {@link SkinValueLoader} interface. 
     6 * Extension of the extension point defined with {@link SkinValueLoader} interface. 
     7 * Processes records which kind is <b>text</b> 
    78 *  
    89 * @author tanya 
    910 */ 
     
    1112 
    1213        private static String KIND = "text"; 
    1314         
    14         public Object createValue(String value) { 
     15        public Object createValue(String value, String path) { 
    1516                return value; 
    1617        } 
    1718 
     
    2829        public SimpleSophieExtension<SkinValueLoader> asExtension() { 
    2930                return new SimpleSophieExtension<SkinValueLoader>(SkinValueLoader.class, this); 
    3031        } 
    31 } 
     32} 
     33 No newline at end of file 
  • modules/org.sophie2.base.menus/src/main/java/org/sophie2/base/menus/MenuItem.java

     
    7171                                        res.setAccelerator(accelerator().get()); 
    7272                                } 
    7373                                if (!OSUtil.isMacOS() && mnemonic().get() != null) { 
    74                                         res.setMnemonic(mnemonic().get()); 
     74                                        res.setMnemonic(mnemonic().get().getMnemonic()); 
    7575                                } 
    7676                        } 
    7777                         
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/file/BookPropertiesItem.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.skins.SkinElementId; 
    67import org.sophie2.base.visual.skins.ElementPartCreator; 
    78import org.sophie2.base.visual.skins.SkinPartDef; 
     
    2324        private static void defineSkin(ElementPartCreator part) { 
    2425                part.add(TITLE_PROP_ID, "Book Properties..."); 
    2526                part.add(TOOL_TIP_PROP_ID, "Edit the current book's title and dimensions"); 
    26                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_R); 
     27                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_R)); 
    2728        } 
    2829 
    2930         
  • modules/org.sophie2.base.skins/src/test/java/org/sophie2/base/skins/SkinsTest.java

     
    1 package org.sophie2.base.skins; 
    2  
    3 import java.util.List; 
    4  
    5 import org.sophie2.base.skins.providers.SimpleSkinPartsProvider; 
    6 import org.sophie2.core.modularity.FakeModuleRegistry; 
    7 import org.sophie2.core.modularity.SophieExtension; 
    8 import org.sophie2.core.modularity.SophieExtensionPoint; 
    9 import org.sophie2.core.modularity.SophieModule; 
    10 import org.sophie2.core.prolib.impl.AutoProperty; 
    11 import org.sophie2.core.prolib.impl.BaseProObject; 
    12 import org.sophie2.core.prolib.interfaces.Prop; 
    13 import org.sophie2.core.testing.IntegrationTestBase; 
    14  
    15 /** 
    16  * A test for Skins. Should test whether {@link Skin}s are properly changing. 
    17  *  
    18  * @author peko 
    19  */ 
    20 public class SkinsTest extends IntegrationTestBase { 
    21  
    22         // create the skin values for both skins. These are just Strings but can be 
    23         // any other types. => 
    24  
    25         // default Skin values. 
    26         private final static String DEFAULT_SKIN_TOOLTIP = "This is a tool-tip for the SkinsTest"; 
    27         private final static String DEFAULT_SKIN_TITLE = "This is a title for the SkinsTest"; 
    28         private final static String DEFAULT_SKIN_STRING = "This is just a String..."; 
    29  
    30         // alternative Skin values. 
    31         private final static String ALT_SKIN_TOOLTIP = "Th15 15 4 t00l-t1p f0r the Sk1n5Te5t"; 
    32         private final static String ALT_SKIN_TITLE = "Th15 15 4 t1tle f0r the 5k1n5Te5t"; 
    33         private final static String ALT_SKIN_STRING = "Th15 15 ju5t 4 5tr1ng..."; 
    34  
    35         // cool Skin value. 
    36         private final static String COOL_SKIN_TITLE = "<html>This is<br>a test title with <br> three lines </html>"; 
    37  
    38         private final static String TITLE_ID = "test-title"; 
    39         private final static String TOOLTIP_ID = "test-tooltip"; 
    40         private final static String STRING_ID = "test-string"; 
    41  
    42         // the class for use in the record ids. 
    43         private final static Class<DummySkinableComponent> CLAZZ = DummySkinableComponent.class; 
    44  
    45         private Skin defaultSkin; 
    46         private Skin alternativeSkin; 
    47  
    48         // the third skin will be used to set part of the values 
    49         // so that its fallback skin is used. 
    50         private Skin coolSkin3; 
    51         private static final String COOL_SKIN_NAME = "Cool Skin"; 
    52  
    53         private DummySkinableComponent component; 
    54          
    55          
    56  
    57         /** 
    58          * A module providing the needed extensions for the test. 
    59          *  
    60          * @author peko, nenko 
    61          *  
    62          */ 
    63         public static class DemoModule extends SophieModule { 
    64  
    65                 @Override 
    66                 protected void defineExtensionPoints(List<SophieExtensionPoint<?>> res) { 
    67                         // no extension points 
    68                 } 
    69  
    70                 @Override 
    71                 protected void defineExtensions(List<SophieExtension<?>> res) { 
    72                         makeSkinParts(res); 
    73                 } 
    74  
    75                 @SuppressWarnings("synthetic-access") 
    76                 private void makeSkinParts(List<SophieExtension<?>> list) { 
    77                         // the default skin will have two SkinParts. 
    78                         // create skin parts and add skin records to them. 
    79                         BaseSkinPart part1 = new BaseSkinPart(SkinManager.LANGUAGE_PACK_NAME); 
    80                         BaseSkinPart part2 = new BaseSkinPart(SkinManager.LANGUAGE_PACK_NAME); 
    81                         // the skinpart for the third skin. 
    82                         BaseSkinPart part4 = new BaseSkinPart(COOL_SKIN_NAME); 
    83  
    84                         part1.add(SkinUtil.getElementId(CLAZZ), TOOLTIP_ID, 
    85                                         DEFAULT_SKIN_TOOLTIP); 
    86                         part1.add(SkinUtil.getElementId(CLAZZ), TITLE_ID, 
    87                                         DEFAULT_SKIN_TITLE); 
    88                         part2.add(SkinUtil.getElementId(CLAZZ), STRING_ID, 
    89                                         DEFAULT_SKIN_STRING); 
    90  
    91                         part4.add(SkinUtil.getElementId(CLAZZ), TITLE_ID, COOL_SKIN_TITLE); 
    92  
    93                         SimpleSkinPartsProvider provider = new SimpleSkinPartsProvider(); 
    94                         provider.parts().add(part1); 
    95                         provider.parts().add(part2); 
    96                         provider.parts().add(part4); 
    97  
    98                         list.add(provider.asExtension()); 
    99                 } 
    100         } 
    101  
    102         /** 
    103          * A dummy implementation for a skinable component. 
    104          *  
    105          * @author peko 
    106          */ 
    107         class DummySkinableComponent extends BaseProObject { 
    108                  
    109                 /** 
    110                  * The tool-tip of this component. 
    111                  *  
    112                  * @return property. 
    113                  */ 
    114                 public Prop<String> toolTip() { 
    115                         class toolTip extends AutoProperty<String> { 
    116  
    117                                 @SuppressWarnings( { "synthetic-access", "static-access" }) 
    118                                 @Override 
    119                                 protected String compute() { 
    120                                         String res = SkinUtil.getSkinValue(SkinsTest.this.CLAZZ, 
    121                                                         TOOLTIP_ID, String.class); 
    122                                         return res; 
    123                                 } 
    124                         } 
    125                         return getBean().makeProp(toolTip.class); 
    126                 } 
    127  
    128                 /** 
    129                  * The title of this component. 
    130                  *  
    131                  * @return property. 
    132                  */ 
    133                 public Prop<String> title() { 
    134                         class title extends AutoProperty<String> { 
    135  
    136                                 @SuppressWarnings( "synthetic-access") 
    137                                 @Override 
    138                                 protected String compute() { 
    139                                         String res = SkinUtil.getSkinValue(SkinsTest.CLAZZ, 
    140                                                         TITLE_ID, String.class); 
    141                                         return res; 
    142                                 } 
    143                         } 
    144                         return getBean().makeProp(title.class); 
    145                 } 
    146  
    147                 /** 
    148                  * A string containing property for this component. 
    149                  *  
    150                  * @return property. 
    151                  */ 
    152                 public Prop<String> string() { 
    153                         class string extends AutoProperty<String> { 
    154  
    155                                 @SuppressWarnings( "synthetic-access") 
    156                                 @Override 
    157                                 protected String compute() { 
    158                                         String res = SkinUtil.getSkinValue(SkinsTest.CLAZZ, 
    159                                                         STRING_ID, String.class); 
    160                                         return res; 
    161                                 } 
    162                         } 
    163                         return getBean().makeProp(string.class); 
    164                 } 
    165  
    166         } 
    167  
    168         @SuppressWarnings("unchecked") 
    169         @Override 
    170         protected void setUp() throws Exception { 
    171                 super.setUp(); 
    172  
    173                 FakeModuleRegistry.start(BaseSkinsModule.class, DemoModule.class); 
    174  
    175                 // the default skin. 
    176                 this.defaultSkin = new Skin(SkinManager.DEFAULT_NAME, null); 
    177  
    178                 // the third skin. 
    179                 this.coolSkin3 = new Skin(COOL_SKIN_NAME, this.defaultSkin); 
    180  
    181                 this.component = new DummySkinableComponent(); 
    182         } 
    183  
    184         @Override 
    185         protected void tearDown() throws Exception { 
    186                 FakeModuleRegistry.stop(); 
    187                 super.tearDown(); 
    188         } 
    189  
    190         /** 
    191          * Tests the whether the changing of {@link Skin}s changes values properly. 
    192          */ 
    193         public void testChangeSkin() { 
    194  
    195                 // setting the skin in the SkinManager. 
    196                 SkinManager.get().currentSkin().set(this.defaultSkin); 
    197  
    198                 assertSame(SkinsTest.DEFAULT_SKIN_TOOLTIP, this.component.toolTip().get()); 
    199                 assertSame(SkinsTest.DEFAULT_SKIN_TITLE, this.component.title().get()); 
    200                 assertSame(SkinsTest.DEFAULT_SKIN_STRING, this.component.string().get()); 
    201  
    202                 // changing the skin in the SkinManager. 
    203                 SkinManager.get().currentSkin().set(this.alternativeSkin); 
    204  
    205                 assertSame(SkinsTest.ALT_SKIN_TOOLTIP, this.component.toolTip().get()); 
    206                 assertSame(SkinsTest.ALT_SKIN_TITLE, this.component.title().get()); 
    207                 assertSame(SkinsTest.ALT_SKIN_STRING, this.component.string().get()); 
    208  
    209                 // resetting the skin to the initial default skin value. 
    210                 SkinManager.get().currentSkin().set(this.defaultSkin); 
    211  
    212                 assertSame(SkinsTest.DEFAULT_SKIN_TOOLTIP, this.component.toolTip().get()); 
    213                 assertSame(SkinsTest.DEFAULT_SKIN_TITLE, this.component.title().get()); 
    214                 assertSame(SkinsTest.DEFAULT_SKIN_STRING, this.component.string().get()); 
    215  
    216                 // setting the cool skin so that the fallback skin is used (the default 
    217                 // one). 
    218                 SkinManager.get().currentSkin().set(this.coolSkin3); 
    219                 // from fallback skin. 
    220                 assertSame(SkinsTest.DEFAULT_SKIN_TOOLTIP, this.component.toolTip().get()); 
    221                 // from cool skin 
    222                 assertSame(SkinsTest.COOL_SKIN_TITLE, this.component.title().get()); 
    223                 // from fallback skin again. 
    224                 assertSame(SkinsTest.DEFAULT_SKIN_STRING, this.component.string().get()); 
    225         } 
    226 } 
     1//package org.sophie2.base.skins; 
     2// 
     3//import java.util.List; 
     4// 
     5//import org.sophie2.base.skins.providers.SimpleSkinPartsProvider; 
     6//import org.sophie2.core.modularity.FakeModuleRegistry; 
     7//import org.sophie2.core.modularity.SophieExtension; 
     8//import org.sophie2.core.modularity.SophieExtensionPoint; 
     9//import org.sophie2.core.modularity.SophieModule; 
     10//import org.sophie2.core.prolib.impl.AutoProperty; 
     11//import org.sophie2.core.prolib.impl.BaseProObject; 
     12//import org.sophie2.core.prolib.interfaces.Prop; 
     13//import org.sophie2.core.testing.IntegrationTestBase; 
     14// 
     15///** 
     16// * A test for Skins. Should test whether {@link Skin}s are properly changing. 
     17// *  
     18// * @author peko 
     19// */ 
     20//public class SkinsTest extends IntegrationTestBase { 
     21// 
     22//      // create the skin values for both skins. These are just Strings but can be 
     23//      // any other types. => 
     24// 
     25//      // default Skin values. 
     26//      private final static String DEFAULT_SKIN_TOOLTIP = "This is a tool-tip for the SkinsTest"; 
     27//      private final static String DEFAULT_SKIN_TITLE = "This is a title for the SkinsTest"; 
     28//      private final static String DEFAULT_SKIN_STRING = "This is just a String..."; 
     29// 
     30//      // alternative Skin values. 
     31//      private final static String ALT_SKIN_TOOLTIP = "Th15 15 4 t00l-t1p f0r the Sk1n5Te5t"; 
     32//      private final static String ALT_SKIN_TITLE = "Th15 15 4 t1tle f0r the 5k1n5Te5t"; 
     33//      private final static String ALT_SKIN_STRING = "Th15 15 ju5t 4 5tr1ng..."; 
     34// 
     35//      // cool Skin value. 
     36//      private final static String COOL_SKIN_TITLE = "<html>This is<br>a test title with <br> three lines </html>"; 
     37// 
     38//      private final static String TITLE_ID = "test-title"; 
     39//      private final static String TOOLTIP_ID = "test-tooltip"; 
     40//      private final static String STRING_ID = "test-string"; 
     41// 
     42//      // the class for use in the record ids. 
     43//      private final static Class<DummySkinableComponent> CLAZZ = DummySkinableComponent.class; 
     44// 
     45//      private Skin defaultSkin; 
     46//      private Skin alternativeSkin; 
     47// 
     48//      // the third skin will be used to set part of the values 
     49//      // so that its fallback skin is used. 
     50//      private Skin coolSkin3; 
     51//      private static final String COOL_SKIN_NAME = "Cool Skin"; 
     52// 
     53//      private DummySkinableComponent component; 
     54//       
     55//       
     56// 
     57//      /** 
     58//       * A module providing the needed extensions for the test. 
     59//       *  
     60//       * @author peko, nenko 
     61//       *  
     62//       */ 
     63//      public static class DemoModule extends SophieModule { 
     64// 
     65//              @Override 
     66//              protected void defineExtensionPoints(List<SophieExtensionPoint<?>> res) { 
     67//                      // no extension points 
     68//              } 
     69// 
     70//              @Override 
     71//              protected void defineExtensions(List<SophieExtension<?>> res) { 
     72//                      makeSkinParts(res); 
     73//              } 
     74// 
     75//              @SuppressWarnings("synthetic-access") 
     76//              private void makeSkinParts(List<SophieExtension<?>> list) { 
     77//                      // the default skin will have two SkinParts. 
     78//                      // create skin parts and add skin records to them. 
     79//                      BaseSkinPart part1 = new BaseSkinPart(SkinManager.LANGUAGE_PACK_NAME); 
     80//                      BaseSkinPart part2 = new BaseSkinPart(SkinManager.LANGUAGE_PACK_NAME); 
     81//                      // the skinpart for the third skin. 
     82//                      BaseSkinPart part4 = new BaseSkinPart(COOL_SKIN_NAME); 
     83// 
     84//                      part1.add(SkinUtil.getElementId(CLAZZ), TOOLTIP_ID, 
     85//                                      DEFAULT_SKIN_TOOLTIP); 
     86//                      part1.add(SkinUtil.getElementId(CLAZZ), TITLE_ID, 
     87//                                      DEFAULT_SKIN_TITLE); 
     88//                      part2.add(SkinUtil.getElementId(CLAZZ), STRING_ID, 
     89//                                      DEFAULT_SKIN_STRING); 
     90// 
     91//                      part4.add(SkinUtil.getElementId(CLAZZ), TITLE_ID, COOL_SKIN_TITLE); 
     92// 
     93//                      SimpleSkinPartsProvider provider = new SimpleSkinPartsProvider(); 
     94//                      provider.parts().add(part1); 
     95//                      provider.parts().add(part2); 
     96//                      provider.parts().add(part4); 
     97// 
     98//                      list.add(provider.asExtension()); 
     99//              } 
     100//      } 
     101// 
     102//      /** 
     103//       * A dummy implementation for a skinable component. 
     104//       *  
     105//       * @author peko 
     106//       */ 
     107//      class DummySkinableComponent extends BaseProObject { 
     108//               
     109//              /** 
     110//               * The tool-tip of this component. 
     111//               *  
     112//               * @return property. 
     113//               */ 
     114//              public Prop<String> toolTip() { 
     115//                      class toolTip extends AutoProperty<String> { 
     116// 
     117//                              @SuppressWarnings( { "synthetic-access", "static-access" }) 
     118//                              @Override 
     119//                              protected String compute() { 
     120//                                      String res = SkinUtil.getSkinValue(SkinsTest.this.CLAZZ, 
     121//                                                      TOOLTIP_ID, String.class); 
     122//                                      return res; 
     123//                              } 
     124//                      } 
     125//                      return getBean().makeProp(toolTip.class); 
     126//              } 
     127// 
     128//              /** 
     129//               * The title of this component. 
     130//               *  
     131//               * @return property. 
     132//               */ 
     133//              public Prop<String> title() { 
     134//                      class title extends AutoProperty<String> { 
     135// 
     136//                              @SuppressWarnings( "synthetic-access") 
     137//                              @Override 
     138//                              protected String compute() { 
     139//                                      String res = SkinUtil.getSkinValue(SkinsTest.CLAZZ, 
     140//                                                      TITLE_ID, String.class); 
     141//                                      return res; 
     142//                              } 
     143//                      } 
     144//                      return getBean().makeProp(title.class); 
     145//              } 
     146// 
     147//              /** 
     148//               * A string containing property for this component. 
     149//               *  
     150//               * @return property. 
     151//               */ 
     152//              public Prop<String> string() { 
     153//                      class string extends AutoProperty<String> { 
     154// 
     155//                              @SuppressWarnings( "synthetic-access") 
     156//                              @Override 
     157//                              protected String compute() { 
     158//                                      String res = SkinUtil.getSkinValue(SkinsTest.CLAZZ, 
     159//                                                      STRING_ID, String.class); 
     160//                                      return res; 
     161//                              } 
     162//                      } 
     163//                      return getBean().makeProp(string.class); 
     164//              } 
     165// 
     166//      } 
     167// 
     168//      @SuppressWarnings("unchecked") 
     169//      @Override 
     170//      protected void setUp() throws Exception { 
     171//              super.setUp(); 
     172// 
     173//              FakeModuleRegistry.start(BaseSkinsModule.class, DemoModule.class); 
     174// 
     175//              // the default skin. 
     176//              this.defaultSkin = new Skin(SkinManager.DEFAULT_NAME, null); 
     177// 
     178//              // the third skin. 
     179//              this.coolSkin3 = new Skin(COOL_SKIN_NAME, this.defaultSkin); 
     180// 
     181//              this.component = new DummySkinableComponent(); 
     182//      } 
     183// 
     184//      @Override 
     185//      protected void tearDown() throws Exception { 
     186//              FakeModuleRegistry.stop(); 
     187//              super.tearDown(); 
     188//      } 
     189// 
     190//      /** 
     191//       * Tests the whether the changing of {@link Skin}s changes values properly. 
     192//       */ 
     193//      public void testChangeSkin() { 
     194// 
     195//              // setting the skin in the SkinManager. 
     196//              SkinManager.get().currentSkin().set(this.defaultSkin); 
     197// 
     198//              assertSame(SkinsTest.DEFAULT_SKIN_TOOLTIP, this.component.toolTip().get()); 
     199//              assertSame(SkinsTest.DEFAULT_SKIN_TITLE, this.component.title().get()); 
     200//              assertSame(SkinsTest.DEFAULT_SKIN_STRING, this.component.string().get()); 
     201// 
     202//              // changing the skin in the SkinManager. 
     203//              SkinManager.get().currentSkin().set(this.alternativeSkin); 
     204// 
     205//              assertSame(SkinsTest.ALT_SKIN_TOOLTIP, this.component.toolTip().get()); 
     206//              assertSame(SkinsTest.ALT_SKIN_TITLE, this.component.title().get()); 
     207//              assertSame(SkinsTest.ALT_SKIN_STRING, this.component.string().get()); 
     208// 
     209//              // resetting the skin to the initial default skin value. 
     210//              SkinManager.get().currentSkin().set(this.defaultSkin); 
     211// 
     212//              assertSame(SkinsTest.DEFAULT_SKIN_TOOLTIP, this.component.toolTip().get()); 
     213//              assertSame(SkinsTest.DEFAULT_SKIN_TITLE, this.component.title().get()); 
     214//              assertSame(SkinsTest.DEFAULT_SKIN_STRING, this.component.string().get()); 
     215// 
     216//              // setting the cool skin so that the fallback skin is used (the default 
     217//              // one). 
     218//              SkinManager.get().currentSkin().set(this.coolSkin3); 
     219//              // from fallback skin. 
     220//              assertSame(SkinsTest.DEFAULT_SKIN_TOOLTIP, this.component.toolTip().get()); 
     221//              // from cool skin 
     222//              assertSame(SkinsTest.COOL_SKIN_TITLE, this.component.title().get()); 
     223//              // from fallback skin again. 
     224//              assertSame(SkinsTest.DEFAULT_SKIN_STRING, this.component.string().get()); 
     225//      } 
     226//} 
  • modules/org.sophie2.extra.func.plain/src/main/java/org/sophie2/extra/func/plain/InsertPlainTextItem.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.skins.SkinElementId; 
    67import org.sophie2.base.visual.skins.ElementPartCreator; 
    78import org.sophie2.base.visual.skins.SkinPartDef; 
     
    2324        private static void defineSkin(ElementPartCreator part) { 
    2425                part.add(TITLE_PROP_ID, "Plain Text..."); 
    2526                part.add(TOOL_TIP_PROP_ID, "Import plain text into a text frame on the current page"); 
    26                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_L); 
     27                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_L)); 
    2728        } 
    2829 
    2930        @Override 
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/edit/UndoItem.java

     
    44 
    55import javax.swing.KeyStroke; 
    66 
     7import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    78import org.sophie2.base.commons.util.OSUtil; 
    89import org.sophie2.base.model.resources.r4.changes.MetaChange; 
    910import org.sophie2.base.skins.SkinElementId; 
     
    2425        private static void defineSkin(ElementPartCreator part) { 
    2526                part.add(TITLE_PROP_ID, "{generated}"); 
    2627                part.add(TOOL_TIP_PROP_ID, "Undo the last action"); 
    27                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_U); 
     28                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_U)); 
    2829                part.add(ACCELERATOR_PROP_ID, KeyStroke.getKeyStroke(KeyEvent.VK_Z, OSUtil.getDefaultMask())); 
    2930        } 
    3031 
  • modules/org.sophie2.extra.func.browser/src/main/java/org/sophie2/extra/func/browser/view/InsertBrowserItem.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.skins.SkinElementId; 
    67import org.sophie2.base.visual.skins.ElementPartCreator; 
    78import org.sophie2.base.visual.skins.SkinPartDef; 
     
    2122        private static void defineSkin(ElementPartCreator part) { 
    2223                part.add(TITLE_PROP_ID, "Browser"); 
    2324                part.add(TOOL_TIP_PROP_ID, "Insert a browser frame on the current page"); 
    24                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_W); 
     25                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_W)); 
    2526        } 
    2627 
    2728        @Override 
  • modules/org.sophie2.main.func.resources/src/main/java/org/sophie2/main/func/resources/exports/ExportToPackageItem.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.skins.SkinElementId; 
    67import org.sophie2.base.visual.skins.ElementPartCreator; 
    78import org.sophie2.base.visual.skins.SkinPartDef; 
     
    2324        private static void defineSkin(ElementPartCreator part) { 
    2425                part.add(TITLE_PROP_ID, "Sophie Package..."); 
    2526                part.add(TOOL_TIP_PROP_ID, "Exports current book to package file"); 
    26                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_S); 
     27                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_S)); 
    2728        } 
    2829 
    2930        /** 
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/view/ViewMenu.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.menus.MenuMember; 
    67import org.sophie2.base.skins.SkinElementId; 
    78import org.sophie2.base.visual.BaseVisualElement; 
     
    2930                part.add(BaseVisualElement.TITLE_PROP_ID, "View"); 
    3031                part.add(BaseVisualElement.TOOL_TIP_PROP_ID, 
    3132                        "View Menu (Alt+V)"); 
    32                 part.add(MenuMember.MNEMONIC_PROP_ID, KeyEvent.VK_V); 
     33                part.add(MenuMember.MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_V)); 
    3334                part.add(MenuMember.ACCELERATOR_PROP_ID, null); 
    3435        } 
    3536         
  • modules/org.sophie2.extra.func.html/src/main/java/org/sophie2/extra/func/html/view/InsertHtmlItem.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.skins.SkinElementId; 
    67import org.sophie2.base.visual.skins.ElementPartCreator; 
    78import org.sophie2.base.visual.skins.SkinPartDef; 
     
    2122        private static void defineSkin(ElementPartCreator part) { 
    2223                part.add(TITLE_PROP_ID, "Html..."); 
    2324                part.add(TOOL_TIP_PROP_ID, "Import HTML text content into a frame on the current page"); 
    24                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_H); 
     25                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_H)); 
    2526        } 
    2627         
    2728        @Override 
  • modules/org.sophie2.extra.func.print/src/main/java/org/sophie2/extra/func/print/view/PrintItem.java

     
    44 
    55import javax.swing.KeyStroke; 
    66 
     7import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    78import org.sophie2.base.commons.util.OSUtil; 
    89import org.sophie2.base.skins.SkinElementId; 
    910import org.sophie2.base.visual.skins.ElementPartCreator; 
     
    2324        private static void defineSkin(ElementPartCreator part) { 
    2425                part.add(TITLE_PROP_ID, "Print..."); 
    2526                part.add(TOOL_TIP_PROP_ID, "Print the book"); 
    26                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_P); 
     27                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_P)); 
    2728                part.add(ACCELERATOR_PROP_ID,  
    2829                                KeyStroke.getKeyStroke(KeyEvent.VK_P, OSUtil.getDefaultMask())); 
    2930        } 
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/file/NewBookItem.java

     
    44 
    55import javax.swing.KeyStroke; 
    66 
     7import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    78import org.sophie2.base.commons.util.OSUtil; 
    89import org.sophie2.base.skins.SkinElementId; 
    910import org.sophie2.base.visual.skins.ElementPartCreator; 
     
    2324        private static void defineSkin(ElementPartCreator part) { 
    2425                part.add(TITLE_PROP_ID, "New Book"); 
    2526                part.add(TOOL_TIP_PROP_ID, "Create a new book"); 
    26                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_N); 
     27                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_N)); 
    2728                part.add(ACCELERATOR_PROP_ID, KeyStroke.getKeyStroke(KeyEvent.VK_N, OSUtil.getDefaultMask())); 
    2829        } 
    2930 
  • modules/org.sophie2.main.func.media/src/main/java/org/sophie2/main/func/media/view/controls/InsertAudioRecordItem.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.visual.skins.ElementPartCreator; 
    67import org.sophie2.base.visual.skins.SkinPartDef; 
    78import org.sophie2.main.app.menus.insert.InsertResourceMenuItem; 
     
    1920        private static void defineSkin(ElementPartCreator part) { 
    2021                part.add(TITLE_PROP_ID, "Audio Record..."); 
    2122                part.add(TOOL_TIP_PROP_ID, "Record audio and add it to the current page"); 
    22                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_R); 
     23                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_R)); 
    2324        } 
    2425         
    2526        @Override 
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/file/OpenItem.java

     
    44 
    55import javax.swing.KeyStroke; 
    66 
     7import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    78import org.sophie2.base.commons.util.OSUtil; 
    89import org.sophie2.base.skins.SkinElementId; 
    910import org.sophie2.base.visual.skins.ElementPartCreator; 
     
    2324        private static void defineSkin(ElementPartCreator part) { 
    2425                part.add(TITLE_PROP_ID, "Open"); 
    2526                part.add(TOOL_TIP_PROP_ID, "Open an existing resource"); 
    26                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_O); 
     27                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_O)); 
    2728                part.add(ACCELERATOR_PROP_ID, KeyStroke.getKeyStroke(KeyEvent.VK_O, OSUtil.getDefaultMask())); 
    2829        } 
    2930 
  • modules/org.sophie2.base.menus/src/main/java/org/sophie2/base/menus/testing/DummyMenu.java

     
    22 
    33import javax.swing.KeyStroke; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.menus.Menu; 
    67import org.sophie2.core.prolib.interfaces.RwProp; 
    78 
     
    2223         */ 
    2324        public DummyMenu(String toolTip, int mnemonic, KeyStroke accelerator) { 
    2425                toolTip().set(toolTip); 
    25                 mnemonic().set(mnemonic); 
     26                mnemonic().set(new MenuMemberMnemonic(mnemonic)); 
    2627                accelerator().set(accelerator); 
    2728        } 
    2829         
     
    5152 
    5253         
    5354        @Override 
    54         public RwProp<Integer> mnemonic() { 
    55                 return getBean().makeValueProp("mnemonic", Integer.class, 0); 
     55        public RwProp<MenuMemberMnemonic> mnemonic() { 
     56                return getBean().makeValueProp("mnemonic", MenuMemberMnemonic.class, new MenuMemberMnemonic(0)); 
    5657        } 
    5758         
    5859        @Override 
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/edit/EditMenu.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.skins.SkinElementId; 
    67import org.sophie2.base.visual.skins.ElementPartCreator; 
    78import org.sophie2.base.visual.skins.SkinPartDef; 
     
    2021        private static void defineSkin(ElementPartCreator part) { 
    2122                part.add(TITLE_PROP_ID, "Edit"); 
    2223                part.add(TOOL_TIP_PROP_ID, "Edit menu (Alt+E)"); 
    23                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_E); 
     24                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_E)); 
    2425        } 
    2526 
    2627        @Override 
  • modules/org.sophie2.main.func.help/src/main/java/org/sophie2/main/func/help/HelpModule.java

     
    77 
    88import javax.swing.KeyStroke; 
    99 
     10import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    1011import org.sophie2.base.commons.util.OSUtil; 
    1112import org.sophie2.base.config.ConfigKey; 
    1213import org.sophie2.base.dialogs.Dialog; 
     
    195196                BaseSkinPart res = new BaseSkinPart(); 
    196197 
    197198                res.add(SkinUtil.getElementId(HelpMenu.class), MenuMember.MNEMONIC_PROP_ID, 
    198                                 KeyEvent.VK_H); 
     199                                new MenuMemberMnemonic(KeyEvent.VK_H)); 
    199200                res.add(SkinUtil.getElementId(HelpMenu.class), MenuMember.ACCELERATOR_PROP_ID, null); 
    200201 
    201                 res.add(SkinUtil.getElementId(InspectorItem.class), MenuMember.MNEMONIC_PROP_ID, -1); 
     202                res.add(SkinUtil.getElementId(InspectorItem.class), MenuMember.MNEMONIC_PROP_ID, new MenuMemberMnemonic(-1)); 
    202203                if ( Boolean.valueOf(System.getProperty("sophie2.development")) ) { 
    203204                        res.add(SkinUtil.getElementId(InspectorItem.class), MenuMember.ACCELERATOR_PROP_ID, 
    204205                                        KeyStroke.getKeyStroke(KeyEvent.VK_I, OSUtil.getDefaultMask())); 
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/file/CloseBookItem.java

     
    44 
    55import javax.swing.KeyStroke; 
    66 
     7import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    78import org.sophie2.base.commons.util.OSUtil; 
    89import org.sophie2.base.layout.model.DocView; 
    910import org.sophie2.base.layout.model.MainWindow; 
     
    2526        private static void defineSkin(ElementPartCreator part) { 
    2627                part.add(TITLE_PROP_ID, "Close Book"); 
    2728                part.add(TOOL_TIP_PROP_ID, "Close the current book"); 
    28                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_C); 
     29                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_C)); 
    2930                part.add(ACCELERATOR_PROP_ID, KeyStroke.getKeyStroke(KeyEvent.VK_W, OSUtil.getDefaultMask())); 
    3031        } 
    3132 
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/window/TileItem.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.skins.SkinElementId; 
    67import org.sophie2.base.visual.skins.ElementPartCreator; 
    78import org.sophie2.base.visual.skins.SkinPartDef; 
     
    2021        private static void defineSkin(ElementPartCreator part) { 
    2122                part.add(TITLE_PROP_ID, "Tile"); 
    2223                part.add(TOOL_TIP_PROP_ID, "Arrange the book windows so they are shown side by side"); 
    23                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_T); 
     24                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_T)); 
    2425        } 
    2526         
    2627        @Override 
  • modules/org.sophie2.main.func.media/src/main/java/org/sophie2/main/func/media/view/InsertAudioItem.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.skins.SkinElementId; 
    67import org.sophie2.base.visual.skins.ElementPartCreator; 
    78import org.sophie2.base.visual.skins.SkinPartDef; 
     
    2122        private static void defineSkin(ElementPartCreator part) { 
    2223                part.add(TITLE_PROP_ID, "Audio..."); 
    2324                part.add(TOOL_TIP_PROP_ID, "Add an audio file to the current page"); 
    24                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_A); 
     25                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_A)); 
    2526        } 
    2627 
    2728        @Override 
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/window/DocumentItem.java

     
    11package org.sophie2.main.app.menus.window; 
    22 
     3import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    34import org.sophie2.base.commons.util.ImageUtil; 
    45import org.sophie2.base.commons.util.ImmImage; 
    56import org.sophie2.base.layout.impl.DefaultDocView; 
     
    2324        private static void defineSkin(ElementPartCreator part) { 
    2425                part.add(TITLE_PROP_ID, "{generated:document-title}"); 
    2526                part.add(TOOL_TIP_PROP_ID, "Switch to this document window"); 
    26                 part.add(MNEMONIC_PROP_ID, 0); 
     27                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(0)); 
    2728                part.add(ICON_PROP_ID, ImageUtil.loadIcon("tick.png")); 
    2829        } 
    2930         
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/view/NormalModeItem.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.commons.util.ImageUtil; 
    67import org.sophie2.base.commons.util.ImmImage; 
    78import org.sophie2.base.layout.model.MainWindowOptions.ScreenMode; 
     
    2930                part.add(BaseVisualElement.TITLE_PROP_ID, "Normal mode"); 
    3031                part.add(BaseVisualElement.TOOL_TIP_PROP_ID, 
    3132                                "Use Sophie in a window"); 
    32                 part.add(MenuMember.MNEMONIC_PROP_ID, KeyEvent.VK_N); 
     33                part.add(MenuMember.MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_N)); 
    3334                part.add(ICON_PROP_ID, ImageUtil.loadIcon("tick.png")); 
    3435        } 
    3536 
  • modules/org.sophie2.main.func.media/src/main/java/org/sophie2/main/func/media/view/InsertVideoItem.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.skins.SkinElementId; 
    67import org.sophie2.base.visual.skins.ElementPartCreator; 
    78import org.sophie2.base.visual.skins.SkinPartDef; 
     
    2122        private static void defineSkin(ElementPartCreator part) { 
    2223                part.add(TITLE_PROP_ID, "Video..."); 
    2324                part.add(TOOL_TIP_PROP_ID, "Add a video file to the current page"); 
    24                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_V); 
     25                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_V)); 
    2526        } 
    2627 
    2728        @Override 
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/skins/DefaultSkinItem.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.commons.util.ImageUtil; 
    67import org.sophie2.base.commons.util.ImmImage; 
    78import org.sophie2.base.menus.MenuItem; 
     
    2526        private static void defineSkin(ElementPartCreator part) { 
    2627                part.add(TITLE_PROP_ID, "Default Skin"); 
    2728                part.add(TOOL_TIP_PROP_ID, "Switch to default skin"); 
    28                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_D); 
     29                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_D)); 
    2930                part.add(ICON_PROP_ID, ImageUtil.loadIcon("tick.png")); 
    3031        } 
    3132         
     
    3637         
    3738        @Override 
    3839        protected ImmImage computeIcon() { 
    39                 if(SkinManager.get().currentSkin().get().skinName().get().equals(SkinManager.DEFAULT_NAME)) { 
     40                if(SkinManager.get().currentThemePack().get() != null && 
     41                                SkinManager.get().currentThemePack().get().skinName().get().equals(SkinManager.THEME_PACK_NAME)) { 
    4042                        return super.computeIcon(); 
    4143                } 
    4244                 
  • modules/org.sophie2.base.skins/src/main/java/org/sophie2/base/skins/SkinUtil.java

     
    33import java.util.ArrayList; 
    44import java.util.List; 
    55 
     6import javax.swing.KeyStroke; 
     7 
     8import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    69import org.sophie2.core.logging.SophieLog; 
    710 
    811/** 
     
    9194                        Class<T> valueClass) { 
    9295                assert valueClass != null : "valueClass must be not null"; 
    9396                assert elementClass != null : "elementClass must be not null"; 
     97 
     98                Skin currentPack = currentPack(valueClass); 
     99                Skin defaultPack = defaultPack(valueClass); 
    94100                 
    95                 Skin currentSkin; 
     101                T res = searchSkin(elementClass, propId, valueClass, currentPack); 
    96102                 
    97                 if (valueClass.equals(String.class)) { 
    98                          
    99                         currentSkin = SkinManager.get().currentLanguagePack().get(); 
    100                          
    101                         T res = searchSkin(elementClass, propId, valueClass, currentSkin); 
    102                          
    103                         if (res != null) { 
    104                                 return res; 
    105                         } 
    106                          
    107                         Skin defaultLanguagePack = SkinManager.get().getDefaultLanguagePack(); 
    108                         res = searchSkin(elementClass, propId, valueClass, defaultLanguagePack); 
    109                          
     103                if (res != null) { 
    110104                        return res; 
    111                 }  
     105                } 
    112106                 
    113                 currentSkin = SkinManager.get().currentSkin().get(); 
    114  
    115                 T res = searchSkin(elementClass, propId, valueClass, currentSkin); 
    116  
     107                res = searchSkin(elementClass, propId, valueClass, defaultPack); 
     108                 
    117109                if (res == null) { 
    118110                        SophieLog.debugf( 
    119111                                        "Cannot get skin value for element class %s id %s and value" 
    120112                                                        + " class: %s", elementClass.getName(), propId, 
    121113                                        valueClass.getName()); 
    122114                } 
     115                 
    123116                return res; 
    124117        } 
    125118         
     
    142135                List<T> res = new ArrayList<T>(); 
    143136                for (Class<?> c = elementClass; c != null; c = c.getSuperclass()) { 
    144137                        String id = SkinUtil.getElementId(c); 
    145                         res.addAll(SkinManager.get().currentSkin().get().getValues(id, 
     138                        res.addAll(currentPack(valueClass).getValues(id, 
    146139                                        propId, valueClass)); 
    147140                } 
     141                 
    148142                return res; 
    149143        } 
     144         
     145        private static <T> Skin currentPack(Class<T> valueClass) { 
     146                 
     147                 
     148                if (valueClass.equals(String.class)) { 
     149                        return SkinManager.get().currentLanguagePack().get(); 
     150                } else if (valueClass.equals(valueClass.equals(KeyStroke.class) || valueClass.equals(MenuMemberMnemonic.class))){ 
     151                        return SkinManager.get().currentInteractionPack().get(); 
     152                }  
     153 
     154                return SkinManager.get().currentThemePack().get(); 
     155        } 
     156         
     157        private static <T> Skin defaultPack(Class<T> valueClass) { 
     158                 
     159                if (valueClass.equals(String.class)) { 
     160                        return SkinManager.get().getDefaultLanguagePack(); 
     161                } else if (valueClass.equals(valueClass.equals(KeyStroke.class) || valueClass.equals(MenuMemberMnemonic.class))){ 
     162                        return SkinManager.get().getDefaultInteractionPack(); 
     163                }  
     164                 
     165                return SkinManager.get().getDefaultThemePack(); 
     166        } 
    150167} 
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/edit/CutItem.java

     
    44 
    55import javax.swing.KeyStroke; 
    66 
     7import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    78import org.sophie2.base.commons.util.OSUtil; 
    89import org.sophie2.base.visual.skins.ElementPartCreator; 
    910import org.sophie2.base.visual.skins.SkinPartDef; 
     
    2728                part.add(TITLE_PROP_ID, "Cut"); 
    2829                part.add(TOOL_TIP_PROP_ID, "Cut the current selection"); 
    2930                part.add(ACCELERATOR_PROP_ID, KeyStroke.getKeyStroke(KeyEvent.VK_X, OSUtil.getDefaultMask())); 
    30                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_T); 
     31                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_T)); 
    3132        } 
    3233 
    3334        @Override 
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/file/SaveBookAsTemplateItem.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.skins.SkinElementId; 
    67import org.sophie2.base.visual.skins.ElementPartCreator; 
    78import org.sophie2.base.visual.skins.SkinPartDef; 
     
    2324        private static void defineSkin(ElementPartCreator part) { 
    2425                part.add(TITLE_PROP_ID, "Save As Template"); 
    2526                part.add(TOOL_TIP_PROP_ID, "Save the current book as a book template"); 
    26                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_T); 
     27                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_T)); 
    2728        } 
    2829 
    2930 
  • modules/org.sophie2.base.commons/src/main/java/org/sophie2/base/commons/gui/MenuMemberMnemonic.java

     
     1package org.sophie2.base.commons.gui; 
     2 
     3/** 
     4 * Wrapper class for the mnemonics of menu items of Sophie. 
     5 *  
     6 * @author tanya 
     7 */ 
     8public class MenuMemberMnemonic { 
     9 
     10        private Integer mnemonic; 
     11         
     12        /** 
     13         * Constructor. Creates new object by integer which is the mnemonic itself. 
     14         *  
     15         * @param mnemonic 
     16         *                              The mnemonic itself. 
     17         */ 
     18        public MenuMemberMnemonic (int mnemonic) { 
     19                this.mnemonic = mnemonic; 
     20        } 
     21         
     22        /** 
     23         * Returns the mnemonic. 
     24         *  
     25         * @return 
     26         *              The mnemonic. 
     27         */ 
     28        public Integer getMnemonic() { 
     29                return this.mnemonic; 
     30        } 
     31} 
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/edit/RedoItem.java

     
    44 
    55import javax.swing.KeyStroke; 
    66 
     7import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    78import org.sophie2.base.commons.util.OSUtil; 
    89import org.sophie2.base.model.resources.r4.changes.MetaChange; 
    910import org.sophie2.base.skins.SkinElementId; 
     
    2425        private static void defineSkin(ElementPartCreator part) { 
    2526                part.add(TITLE_PROP_ID, "{generated}"); 
    2627                part.add(TOOL_TIP_PROP_ID, "Redo the last undone action"); 
    27                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_R); 
     28                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_R)); 
    2829                part.add(ACCELERATOR_PROP_ID, KeyStroke.getKeyStroke(KeyEvent.VK_Y, OSUtil.getDefaultMask())); 
    2930        } 
    3031 
  • modules/org.sophie2.main.func.help/src/main/java/org/sophie2/main/func/help/menuitems/HelpContentsItem.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.menus.MenuMember; 
    67import org.sophie2.base.skins.SkinElementId; 
    78import org.sophie2.base.visual.BaseVisualElement; 
     
    2223        private static void defineSkin(ElementPartCreator part) { 
    2324                part.add(BaseVisualElement.TITLE_PROP_ID, "Help Contents"); 
    2425                part.add(BaseVisualElement.TOOL_TIP_PROP_ID, "Display the main help index"); 
    25                 part.add(MenuMember.MNEMONIC_PROP_ID, KeyEvent.VK_H); 
     26                part.add(MenuMember.MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_H)); 
    2627                part.add(MenuMember.ACCELERATOR_PROP_ID, null); 
    2728        } 
    2829         
  • modules/org.sophie2.main.func.text/src/main/java/org/sophie2/main/func/text/rtf/InsertRtfItem.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.skins.SkinElementId; 
    67import org.sophie2.base.visual.skins.ElementPartCreator; 
    78import org.sophie2.base.visual.skins.SkinPartDef; 
     
    2324        private static void defineSkin(ElementPartCreator part) { 
    2425                part.add(TITLE_PROP_ID, "Rtf..."); 
    2526                part.add(TOOL_TIP_PROP_ID, "Import RTF text content into a frame on the current page"); 
    26                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_R); 
     27                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_R)); 
    2728        } 
    2829 
    2930        @Override 
  • modules/org.sophie2.base.menus/src/main/java/org/sophie2/base/menus/testing/DummyMenuItem.java

     
    22 
    33import javax.swing.KeyStroke; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.menus.MenuItem; 
    67import org.sophie2.core.logging.SophieLog; 
    78import org.sophie2.core.mvc.EventFilterBuilder; 
     
    6263         */ 
    6364        public DummyMenuItem(String toolTip, int mnemonic, KeyStroke accelerator) { 
    6465                toolTip().set(toolTip); 
    65                 mnemonic().set(mnemonic); 
     66                mnemonic().set(new MenuMemberMnemonic(mnemonic)); 
    6667                accelerator().set(accelerator); 
    6768        } 
    6869         
     
    8283        } 
    8384         
    8485        @Override 
    85         public RwProp<Integer> mnemonic() { 
    86                 return getBean().makeValueProp("mnemonic", Integer.class, 0); 
     86        public RwProp<MenuMemberMnemonic> mnemonic() { 
     87                return getBean().makeValueProp("mnemonic", MenuMemberMnemonic.class, new MenuMemberMnemonic(0)); 
    8788        } 
    8889         
    8990        @Override 
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/insert/InsertMenu.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.skins.SkinElementId; 
    67import org.sophie2.base.visual.skins.ElementPartCreator; 
    78import org.sophie2.base.visual.skins.SkinPartDef; 
     
    2324        private static void defineSkin(ElementPartCreator part) { 
    2425                part.add(TITLE_PROP_ID, "Insert"); 
    2526                part.add(TOOL_TIP_PROP_ID, "Insert menu (Alt+I)"); 
    26                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_I); 
     27                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_I)); 
    2728        } 
    2829        @Override 
    2930        protected boolean computeEnabled() { 
  • modules/org.sophie2.base.visual/src/main/java/org/sophie2/base/visual/InternalSkinPart.java

     
    66import java.util.HashSet; 
    77import java.util.Set; 
    88 
     9import javax.swing.KeyStroke; 
     10 
     11import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    912import org.sophie2.base.skins.BaseSkinPart; 
    1013import org.sophie2.base.skins.SkinUtil; 
    1114import org.sophie2.base.visual.interaction.InteractionEntry; 
     
    6265                                        public void add(String propId, Object value) { 
    6366                                                if (value instanceof String) { 
    6467                                                        BaseVisualModule.get().getInternalLanguagePackPart().add(elementId, propId, value); 
    65                                                 } else { 
    66                                                         BaseVisualModule.get().getInternalSkinPart().add(elementId, propId, value); 
     68                                                }  
     69                                                else if (value instanceof KeyStroke || value instanceof MenuMemberMnemonic) { 
     70                                                        BaseVisualModule.get().getInternalInteractionPackPart().add(elementId, propId, value); 
     71                                                }  
     72                                                else { 
     73                                                        BaseVisualModule.get().getInternalThemePackPart().add(elementId, propId, value); 
    6774                                                } 
    6875                                        } 
    6976 
  • modules/org.sophie2.base.menus/src/main/java/org/sophie2/base/menus/Menu.java

     
    7373                        protected void setupStaticThings(JMenu res) { 
    7474                                res.setToolTipText(toolTip().get()); 
    7575                                if (!OSUtil.isMacOS() && mnemonic().get() != null) { 
    76                                         res.setMnemonic(mnemonic().get()); 
     76                                        res.setMnemonic(mnemonic().get().getMnemonic()); 
    7777                                } 
    7878                                res.setIcon(icon().get() == null ? null : icon().get().toIcon()); 
    7979                        } 
  • modules/org.sophie2.main.skin.alternative/src/main/java/org/sophie2/main/skin/alternative/SkinsMenuLogic.java

     
    3030                } 
    3131 
    3232                public boolean handle(EventR3 event) { 
    33                         SkinManager.get().currentSkin().set( 
    34                                         new Skin(SkinManager.DEFAULT_NAME, null)); 
     33                        SkinManager.get().currentThemePack().set( 
     34                                        new Skin(SkinManager.THEME_PACK_NAME, null)); 
    3535 
    3636                        return true; 
    3737                } 
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/file/FileMenu.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.skins.SkinElementId; 
    67import org.sophie2.base.visual.skins.ElementPartCreator; 
    78import org.sophie2.base.visual.skins.SkinPartDef; 
     
    2122        private static void defineSkin(ElementPartCreator part) { 
    2223                part.add(TITLE_PROP_ID, "File"); 
    2324                part.add(TOOL_TIP_PROP_ID, "File menu (Alt+F)"); 
    24                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_F); 
     25                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_F)); 
    2526        } 
    2627 
    2728 
  • modules/org.sophie2.extra.func.scripting/src/main/java/org/sophie2/extra/func/scripting/view/InsertScriptItem.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.menus.MenuItem; 
    67import org.sophie2.base.menus.MenuMember; 
    78import org.sophie2.base.skins.SkinElementId; 
     
    2728        private static void defineSkin(ElementPartCreator part) { 
    2829                part.add(BaseVisualElement.TITLE_PROP_ID, "Script"); 
    2930                part.add(BaseVisualElement.TOOL_TIP_PROP_ID, "Create a new script in this book"); 
    30                 part.add(MenuMember.MNEMONIC_PROP_ID, KeyEvent.VK_S); 
     31                part.add(MenuMember.MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_S)); 
    3132        } 
    3233         
    3334        @Override 
  • modules/org.sophie2.base.skins/src/main/java/org/sophie2/base/skins/value/loaders/IconValueLoader.java

     
     1package org.sophie2.base.skins.value.loaders; 
     2 
     3import org.sophie2.base.skins.utils.IconValueLoaderUtil; 
     4import org.sophie2.core.modularity.SimpleSophieExtension; 
     5 
     6/** 
     7 * Extension of the extension point defined with {@link SkinValueLoader} interface. 
     8 * Processes records which kind is <b>icon</b> 
     9 *  
     10 * @author tanya 
     11 */ 
     12public class IconValueLoader implements SkinValueLoader { 
     13 
     14        private static String KIND = "icon"; 
     15 
     16        public String getKind() { 
     17                return KIND; 
     18        } 
     19         
     20        public Object createValue(String value, String path) { 
     21                return IconValueLoaderUtil.value(value, path); 
     22        } 
     23         
     24        /** 
     25         * Creates an extension for this {@link SkinValueLoader}. 
     26         *  
     27         * @return  
     28         *                      The created extension. 
     29         */ 
     30        public SimpleSophieExtension<SkinValueLoader> asExtension() { 
     31                return new SimpleSophieExtension<SkinValueLoader>(SkinValueLoader.class, this); 
     32        } 
     33} 
  • modules/org.sophie2.main.func.image/src/main/java/org/sophie2/main/func/image/view/InsertImageItem.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.skins.SkinElementId; 
    67import org.sophie2.base.visual.skins.ElementPartCreator; 
    78import org.sophie2.base.visual.skins.SkinPartDef; 
     
    2122        private static void defineSkin(ElementPartCreator part) { 
    2223                part.add(TITLE_PROP_ID, "Image..."); 
    2324                part.add(TOOL_TIP_PROP_ID, "Add an image file to the current page"); 
    24                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_I); 
     25                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_I)); 
    2526        } 
    2627 
    2728        @Override 
  • modules/org.sophie2.base.skins/src/main/java/org/sophie2/base/skins/value/loaders/SkinValueLoader.java

     
    11package org.sophie2.base.skins.value.loaders; 
    22 
    33/** 
    4  * An extension point for entries for the skin. (text, icon,..) 
     4 * Interface of an extension point for records for a skin. 
     5 * When the skin is to be loaded from a file, the values of the records are Strings that should be parsed. 
     6 * Depending on that whether the value of the record should be string (for titles or tool-tips for example), 
     7 * or should be an icon, it should be parsed in different way. The extension point helps to define whether 
     8 * the value should be parsed to string or icon and finds the appropriate extension that will parse the value. 
    59 *  
    610 * @author tanya 
    711 */ 
    812public interface SkinValueLoader { 
    913 
    1014        /** 
    11          * Returns the kind of the entry. 
     15         * Returns the kind of the value of the record. The kind can be text or icon for example. 
    1216         *  
    1317         * @return  
    14          *                      The kind of the entry. 
     18         *                      The kind of the value of the record. 
    1519         */ 
    1620        public String getKind(); 
    1721         
    1822        /** 
    19          * Creates an object and returns is. 
     23         * Creates an object and returns is. Parse the string to the desired object. 
    2024         *  
    2125         * @param value 
    22          *                              The value needed for an object to be created. 
     26         *                              The value needed for an object to be created. The string that should be parsed. 
     27         * @param path  
     28         *                              The home directory of the current skin  
     29         *                              (i.e. /distrib/skins/skin_id where skin_id is the id for the current skin) 
    2330         * @return 
    24          *                      The object created. 
     31         *                      The object created after parsing of the string. 
    2532         */ 
    26         public Object createValue(String value); 
     33        public Object createValue(String value, String path); 
    2734} 
  • modules/org.sophie2.main.func.help/src/main/java/org/sophie2/main/func/help/menuitems/BugReportItem.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.menus.MenuMember; 
    67import org.sophie2.base.skins.SkinElementId; 
    78import org.sophie2.base.visual.BaseVisualElement; 
     
    2223        private static void defineSkin(ElementPartCreator part) { 
    2324                part.add(BaseVisualElement.TITLE_PROP_ID, "Send an Error Report..."); 
    2425                part.add(BaseVisualElement.TOOL_TIP_PROP_ID, "Report problems related to application use to the Sophie developers"); 
    25                 part.add(MenuMember.MNEMONIC_PROP_ID, KeyEvent.VK_E); 
     26                part.add(MenuMember.MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_E)); 
    2627                part.add(MenuMember.ACCELERATOR_PROP_ID, null); 
    2728        } 
    2829         
  • modules/org.sophie2.base.visual/src/main/java/org/sophie2/base/visual/BaseVisualElement.java

     
    4242        public BaseVisualElement() { 
    4343                getBean(); 
    4444                // XXX: Left here just in case. See BaseVisalModule$VisualPoint#extensionRegistered(SophieExtension<VisualProvider>). 
    45                 BaseVisualModule.get().getInternalSkinPart().registerSkinRecords(getClass()); 
     45                BaseVisualModule.get().getInternalInteractionPackPart().registerSkinRecords(getClass()); 
    4646        } 
    4747 
    4848        /** 
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/MainAppMenusModule.java

     
    33import java.awt.event.KeyEvent; 
    44import java.util.List; 
    55 
     6import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    67import org.sophie2.base.menus.MenuItem; 
    78import org.sophie2.base.menus.MenuMember; 
    89import org.sophie2.base.skins.BaseSkinPart; 
     
    189190                BaseSkinPart res = new BaseSkinPart(); 
    190191 
    191192                res.add(SkinUtil.getElementId(MinimizeAllItem.class), MenuMember.MNEMONIC_PROP_ID, 
    192                                 KeyEvent.VK_M); 
     193                                new MenuMemberMnemonic(KeyEvent.VK_M)); 
    193194                res.add(SkinUtil.getElementId(MinimizeAllItem.class), MenuMember.ACCELERATOR_PROP_ID, null); 
    194195 
    195196                res.add(SkinUtil.getElementId(RestoreAllItem.class), MenuMember.MNEMONIC_PROP_ID, 
    196                                 KeyEvent.VK_R); 
     197                                new MenuMemberMnemonic(KeyEvent.VK_R)); 
    197198                res.add(SkinUtil.getElementId(RestoreAllItem.class), MenuMember.ACCELERATOR_PROP_ID, null);              
    198199 
    199200                return res; 
  • modules/org.sophie2.base.visual/src/main/java/org/sophie2/base/visual/BaseVisualModule.java

     
    33import java.util.Comparator; 
    44import java.util.List; 
    55 
     6import javax.swing.KeyStroke; 
     7 
     8import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    69import org.sophie2.base.skins.SkinManager; 
    710import org.sophie2.base.skins.providers.SimpleSkinPartsProvider; 
    811import org.sophie2.base.visual.interaction.InteractionLogic; 
     
    7376                         
    7477                        // XXX: copied for the BaseVisaulElement's constructor. Because we actually need the  
    7578                        // skin values before its invocation. In setup methods.  
    76                         BaseVisualModule.get().getInternalSkinPart().registerSkinRecords(extension.getObject().getProvidedClass()); 
     79                        BaseVisualModule.get().getInternalInteractionPackPart().registerSkinRecords(extension.getObject().getProvidedClass()); 
    7780                } 
    7881 
    7982        } 
    8083 
    8184        private VisualPoint visualPoint; 
    82         private InternalSkinPart internalSkinPart; 
    8385        private InternalSkinPart internalLanguagePackPart; 
     86        private InternalSkinPart internalThemePackPart; 
     87        private InternalSkinPart internalInteractionPackPart; 
    8488 
    8589        /** 
    8690         * Gets the extension point for visual element provides. 
     
    99103        } 
    100104 
    101105        /** 
    102          * Gets the internal skin part (which holds all skin records defined in 
    103          * classes). 
     106         * Gets the internal language pack part. Holds all the {@link String} records - 
     107         * tool-tips, titles. 
    104108         *  
    105109         * @return  
    106110         *                      The internal skin part. 
    107111         */ 
    108         protected InternalSkinPart getInternalSkinPart() { 
    109                 if (this.internalSkinPart == null) { 
    110                         this.internalSkinPart = new InternalSkinPart(); 
     112        protected InternalSkinPart getInternalLanguagePackPart() { 
     113                if (this.internalLanguagePackPart == null) { 
     114                        this.internalLanguagePackPart = new InternalSkinPart(); 
     115                        this.internalLanguagePackPart.skinName().set(SkinManager.LANGUAGE_PACK_NAME); 
    111116                } 
    112                 return this.internalSkinPart; 
     117                return this.internalLanguagePackPart; 
    113118        } 
    114  
     119         
    115120        /** 
    116          * Gets the internal language skin part. Holds all the string records - 
    117          * tool-tips, titles. 
     121         * Gets the internal theme pack part. Holds all the records that are not {@link String},  
     122         * {@link KeyStroke} or {@link MenuMemberMnemonic}. 
    118123         *  
    119124         * @return The internal skin part. 
    120125         */ 
    121         protected InternalSkinPart getInternalLanguagePackPart() { 
    122                 if (this.internalLanguagePackPart == null) { 
    123                         this.internalLanguagePackPart = new InternalSkinPart(); 
    124                         this.internalLanguagePackPart.skinName().set(SkinManager.LANGUAGE_PACK_NAME); 
     126        protected InternalSkinPart getInternalThemePackPart() { 
     127                if (this.internalThemePackPart == null) { 
     128                        this.internalThemePackPart = new InternalSkinPart(); 
     129                        this.internalThemePackPart.skinName().set(SkinManager.THEME_PACK_NAME); 
    125130                } 
    126                 return this.internalLanguagePackPart; 
     131                return this.internalThemePackPart; 
    127132        } 
    128133         
     134        /** 
     135         * Gets the internal interaction pack part. Holds all the {@link KeyStroke} 
     136         * and {@link MenuMemberMnemonic} records. 
     137         *  
     138         * @return The internal skin part. 
     139         */ 
     140        protected InternalSkinPart getInternalInteractionPackPart() { 
     141                if (this.internalInteractionPackPart == null) { 
     142                        this.internalInteractionPackPart = new InternalSkinPart(); 
     143                        this.internalInteractionPackPart.skinName().set(SkinManager.INTERACTION_PACK_NAME); 
     144                } 
     145                return this.internalInteractionPackPart; 
     146        } 
    129147 
    130148        private SimpleSkinPartsProvider simpleSkinPartsProvider = null; 
    131149         
     
    138156                if (this.simpleSkinPartsProvider == null) { 
    139157                        this.simpleSkinPartsProvider = new SimpleSkinPartsProvider(); 
    140158                 
    141                         this.simpleSkinPartsProvider.parts().add(getInternalSkinPart()); 
     159                        this.simpleSkinPartsProvider.parts().add(getInternalThemePackPart()); 
     160                        this.simpleSkinPartsProvider.parts().add(getInternalInteractionPackPart()); 
    142161                        this.simpleSkinPartsProvider.parts().add(getInternalLanguagePackPart()); 
    143162                } 
    144163                 
  • modules/org.sophie2.base.skins/src/main/java/org/sophie2/base/skins/value/loaders/IconsetValueLoader.java

     
     1package org.sophie2.base.skins.value.loaders; 
     2 
     3import org.sophie2.base.commons.skin.IconId; 
     4import org.sophie2.base.commons.skin.IconsSet; 
     5import org.sophie2.base.commons.util.ImmImage; 
     6import org.sophie2.base.skins.utils.IconValueLoaderUtil; 
     7import org.sophie2.core.modularity.SimpleSophieExtension; 
     8 
     9/** 
     10 * Extension of the extension point defined with {@link SkinValueLoader} interface. 
     11 * Processes records which kind is <b>iconset</b>. 
     12 *  
     13 * @author tanya 
     14 */ 
     15public class IconsetValueLoader implements SkinValueLoader { 
     16 
     17        private static String KIND = "iconset"; 
     18         
     19        public Object createValue(String value, String path) { 
     20                IconsSet icons = new IconsSet(); 
     21                String iconValues[] = value.split(","); 
     22                for (String record : iconValues) { 
     23                        String recordEntry[] = record.split("="); 
     24                        if (recordEntry.length == 2) { 
     25                                icons.addIcon(IconId.valueOf(recordEntry[0].trim()),  
     26                                                (ImmImage)IconValueLoaderUtil.value(recordEntry[1].trim(), path)); 
     27                        } 
     28                } 
     29 
     30                return icons; 
     31        } 
     32 
     33        public String getKind() { 
     34                return KIND; 
     35        } 
     36 
     37        /** 
     38         * Creates an extension for this {@link SkinValueLoader}. 
     39         *  
     40         * @return  
     41         *                      The created extension. 
     42         */ 
     43        public SimpleSophieExtension<SkinValueLoader> asExtension() { 
     44                return new SimpleSophieExtension<SkinValueLoader>(SkinValueLoader.class, this); 
     45        } 
     46} 
  • modules/org.sophie2.extra.func.print/src/main/java/org/sophie2/extra/func/print/view/PageSetupItem.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.visual.skins.ElementPartCreator; 
    67import org.sophie2.base.visual.skins.SkinPartDef; 
    78import org.sophie2.main.app.menus.AppMenuItem; 
     
    1819        private static void defineSkin(ElementPartCreator part) { 
    1920                part.add(TITLE_PROP_ID, "Page Setup..."); 
    2021                part.add(TOOL_TIP_PROP_ID, "Customize printing page format"); 
    21                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_A); 
     22                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_A)); 
    2223        } 
    2324 
    2425        @Override 
  • modules/org.sophie2.extra.func.html/src/main/java/org/sophie2/extra/func/html/view/ExportAsHtmlItem.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.skins.SkinElementId; 
    67import org.sophie2.base.visual.skins.ElementPartCreator; 
    78import org.sophie2.base.visual.skins.SkinPartDef; 
     
    2021        private static void defineSkin(ElementPartCreator part) { 
    2122                part.add(TITLE_PROP_ID, "HTML..."); 
    2223                part.add(TOOL_TIP_PROP_ID, "Export the book as a webpage"); 
    23                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_H); 
     24                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_H)); 
    2425        } 
    2526 
    2627        @Override 
  • modules/org.sophie2.main.func.servers/src/main/java/org/sophie2/main/func/servers/view/SaveBookOnServerItem.java

     
    55 
    66import javax.swing.KeyStroke; 
    77 
     8import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    89import org.sophie2.base.commons.util.OSUtil; 
    910import org.sophie2.base.skins.SkinElementId; 
    1011import org.sophie2.base.visual.skins.ElementPartCreator; 
     
    2728        private static void defineSkin(ElementPartCreator part) { 
    2829                part.add(TITLE_PROP_ID, "Save On Server..."); 
    2930                part.add(TOOL_TIP_PROP_ID, "Save current resource to a server"); 
    30                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_E); 
     31                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_E)); 
    3132                part.add(ACCELERATOR_PROP_ID, KeyStroke.getKeyStroke(KeyEvent.VK_S, 
    3233                                OSUtil.getDefaultMask() | InputEvent.ALT_MASK)); 
    3334        } 
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/file/ExportSubMenu.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44 
     5import org.sophie2.base.commons.gui.MenuMemberMnemonic; 
    56import org.sophie2.base.skins.SkinElementId; 
    67import org.sophie2.base.visual.skins.ElementPartCreator; 
    78import org.sophie2.base.visual.skins.SkinPartDef; 
     
    4546        @SkinPartDef 
    4647        private static void defineSkin(ElementPartCreator part) { 
    4748                part.add(TITLE_PROP_ID, "Export Book As"); 
    48                 part.add(MNEMONIC_PROP_ID, KeyEvent.VK_X); 
     49                part.add(MNEMONIC_PROP_ID, new MenuMemberMnemonic(KeyEvent.VK_X)); 
    4950        } 
    5051 
    5152