/* * Copyright 2004 - 2008 Christian Sprajc. All rights reserved. * * This file is part of PowerFolder. * * PowerFolder 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. * * PowerFolder 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 PowerFolder. If not, see <http://www.gnu.org/licenses/>. * * $Id$ */ package de.dal33t.powerfolder.ui.information.notices; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Font; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.Icon; import javax.swing.JTable; import javax.swing.JViewport; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.JTableHeader; import javax.swing.table.TableColumn; import javax.swing.table.TableModel; import de.dal33t.powerfolder.ui.util.Icons; import de.dal33t.powerfolder.ui.util.ColorUtil; import de.dal33t.powerfolder.ui.notices.Notice; import de.dal33t.powerfolder.ui.notices.NoticeSeverity; import de.dal33t.powerfolder.ui.render.SortedTableHeaderRenderer; import de.dal33t.powerfolder.util.Format; /** * Table showing notices in dialog */ public class NoticesTable extends JTable { public NoticesTable(NoticesTableModel tableModel) { super(tableModel); setShowGrid(false); setSelectionMode(ListSelectionModel.SINGLE_SELECTION); setDefaultRenderer(Notice.class, new MyDefaultTreeCellRenderer()); setRowHeight(Icons.getIconById(Icons.INFORMATION).getIconHeight() + 3); // add sorting getTableHeader().addMouseListener(new TableHeaderMouseListener()); // Set table columns setupColumns(); // Associate a header renderer with all columns. SortedTableHeaderRenderer.associateHeaderRenderer(tableModel, getColumnModel(), tableModel.getSortColumn(), tableModel .isSortAscending()); } /** * Make the height same as viewport (JScrollPane) if bigger than this. * * @return */ public boolean getScrollableTracksViewportHeight() { Container viewport = getParent(); return viewport instanceof JViewport && getPreferredSize().height < viewport.getHeight(); } private static class MyDefaultTreeCellRenderer extends DefaultTableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { String myValue = ""; boolean bold = false; if (value != null) { Notice notice = (Notice) value; setIcon(null); switch (column) { case 0 : // severity setHorizontalAlignment(LEFT); Icon icon; if (notice.getNoticeSeverity() == NoticeSeverity.INFORMATION) { icon = Icons.getIconById(Icons.INFORMATION); } else if (notice.getNoticeSeverity() == NoticeSeverity.WARINING) { icon = Icons.getIconById(Icons.WARNING); } else { icon = Icons.getIconById(Icons.BLANK); } setIcon(icon); break; case 1 : // date myValue = Format.formatDateShort(notice.getDate()); setHorizontalAlignment(RIGHT); break; case 2 : // summary myValue = notice.getSummary(); setHorizontalAlignment(LEFT); break; } bold = !notice.isRead(); } Component c = super.getTableCellRendererComponent(table, myValue, isSelected, hasFocus, row, column); if (bold) { c.setFont(new Font(c.getFont().getFontName(), Font.BOLD, c .getFont().getSize())); } else { c.setFont(new Font(c.getFont().getFontName(), Font.PLAIN, c .getFont().getSize())); } if (!isSelected) { setBackground(row % 2 == 0 ? ColorUtil.EVEN_TABLE_ROW_COLOR : ColorUtil.ODD_TABLE_ROW_COLOR); } return c; } } /** * Listner on table header, takes care about the sorting of table */ private class TableHeaderMouseListener extends MouseAdapter { public void mouseClicked(MouseEvent e) { if (SwingUtilities.isLeftMouseButton(e)) { JTableHeader tableHeader = (JTableHeader) e.getSource(); int columnNo = tableHeader.columnAtPoint(e.getPoint()); TableColumn column = tableHeader.getColumnModel().getColumn( columnNo); int modelColumnNo = column.getModelIndex(); TableModel model = tableHeader.getTable().getModel(); if (model instanceof NoticesTableModel) { NoticesTableModel noticesTableModel = (NoticesTableModel) model; boolean freshSorted = noticesTableModel .sortBy(modelColumnNo); if (!freshSorted) { // reverse list noticesTableModel.reverseList(); } } } } } /** * Sets the column sizes of the table */ private void setupColumns() { int totalWidth = getWidth(); // otherwise the table header is not visible: getTableHeader().setPreferredSize(new Dimension(totalWidth, 20)); TableColumn column = getColumn(getColumnName(0)); int size = Icons.getIconById(Icons.INFORMATION).getIconHeight() + 3; column.setPreferredWidth(size); column.setMinWidth(size); column.setMaxWidth(size); column = getColumn(getColumnName(1)); column.setPreferredWidth(20); column = getColumn(getColumnName(2)); column.setPreferredWidth(200); } }