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 }