home *** CD-ROM | disk | FTP | other *** search
/ Chip 1998 November / Chip_1998-11_cd.bin / tema / Cafe / jfc.bin / BasicTreeCellEditor.java < prev    next >
Text File  |  1998-02-26  |  5KB  |  173 lines

  1. /*
  2.  * @(#)BasicTreeCellEditor.java    1.12 98/02/02
  3.  * 
  4.  * Copyright (c) 1997 Sun Microsystems, Inc. All Rights Reserved.
  5.  * 
  6.  * This software is the confidential and proprietary information of Sun
  7.  * Microsystems, Inc. ("Confidential Information").  You shall not
  8.  * disclose such Confidential Information and shall use it only in
  9.  * accordance with the terms of the license agreement you entered into
  10.  * with Sun.
  11.  * 
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
  13.  * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  14.  * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  15.  * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
  16.  * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
  17.  * THIS SOFTWARE OR ITS DERIVATIVES.
  18.  * 
  19.  */
  20.  
  21. package com.sun.java.swing.plaf.basic;
  22.  
  23. import com.sun.java.swing.*;
  24. import com.sun.java.swing.event.*;
  25. import java.awt.*;
  26. import java.awt.event.*;
  27. import java.beans.*;
  28. import java.util.*;
  29. import com.sun.java.swing.plaf.*;
  30. import com.sun.java.swing.tree.*;
  31.  
  32. /**
  33.  * BasicTreeCellEditor starts editing on triple clicks, or on
  34.  * click-pause-click-pause (two single clicks, followed by a 
  35.  * delay of 1200 milliseconds).
  36.  * This determines the JTree instance by seeing if one of the
  37.  * editorListeners that is added is the BasicTreeUI, and if it is
  38.  * the JTree is obtained from that. Meaning there isn't really a 
  39.  * good reason for this to be an inner class.
  40.  * <p>
  41.  * Warning: serialized objects of this class will not be compatible with
  42.  * future swing releases.  The current serialization support is appropriate
  43.  * for short term storage or RMI between Swing1.0 applications.  It will
  44.  * not be possible to load serialized Swing1.0 objects with future releases
  45.  * of Swing.  The JDK1.2 release of Swing will be the compatibility
  46.  * baseline for the serialized form of Swing objects.
  47.  *
  48.  * @version 1.12 02/02/98
  49.  * @author Scott Violet
  50.  */
  51. public class BasicTreeCellEditor extends BasicTreeCellEditorContainer
  52.     implements ActionListener, TreeSelectionListener
  53. {
  54.     /** Should isCellEditable return true? This is set in configure...
  55.      * based on the value and lastPath. */
  56.     protected boolean     canEdit;
  57.     /** JTree instance listening too. */
  58.     protected JTree       changeTree;
  59.     /** last path that was selected. */
  60.     protected TreePath   lastPath;
  61.     /** Used before starting the editing session. */
  62.     protected Timer      timer;
  63.  
  64.     public BasicTreeCellEditor(BasicTreeCellRenderer renderer) {
  65.     super(null, renderer);
  66.  
  67.     /* Boy, it sure would be nice not to have to call super first! */
  68.     JTextField        tf = new JTextField();
  69.     realEditor = new DefaultCellEditor(tf);
  70.     /* One click to edit. */
  71.     ((DefaultCellEditor)realEditor).setClickCountToStart(1);
  72.     }
  73.  
  74.     /**
  75.      * Messages super and sets isCellEditable based on value nast lastPath.
  76.      */
  77.     public Component getTreeCellEditorComponent(JTree tree, Object value,
  78.                         boolean isSelected,
  79.                         boolean expanded,
  80.                         boolean leaf, int row) {
  81.     TreePath        newPath = tree.getPathForRow(row);
  82.     Component    returnValue;
  83.  
  84.     returnValue = super.getTreeCellEditorComponent(tree, value, isSelected,
  85.                                expanded,leaf, row);
  86.     canEdit = (lastPath != null && newPath != null &&
  87.            lastPath.equals(newPath));
  88.     if(timer != null) {
  89.         timer.stop();
  90.     }
  91.     return returnValue;
  92.     }
  93.  
  94.     /**
  95.      * Returns true for triple clicks, or if isCellEditable is true, or the
  96.      * event is null.
  97.      */
  98.     public boolean isCellEditable(EventObject event) {
  99.     if(event == null || ((event instanceof MouseEvent) &&
  100.                  ((MouseEvent)event).getClickCount() > 2))
  101.         return super.isCellEditable(event);
  102.     else if(canEdit && ((MouseEvent)event).getClickCount() == 1) {
  103.         if(timer == null) {
  104.         timer = new Timer(1200, this);
  105.         timer.setRepeats(false);
  106.         }
  107.         timer.start();
  108.     }
  109.     return false;
  110.     }
  111.  
  112.     /**
  113.      * Messages super and setChangeTree.
  114.      */
  115.     public void addCellEditorListener(CellEditorListener l) {
  116.     super.addCellEditorListener(l);
  117.     if(l instanceof BasicTreeUI)
  118.         setChangeTree(((BasicTreeUI)l).tree);
  119.     else
  120.         setChangeTree(null);
  121.     }
  122.  
  123.     /**
  124.      * Messages super and setChangeTree.
  125.      */
  126.     public void removeCellEditorListener(CellEditorListener l) {
  127.     super.removeCellEditorListener(l);
  128.     if(l instanceof BasicTreeUI)
  129.         setChangeTree(null);
  130.     }
  131.  
  132.     /**
  133.      * Sets the JTree to listen to to newTree.
  134.      */
  135.     protected void setChangeTree(JTree newTree) {
  136.     if(changeTree != null)
  137.         changeTree.removeTreeSelectionListener(this);
  138.     changeTree = newTree;
  139.     if(changeTree != null)
  140.         changeTree.addTreeSelectionListener(this);
  141.     if(timer != null) {
  142.         timer.stop();
  143.     }
  144.     }
  145.  
  146.     /**
  147.      * Resets lastPath.
  148.      */
  149.     public void valueChanged(TreeSelectionEvent e) {
  150.     if(changeTree != null) {
  151.         if(changeTree.getSelectionCount() == 1)
  152.         lastPath = changeTree.getSelectionPath();
  153.         else
  154.         lastPath = null;
  155.     }
  156.     if(timer != null) {
  157.         timer.stop();
  158.     }
  159.     }
  160.  
  161.     /**
  162.      * Messaged when the timer fires, this will start the editing
  163.      * session.
  164.      */
  165.     public void actionPerformed(ActionEvent e) {
  166.     if(changeTree != null && lastPath != null) {
  167.         changeTree.startEditingAtPath(lastPath);
  168.     }
  169.     }
  170. } // End of BasicTreeCellEditor
  171.  
  172.  
  173.