/* * Copyright (C) 2010 Brockmann Consult GmbH (info@brockmann-consult.de) * * 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 3 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, see http://www.gnu.org/licenses/ */ package org.esa.snap.rcp.mask; import org.esa.snap.core.datamodel.Mask; import org.esa.snap.core.datamodel.Product; import org.esa.snap.core.datamodel.RasterDataNode; import org.esa.snap.ui.UIUtils; import org.esa.snap.ui.color.ColorTableCellEditor; import org.esa.snap.ui.color.ColorTableCellRenderer; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.SwingConstants; import javax.swing.UIManager; import javax.swing.event.MouseInputAdapter; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumnModel; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.event.MouseEvent; class MaskTable extends JTable { private final VisibilityHR visibilityHR; public MaskTable(boolean maskManagmentMode) { super(new MaskTableModel(maskManagmentMode)); visibilityHR = new VisibilityHR(); setName("maskTable"); setAutoCreateColumnsFromModel(true); setPreferredScrollableViewportSize(new Dimension(200, 150)); setDefaultRenderer(Color.class, new ColorTableCellRenderer()); setDefaultEditor(Color.class, new ColorTableCellEditor()); setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); getTableHeader().setReorderingAllowed(false); getTableHeader().setResizingAllowed(true); setAutoResizeMode(JTable.AUTO_RESIZE_OFF); ToolTipMIL toolTipSetter = new ToolTipMIL(); addMouseListener(toolTipSetter); addMouseMotionListener(toolTipSetter); setRowHeight(this.getRowHeight() + 4); reconfigureColumnModel(); } @Override public MaskTableModel getModel() { return (MaskTableModel) super.getModel(); } Product getProduct() { return getModel().getProduct(); } void setProduct(Product product, RasterDataNode visibleBand) { saveColumnWidths(); getModel().setProduct(product, visibleBand); reconfigureColumnModel(); } Mask getSelectedMask() { int selectedRow = getSelectedRow(); return selectedRow >= 0 ? getMask(selectedRow) : null; } Mask[] getSelectedMasks() { int[] rows = getSelectedRows(); Mask[] masks = new Mask[rows.length]; for (int i = 0; i < rows.length; i++) { int row = rows[i]; masks[i] = getMask(row); } return masks; } void clear() { getModel().clear(); } boolean isInManagmentMode() { return getModel().isInManagmentMode(); } Mask getMask(int rowIndex) { return getModel().getMask(rowIndex); } void addMask(Mask mask) { getModel().addMask(mask); int rowIndex = getModel().getMaskIndex(mask.getName()); getSelectionModel().addSelectionInterval(rowIndex, rowIndex); scrollRectToVisible(getCellRect(rowIndex, 0, true)); } public void insertMask(Mask mask, int index) { getModel().addMask(mask, index); } void removeMask(Mask mask) { getModel().removeMask(mask); } private void saveColumnWidths() { if (getRowCount() > 0) { MaskTableModel maskTableModel = getModel(); for (int i = 0; i < maskTableModel.getColumnCount(); i++) { maskTableModel.setPreferredColumnWidth(i, columnModel.getColumn(i).getPreferredWidth()); } } } private void reconfigureColumnModel() { createDefaultColumnsFromModel(); TableColumnModel columnModel = getColumnModel(); MaskTableModel maskTableModel = getModel(); int vci = maskTableModel.getVisibilityColumnIndex(); if (vci >= 0) { columnModel.getColumn(vci).setHeaderRenderer(visibilityHR); } for (int i = 0; i < maskTableModel.getColumnCount(); i++) { columnModel.getColumn(i).setPreferredWidth(maskTableModel.getPreferredColumnWidth(i)); } } private class ToolTipMIL extends MouseInputAdapter { private int currentRowIndex; ToolTipMIL() { currentRowIndex = -1; } @Override public void mouseExited(MouseEvent e) { currentRowIndex = -1; } @Override public void mouseMoved(MouseEvent e) { int rowIndex = rowAtPoint(e.getPoint()); if (rowIndex != this.currentRowIndex) { this.currentRowIndex = rowIndex; if (this.currentRowIndex >= 0 && this.currentRowIndex < getRowCount()) { setToolTipText(getToolTipText(rowIndex)); } } } private String getToolTipText(int rowIndex) { Mask mask = getMask(rowIndex); return mask.getDescription(); } } private static class VisibilityHR extends JLabel implements TableCellRenderer { VisibilityHR() { ImageIcon icon = UIUtils.loadImageIcon("icons/EyeIcon10.gif"); this.setBorder(UIManager.getBorder("TableHeader.cellBorder")); this.setText(null); this.setIcon(icon); this.setHorizontalAlignment(SwingConstants.CENTER); this.setPreferredSize(this.getPreferredSize()); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { return this; } } }