001    // This file is part of AceWiki.
002    // Copyright 2008-2012, AceWiki developers.
003    // 
004    // AceWiki is free software: you can redistribute it and/or modify it under the terms of the GNU
005    // Lesser General Public License as published by the Free Software Foundation, either version 3 of
006    // the License, or (at your option) any later version.
007    // 
008    // AceWiki is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
009    // even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
010    // Lesser General Public License for more details.
011    // 
012    // You should have received a copy of the GNU Lesser General Public License along with AceWiki. If
013    // not, see http://www.gnu.org/licenses/.
014    
015    package ch.uzh.ifi.attempto.preditor;
016    
017    import nextapp.echo.app.Button;
018    import nextapp.echo.app.Extent;
019    import nextapp.echo.app.Font;
020    import nextapp.echo.app.Insets;
021    import ch.uzh.ifi.attempto.echocomp.Style;
022    
023    /**
024     * This abstract class represents an item of a menu of the predictive editor. Each menu item
025     * contains the name of the menu group it belongs to.
026     * 
027     * @author Tobias Kuhn
028     */
029    public abstract class MenuItem extends Button {
030            
031            private static final long serialVersionUID = 6061341215846815821L;
032            
033            private String menuGroup;
034            private String id;
035            private boolean highlighted = false;
036            private int colorShift;
037            
038            /**
039             * Initializes a new menu item.
040             * 
041             * @param menuGroup The menu group to which this item should be assigned.
042             */
043            public MenuItem(String menuGroup) {
044                    if (menuGroup == null) menuGroup = "";
045                    this.menuGroup = menuGroup;
046            setWidth(new Extent(146));
047            setHeight(new Extent(15));
048            setInsets(new Insets(2,0));
049                    setBackground(Style.mediumBackground);
050                    setForeground(Style.darkForeground);
051                    setRolloverEnabled(true);
052                    setRolloverForeground(Style.lightForeground);
053                    setRolloverBackground(Style.darkBackground);
054            setLineWrap(false);
055            updateStyle();
056            }
057            
058            /**
059             * Returns the name of the menu group of this menu item.
060             * 
061             * @return The name of the menu group.
062             */
063            public String getMenuGroup() {
064                    return menuGroup;
065            }
066            
067            /**
068             * This method returns an identifier that is unique (within one instance of the predictive
069             * editor).
070             * 
071             * @return the identifier.
072             */
073            public String getMenuItemID() {
074                    if (id == null) recalculateID();
075                    return id;
076            }
077        
078        /**
079         * This method determines whether the menu entry is highlighted or not. Hightlighted menu
080         * entries are displayed in bold font and are shown in front of non-highlighted menu entries
081         * in sorted lists.
082         * 
083         * @param highlighted true if this entry should be highlighted.
084         */
085        public void setHighlighted(boolean highlighted) {
086            this.highlighted = highlighted;
087            updateStyle();
088        }
089        
090        /**
091         * Returns whether this menu item is highlighted or not.
092         * 
093         * @return true if this menu item is highlighted.
094         */
095        public boolean isHighlighted() {
096            return highlighted;
097        }
098        
099        /**
100         * This methods sets the color shift that defines the color in which this menu item is to be
101         * displayed.
102         * 
103         * @see MenuCreator#getColorShift
104         * @param colorShift The color shift value.
105         */
106        public void setColorShift(int colorShift) {
107            int colorShiftDiff = colorShift - this.colorShift;
108            this.colorShift = colorShift;
109            setBackground(Style.shiftColor(super.getBackground(), colorShiftDiff));
110            setForeground(Style.shiftColor(super.getForeground(), colorShiftDiff));
111            setRolloverBackground(Style.shiftColor(super.getRolloverBackground(), colorShiftDiff));
112            setRolloverForeground(Style.shiftColor(super.getRolloverForeground(), colorShiftDiff));
113        }
114            
115            /**
116             * This method should be called internally whenever something changed that has an influence on
117             * the identifier.
118             */
119            protected void recalculateID() {
120                    id = "";
121                    for (String s : getContent()) {
122                            id += s.replaceAll(":", "~:").replaceAll("~", "~~") + ":";
123                    }
124            }
125            
126            /**
127             * This method sets the style according to whether or not this menu item is highlighted.
128             */
129            protected void updateStyle() {
130                    if (highlighted) {
131                            setFont(new Font(Style.fontTypeface, Font.BOLD, new Extent(12)));
132                    } else {
133                            setFont(new Font(Style.fontTypeface, Font.PLAIN, new Extent(12)));
134                    }
135            }
136            
137            /**
138             * This method is used to calculate the unique identifier.
139             * 
140             * @return An array of strings that uniquely defines the menu item object.
141             */
142            protected abstract String[] getContent();
143    
144            public boolean equals(Object obj) {
145                    if (obj instanceof MenuItem) {
146                            return getMenuItemID().equals(((MenuItem) obj).getMenuItemID());
147                    } else {
148                            return false;
149                    }
150            }
151            
152    }