/*
* Created on 17.08.2011
*
*/
package org.jdesktop.swingx.table;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFrame;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import org.jdesktop.swingx.InteractiveTestCase;
import org.jdesktop.swingx.JXFrame;
import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.action.AbstractActionExt;
import org.jdesktop.swingx.table.ColumnControlPopup.ActionGrouper;
import org.jdesktop.test.AncientSwingTeam;
public class ColumnControlButtonVisualCheck extends InteractiveTestCase {
public static void main(String[] args) {
ColumnControlButtonVisualCheck test = new ColumnControlButtonVisualCheck();
try {
// test.runInteractiveTests();
// test.runInteractive("ToggleTableModel");
// test.runInteractive("ColumnAction");
test.runInteractive("Null");
} catch (Exception e) {
e.printStackTrace();
}
}
public void interactiveCustomColumnActionGroup() {
JXTable table = new JXTable(new AncientSwingTeam());
AbstractActionExt custom = new AbstractActionExt("Custom") {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
};
// add a group as value
custom.putValue(GroupKeyActionGrouper.GROUP_KEY, 0);
// add to table's action map
table.getActionMap().put(ColumnControlButton.COLUMN_CONTROL_MARKER + "myCommand", custom);
final ColumnControlButton control = (ColumnControlButton) table.getColumnControl();
table.setColumnControlVisible(true);
JXFrame frame = wrapWithScrollingInFrame(table, "Group actions");
Action toggleGrouper = new AbstractAction("toggleGrouper") {
ActionGrouper current;
@Override
public void actionPerformed(ActionEvent e) {
current = (current == null) ? new GroupKeyActionGrouper() : null;
control.setActionGrouper(current);
}
};
addAction(frame, toggleGrouper);
show(frame);
}
/**
* Implementation of ActionGrouper which groups by action values with
* key GROUP_KEY.
*/
public static class GroupKeyActionGrouper implements ActionGrouper {
/** Marker to support custom grouping of additional actions. (Issue #swingx-968) */
public static final String GROUP_KEY = "zzzz_group";
@Override
public <A extends Action> List<List<A>> group(List<A> actions) {
List<List<A>> result = new ArrayList<List<A>>();
List<Object> keys = new ArrayList<Object>();
List<A> noKey = new ArrayList<A>();
for (A action : actions) {
Object groupKey = action.getValue(GROUP_KEY);
if (groupKey != null) {
int index = keys.indexOf(groupKey);
if (index < 0) {
keys.add(groupKey);
index = keys.size() - 1;
result.add(new ArrayList<A>());
}
result.get(index).add(action);
} else {
noKey.add(action);
}
}
result.add(0, noKey);
return result ;
}
}
public void interactiveCustomColumnAction() {
JXTable table = new JXTable(new AncientSwingTeam());
ColumnControlButton control = new ColumnControlButton(table) {
/**
* @inherited <p>
*/
@Override
protected ColumnControlPopup createColumnControlPopup() {
ColumnControlPopup controlPopup = new DefaultColumnControlPopup() {
/**
* @inherited <p>
*/
@Override
public void addAdditionalActionItems(
List<? extends Action> actions) {
super.addAdditionalActionItems(actions);
String commands = "commands: ";
for (Action action : actions) {
commands += action
.getValue(Action.ACTION_COMMAND_KEY);
}
LOG.info(commands);
}
};
return controlPopup;
}
};
table.setColumnControl(control);
table.setColumnControlVisible(true);
showWithScrollingInFrame(table, "custom control");
}
/**
* test if subclasses are allowed to not create a visibility action. This
* might happen, if they want to exempt certain columns from user
* interaction.
*
*/
public void interactiveNullVisibilityActionWithHideable() {
JXTable table = new JXTable();
ColumnControlButton columnControl = new ColumnControlButton(table) {
@Override
protected ColumnVisibilityAction createColumnVisibilityAction(
TableColumn column) {
if (column instanceof TableColumnExt
&& !((TableColumnExt) column).isHideable())
return null;
return super.createColumnVisibilityAction(column);
}
};
table.setColumnControl(columnControl);
table.setColumnControlVisible(true);
ColumnFactory factory = new ColumnFactory() {
/**
* @inherited <p>
*/
@Override
public void configureTableColumn(TableModel model,
TableColumnExt columnExt) {
super.configureTableColumn(model, columnExt);
if (columnExt.getModelIndex() == 0) {
columnExt.setHideable(false);
}
}
};
table.setColumnFactory(factory);
table.setModel(new AncientSwingTeam());
JXFrame frame = wrapWithScrollingInFrame(table,
"first model column not togglable");
frame.setVisible(true);
}
/**
* Issue #1573-swingx: !hideable column action must be disabled
* Problem was missing initial synch.
*/
public void interactiveNullVisibilityAction() {
JXTable table = new JXTable(new AncientSwingTeam());
table.getColumnExt(0).setHideable(false);
table.setColumnControlVisible(true);
JXFrame frame = wrapWithScrollingInFrame(table,
"first model column not hideable - needs custom control");
frame.setVisible(true);
}
/**
* Issue ??: Column control update on changing table model.
* Issue ??: add property to control whether or not additional table
* actions are included
*/
public void interactiveTestToggleTableModel() {
final DefaultTableModel tableModel = new DefaultTableModel(0, 20);
final JXTable table = new JXTable(tableModel);
table.setColumnControlVisible(true);
Action toggleAction = new AbstractAction("Toggle TableModel") {
@Override
public void actionPerformed(ActionEvent e) {
TableModel model = table.getModel();
table.setModel(model.equals(tableModel) ? new AncientSwingTeam()
: tableModel);
}
};
JXFrame frame = wrapWithScrollingInFrame(table,
"ColumnControl: set tableModel update columns");
addAction(frame, toggleAction);
Action toggleAdditionalActions = new AbstractAction("toggleAdditionalActions") {
@Override
public void actionPerformed(ActionEvent e) {
ColumnControlButton button = (ColumnControlButton) table.getColumnControl();
button.setAdditionalActionsVisible(!button.getAdditionalActionsVisible());
}
};
addAction(frame, toggleAdditionalActions);
frame.setVisible(true);
}
/**
* Issue ??: Column control on changing column model.
*
*/
public void interactiveTestColumnControlColumnModel() {
final JXTable table = new JXTable(10, 5);
table.setColumnControlVisible(true);
Action toggleAction = new AbstractAction("Set ColumnModel") {
@Override
public void actionPerformed(ActionEvent e) {
table.setColumnModel(new DefaultTableColumnModel());
table.setModel(new AncientSwingTeam());
setEnabled(false);
}
};
JXFrame frame = wrapWithScrollingInFrame(table,
"ColumnControl: set columnModel ext -> core default");
addAction(frame, toggleAction);
frame.setVisible(true);
}
/**
* Issue ??: Column control cancontrol update on changing column model.
*
*/
public void interactiveTestColumnControlColumnModelExt() {
final JXTable table = new JXTable();
table.setColumnModel(new DefaultTableColumnModel());
table.setModel(new DefaultTableModel(10, 5));
table.setColumnControlVisible(true);
Action toggleAction = new AbstractAction("Set ColumnModelExt") {
@Override
public void actionPerformed(ActionEvent e) {
table.setColumnModel(new DefaultTableColumnModelExt());
table.setModel(new AncientSwingTeam());
table.getColumnExt(0).setVisible(false);
setEnabled(false);
}
};
JXFrame frame = wrapWithScrollingInFrame(table,
"ColumnControl: set ColumnModel core -> modelExt");
addAction(frame, toggleAction);
frame.setVisible(true);
}
/**
* Issue #192: initially invisibility columns are hidden but marked as
* visible in control.
*
* Issue #38 (swingx): initially invisble columns don't show up in the
* column control list.
*
* Visual check: first enable column control then set column invisible.
*
*/
public void interactiveTestColumnControlInvisibleColumns() {
final JXTable table = new JXTable(new AncientSwingTeam());
table.setColumnControlVisible(true);
final TableColumnExt firstNameColumn = table.getColumnExt("First Name");
firstNameColumn.setVisible(false);
JXFrame frame = wrapWithScrollingInFrame(
table,
"ColumnControl (#192, #38-swingx) first enable ColumnControl then column invisible");
Action toggleHideable = new AbstractActionExt(
"toggle hideable first Name") {
@Override
public void actionPerformed(ActionEvent e) {
firstNameColumn.setHideable(!firstNameColumn.isHideable());
}
};
addAction(frame, toggleHideable);
show(frame);
}
/**
* Issue #192: initially invisibility columns are hidden but marked as
* visible in control.
*
* Issue #38 (swingx): initially invisble columns don't show up in the
* column control list.
*
* Visual check: first set column invisible then enable column control.
*
*/
public void interactiveTestColumnControlEarlyInvisibleColumns() {
final JXTable table = new JXTable(new AncientSwingTeam());
table.getColumnExt("First Name").setVisible(false);
table.setColumnControlVisible(true);
JFrame frame = wrapWithScrollingInFrame(
table,
"ColumnControl (#192, #38-swingx) first column invisible, the enable columnControl");
frame.setVisible(true);
}
/**
* Issue #212: programmatically toggle column vis does not work.
*
* Visual check: compare toggle column visibility both via the columnControl
* and programmatically by button. While the columnControl prevents to hide
* the very last visible column, developers have full control to do so
* programatically.
*
*
*/
public void interactiveTestColumnControlSetModelToggleInvisibleColumns() {
final JXTable table = new JXTable();
table.setColumnControlVisible(true);
JXFrame frame = wrapWithScrollingInFrame(table,
"ColumnControl (#212-swingx) setModel and toggle first column invisible");
frame.setVisible(true);
table.setModel(new DefaultTableModel(10, 2));
final TableColumnExt firstNameColumn = table.getColumnExt(1);
Action action = new AbstractAction("Toggle first name visibility") {
@Override
public void actionPerformed(ActionEvent e) {
firstNameColumn.setVisible(!firstNameColumn.isVisible());
}
};
addAction(frame, action);
}
/**
*
*
*/
public void interactiveTestLastVisibleColumn() {
final JXTable table = new JXTable();
table.setModel(new DefaultTableModel(10, 2));
table.setColumnControlVisible(true);
JFrame frame = wrapWithScrollingInFrame(table,
"JXTable (#192, #38-swingx) ColumnControl and Visibility of items");
table.getColumnExt(0).setVisible(false);
frame.setVisible(true);
}
@SuppressWarnings("unused")
private static final Logger LOG = Logger
.getLogger(ColumnControlButtonVisualCheck.class.getName());
}