mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			457 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			457 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Java
		
	
	
	
| /* AbstractLayoutCache.java --
 | |
|    Copyright (C) 2002, 2004, 2006,  Free Software Foundation, Inc.
 | |
| 
 | |
| This file is part of GNU Classpath.
 | |
| 
 | |
| GNU Classpath 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, or (at your option)
 | |
| any later version.
 | |
| 
 | |
| GNU Classpath 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 GNU Classpath; see the file COPYING.  If not, write to the
 | |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | |
| 02110-1301 USA.
 | |
| 
 | |
| Linking this library statically or dynamically with other modules is
 | |
| making a combined work based on this library.  Thus, the terms and
 | |
| conditions of the GNU General Public License cover the whole
 | |
| combination.
 | |
| 
 | |
| As a special exception, the copyright holders of this library give you
 | |
| permission to link this library with independent modules to produce an
 | |
| executable, regardless of the license terms of these independent
 | |
| modules, and to copy and distribute the resulting executable under
 | |
| terms of your choice, provided that you also meet, for each linked
 | |
| independent module, the terms and conditions of the license of that
 | |
| module.  An independent module is a module which is not derived from
 | |
| or based on this library.  If you modify this library, you may extend
 | |
| this exception to your version of the library, but you are not
 | |
| obligated to do so.  If you do not wish to do so, delete this
 | |
| exception statement from your version. */
 | |
| 
 | |
| 
 | |
| package javax.swing.tree;
 | |
| 
 | |
| import java.awt.Rectangle;
 | |
| import java.util.Enumeration;
 | |
| 
 | |
| import javax.swing.event.TreeModelEvent;
 | |
| 
 | |
| /**
 | |
|  * class AbstractLayoutCache
 | |
|  *
 | |
|  * @author Andrew Selkirk
 | |
|  */
 | |
| public abstract class AbstractLayoutCache
 | |
|   implements RowMapper
 | |
