/*
* $Id$
*
* Copyright 2009 Sun Microsystems, Inc., 4150 Network Circle,
* Santa Clara, California 95054, U.S.A. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
package org.jdesktop.swingx.demos.highlighter;
import static org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.ComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import org.jdesktop.application.Application;
import org.jdesktop.beansbinding.BeanProperty;
import org.jdesktop.beansbinding.Binding;
import org.jdesktop.beansbinding.Bindings;
import org.jdesktop.beansbinding.ELProperty;
import org.jdesktop.beansbinding.Property;
import org.jdesktop.beansbinding.PropertyStateEvent;
import org.jdesktop.swingx.JXComboBox;
import org.jdesktop.swingx.JXList;
import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.JXTree;
import org.jdesktop.swingx.JXTreeTable;
import org.jdesktop.swingx.binding.ArrayAggregator;
import org.jdesktop.swingx.binding.BindingAdapter;
import org.jdesktop.swingx.combobox.ListComboBoxModel;
import org.jdesktop.swingx.decorator.AlignmentHighlighter;
import org.jdesktop.swingx.decorator.BorderHighlighter;
import org.jdesktop.swingx.decorator.ColorHighlighter;
import org.jdesktop.swingx.decorator.ComponentAdapter;
import org.jdesktop.swingx.decorator.EnabledHighlighter;
import org.jdesktop.swingx.decorator.FontHighlighter;
import org.jdesktop.swingx.decorator.HighlightPredicate;
import org.jdesktop.swingx.decorator.Highlighter;
import org.jdesktop.swingx.decorator.HighlighterFactory;
import org.jdesktop.swingx.decorator.IconHighlighter;
import org.jdesktop.swingx.decorator.PainterHighlighter;
import org.jdesktop.swingx.decorator.ToolTipHighlighter;
import org.jdesktop.swingx.painter.MattePainter;
import org.jdesktop.swingx.painter.ShapePainter;
import org.jdesktop.swingx.renderer.DefaultListRenderer;
import org.jdesktop.swingx.renderer.DefaultTreeRenderer;
import org.jdesktop.swingx.renderer.StringValue;
import org.jdesktop.swingx.renderer.StringValues;
import org.jdesktop.swingx.util.PaintUtils;
import org.jdesktop.swingx.util.ShapeUtils;
import org.jdesktop.swingxset.DefaultDemoPanel;
import org.jdesktop.swingxset.util.ComponentModels;
import com.sun.swingset3.DemoProperties;
/**
* A demo for {@code Highlighter}.
*
* @author Karl George Schaefer
* @author Jeanette Winzenburg (original JXTableDemoPanel)
*/
@DemoProperties(
value = "Highlighter Demo",
category = "Functionality",
description = "Demonstrates Highlighters, a lightweight, reusable, visual decorator.",
sourceFiles = {
"org/jdesktop/swingx/demos/highlighter/HighlighterDemo.java",
"org/jdesktop/swingx/demos/highlighter/resources/HighlighterDemo.properties",
"org/jdesktop/swingx/demos/highlighter/resources/HighlighterDemo.html",
"org/jdesktop/swingx/demos/highlighter/resources/images/HighlighterDemo.png"
}
)
@SuppressWarnings("serial")
public class HighlighterDemo extends DefaultDemoPanel {
private JXList list;
private JXTable table;
private JXTree tree;
private JXTreeTable treeTable;
private JXComboBox comboBox;
// private CardLayout layout;
// private JPanel contents;
// private JButton nextBtn;
// private JButton previousBtn;
private JComboBox stripingOptions;
private JComboBox highlighters;
private JComboBox predicates;
/**
* main method allows us to run as a standalone demo.
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame(HighlighterDemo.class.getAnnotation(DemoProperties.class).value());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new HighlighterDemo());
frame.setPreferredSize(new Dimension(800, 600));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
@Override
protected void createDemo() {
setLayout(new BorderLayout());
JTabbedPane tabbedPane = new JTabbedPane();
// JPanel navigation = new JPanel(new FlowLayout());
// previousBtn = new JButton();
// navigation.add(previousBtn);
//
// nextBtn = new JButton();
// navigation.add(nextBtn);
// add(navigation, BorderLayout.NORTH);
// layout = new CardLayout();
// contents = new JPanel(layout);
list = new JXList();
list.setName("list");
list.setCellRenderer(new DefaultListRenderer(new StringValue() {
public String getString(Object value) {
if (value instanceof Component) {
return value.getClass().getSimpleName() + " (" + ((Component) value).getName() + ")";
}
return StringValues.TO_STRING.getString(value);
}
}));
tabbedPane.addTab("JXList", new JScrollPane(list));
// contents.add(list, list.getName());
table = new JXTable();
tabbedPane.addTab("JXTable", new JScrollPane(table));
// contents.add(table, "table");
tree = new JXTree();
tree.setName("tree");
tree.setCellRenderer(new DefaultTreeRenderer(new StringValue() {
public String getString(Object value) {
if (value instanceof Component) {
return value.getClass().getSimpleName() + " (" + ((Component) value).getName() + ")";
}
return StringValues.TO_STRING.getString(value);
}
}));
tabbedPane.addTab("JXTree", new JScrollPane(tree));
// contents.add(tree, tree.getName());
treeTable = new JXTreeTable();
treeTable.setName("treeTable");
treeTable.setShowGrid(true, true);
treeTable.setTreeCellRenderer(new DefaultTreeRenderer(new StringValue() {
public String getString(Object value) {
if (value instanceof Component) {
return value.getClass().getSimpleName() + " (" + ((Component) value).getName() + ")";
}
return StringValues.TO_STRING.getString(value);
}
}));
tabbedPane.addTab("JXTreeTable", new JScrollPane(treeTable));
// contents.add(treeTable, treeTable.getName());
comboBox = new JXComboBox();
comboBox.setName("comboBox");
comboBox.setRenderer(new DefaultListRenderer(new StringValue() {
public String getString(Object value) {
if (value instanceof Component) {
return value.getClass().getSimpleName() + " (" + ((Component) value).getName() + ")";
}
return StringValues.TO_STRING.getString(value);
}
}));
JPanel panel = new JPanel();
panel.add(comboBox);
tabbedPane.addTab("JXComboBox", panel);
add(tabbedPane);
// add(new JScrollPane(contents));
JPanel control = new JPanel(new GridLayout(2, 2));
control.add(new JLabel("Highlighter Options:"));
stripingOptions = new JComboBox(getStripingOptionsModel());
stripingOptions.setRenderer(new DefaultListRenderer(new StringValue() {
public String getString(Object value) {
if (value instanceof HighlighterInfo) {
return ((HighlighterInfo) value).getDescription();
}
return StringValues.TO_STRING.getString(value);
}
}));
control.add(stripingOptions);
highlighters = new JComboBox(getHighlighterOptionsModel());
highlighters.setRenderer(new DefaultListRenderer(new StringValue() {
public String getString(Object value) {
if (value instanceof HighlighterInfo) {
return ((HighlighterInfo) value).getDescription();
}
return StringValues.TO_STRING.getString(value);
}
}));
control.add(highlighters);
predicates = new JComboBox(getPredicateOptionsModel());
predicates.setRenderer(new DefaultListRenderer(new StringValue() {
public String getString(Object value) {
if (value instanceof HighlightPredicateInfo) {
return ((HighlightPredicateInfo) value).getDescription();
}
return StringValues.TO_STRING.getString(value);
}
}));
control.add(predicates);
add(control, BorderLayout.SOUTH);
}
private ComboBoxModel getStripingOptionsModel() {
List<HighlighterInfo> info = new ArrayList<HighlighterInfo>();
info.add(new HighlighterInfo("No Striping", null));
info.add(new HighlighterInfo("Alternating UI-Dependent",
HighlighterFactory.createAlternateStriping()));
info.add(new HighlighterInfo("Alternating Groups (2) UI-Dependent",
HighlighterFactory.createAlternateStriping(2)));
info.add(new HighlighterInfo("Alternating Groups (3) UI-Dependent",
HighlighterFactory.createAlternateStriping(3)));
Color lightBlue = new Color(0xC0D9D9);
Color gold = new Color(0xDBDB70);
info.add(new HighlighterInfo("Alternating Blue-Gold",
HighlighterFactory.createAlternateStriping(lightBlue, gold)));
info.add(new HighlighterInfo("Alternating Groups (2) Blue-Gold",
HighlighterFactory.createAlternateStriping(lightBlue, gold, 2)));
info.add(new HighlighterInfo("Alternating Groups (3) Blue-Gold",
HighlighterFactory.createAlternateStriping(lightBlue, gold, 3)));
return new ListComboBoxModel<HighlighterInfo>(info);
}
private ComboBoxModel getHighlighterOptionsModel() {
List<HighlighterInfo> info = new ArrayList<HighlighterInfo>();
info.add(new HighlighterInfo("No Additional Highlighter", null));
info.add(new HighlighterInfo("Green Border",
new BorderHighlighter(BorderFactory.createLineBorder(Color.GREEN, 1))));
info.add(new HighlighterInfo("Blue Border",
new BorderHighlighter(BorderFactory.createLineBorder(Color.BLUE, 1))));
info.add(new HighlighterInfo("Red Text",
new ColorHighlighter(null, Color.RED)));
info.add(new HighlighterInfo("Purple Text",
new ColorHighlighter(null, new Color(0x80, 0x00, 0x80))));
info.add(new HighlighterInfo("Blended Red Background",
new ColorHighlighter(new Color(255, 0, 0, 127), null)));
info.add(new HighlighterInfo("Blended Green Background",
new ColorHighlighter(new Color(0, 180, 0, 80), null)));
info.add(new HighlighterInfo("Green Orb Icon",
new IconHighlighter(Application.getInstance().getContext()
.getResourceMap(HighlighterDemo.class).getIcon("greenOrb"))));
info.add(new HighlighterInfo("Aerith Gradient Painter",
new PainterHighlighter(new MattePainter(PaintUtils.AERITH, true))));
info.add(new HighlighterInfo("Star Shape Painter",
new PainterHighlighter(new ShapePainter(
ShapeUtils.generatePolygon(5, 10, 5, true), PaintUtils.NIGHT_GRAY_LIGHT))));
info.add(new HighlighterInfo("10pt. Bold Dialog Font",
new FontHighlighter(new Font("Dialog", Font.BOLD, 10))));
info.add(new HighlighterInfo("Italic Font",
new DerivedFontHighlighter(Font.ITALIC)));
info.add(new HighlighterInfo("Trailing Alignment",
new AlignmentHighlighter(SwingConstants.TRAILING)));
info.add(new HighlighterInfo("Show As Disabled",
new EnabledHighlighter(false)));
return new ListComboBoxModel<HighlighterInfo>(info);
}
private ComboBoxModel getPredicateOptionsModel() {
List<HighlightPredicateInfo> info = new ArrayList<HighlightPredicateInfo>();
info.add(new HighlightPredicateInfo("Always Off", HighlightPredicate.NEVER));
info.add(new HighlightPredicateInfo("Always On", HighlightPredicate.ALWAYS));
info.add(new HighlightPredicateInfo("Focused Cell", HighlightPredicate.HAS_FOCUS));
info.add(new HighlightPredicateInfo("Non-Leaf Node", HighlightPredicate.IS_FOLDER));
info.add(new HighlightPredicateInfo("Leaf Node", HighlightPredicate.IS_LEAF));
info.add(new HighlightPredicateInfo("Rollover Row", HighlightPredicate.ROLLOVER_ROW));
info.add(new HighlightPredicateInfo("Columns 0 and 3",
new HighlightPredicate.ColumnHighlightPredicate(0, 3)));
info.add(new HighlightPredicateInfo("Node Depth Columns 0 and 3",
new HighlightPredicate.DepthHighlightPredicate(0, 3)));
info.add(new HighlightPredicateInfo("JButton Type",
new HighlightPredicate.TypeHighlightPredicate(JButton.class)));
return new ListComboBoxModel<HighlightPredicateInfo>(info);
}
/**
* {@inheritDoc}
*/
@Override
@SuppressWarnings("unchecked")
protected void bind() {
list.setModel(ComponentModels.getListModel(this));
table.setModel(ComponentModels.getTableModel(this));
tree.setModel(ComponentModels.getTreeModel(this));
treeTable.setTreeTableModel(ComponentModels.getTreeTableModel(this));
comboBox.setModel(ComponentModels.getComboBoxModel(this));
// previousBtn.setAction(map.get("displayPrevious"));
// nextBtn.setAction(map.get("displayNext"));
Binding b = Bindings.createAutoBinding(READ,
predicates, ELProperty.create("${selectedItem.predicate}"),
highlighters, ELProperty.create("${selectedItem.highlighter.highlightPredicate}"));
b.addBindingListener(new BindingAdapter() {
public void targetChanged(Binding binding, PropertyStateEvent event) {
binding.refresh();
}
});
b.bind();
ArrayAggregator<Highlighter> activeHighlighters
= new ArrayAggregator<Highlighter>(Highlighter.class);
activeHighlighters.addSource(new HighlighterInfo("Tooltip for truncated text",
new ToolTipHighlighter(new HighlightPredicate.AndHighlightPredicate(
new HighlightPredicate() {
@Override
public boolean isHighlighted(Component renderer,
ComponentAdapter adapter) {
return adapter.getComponent() instanceof JTable;
}
}, HighlightPredicate.IS_TEXT_TRUNCATED))),
(Property) ELProperty.create("${highlighter}"));
activeHighlighters.addSource(stripingOptions,
(Property) ELProperty.create("${selectedItem.highlighter}"));
activeHighlighters.addSource(highlighters,
(Property) ELProperty.create("${selectedItem.highlighter}"));
Bindings.createAutoBinding(READ,
activeHighlighters, BeanProperty.create("value"),
list, BeanProperty.create("highlighters")).bind();
Bindings.createAutoBinding(READ,
activeHighlighters, BeanProperty.create("value"),
table, BeanProperty.create("highlighters")).bind();
Bindings.createAutoBinding(READ,
activeHighlighters, BeanProperty.create("value"),
tree, BeanProperty.create("highlighters")).bind();
Bindings.createAutoBinding(READ,
activeHighlighters, BeanProperty.create("value"),
treeTable, BeanProperty.create("highlighters")).bind();
Bindings.createAutoBinding(READ,
activeHighlighters, BeanProperty.create("value"),
comboBox, BeanProperty.create("highlighters")).bind();
}
//
// @Action
// public void displayNext() {
// layout.next(contents);
// }
//
// @Action
// public void displayPrevious() {
// layout.previous(contents);
// }
}