content: // This file is part of AceWiki.
  // Copyright 2008-2013, AceWiki developers.
  // 
  // AceWiki is free software: you can redistribute it and/or modify it under the terms of the GNU
  // Lesser General Public License as published by the Free Software Foundation, either version 3 of
  // the License, or (at your option) any later version.
  // 
  // AceWiki is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
  // even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  // Lesser General Public License for more details.
  // 
  // You should have received a copy of the GNU Lesser General Public License along with AceWiki. If
  // not, see http://www.gnu.org/licenses/.
  
  package ch.uzh.ifi.attempto.acewiki.gui;
  
  import java.awt.Font;
  
  import nextapp.echo.app.Border;
  import nextapp.echo.app.Color;
  import nextapp.echo.app.Column;
  import nextapp.echo.app.Extent;
  import nextapp.echo.app.Insets;
  import nextapp.echo.app.Row;
  import nextapp.echo.app.event.ActionEvent;
  import nextapp.echo.app.event.ActionListener;
  import ch.uzh.ifi.attempto.echocomp.LocaleResources;
  import ch.uzh.ifi.attempto.echocomp.SmallButton;
  import ch.uzh.ifi.attempto.echocomp.SolidLabel;
  
  /**
   * This class represents an index bar that shows either letters from A to Z or numbers. This
   * index bar is used to organize large amounts of entries.
   * 
   * @author Tobias Kuhn
   */
  public class IndexBar extends Column implements ActionListener {
  
  	private static final long serialVersionUID = -1496012516474073170L;
  
  	private ActionListener actionListener;
  	
  	private SmallButton activeButton;
  	private Row row;
  	
  	private void init(String text) {
  		Row mainRow = new Row();
  		mainRow.setInsets(new Insets(10, 2, 5, 2));
  		mainRow.setCellSpacing(new Extent(5));
  		mainRow.add(new SolidLabel(text, Font.ITALIC, 10));
  		row = new Row();
  		mainRow.add(row);
  		add(mainRow);
  	}
  	
  	/**
  	 * Creates a new index bar showing letters from A to Z.
  	 * 
  	 * @param actionListener The actionlistener.
  	 */
  	public IndexBar(ActionListener actionListener) {
  		init(LocaleResources.getString("acewiki_list_firstletter"));
  		this.actionListener = actionListener;
  		setLetters();
  	}
  	
  	/**
  	 * Creates a new index bar showing numbers from 1 to the specified number.
  	 * 
  	 * @param n The last number to be shown.
  	 * @param text The text of text key for the label.
  	 * @param actionListener The actionlistener.
  	 */
  	public IndexBar(int n, String text, ActionListener actionListener) {
  		String l = LocaleResources.getString(text);
  		if (l == null) l = text;
  		init(l);
  		this.actionListener = actionListener;
  		setNumbers(n);
  	}
  	
  	/**
  	 * Creates a new index bar showing numbers from 1 to the specified number.
  	 * 
  	 * @param n The last number to be shown.
  	 * @param actionListener The actionlistener.
  	 */
  	public IndexBar(int n, ActionListener actionListener) {
  		this(n, "acewiki_list_page", actionListener);
  	}
  	
  	/**
  	 * Shows letters from A to Z.
  	 */
  	public void setLetters() {
  		row.removeAll();
  		char c = 'A';
  		while (c <= 'Z') {
  			SmallButton b = new SmallButton(new String(new char[] {c}), this, 12);
  			b.setBorder(new Border(1, Color.WHITE, Border.STYLE_SOLID));
  			row.add(b);
  			c++;
  		}
  		activeButton = null;
  		setActiveButton((SmallButton) row.getComponent(0));
  	}
  	
  	/**
  	 * Shows numbers from 1 to the specified number.
  	 * 
  	 * @param n The last number to be shown.
  	 */
  	public void setNumbers(int n) {
  		row.removeAll();
  		for (int i = 0; i < n; i++) {
  			SmallButton b = new SmallButton((i+1) + "", this, 12);
  			b.setBorder(new Border(1, Color.WHITE, Border.STYLE_SOLID));
  			row.add(b);
  		}
  		activeButton = null;
  		if (n > 0) setActiveButton((SmallButton) row.getComponent(0));
  	}
  	
  	/**
  	 * Sets the button (letter or number) at the given position as the currently active button.
  	 * 
  	 * @param i The position of the button.
  	 */
  	public void setActiveButton(int i) {
  		if (i >= 0 && i < row.getComponentCount()) {
  			setActiveButton((SmallButton) row.getComponent(i));
  		}
  	}
  	
  	private void setActiveButton(SmallButton button) {
  		if (activeButton == button) return;
  		if (activeButton != null) {
  			activeButton.setBorder(new Border(1, Color.WHITE, Border.STYLE_SOLID));
  		}
  		activeButton = button;
  		activeButton.setBorder(new Border(1, Color.DARKGRAY, Border.STYLE_SOLID));
  	}
  
  	public void actionPerformed(ActionEvent e) {
  		setActiveButton((SmallButton) e.getSource());
  		actionListener.actionPerformed(new ActionEvent(this, e.getActionCommand()));
  	}
  
  }
  