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

weka.gui.filters.AddUserFieldsCustomizer 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 .
 */

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

package weka.gui.filters;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import weka.core.Environment;
import weka.core.EnvironmentHandler;
import weka.filters.unsupervised.attribute.AddUserFields;
import weka.gui.JListHelper;
import weka.gui.beans.EnvironmentField;
import weka.gui.beans.GOECustomizer;

/**
 * Customizer for the AddUserFields filter.
 * 
 * @author Mark Hall (mhall{[at]}pentaho{[dot]}com)
 * @version $Revision: 12733 $
 */
public class AddUserFieldsCustomizer extends JPanel implements
    EnvironmentHandler, GOECustomizer {

  /** For serialization */
  private static final long serialVersionUID = -3823417827142174931L;
  protected ModifyListener m_modifyL = null;
  protected Environment m_env = Environment.getSystemWide();

  /** THe filter being customized */
  protected AddUserFields m_filter = null;

  protected EnvironmentField m_nameField;
  protected JComboBox m_typeField;
  protected EnvironmentField m_dateFormatField;
  protected EnvironmentField m_valueField;

  protected JList m_list = new JList();
  protected DefaultListModel m_listModel;

  protected JButton m_newBut = new JButton("New");
  protected JButton m_deleteBut = new JButton("Delete");
  protected JButton m_upBut = new JButton("Move up");
  protected JButton m_downBut = new JButton("Move down");

  protected boolean m_dontShowButs = false;

  /**
   * Constructor
   */
  public AddUserFieldsCustomizer() {
    setLayout(new BorderLayout());
  }

  private void setup() {
    JPanel fieldHolder = new JPanel();
    JPanel namePanel = new JPanel();
    namePanel.setLayout(new BorderLayout());
    namePanel.setBorder(BorderFactory.createTitledBorder("Attribute name"));
    m_nameField = new EnvironmentField(m_env);
    namePanel.add(m_nameField, BorderLayout.CENTER);
    namePanel.setToolTipText("Name of the new attribute");

    JPanel typePanel = new JPanel();
    typePanel.setLayout(new BorderLayout());
    typePanel.setBorder(BorderFactory.createTitledBorder("Attribute type"));
    m_typeField = new JComboBox();
    m_typeField.addItem("numeric");
    m_typeField.addItem("nominal");
    m_typeField.addItem("string");
    m_typeField.addItem("date");
    typePanel.add(m_typeField, BorderLayout.CENTER);
    m_typeField.setToolTipText("Attribute type");
    typePanel.setToolTipText("Attribute type");

    JPanel formatPanel = new JPanel();
    formatPanel.setLayout(new BorderLayout());
    formatPanel.setBorder(BorderFactory.createTitledBorder("Date format"));
    m_dateFormatField = new EnvironmentField(m_env);
    formatPanel.add(m_dateFormatField, BorderLayout.CENTER);
    formatPanel.setToolTipText("Date format (date attributes only)");

    JPanel valuePanel = new JPanel();
    valuePanel.setLayout(new BorderLayout());
    valuePanel.setBorder(BorderFactory.createTitledBorder("Attribute value"));
    m_valueField = new EnvironmentField(m_env);
    valuePanel.add(m_valueField, BorderLayout.CENTER);
    valuePanel
        .setToolTipText("Constant value (number, string or date)
" + "for field. Special value \"now\" can be
" + "used for date attributes for the current
" + "time stamp"); fieldHolder.add(namePanel); fieldHolder.add(typePanel); fieldHolder.add(formatPanel); fieldHolder.add(valuePanel); add(fieldHolder, BorderLayout.NORTH); m_list.setVisibleRowCount(5); m_deleteBut.setEnabled(false); JPanel listPanel = new JPanel(); listPanel.setLayout(new BorderLayout()); JPanel butHolder = new JPanel(); butHolder.setLayout(new GridLayout(1, 0)); butHolder.add(m_newBut); butHolder.add(m_deleteBut); butHolder.add(m_upBut); butHolder.add(m_downBut); m_upBut.setEnabled(false); m_downBut.setEnabled(false); listPanel.add(butHolder, BorderLayout.NORTH); JScrollPane js = new JScrollPane(m_list); js.setBorder(BorderFactory .createTitledBorder("Attributes to add")); listPanel.add(js, BorderLayout.CENTER); add(listPanel, BorderLayout.CENTER); m_list.addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { if (!e.getValueIsAdjusting()) { if (!m_deleteBut.isEnabled()) { m_deleteBut.setEnabled(true); } Object entry = m_list.getSelectedValue(); if (entry != null) { AddUserFields.AttributeSpec m = (AddUserFields.AttributeSpec) entry; m_nameField.setText(m.getName()); m_valueField.setText(m.getValue()); String type = m.getType(); String format = ""; if (type.startsWith("date") && type.indexOf(":") > 0) { format = type.substring(type.indexOf(":") + 1, type.length()); type = type.substring(0, type.indexOf(":")); } m_typeField.setSelectedItem(type.trim()); m_dateFormatField.setText(format); } } } }); m_nameField.addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent e) { Object a = m_list.getSelectedValue(); if (a != null) { ((AddUserFields.AttributeSpec) a).setName(m_nameField.getText()); m_list.repaint(); } } }); m_typeField.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { Object a = m_list.getSelectedValue(); if (a != null) { String type = m_typeField.getSelectedItem().toString(); if (type.startsWith("date")) { // check to see if there is a date format specified String format = m_dateFormatField.getText(); if (format != null && format.length() > 0) { type += ":" + format; } } ((AddUserFields.AttributeSpec) a).setType(type); m_list.repaint(); } } }); m_valueField.addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent e) { Object a = m_list.getSelectedValue(); if (a != null) { ((AddUserFields.AttributeSpec) a).setValue(m_valueField.getText()); m_list.repaint(); } } }); m_newBut.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { AddUserFields.AttributeSpec a = new AddUserFields.AttributeSpec(); String name = (m_nameField.getText() != null && m_nameField.getText() .length() > 0) ? m_nameField.getText() : "newAtt"; a.setName(name); String type = m_typeField.getSelectedItem().toString(); if (type.startsWith("date")) { if (m_dateFormatField.getText() != null && m_dateFormatField.getText().length() > 0) { type += ":" + m_dateFormatField.getText(); } } a.setType(type); String value = (m_valueField.getText() != null) ? m_valueField .getText() : ""; a.setValue(value); m_listModel.addElement(a); if (m_listModel.size() > 1) { m_upBut.setEnabled(true); m_downBut.setEnabled(true); } if (m_listModel.size() > 0) { m_nameField.setEnabled(true); m_typeField.setEnabled(true); m_dateFormatField.setEnabled(true); m_valueField.setEnabled(true); } m_list.setSelectedIndex(m_listModel.size() - 1); } }); m_deleteBut.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int selected = m_list.getSelectedIndex(); if (selected >= 0) { m_listModel.removeElementAt(selected); if (m_listModel.size() <= 1) { m_upBut.setEnabled(false); m_downBut.setEnabled(false); } if (m_listModel.size() == 0) { m_nameField.setEnabled(false); m_typeField.setEnabled(false); m_dateFormatField.setEnabled(false); m_valueField.setEnabled(false); } } } }); m_upBut.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JListHelper.moveUp(m_list); } }); m_downBut.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JListHelper.moveDown(m_list); } }); if (m_dontShowButs) { return; } addButtons(); } private void addButtons() { JButton okBut = new JButton("OK"); JButton cancelBut = new JButton("Cancel"); JPanel butHolder = new JPanel(); butHolder.setLayout(new GridLayout(1, 2)); butHolder.add(okBut); butHolder.add(cancelBut); add(butHolder, BorderLayout.SOUTH); okBut.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { closingOK(); } }); cancelBut.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { closingCancel(); } }); } /** * Set environment variables to use * * @param env the variables to use */ @Override public void setEnvironment(Environment env) { m_env = env; } /** * Set an object that is interested in knowing when we make a change to the * object that we're editing */ @Override public void setModifiedListener(ModifyListener l) { m_modifyL = l; } /** * Initialize the GUI with settings from the filter being edited. */ protected void initialize() { List specs = m_filter.getAttributeSpecs(); m_listModel = new DefaultListModel(); m_list.setModel(m_listModel); if (specs.size() > 0) { m_upBut.setEnabled(true); m_downBut.setEnabled(true); for (AddUserFields.AttributeSpec s : specs) { AddUserFields.AttributeSpec specCopy = new AddUserFields.AttributeSpec( s.toStringInternal()); m_listModel.addElement(specCopy); } m_list.repaint(); } else { // disable editing fields until the user has clicked new m_nameField.setEnabled(false); m_typeField.setEnabled(false); m_dateFormatField.setEnabled(false); m_valueField.setEnabled(false); } } /** * Set the filter to edit. * * @param o the filter to edit */ @Override public void setObject(Object o) { if (o instanceof AddUserFields) { m_filter = (AddUserFields) o; setup(); initialize(); } } /** * Tell this customizer not to show its own OK and Cancel buttons. */ @Override public void dontShowOKCancelButtons() { m_dontShowButs = true; } /** * Actions to perform when the user has closed the dialog with the OK button. */ @Override public void closingOK() { List specs = new ArrayList(); for (int i = 0; i < m_listModel.size(); i++) { AddUserFields.AttributeSpec a = (AddUserFields.AttributeSpec) m_listModel .elementAt(i); specs.add(a); } if (m_modifyL != null) { m_modifyL.setModifiedStatus(AddUserFieldsCustomizer.this, true); } m_filter.setAttributeSpecs(specs); } /** * Actions to perform when the user has closed the dialog with the Cancel * button */ @Override public void closingCancel() { // Nothing to do } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy