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.
    */
  
   /*
    *    ViewerDialog.java
    *    Copyright (C) 2005 University of Waikato, Hamilton, New Zealand
    *
    */
  
  package weka.gui;
  
  import weka.core.Instances;
  import weka.gui.arffviewer.ArffPanel;
  
  import java.awt.BorderLayout;
  import java.awt.FlowLayout;
  import java.awt.Frame;
  import java.awt.event.ActionEvent;
  import java.awt.event.ActionListener;
  
  import javax.swing.JButton;
  import javax.swing.JDialog;
  import javax.swing.JPanel;
  import javax.swing.event.ChangeEvent;
  import javax.swing.event.ChangeListener;
  
  /**
   * A downsized version of the ArffViewer, displaying only one Instances-Object.
   *
   *
   * @see weka.gui.arffviewer.ArffViewer
   * @author FracPete (fracpete at waikato dot ac dot nz)
   * @version $Revision: 1.4 $ 
   */
  public class ViewerDialog 
    extends JDialog 
    implements ChangeListener { 
  
    /** for serialization */
    private static final long serialVersionUID = 6747718484736047752L;
    
    /** Signifies an OK property selection */
    public static final int APPROVE_OPTION = 0;
  
    /** Signifies a cancelled property selection */
    public static final int CANCEL_OPTION = 1;
  
    /** the result of the user's action, either OK or CANCEL */
    protected int m_Result = CANCEL_OPTION;
    
    /** Click to activate the current set parameters */
    protected JButton m_OkButton = new JButton("OK");
  
    /** Click to cancel the dialog */
    protected JButton m_CancelButton = new JButton("Cancel");
  
    /** Click to undo the last action */
    protected JButton m_UndoButton = new JButton("Undo");
    
    /** the panel to display the Instances-object */
    protected ArffPanel m_ArffPanel = new ArffPanel();
    
    /**
     * initializes the dialog with the given parent
     * 
     * @param parent the parent for this dialog
     */
    public ViewerDialog(Frame parent) {
      super(parent, true);
      createDialog();
    }
  
    /**
     * creates all the elements of the dialog
     */
    protected void createDialog() {
      JPanel              panel;
  
      setTitle("Viewer");
      
      getContentPane().setLayout(new BorderLayout());
      
      // ArffPanel
      m_ArffPanel.addChangeListener(this);
      getContentPane().add(m_ArffPanel, BorderLayout.CENTER);
      
      // Buttons
      panel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
      getContentPane().add(panel, BorderLayout.SOUTH);
      m_UndoButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
          undo();
        }
      });
      getContentPane().add(panel, BorderLayout.SOUTH);
      m_CancelButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
          m_Result = CANCEL_OPTION;
          setVisible(false);
        }
      });
      m_OkButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
          m_Result = APPROVE_OPTION;
          setVisible(false);
        }
      });
      panel.add(m_UndoButton);
      panel.add(m_OkButton);
      panel.add(m_CancelButton);
  
      pack();
    }
    
    /**
     * sets the instances to display
     */
    public void setInstances(Instances inst) {
      m_ArffPanel.setInstances(new Instances(inst));
    }
    
    /**
     * returns the currently displayed instances
     */
    public Instances getInstances() {
      return m_ArffPanel.getInstances();
    }
    
    /**
     * sets the state of the buttons 
     */
    protected void setButtons() {
      m_OkButton.setEnabled(true); 
      m_CancelButton.setEnabled(true); 
      m_UndoButton.setEnabled(m_ArffPanel.canUndo()); 
    }
    
    /**
     * returns whether the data has been changed
     * 
     * @return true if the data has been changed
     */
    public boolean isChanged() {
      return m_ArffPanel.isChanged();
    }
    
    /**
     * undoes the last action 
     */
    private void undo() {
      m_ArffPanel.undo();
    }
  
    /**
     * Invoked when the target of the listener has changed its state.
     */
    public void stateChanged(ChangeEvent e) {
      setButtons();
    }
    
    /**
     * Pops up the modal dialog and waits for Cancel or OK.
     *
     * @return either APPROVE_OPTION, or CANCEL_OPTION
     */
    public int showDialog() {
      m_Result = CANCEL_OPTION;
      setVisible(true);
      setButtons();
      return m_Result;
    }
  
    /**
     * Pops up the modal dialog and waits for Cancel or OK.
     *
     * @param inst the instances to display
     * @return either APPROVE_OPTION, or CANCEL_OPTION
     */
    public int showDialog(Instances inst) {
      setInstances(inst);
      return showDialog();
    }
  }
  