components/visual-panels/core/src/java/vpanels/panel/com/oracle/solaris/vp/panel/swing/view/ManagedObjectTreeTable.java
changeset 827 0944d8c0158b
equal deleted inserted replaced
826:c6aad84d2493 827:0944d8c0158b
       
     1 /*
       
     2  * CDDL HEADER START
       
     3  *
       
     4  * The contents of this file are subject to the terms of the
       
     5  * Common Development and Distribution License (the "License").
       
     6  * You may not use this file except in compliance with the License.
       
     7  *
       
     8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
       
     9  * or http://www.opensolaris.org/os/licensing.
       
    10  * See the License for the specific language governing permissions
       
    11  * and limitations under the License.
       
    12  *
       
    13  * When distributing Covered Code, include this CDDL HEADER in each
       
    14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
       
    15  * If applicable, add the following below this CDDL HEADER, with the
       
    16  * fields enclosed by brackets "[]" replaced with your own identifying
       
    17  * information: Portions Copyright [yyyy] [name of copyright owner]
       
    18  *
       
    19  * CDDL HEADER END
       
    20  */
       
    21 
       
    22 /*
       
    23  * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.
       
    24  */
       
    25 
       
    26 package com.oracle.solaris.vp.panel.swing.view;
       
    27 
       
    28 import java.awt.*;
       
    29 import java.awt.event.*;
       
    30 import java.util.*;
       
    31 import java.util.List;
       
    32 import javax.swing.*;
       
    33 import javax.swing.event.*;
       
    34 import javax.swing.table.*;
       
    35 import com.oracle.solaris.vp.panel.common.model.ManagedObject;
       
    36 import com.oracle.solaris.vp.util.swing.*;
       
    37 import com.oracle.solaris.vp.util.swing.tree.*;
       
    38 
       
    39 @SuppressWarnings({"serial"})
       
    40 public class ManagedObjectTreeTable extends TreeTable {
       
    41     //
       
    42     // Instance data
       
    43     //
       
    44 
       
    45     private JPopupMenu popup;
       
    46 
       
    47     //
       
    48     // Constructors
       
    49     //
       
    50 
       
    51     public ManagedObjectTreeTable(ManagedObjectTreeTableModel model,
       
    52 	JPopupMenu popup, final Action dAction) {
       
    53 
       
    54 	super(model);
       
    55 
       
    56 	this.popup = popup;
       
    57 
       
    58 	ListSelectionModel tsModel = new ExtListSelectionModel();
       
    59 	setSelectionModel(tsModel);
       
    60 	tsModel.setSelectionMode(
       
    61 	    ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
       
    62 
       
    63 	for (int i = 0, n = model.getColumnCount(); i < n; i++) {
       
    64 	    setCustomRendererEditor(i);
       
    65 	}
       
    66 
       
    67 	getColumnModel().addColumnModelListener(
       
    68 	    new TableColumnModelListener() {
       
    69 		@Override
       
    70 		public void columnAdded(TableColumnModelEvent e) {
       
    71 		    setCustomRendererEditor(e.getToIndex());
       
    72 		}
       
    73 
       
    74 		@Override
       
    75 		public void columnMarginChanged(ChangeEvent e) {
       
    76 		}
       
    77 
       
    78 		@Override
       
    79 		public void columnMoved(TableColumnModelEvent e) {
       
    80 		}
       
    81 
       
    82 		@Override
       
    83 		public void columnRemoved(TableColumnModelEvent e) {
       
    84 		}
       
    85 
       
    86 		@Override
       
    87 		public void columnSelectionChanged(ListSelectionEvent e) {
       
    88 		}
       
    89 	    });
       
    90 
       
    91 	addMouseListener(
       
    92 	    new MouseAdapter() {
       
    93 		//
       
    94 		// MouseListener methods
       
    95 		//
       
    96 
       
    97 		@Override
       
    98 		public void mouseClicked(MouseEvent e) {
       
    99 		    // Invoke default action (if non-null) on double-click
       
   100 		    if (dAction != null && GUIUtil.isUnmodifiedClick(e, 2) &&
       
   101 			dAction.isEnabled()) {
       
   102 
       
   103 			EventQueue.invokeLater(
       
   104 			    new Runnable() {
       
   105 				@Override
       
   106 				public void run() {
       
   107 				    ActionEvent ae = new ActionEvent(
       
   108 					ManagedObjectTreeTable.this,
       
   109 					ActionEvent.ACTION_PERFORMED,
       
   110 					"default");
       
   111 				    dAction.actionPerformed(ae);
       
   112 				}
       
   113 			    });
       
   114 		    }
       
   115 		}
       
   116 
       
   117 		@Override
       
   118 		public void mousePressed(final MouseEvent e) {
       
   119 		    if (e.isPopupTrigger()) {
       
   120 			// By default, the JTable doesn't select on
       
   121 			// right-clicks.  If right-clicks are a popup trigger,
       
   122 			// modify selection before popping up the menu.
       
   123 			if (e.getButton() == MouseEvent.BUTTON3) {
       
   124 			    int index = rowAtPoint(e.getPoint());
       
   125 			    if (index >= 0) {
       
   126 				ListSelectionModel model = getSelectionModel();
       
   127 				if (!model.isSelectedIndex(index)) {
       
   128 				    model.clearSelection();
       
   129 				    model.setSelectionInterval(index, index);
       
   130 				};
       
   131 			    }
       
   132 			}
       
   133 
       
   134 			// Invoke later so that events resulting from any
       
   135 			// change in selection above can be processed before the
       
   136 			// popup is shown.
       
   137 			EventQueue.invokeLater(
       
   138 			    new Runnable() {
       
   139 				@Override
       
   140 				public void run() {
       
   141 				    showPopup(e.getX(), e.getY());
       
   142 				}
       
   143 			    });
       
   144 		    }
       
   145 		}
       
   146 
       
   147 		@Override
       
   148 		public void mouseReleased(final MouseEvent e) {
       
   149 		    if (e.isPopupTrigger()) {
       
   150 			EventQueue.invokeLater(
       
   151 			    new Runnable() {
       
   152 				@Override
       
   153 				public void run() {
       
   154 				    showPopup(e.getX(), e.getY());
       
   155 				}
       
   156 			    });
       
   157 		    }
       
   158 		}
       
   159 	    });
       
   160 
       
   161 	setAutoFitColumns(ColumnWidthPolicy.PREFERRED);
       
   162     }
       
   163 
       
   164     //
       
   165     // JTable methods
       
   166     //
       
   167 
       
   168     @Override
       
   169     public Component prepareRenderer(TableCellRenderer renderer, int vRow,
       
   170 	int vCol) {
       
   171 
       
   172 	Component c = super.prepareRenderer(renderer, vRow, vCol);
       
   173 
       
   174 	boolean enabled = isCellSelected(vRow, vCol);
       
   175 	if (!enabled) {
       
   176 	    TreeTableModelAdapter adapter = getModel();
       
   177 
       
   178 	    int mRow = convertRowIndexToModel(vRow);
       
   179 	    int mCol = convertColumnIndexToModel(vCol);
       
   180 
       
   181 	    ManagedObjectTreeNode node =
       
   182 		(ManagedObjectTreeNode)adapter.getTreeNode(mRow);
       
   183 
       
   184 	    ManagedObjectTreeTableModel model =
       
   185 		(ManagedObjectTreeTableModel)adapter.getTreeTableModel();
       
   186 
       
   187 	    enabled = model.isCellEnabled(node, mCol);
       
   188 	}
       
   189 
       
   190 	c.setEnabled(enabled);
       
   191 
       
   192 	return c;
       
   193     }
       
   194 
       
   195     //
       
   196     // ManagedObjectTreeTable methods
       
   197     //
       
   198 
       
   199     public List<ManagedObject> getSelectedObjects() {
       
   200         TreeTableModelAdapter adapter = getModel();
       
   201         int[] sRows = getSelectedRows();
       
   202 
       
   203         List<ManagedObject> objects =
       
   204 	    new ArrayList<ManagedObject>(sRows.length);
       
   205 
       
   206         for (int i = 0; i < sRows.length; i++) {
       
   207             int index = convertRowIndexToModel(sRows[i]);
       
   208             ManagedObjectTreeNode node =
       
   209                 (ManagedObjectTreeNode)adapter.getTreeNode(index);
       
   210             objects.add(node.getUserObject());
       
   211         }
       
   212 
       
   213         return objects;
       
   214     }
       
   215 
       
   216     public JPopupMenu getPopupMenu() {
       
   217 	return popup;
       
   218     }
       
   219 
       
   220     public void showPopup(int x, int y) {
       
   221 	JPopupMenu popup = getPopupMenu();
       
   222 	if (popup != null) {
       
   223 	    popup.show(this, x, y);
       
   224 	}
       
   225     }
       
   226 
       
   227     //
       
   228     // Private methods
       
   229     //
       
   230 
       
   231     private void setCustomRendererEditor(int col) {
       
   232 	ManagedObjectTreeTableModel model =
       
   233 	    (ManagedObjectTreeTableModel)getModel().getTreeTableModel();
       
   234 	TableColumnModel cModel = getColumnModel();
       
   235 
       
   236 	TableCellEditor editor = model.getTableCellEditor(col);
       
   237 	if (editor != null) {
       
   238 	    cModel.getColumn(col).setCellEditor(editor);
       
   239 	}
       
   240 
       
   241 	TableCellRenderer renderer = model.getTableCellRenderer(col);
       
   242 	if (renderer != null) {
       
   243 	    cModel.getColumn(col).setCellRenderer(renderer);
       
   244 	}
       
   245     }
       
   246 }