blob: 460700856b3e3b9b3b5afc0a035c5ca4c5155597 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.autoupdate.ui;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.util.Arrays;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.RowSorter;
import javax.swing.SortOrder;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;
import org.netbeans.api.autoupdate.UpdateManager;
/**
*
* @author Jiri Rechtacek, Radek Matous
*/
public final class UnitTable extends JTable {
private UnitCategoryTableModel model = null;
private static final int DARKER_COLOR_COMPONENT = 10;
private TableCellRenderer enableRenderer = null;
/** Creates a new instance of UpdateTable */
public UnitTable (TableModel model) {
super (model);
getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(UnitTable.class, "ACN_UnitTable")); // NOI18N
getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(UnitTab.class, "ACD_UnitTable")); // NOI18N
this.model = (UnitCategoryTableModel) model;
setShowGrid (false);
setColumnsSize ();
if(UIManager.getLookAndFeel().getID().equals("Nimbus")) {
setBackground(new Color(getBackground().getRGB(), false));
}
//setFillsViewportHeight(true);
setIntercellSpacing (new Dimension (0, 0));
setAutoCreateRowSorter(true);
revalidate ();
}
@Override
public TableCellRenderer getCellRenderer(int row, int column) {
return model.isExpansionControlAtRow(row) ? new MoreRenderer() : super.getCellRenderer(row, column);
}
@Override
public void addNotify() {
super.addNotify();
////instead of setFillsViewportHeight(true);
getParent().setBackground(getBackground());
}
@Override
public void removeNotify () {
super.removeNotify ();
enableRenderer = null;
}
@Override
public String getToolTipText (MouseEvent e) {
String tip;
java.awt.Point p = e.getPoint ();
int rowIndex = rowAtPoint (p);
int colIndex = columnAtPoint (p);
int realRowIndex = convertRowIndexToModel(rowIndex);
int realColumnIndex = convertColumnIndexToModel (colIndex);
tip = model.getToolTipText(realRowIndex, realColumnIndex);
return tip != null ? tip : super.getToolTipText (e);
}
void resetEnableRenderer () {
if (enableRenderer != null) {
setEnableRenderer (enableRenderer);
}
}
void setEnableRenderer (TableCellRenderer renderer) {
enableRenderer = renderer;
columnModel.getColumn(columnModel.getColumnCount() - 1).setCellRenderer(renderer);
}
void resortByDefault () {
RowSorter sorter = getRowSorter();
sorter.setSortKeys(Arrays.asList(new RowSorter.SortKey(2, SortOrder.ASCENDING)));
}
void setColumnsSize () {
int columnCount = model.getColumnCount ();
for (int i = 0; i < columnCount; i++) {
TableColumn activeColumn = getColumnModel ().getColumn (i);
activeColumn.setPreferredWidth (this.model.getPreferredWidth (getTableHeader (), i));
}
}
@Override
public Component prepareRenderer (TableCellRenderer renderer,
int rowIndex, int vColIndex) {
if (rowIndex < 0 || vColIndex < 0) {
return null;
}
Component c = super.prepareRenderer (renderer, rowIndex, vColIndex);
Color bgColor = getBackground ();
Color bgColorDarker = getDarkerColor(bgColor);
Unit u = model.getUnitAtRow(convertRowIndexToModel(rowIndex));
if (u != null && !u.canBeMarked ()) {
c.setForeground (Color.gray);
} else {
if (vColIndex == 1 && u != null && UpdateManager.TYPE.FEATURE.equals(u.updateUnit.getType())) {
c.setFont(getFont().deriveFont(java.awt.Font.BOLD));
} else {
c.setFont(getFont());
}
if (isRowSelected(rowIndex)) {
c.setForeground(getSelectionForeground());
} else {
c.setForeground(getForeground());
}
}
if (!isCellSelected (rowIndex, vColIndex)) {
if (rowIndex % 2 == 0 && !model.isExpansionControlAtRow(rowIndex)) {
c.setBackground (bgColorDarker);
} else {
c.setBackground (bgColor);
}
} else if (model.isExpansionControlAtRow(rowIndex)) {
c.setBackground (getBackground ());
c.setForeground(getForeground());
JComponent jc = (JComponent)c;
jc.setBorder(BorderFactory.createEmptyBorder());
}
int fontHeight = c.getFontMetrics(c.getFont()).getHeight();
if (rowHeight < 0 || rowHeight < fontHeight) {
int def = new JTable().getRowHeight();
rowHeight = Math.max(def, fontHeight);
setRowHeight(rowHeight);
}
return c;
}
static Color getDarkerColor(Color color) {
return new Color(
Math.abs(color.getRed() - DARKER_COLOR_COMPONENT),
Math.abs(color.getGreen() - DARKER_COLOR_COMPONENT),
Math.abs(color.getBlue() - DARKER_COLOR_COMPONENT));
}
@Override
protected JTableHeader createDefaultTableHeader () {
return new MyTableHeader ( columnModel );
}
private class MyTableHeader extends JTableHeader {
public MyTableHeader ( TableColumnModel model ) {
super ( model );
this.setReorderingAllowed ( false );
}
@Override
public void setDraggedColumn ( TableColumn aColumn ) {
if( null != aColumn && aColumn.getModelIndex () == 0 )
return; //don't allow the first column to be dragged
super.setDraggedColumn ( aColumn );
}
@Override
public void setResizingColumn ( TableColumn col ) {
if( null != getResizingColumn () && null == col ) {
//maybe could be persistent later
//storeColumnState();
}
super.setResizingColumn ( col );
}
}
private class MoreRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent (JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
Component res = super.getTableCellRendererComponent (table, value, isSelected, hasFocus, row, column);
if (res == null || value == null) {
return res;
}
if (column == 1 && res instanceof JLabel) {
JLabel original = (JLabel)res;
StringBuilder text = new StringBuilder();
if (isSelected || hasFocus) {
text.append("<b>").append(model.getExpansionControlText()).append("</b>");//NOI18N
} else {
text.append(model.getExpansionControlText());
}
setEnabled(isSelected);
original.setText("<html>" + "<a href=\"\">" + text.toString() + "</a></html>");//NOI18N
} else if (column != 1) {
res = new JLabel();
}
return res;
}
}
}