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 }