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.acewiki.gui;
016    
017    import java.awt.Font;
018    
019    import ch.uzh.ifi.attempto.echocomp.SmallButton;
020    import ch.uzh.ifi.attempto.echocomp.SolidLabel;
021    
022    import nextapp.echo.app.Border;
023    import nextapp.echo.app.Color;
024    import nextapp.echo.app.Column;
025    import nextapp.echo.app.Extent;
026    import nextapp.echo.app.Insets;
027    import nextapp.echo.app.Row;
028    import nextapp.echo.app.event.ActionEvent;
029    import nextapp.echo.app.event.ActionListener;
030    
031    /**
032     * This class represents an index bar that shows either letters from A to Z or numbers. This
033     * index bar is used to organize large amounts of entries.
034     * 
035     * @author Tobias Kuhn
036     */
037    public class IndexBar extends Column implements ActionListener {
038    
039            private static final long serialVersionUID = -1496012516474073170L;
040    
041            private ActionListener actionListener;
042            
043            private SmallButton activeButton;
044            private Row row;
045            
046            private IndexBar(String text) {
047                    Row mainRow = new Row();
048                    mainRow.setInsets(new Insets(10, 2, 5, 2));
049                    mainRow.setCellSpacing(new Extent(5));
050                    mainRow.add(new SolidLabel(text, Font.ITALIC, 10));
051                    row = new Row();
052                    mainRow.add(row);
053                    add(mainRow);
054            }
055            
056            /**
057             * Creates a new index bar showing letters from A to Z.
058             * 
059             * @param text The text to be shown on the left hand side of the index bar.
060             * @param actionListener The actionlistener.
061             */
062            public IndexBar(String text, ActionListener actionListener) {
063                    this(text);
064                    this.actionListener = actionListener;
065                    setLetters();
066            }
067            
068            /**
069             * Creates a new index bar showing numbers from 1 to the specified number.
070             * 
071             * @param text The text to be shown on the left hand side of the index bar.
072             * @param n The last number to be shown.
073             * @param actionListener The actionlistener.
074             */
075            public IndexBar(String text, int n, ActionListener actionListener) {
076                    this(text);
077                    this.actionListener = actionListener;
078                    setNumbers(n);
079            }
080            
081            /**
082             * Shows letters from A to Z.
083             */
084            public void setLetters() {
085                    row.removeAll();
086                    char c = 'A';
087                    while (c <= 'Z') {
088                            SmallButton b = new SmallButton(new String(new char[] {c}), this, 12);
089                            b.setBorder(new Border(1, Color.WHITE, Border.STYLE_SOLID));
090                            row.add(b);
091                            c++;
092                    }
093                    activeButton = null;
094                    setActiveButton((SmallButton) row.getComponent(0));
095            }
096            
097            /**
098             * Shows numbers from 1 to the specified number.
099             * 
100             * @param n The last number to be shown.
101             */
102            public void setNumbers(int n) {
103                    row.removeAll();
104                    for (int i = 0; i < n; i++) {
105                            SmallButton b = new SmallButton((i+1) + "", this, 12);
106                            b.setBorder(new Border(1, Color.WHITE, Border.STYLE_SOLID));
107                            row.add(b);
108                    }
109                    activeButton = null;
110                    if (n > 0) setActiveButton((SmallButton) row.getComponent(0));
111            }
112            
113            /**
114             * Sets the button (letter or number) at the given position as the currently active button.
115             * 
116             * @param i The position of the button.
117             */
118            public void setActiveButton(int i) {
119                    if (i >= 0 && i < row.getComponentCount()) {
120                            setActiveButton((SmallButton) row.getComponent(i));
121                    }
122            }
123            
124            private void setActiveButton(SmallButton button) {
125                    if (activeButton == button) return;
126                    if (activeButton != null) {
127                            activeButton.setBorder(new Border(1, Color.WHITE, Border.STYLE_SOLID));
128                    }
129                    activeButton = button;
130                    activeButton.setBorder(new Border(1, Color.DARKGRAY, Border.STYLE_SOLID));
131            }
132    
133            public void actionPerformed(ActionEvent e) {
134                    setActiveButton((SmallButton) e.getSource());
135                    actionListener.actionPerformed(new ActionEvent(this, e.getActionCommand()));
136            }
137    
138    }