All Downloads are FREE. Search and download functionalities are using the official Maven repository.

weka.gui.GenericObjectEditorHistory Maven / Gradle / Ivy

Go to download

The Waikato Environment for Knowledge Analysis (WEKA), a machine learning workbench. This version represents the developer version, the "bleeding edge" of development, you could say. New functionality gets added to this version.

There is a newer version: 3.9.6
Show newest version
/*
 *   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 3 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, see .
 */

/*
 * ObjectHistory.java
 * Copyright (C) 2009-2012 University of Waikato, Hamilton, New Zealand
 */

package weka.gui;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.Serializable;
import java.util.EventObject;
import java.util.Vector;

import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;

import weka.core.SerializedObject;
import weka.core.Utils;

/**
 * A helper class for maintaining a history of objects selected in the GOE.
 * 
 * @author fracpete (fracpete at waikato dot ac dot nz)
 * @version $Revision: 10216 $
 */
public class GenericObjectEditorHistory implements Serializable {

  /** for serialization. */
  private static final long serialVersionUID = -1255734638729633595L;

  /**
   * Event that gets sent when a history item gets selected.
   * 
   * @author fracpete (fracpete at waikato dot ac dot nz)
   * @version $Revision: 10216 $
   */
  public static class HistorySelectionEvent extends EventObject {

    /** for serialization. */
    private static final long serialVersionUID = 45824542929908105L;

    /** the selected favorite. */
    protected Object m_HistoryItem;

    /**
     * Initializes the event.
     * 
     * @param source the object that triggered the event
     * @param historyItem the selected history item
     */
    public HistorySelectionEvent(Object source, Object historyItem) {
      super(source);

      m_HistoryItem = historyItem;
    }

    /**
     * Returns the selected history item.
     * 
     * @return the history item
     */
    public Object getHistoryItem() {
      return m_HistoryItem;
    }
  }

  /**
   * Interface for classes that listen to selections of history items.
   * 
   * @author fracpete (fracpete at waikato dot ac dot nz)
   * @version $Revision: 10216 $
   */
  public static interface HistorySelectionListener {

    /**
     * Gets called when a history item gets selected.
     * 
     * @param e the event
     */
    public void historySelected(HistorySelectionEvent e);
  }

  /** the maximum entries in the history. */
  public final static int MAX_HISTORY_COUNT = 10;

  /** the maximum length of a caption in the history. */
  public final static int MAX_HISTORY_LENGTH = 200;

  /** the menu max line length. */
  public final static int MAX_LINE_LENGTH = 80;

  /** the history of objects. */
  protected Vector m_History;

  /**
   * Initializes the history.
   */
  public GenericObjectEditorHistory() {
    super();

    initialize();
  }

  /**
   * Initializes members.
   */
  protected void initialize() {
    m_History = new Vector();
  }

  /**
   * Clears the history.
   */
  public synchronized void clear() {
    m_History.clear();
  }

  /**
   * Adds the object to the history.
   * 
   * @param obj the object to add
   */
  public synchronized void add(Object obj) {
    obj = copy(obj);

    if (m_History.contains(obj)) {
      m_History.remove(obj);
    }
    m_History.insertElementAt(obj, 0);

    while (m_History.size() > MAX_HISTORY_COUNT) {
      m_History.remove(m_History.size() - 1);
    }
  }

  /**
   * Returns the number of entries in the history.
   * 
   * @return the size of the history
   */
  public synchronized int size() {
    return m_History.size();
  }

  /**
   * Returns the current history.
   * 
   * @return the history
   */
  public synchronized Vector getHistory() {
    return m_History;
  }

  /**
   * Creates a copy of the object.
   * 
   * @param obj the object to copy
   */
  protected Object copy(Object obj) {
    SerializedObject so;
    Object result;

    try {
      so = new SerializedObject(obj);
      result = so.getObject();
    } catch (Exception e) {
      result = null;
      e.printStackTrace();
    }

    return result;
  }

  /**
   * Generates an HTML caption for the an entry in the history menu.
   * 
   * @param obj the object to create the caption for
   * @return the generated HTML captiopn
   */
  protected String generateMenuItemCaption(Object obj) {
    StringBuffer result;
    String cmd;
    String[] lines;
    int i;

    result = new StringBuffer();

    cmd = Utils.toCommandLine(obj);
    if (cmd.length() > MAX_HISTORY_LENGTH) {
      cmd = cmd.substring(0, MAX_HISTORY_LENGTH) + "...";
    }

    lines = Utils.breakUp(cmd, MAX_LINE_LENGTH);
    result.append("");
    for (i = 0; i < lines.length; i++) {
      if (i > 0) {
        result.append("
     "); } result.append(lines[i].trim()); } result.append(""); return result.toString(); } /** * Adds a menu item with the history to the popup menu. * * @param menu the menu to add the history to * @param current the current object * @param listener the listener to attach to the menu items' ActionListener */ public void customizePopupMenu(JPopupMenu menu, Object current, HistorySelectionListener listener) { JMenu submenu; JMenuItem item; int i; if (m_History.size() == 0) { return; } submenu = new JMenu("History"); menu.addSeparator(); menu.add(submenu); // clear history item = new JMenuItem("Clear history"); item.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { m_History.clear(); } }); submenu.add(item); // current history final HistorySelectionListener fListener = listener; for (i = 0; i < m_History.size(); i++) { if (i == 0) { submenu.addSeparator(); } final Object history = m_History.get(i); item = new JMenuItem(generateMenuItemCaption(history)); item.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { fListener.historySelected(new HistorySelectionEvent(fListener, history)); } }); submenu.add(item); } } }