| {
 | |
|   /**
 | |
|    * class NodeDimensions
 | |
|    */
 | |
|   public abstract static class NodeDimensions
 | |
|   {
 | |
|     /**
 | |
|      * Creates <code>NodeDimensions</code> object.
 | |
|      */
 | |
|     public NodeDimensions()
 | |
|     {
 | |
|       // Do nothing here.
 | |
|     }
 | |
| 
 | |
|    /**
 | |
|     * Get the node dimensions. The NodeDimensions property must be set (unless
 | |
|     * the method is overridden, like if {@link FixedHeightLayoutCache}. If the
 | |
|     * method is not overridden and the property is not set, the InternalError is
 | |
|     * thrown.
 | |
|     *
 | |
|     * @param value the last node in the path
 | |
|     * @param row the node row
 | |
|     * @param depth the indentation depth
 | |
|     * @param expanded true if this node is expanded, false otherwise
 | |
|     * @param bounds the area where the tree is displayed
 | |
|     */
 | |
|     public abstract Rectangle getNodeDimensions(Object value, int row,
 | |
|                                                 int depth, boolean expanded,
 | |
|                                                 Rectangle bounds);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * nodeDimensions
 | |
|    */
 | |
|   protected NodeDimensions nodeDimensions;
 | |
| 
 | |
|   /**
 | |
|    * treeModel
 | |
|    */
 | |
|   protected TreeModel treeModel;
 | |
| 
 | |
|   /**
 | |
|    * treeSelectionModel
 | |
|    */
 | |
|   protected TreeSelectionModel treeSelectionModel;
 | |
| 
 | |
|   /**
 | |
|    * rootVisible
 | |
|    */
 | |
|   protected boolean rootVisible;
 | |
| 
 | |
|   /**
 | |
|    * rowHeight
 | |
|    */
 | |
|   protected int rowHeight;
 | |
| 
 | |
|   /**
 | |
|    * Constructor AbstractLayoutCache
 | |
|    */
 | |
|   public AbstractLayoutCache()
 | |
|   {
 | |
|     // Do nothing here.
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * setNodeDimensions
 | |
|    *
 | |
|    * @param dimensions TODO
 | |
|    */
 | |
|   public void setNodeDimensions(NodeDimensions dimensions)
 | |
|   {
 | |
|     nodeDimensions = dimensions;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * getNodeDimensions
 | |
|    *
 | |
|    * @return NodeDimensions
 | |
|    */
 | |
|   public NodeDimensions getNodeDimensions()
 | |
|   {
 | |
|     return nodeDimensions;
 | |
|   }
 | |
| 
 | |
|  /**
 | |
|   * Get the node dimensions. The NodeDimensions property must be set
 | |
|   * (unless the method is overridden, like if
 | |
|   * {@link FixedHeightLayoutCache}. If the method is not overridden and
 | |
|   * the property is not set, the InternalError is thrown.
 | |
|   *
 | |
|   * @param value the last node in the path
 | |
|   * @param row the node row
 | |
|   * @param depth the indentation depth
 | |
|   * @param expanded true if this node is expanded, false otherwise
 | |
|   * @param bounds the area where the tree is displayed
 | |
|   */
 | |
|   protected Rectangle getNodeDimensions(Object value, int row, int depth,
 | |
|                                         boolean expanded, Rectangle bounds)
 | |
|   {
 | |
|     Rectangle d = null;
 | |
|     if (nodeDimensions != null)
 | |
|       d = nodeDimensions.getNodeDimensions(value, row, depth, expanded,
 | |
|                                            bounds);
 | |
|     return d;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Sets the model that provides the tree data.
 | |
|    *
 | |
|    * @param model the model
 | |
|    */
 | |
|   public void setModel(TreeModel model)
 | |
|   {
 | |
|     treeModel = model;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the model that provides the tree data.
 | |
|    *
 | |
|    * @return the model
 | |
|    */
 | |
|   public TreeModel getModel()
 | |
|   {
 | |
|     return treeModel;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * setRootVisible
 | |
|    *
 | |
|    * @param visible <code>true</code> if root should be visible,
 | |
|    * <code>false</code> otherwise
 | |
|    */
 | |
|   public void setRootVisible(boolean visible)
 | |
|   {
 | |
|     rootVisible = visible;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * isRootVisible
 | |
|    *
 | |
|    * @return <code>true</code> if root is visible,
 | |
|    * <code>false</code> otherwise
 | |
|    */
 | |
|   public boolean isRootVisible()
 | |
|   {
 | |
|     return rootVisible;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * setRowHeight
 | |
|    *
 | |
|    * @param height the row height
 | |
|    */
 | |
|   public void setRowHeight(int height)
 | |
|   {
 | |
|     rowHeight = height;
 | |
|     invalidateSizes();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * getRowHeight
 | |
|    *
 | |
|    * @return the row height
 | |
|    */
 | |
|   public int getRowHeight()
 | |
|   {
 | |
|     return rowHeight;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * setSelectionModel
 | |
|    *
 | |
|    * @param model the model
 | |
|    */
 | |
|   public void setSelectionModel(TreeSelectionModel model)
 | |
|   {
 | |
|     if (treeSelectionModel != null)
 | |
|       treeSelectionModel.setRowMapper(null);
 | |
|     treeSelectionModel = model;
 | |
|     if (treeSelectionModel != null)
 | |
|       treeSelectionModel.setRowMapper(this);
 | |
| 
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * getSelectionModel
 | |
|    *
 | |
|    * @return the model
 | |
|    */
 | |
|   public TreeSelectionModel getSelectionModel()
 | |
|   {
 | |
|     return treeSelectionModel;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Get the sum of heights for all rows. This class provides a general not
 | |
|    * optimized implementation that is overridded in derived classes
 | |
|    * ({@link VariableHeightLayoutCache}, {@link FixedHeightLayoutCache}) for
 | |
|    * the better performance.
 | |
|    */
 | |
|   public int getPreferredHeight()
 | |
|   {
 | |
|     int height = 0;
 | |
|     int n = getRowCount();
 | |
|     Rectangle r = new Rectangle();
 | |
|     for (int i = 0; i < n; i++)
 | |
|       {
 | |
|         TreePath path = getPathForRow(i);
 | |
|         height += getBounds(path, r).height;
 | |
|       }
 | |
|     return height;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Get the maximal width. This class provides a general not
 | |
|    * optimized implementation that is overridded in derived classes
 | |
|    * ({@link VariableHeightLayoutCache}, {@link FixedHeightLayoutCache}) for
 | |
|    * the better performance.
 | |
|    *
 | |
|    * @param rect the rectangle that is used during the method work
 | |
|    */
 | |
|   public int getPreferredWidth(Rectangle rect)
 | |
|   {
 | |
|     int maximalWidth = 0;
 | |
|     Rectangle r = new Rectangle();
 | |
|     int n = getRowCount();
 | |
|     for (int i = 0; i < n; i++)
 | |
|       {
 | |
|         TreePath path = getPathForRow(i);
 | |
|         r.setBounds(0, 0, 0, 0);
 | |
|         r = getBounds(path, r);
 | |
|         if (r.x + r.width > maximalWidth)
 | |
|           maximalWidth = r.x + r.width;
 | |
|         // Invalidate the cached value as this may be the very early call
 | |
|         // before the heigth is properly set (the vertical coordinate may
 | |
|         // not be correct).
 | |
|         invalidatePathBounds(path);
 | |
|       }
 | |
|     return maximalWidth;
 | |
|   }
 | |
|   /**
 | |
|    * isExpanded
 | |
|    *
 | |
|    * @param value0 TODO
 | |
|    *
 | |
|    * @return boolean
 | |
|    */
 | |
|   public abstract boolean isExpanded(TreePath value0);
 | |
| 
 | |
|   /**
 | |
|    * getBounds
 | |
|    *
 | |
|    * @param value0 TODO
 | |
|    * @param value1 TODO
 | |
|    *
 | |
|    * @return Rectangle
 | |
|    */
 | |
|   public abstract Rectangle getBounds(TreePath value0, Rectangle value1);
 | |
| 
 | |
|   /**
 | |
|    * getPathForRow
 | |
|    *
 | |
|    * @param row the row
 | |
|    *
 | |
|    * @return the tree path
 | |
|    */
 | |
|   public abstract TreePath getPathForRow(int row);
 | |
| 
 | |
|   /**
 | |
|    * getRowForPath
 | |
|    *
 | |
|    * @param path the tree path
 | |
|    *
 | |
|    * @return the row
 | |
|    */
 | |
|   public abstract int getRowForPath(TreePath path);
 | |
| 
 | |
|   /**
 | |
|    * getPathClosestTo
 | |
|    *
 | |
|    * @param value0 TODO
 | |
|    * @param value1 TODO
 | |
|    *
 | |
|    * @return the tree path
 | |
|    */
 | |
|   public abstract TreePath getPathClosestTo(int value0, int value1);
 | |
| 
 | |
|   /**
 | |
|    * getVisiblePathsFrom
 | |
|    *
 | |
|    * @param path the tree path
 | |
|    *
 | |
|    * @return Enumeration
 | |
|    */
 | |
|   public abstract Enumeration<TreePath> getVisiblePathsFrom(TreePath path);
 | |
| 
 | |
|   /**
 | |
|    * getVisibleChildCount
 | |
|    *
 | |
|    * @param path the tree path
 | |
|    *
 | |
|    * @return int
 | |
|    */
 | |
|   public abstract int getVisibleChildCount(TreePath path);
 | |
| 
 | |
|   /**
 | |
|    * setExpandedState
 | |
|    *
 | |
|    * @param value0 TODO
 | |
|    *
 | |
|    * @param value1 TODO
 | |
|    */
 | |
|   public abstract void setExpandedState(TreePath value0, boolean value1);
 | |
| 
 | |
|   /**
 | |
|    * getExpandedState
 | |
|    *
 | |
|    * @param path the tree path
 | |
|    *
 | |
|    * @return boolean
 | |
|    */
 | |
|   public abstract boolean getExpandedState(TreePath path);
 | |
| 
 | |
|   /**
 | |
|    * getRowCount
 | |
|    *
 | |
|    * @return the number of rows
 | |
|    */
 | |
|   public abstract int getRowCount();
 | |
| 
 | |
|   /**
 | |
|    * invalidateSizes
 | |
|    */
 | |
|   public abstract void invalidateSizes();
 | |
| 
 | |
|   /**
 | |
|    * invalidatePathBounds
 | |
|    *
 | |
|    * @param path the tree path
 | |
|    */
 | |
|   public abstract void invalidatePathBounds(TreePath path);
 | |
| 
 | |
|   /**
 | |
|    * treeNodesChanged
 | |
|    *
 | |
|    * @param event the event to send
 | |
|    */
 | |
|   public abstract void treeNodesChanged(TreeModelEvent event);
 | |
| 
 | |
|   /**
 | |
|    * treeNodesInserted
 | |
|    *
 | |
|    * @param event the event to send
 | |
|    */
 | |
|   public abstract void treeNodesInserted(TreeModelEvent event);
 | |
| 
 | |
|   /**
 | |
|    * treeNodesRemoved
 | |
|    *
 | |
|    * @param event the event to send
 | |
|    */
 | |
|   public abstract void treeNodesRemoved(TreeModelEvent event);
 | |
| 
 | |
|   /**
 | |
|    * treeStructureChanged
 | |
|    *
 | |
|    * @param event the event to send
 | |
|    */
 | |
|   public abstract void treeStructureChanged(TreeModelEvent event);
 | |
| 
 | |
|   /**
 | |
|    * Get the tree row numbers for the given pathes. This method performs
 | |
|    * the "bulk" conversion that may be faster than mapping pathes one by
 | |
|    * one. To have the benefit from the bulk conversion, the method must be
 | |
|    * overridden in the derived classes. The default method delegates work
 | |
|    * to the {@link #getRowForPath(TreePath)}.
 | |
|    *
 | |
|    * @param paths the tree paths the array of the tree pathes.
 | |
|    * @return the array of the matching tree rows.
 | |
|    */
 | |
|   public int[] getRowsForPaths(TreePath[] paths)
 | |
|   {
 | |
|     int[] rows = null;
 | |
|     if (paths != null)
 | |
|       {
 | |
|         rows = new int[paths.length];
 | |
|         for (int i = 0; i < rows.length; i++)
 | |
|           rows[i] = getRowForPath(paths[i]);
 | |
|       }
 | |
|     return rows;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns true if this layout supposes that all rows have the fixed
 | |
|    * height.
 | |
|    *
 | |
|    * @return boolean true if all rows in the tree must have the fixed
 | |
|    * height (false by default).
 | |
|    */
 | |
|   protected boolean isFixedRowHeight()
 | |
|   {
 | |
|     return rowHeight > 0;
 | |
|   }
 | |
| }
 |