/*
* Freeplane - mind map editor
* Copyright (C) 2008 Dimitry Polivaev
*
* This file author is Dimitry Polivaev
*
* 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 2 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.freeplane.features.attribute.mindmapmode;
import java.awt.Component;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.AbstractCellEditor;
import javax.swing.Action;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;
import org.freeplane.core.resources.ResourceController;
import org.freeplane.core.util.TextUtils;
import org.freeplane.core.util.collection.IListModel;
/**
* @author Dimitry Polivaev
*/
class AttributeRegistryTable extends JTable {
static private class ButtonEditor extends AbstractCellEditor implements TableCellEditor {
/**
*
*/
private static final long serialVersionUID = 1L;
final private JButton editButton;
private Object value;
public ButtonEditor(final Action action) {
editButton = new JButton(action);
editButton.setFocusable(false);
}
/*
* (non-Javadoc)
* @see javax.swing.CellEditor#getCellEditorValue()
*/
public Object getCellEditorValue() {
return value;
}
/*
* (non-Javadoc)
* @see
* javax.swing.table.TableCellEditor#getTableCellEditorComponent(javax
* .swing.JTable, java.lang.Object, boolean, int, int)
*/
public Component getTableCellEditorComponent(final JTable table, final Object value, final boolean isSelected,
final int row, final int column) {
this.value = value;
return editButton;
}
}
static private class ButtonRenderer implements TableCellRenderer {
final private JButton renderingEditButton;
public ButtonRenderer(final Icon image, final String toolTip) {
renderingEditButton = new JButton(image);
renderingEditButton.setFocusable(false);
renderingEditButton.setToolTipText(toolTip);
}
/*
* (non-Javadoc)
* @see
* javax.swing.table.TableCellRenderer#getTableCellRendererComponent
* (javax.swing.JTable, java.lang.Object, boolean, boolean, int, int)
*/
public Component getTableCellRendererComponent(final JTable table, final Object value,
final boolean isSelected, final boolean hasFocus, final int row,
final int column) {
return renderingEditButton;
}
}
private class ToggleAllAction extends AbstractAction {
/**
*
*/
private static final long serialVersionUID = 1L;
public ToggleAllAction() {
super(null, AttributeRegistryTable.checkBoxImage);
}
public void actionPerformed(final ActionEvent e) {
final int rowCount = getRowCount();
if (rowCount <= 1) {
return;
}
Boolean checked = (Boolean) getValueAt(1, 1);
checked = Boolean.valueOf(!checked.booleanValue());
for (int i = 1; i < rowCount; i++) {
setValueAt(checked, i, 1);
}
}
}
static final private Icon checkBoxImage = new ImageIcon(ResourceController.getResourceController().getResource(
"/images/checkbox12.png"));
private static final ButtonRenderer editButtonRenderer = new ButtonRenderer(AttributeManagerDialog.editButtonImage,
TextUtils.getText("attributes_edit_tooltip"));
/**
*
*/
private static final long serialVersionUID = 1L;
final private AttributeManagerDialog.EditListAction editListAction;
final private ButtonEditor selectAllButtonEditor;
final private ButtonRenderer selectAllButtonRenderer;
public AttributeRegistryTable(final AttributeManagerDialog.EditListAction editListAction) {
super();
this.editListAction = editListAction;
getTableHeader().setReorderingAllowed(false);
selectAllButtonRenderer = new ButtonRenderer(AttributeRegistryTable.checkBoxImage, TextUtils
.getText("attributes_select_all_tooltip"));
selectAllButtonEditor = new ButtonEditor(new ToggleAllAction());
setDefaultEditor(IListModel.class, new ButtonEditor(editListAction));
setDefaultRenderer(IListModel.class, AttributeRegistryTable.editButtonRenderer);
setRowHeight(20);
setRowSelectionAllowed(false);
}
@Override
public TableCellEditor getCellEditor(final int row, final int column) {
if (row == 0 && column == 1) {
return selectAllButtonEditor;
}
return super.getCellEditor(row, column);
}
@Override
public TableCellRenderer getCellRenderer(final int row, final int column) {
if (row == 0 && column == 1) {
return selectAllButtonRenderer;
}
final TableCellRenderer tableCellRenderer = super.getCellRenderer(row, column);
if (tableCellRenderer instanceof JLabel) {
final JLabel label = (JLabel) tableCellRenderer;
if (row == 0) {
label.setHorizontalAlignment(SwingConstants.CENTER);
}
else {
label.setHorizontalAlignment(SwingConstants.LEFT);
}
}
else if (tableCellRenderer instanceof JComponent) {
final JComponent label = (JComponent) tableCellRenderer;
switch (column) {
case 1:
label.setToolTipText(TextUtils.getText("attributes_visible_tooltip"));
break;
case 2:
if (row == 0) {
label.setToolTipText(TextUtils.getText("attributes_restricted_attributes_tooltip"));
}
else {
label.setToolTipText(TextUtils.getText("attributes_restricted_values_tooltip"));
}
break;
}
}
return tableCellRenderer;
}
@Override
public Component prepareEditor(final TableCellEditor editor, final int row, final int column) {
if (column == 3) {
final IListModel list = (IListModel) getModel().getValueAt(row, column);
final String title = getModel().getValueAt(row, 0).toString();
final String labelText = TextUtils.getText("attribute_list_box_label_text");
editListAction.setListBoxModel(title, labelText, list);
}
return super.prepareEditor(editor, row, column);
}
@Override
public void setModel(final TableModel dataModel) {
super.setModel(dataModel);
if (dataModel.getColumnCount() >= 1) {
for (int i = 1; i < getColumnCount(); i++) {
getColumnModel().getColumn(i).setMinWidth(20);
final int prefWidth = getTableHeader().getDefaultRenderer().getTableCellRendererComponent(this,
getColumnName(i), false, false, -1, i).getPreferredSize().width;
getColumnModel().getColumn(i).setPreferredWidth(prefWidth);
}
}
}
}