content: /*
   *    This program is free software; you can redistribute it and/or modify
   *    it under the terms of the GNU General Public License as published by
   *    the Free Software Foundation; either version 2 of the License, or
   *    (at your option) any later version.
   *
   *    This program 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 General Public License for more details.
   *
   *    You should have received a copy of the GNU General Public License
   *    along with this program; if not, write to the Free Software
   *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
   */
  
  /*
   * JListHelper.java
   * Copyright (C) 2005 University of Waikato, Hamilton, New Zealand
   *
   */
  
  
  package weka.gui;
  
  import javax.swing.DefaultListModel;
  import javax.swing.JList;
  
  /**
   * A helper class for JList GUI elements with DefaultListModel or 
   * derived models.
   *
   * @author  FracPete (fracpete at waikato dot ac dot nz)
   * @version $Revision: 1.1 $
   * @see     JList
   * @see     DefaultListModel
   */
  public class JListHelper {
    
    /** moves items up */
    public final static int MOVE_UP = 0;
  
    /** moves items down */
    public final static int MOVE_DOWN = 1;
    
    /**
     * moves the selected items by a certain amount of items in a given direction
     *
     * @param list        the JList to work on
     * @param moveby      the number of items to move by
     * @param direction   the direction to move in
     * @see               #MOVE_UP
     * @see               #MOVE_DOWN
     */
    protected static void moveItems(JList list, int moveby, int direction) {
      int[]               indices;
      int                 i;
      Object              o;
      DefaultListModel    model;
  
      model = (DefaultListModel) list.getModel();
  
      switch (direction) {
        case MOVE_UP:
          indices = list.getSelectedIndices();
          for (i = 0; i < indices.length; i++) {
            if (indices[i] == 0)
              continue;
            o = model.remove(indices[i]);
            indices[i] -= moveby;
            model.insertElementAt(o, indices[i]);
          }
          list.setSelectedIndices(indices);
          break;
  
        case MOVE_DOWN:
          indices = list.getSelectedIndices();
          for (i = indices.length - 1; i >= 0; i--) {
            if (indices[i] == model.getSize() - 1)
              continue;
            o = model.remove(indices[i]);
            indices[i] += moveby;
            model.insertElementAt(o, indices[i]);
          }
          list.setSelectedIndices(indices);
          break;
  
        default:
          System.err.println(
              JListHelper.class.getName() + ": direction '" 
              + direction + "' is unknown!");
      }
    }
  
    /**
     * moves the selected items up by 1
     *
     * @param list        the JList to work on
     */
    public static void moveUp(JList list) {
      if (canMoveUp(list))
        moveItems(list, 1, MOVE_UP);
    }
  
    /**
     * moves the selected item down by 1
     *
     * @param list        the JList to work on
     */
    public static void moveDown(JList list) {
      if (canMoveDown(list))
        moveItems(list, 1, MOVE_DOWN);
    }
  
    /**
     * moves the selected items to the top
     *
     * @param list        the JList to work on
     */
    public static void moveTop(JList list) {
      int[]     indices;
      int       diff;
  
      if (canMoveUp(list)) {
        indices = list.getSelectedIndices();
        diff    = indices[0];
        moveItems(list, diff, MOVE_UP);
      }
    }
  
    /**
     * moves the selected items to the end
     *
     * @param list        the JList to work on
     */
    public static void moveBottom(JList list) {
      int[]     indices;
      int       diff;
  
      if (canMoveDown(list)) {
        indices = list.getSelectedIndices();
        diff    = list.getModel().getSize() - 1 - indices[indices.length - 1];
        moveItems(list, diff, MOVE_DOWN);
      }
    }
  
    /**
     * checks whether the selected items can be moved up
     *
     * @param list        the JList to work on
     */
    public static boolean canMoveUp(JList list) {
      boolean   result;
      int[]     indices;
  
      result = false;
      
      indices = list.getSelectedIndices();
      if (indices.length > 0) {
        if (indices[0] > 0)
          result = true;
      }
  
      return result;
    }
  
    /**
     * checks whether the selected items can be moved down
     *
     * @param list        the JList to work on
     */
    public static boolean canMoveDown(JList list) {
      boolean   result;
      int[]     indices;
  
      result = false;
      
      indices = list.getSelectedIndices();
      if (indices.length > 0) {
        if (indices[indices.length - 1] < list.getModel().getSize() - 1)
          result = true;
      }
  
      return result;
    }
  }
  