components/visual-panels/core/src/java/util/com/oracle/solaris/vp/util/swing/tree/TreeTable.java
changeset 3553 f1d133b09a8c
parent 3552 077ebe3d0d24
child 3554 ef58713bafc4
--- a/components/visual-panels/core/src/java/util/com/oracle/solaris/vp/util/swing/tree/TreeTable.java	Tue Dec 16 05:53:51 2014 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,478 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-
-/*
- * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.
- */
-
-package com.oracle.solaris.vp.util.swing.tree;
-
-import java.awt.*;
-import java.awt.event.MouseEvent;
-import java.util.*;
-import java.util.List;
-import javax.swing.*;
-import javax.swing.event.*;
-import javax.swing.table.*;
-import com.oracle.solaris.vp.util.swing.ExtTable;
-
-@SuppressWarnings({"serial"})
-public class TreeTable extends ExtTable {
-    //
-    // Instance data
-    //
-
-    protected class RenderPanel extends JPanel {
-	//
-	// Instance data
-	//
-
-	private TreeLines lines;
-
-	//
-	// Constructors
-	//
-
-	public RenderPanel(TreeLines lines) {
-	    super(new BorderLayout());
-	    this.lines = lines;
-	    setBackground(UIManager.getColor("Table.selectionBackground"));
-	    setOpaque(false);
-	}
-
-	//
-	// Component methods
-	//
-
-	@Override
-	public boolean isEnabled() {
-	    try {
-		return getComponent(1).isEnabled();
-	    } catch (IndexOutOfBoundsException e) {
-		return false;
-	    }
-	}
-
-	@Override
-	public void setEnabled(boolean enabled) {
-	    try {
-		getComponent(1).setEnabled(enabled);
-	    } catch (IndexOutOfBoundsException ignore) {
-	    }
-	}
-
-	//
-	// RenderPanel methods
-	//
-
-	public TreeLines getTreeLines() {
-	    return lines;
-	}
-
-	public void setComponent(Component c) {
-	    removeAll();
-	    add(lines, BorderLayout.WEST);
-	    add(c, BorderLayout.CENTER);
-	}
-    }
-
-    //
-    // Static data
-    //
-
-    private RowFilter<TreeTableModelAdapter, Integer> ROOT_VISIBLE_FILTER =
-	new RowFilter<TreeTableModelAdapter, Integer>() {
-	    @Override
-	    public boolean include(RowFilter.Entry<
-		? extends TreeTableModelAdapter, ? extends Integer> entry) {
-
-		if (isRootVisible()) {
-		    return true;
-		}
-
-		int index = entry.getIdentifier();
-		ModelRowData row = entry.getModel().getRow(index);
-
-		return row.getLevel() != 0;
-	    }
-	};
-
-    private RowFilter<TreeTableModelAdapter, Integer>
-	ANCESTOR_COLLAPSED_FILTER =
-	new RowFilter<TreeTableModelAdapter, Integer>() {
-	    @Override
-	    public boolean include(RowFilter.Entry<
-		? extends TreeTableModelAdapter, ? extends Integer> entry) {
-
-		TreeTableModelAdapter adapter = entry.getModel();
-		int index = entry.getIdentifier();
-		ModelRowData row = adapter.getRow(index);
-
-		ModelRowData parent = adapter.getParent(row);
-		while (parent != null) {
-		    if (!parent.isExpanded()) {
-			return false;
-		    }
-		    parent = adapter.getParent(parent);
-		}
-
-		return true;
-	    }
-	};
-
-    //
-    // Instance data
-    //
-
-    private List<ViewRowData> rowData = new ArrayList<ViewRowData>();
-
-    private TreeLines renderTreeLines = new TreeLines(this);
-    private RenderPanel renderPanel = new RenderPanel(renderTreeLines);
-
-    private TreeLines editorTreeLines = new TreeLines(this);
-    private RenderPanel editPanel = new RenderPanel(editorTreeLines);
-
-    private boolean rootVisible = true;
-    private boolean turnerPressed;
-
-    private List<RowFilter<TreeTableModelAdapter, Integer>> filters =
-	new ArrayList<RowFilter<TreeTableModelAdapter, Integer>>();
-
-    //
-    // Constructors
-    //
-
-    public TreeTable(TreeTableModel model) {
-	super(new TreeTableModelAdapter(model));
-
-	// Set up sorting
-	setAutoCreateRowSorter(false);
-
-	final TableRowSorter<TreeTableModelAdapter> sorter =
-	    new TableRowSorter<TreeTableModelAdapter>(getModel());
-
-	// By default, sorting is disabled
-	for (int i = 0, n = model.getColumnCount(); i < n; i++) {
-	    sorter.setSortable(i, false);
-	}
-
-	getColumnModel().addColumnModelListener(
-	    new TableColumnModelListener() {
-		@Override
-		public void columnAdded(TableColumnModelEvent e) {
-		    sorter.setSortable(e.getToIndex(), false);
-		}
-
-		@Override
-		public void columnMarginChanged(ChangeEvent e) {
-		}
-
-		@Override
-		public void columnMoved(TableColumnModelEvent e) {
-		}
-
-		@Override
-		public void columnRemoved(TableColumnModelEvent e) {
-		}
-
-		@Override
-		public void columnSelectionChanged(ListSelectionEvent e) {
-		}
-	    });
-
-	sorter.setRowFilter(
-	    new RowFilter<TreeTableModelAdapter, Integer>() {
-		@Override
-		public boolean include(
-		    RowFilter.Entry<? extends TreeTableModelAdapter,
-		    ? extends Integer> entry) {
-
-		    synchronized (filters) {
-			for (RowFilter<TreeTableModelAdapter, Integer> filter :
-			    filters) {
-
-			    if (!filter.include(entry)) {
-				return false;
-			    }
-			}
-			return true;
-		    }
-		}
-	    });
-	addRowFilter(ROOT_VISIBLE_FILTER);
-	addRowFilter(ANCESTOR_COLLAPSED_FILTER);
-
-	setRowSorter(sorter);
-    }
-
-    //
-    // Component methods
-    //
-
-    @Override
-    protected void processMouseEvent(MouseEvent e) {
-	if (e.getButton() == 1) {
-	    switch (e.getID()) {
-		case MouseEvent.MOUSE_PRESSED:
-		    Point p = e.getPoint();
-		    int vRow = rowAtPoint(p);
-		    if (vRow != -1) {
-			int vCol = columnAtPoint(p);
-			int mCol = convertColumnIndexToModel(vCol);
-			TreeTableModelAdapter adapter = getModel();
-			if (adapter.getTreeTableModel().isTreeColumn(mCol)) {
-
-			    Rectangle cellRect = getCellRect(vRow, vCol, false);
-			    Point relPoint = new Point(
-				p.x - cellRect.x, p.y - cellRect.y);
-
-			    ViewRowData data = getRowData(vRow);
-			    renderTreeLines.setRowData(data);
-
-			    if (renderTreeLines.isOverTurner(relPoint)) {
-//				TableCellEditor editor =
-//				    getTable().getCellEditor();
-//				if (editor != null) {
-//				    editor.stopCellEditing();
-//				}
-
-				ModelRowData row = data.getModelRow();
-				row.setExpanded(!row.isExpanded());
-				((TableRowSorter)getRowSorter()).sort();
-				turnerPressed = true;
-				e.consume();
-				return;
-			    }
-			}
-		    }
-		    break;
-
-		case MouseEvent.MOUSE_RELEASED:
-		    turnerPressed = false;
-		    break;
-	    }
-	}
-
-	super.processMouseEvent(e);
-    }
-
-    @Override
-    protected void processMouseMotionEvent(MouseEvent e) {
-	switch (e.getID()) {
-	    case MouseEvent.MOUSE_DRAGGED:
-		if (turnerPressed) {
-		    e.consume();
-		    return;
-		}
-		break;
-	}
-
-	super.processMouseMotionEvent(e);
-    }
-
-    //
-    // JComponent methods
-    //
-
-    @Override
-    protected void paintComponent(Graphics g) {
-	// This recalculation really should only be done when 1) a sort occurs,
-	// 2) the model changes, or 3) the visible rows change.  Lacking hooks
-	// into the latter, do it every time.
-	synchronized (rowData) {
-	    Rectangle clip = getVisibleRect();
-	    int rHeight = getRowHeight();
-	    int fVRow = clip.y / rHeight;
-	    int lVRow = (clip.y + clip.height) / rHeight;
-	    lVRow = Math.min(lVRow, getRowCount() - 1);
-
-	    int nVRows = lVRow - fVRow + 1;
-
-	    rowData.clear();
-
-	    TreeTableModelAdapter adapter = getModel();
-	    List<Boolean> showLines = null;
-
-	    ViewRowData data = null;
-	    for (int vRow = lVRow; vRow >= fVRow; vRow--) {
-		data = createRowData(adapter, vRow,
-		    data == null ? null : data.getShowLines());
-
-		rowData.add(data);
-	    }
-
-	    Collections.reverse(rowData);
-	}
-
-	super.paintComponent(g);
-    }
-
-    //
-    // JTable methods
-    //
-
-    @Override
-    public TreeTableModelAdapter getModel() {
-	return (TreeTableModelAdapter)super.getModel();
-    }
-
-    @Override
-    public Component prepareEditor(TableCellEditor editor, int vRow, int vCol) {
-	Component comp = super.prepareEditor(editor, vRow, vCol);
-	return prepare(editPanel, comp, vRow, vCol);
-    }
-
-    @Override
-    public Component prepareRenderer(TableCellRenderer renderer, int vRow,
-	int vCol) {
-
-	Component comp = super.prepareRenderer(renderer, vRow, vCol);
-	return prepare(renderPanel, comp, vRow, vCol);
-    }
-
-    //
-    // TreeTable methods
-    //
-
-    public void addRowFilter(RowFilter<TreeTableModelAdapter, Integer> filter) {
-	synchronized (filters) {
-	    filters.add(filter);
-	}
-    }
-
-    public TreeLines getEditorTreeLines() {
-	return editorTreeLines;
-    }
-
-    public TreeLines getRenderTreeLines() {
-	return renderTreeLines;
-    }
-
-    public boolean isRootVisible() {
-	return rootVisible;
-    }
-
-    public void removeRowFilter(
-	RowFilter<TreeTableModelAdapter, Integer> filter) {
-
-	synchronized (filters) {
-	    filters.remove(filter);
-	}
-    }
-
-    public void setRootVisible(boolean rootVisible) {
-	this.rootVisible = rootVisible;
-	((TableRowSorter)getRowSorter()).sort();
-	repaint();
-    }
-
-    //
-    // Private methods
-    //
-
-    private ViewRowData createRowData(TreeTableModelAdapter adapter, int vRow,
-	List<Boolean> templateShowLines) {
-
-	int mRow = convertRowIndexToModel(vRow);
-	ModelRowData row = adapter.getRow(mRow);
-	int level = row.getLevel();
-
-	// Ensure sufficient size
-	List<Boolean> showLines = new ArrayList<Boolean>();
-	for (int i = 0; i < level; i++) {
-	    Boolean value = null;
-	    try {
-		value = templateShowLines.get(i);
-	    } catch (IndexOutOfBoundsException ignore) {
-	    } catch (NullPointerException ignore) {
-	    }
-	    showLines.add(value);
-	}
-	showLines.add(null);
-
-	ViewRowData data = new ViewRowData(vRow, row, showLines);
-
-	int nRows = getRowCount();
-	for (vRow++; level >= 0 && showLines.get(level) == null; vRow++) {
-	    int curLevel = -1;
-	    if (vRow < nRows) {
-		mRow = convertRowIndexToModel(vRow);
-		row = adapter.getRow(mRow);
-		curLevel = row.getLevel();
-	    }
-
-	    if (curLevel == level) {
-		showLines.set(level, true);
-		level--;
-	    } else
-
-	    if (curLevel < level) {
-		for (int i = level; i > curLevel; i--) {
-		    showLines.set(level, false);
-		    level--;
-		}
-
-		if (level != -1) {
-		    showLines.set(level, true);
-		    level--;
-		}
-	    }
-	}
-
-	return data;
-    }
-
-    private ViewRowData getRowData(int vRow) throws IndexOutOfBoundsException {
-	synchronized (rowData) {
-	    int offset = rowData.get(0).getRow();
-	    return rowData.get(vRow - offset);
-	}
-    }
-
-    private Component prepare(RenderPanel panel, Component comp, int vRow,
-	int vCol) {
-
-	TreeTableModelAdapter model = getModel();
-	int mCol = convertColumnIndexToModel(vCol);
-
-	if (model.getTreeTableModel().isTreeColumn(mCol)) {
-	    try {
-		ViewRowData data = getRowData(vRow);
-		panel.getTreeLines().setRowData(data);
-		panel.setComponent(comp);
-
-		if (isCellSelected(vRow, vCol)) {
-		    panel.setOpaque(true);
-		    panel.getTreeLines().setForeground(
-			UIManager.getColor("Table.selectionForeground"));
-		} else {
-		    panel.setOpaque(false);
-		    panel.getTreeLines().setForeground(null);
-		}
-
-		comp = panel;
-	    } catch (IndexOutOfBoundsException ignore) {
-	    }
-	}
-
-	return comp;
-    }
-}