/*
* Created on 10.04.2008
*
*/
package org.jdesktop.swingxset;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JScrollPane;
import javax.swing.SwingConstants;
import org.jdesktop.beans.AbstractBean;
import org.jdesktop.swingx.JXTaskPane;
import org.jdesktop.swingx.JXTaskPaneContainer;
import org.jdesktop.swingx.VerticalLayout;
import org.jdesktop.swingx.hyperlink.AbstractHyperlinkAction;
import com.sun.swingset3.Demo;
/**
* Quick shot playing with TaskPane/Container instead of rolling its own.
*
*/
public class DemoSelector extends AbstractBean {
private static final List<Demo> EMPTY_DEMOS = Collections.emptyList();
private Demo selectedDemo;
private Map<String, JXTaskPane> categoryMap;
private List<Demo> demoSet;
private JComponent selectorComponent;
public DemoSelector() {
this(EMPTY_DEMOS);
}
public DemoSelector(List<Demo> demos) {
demoSet = demos;
}
public void setDefaultSelectedDemo() {
if (demoSet.size() > 0) {
setSelectedDemo(demoSet.get(0));
}
}
public boolean isDefaultSelectedDemo(Demo demo) {
return demoSet.size() == 0 ? false : demoSet.get(0).equals(demo);
}
public JComponent getSelectorComponent() {
if (selectorComponent != null) return selectorComponent;
return getSelectorComponent(demoSet);
}
private JComponent getSelectorComponent(List<Demo> demoSet) {
JXTaskPaneContainer container = new JXTaskPaneContainer() {
// Issue #1189-swingx: reasonable implementation of block increment
@Override
public int getScrollableBlockIncrement(Rectangle visibleRect,
int orientation, int direction) {
return SwingConstants.VERTICAL == orientation ? visibleRect.height :
visibleRect.width;
}
};
container.setLayout(new VerticalLayout(0));
container.setBorder(BorderFactory.createEmptyBorder());
for (Demo demo : demoSet) {
String category = demo.getCategory();
JXTaskPane taskPane = getTaskPane(category);
if (taskPane == null) {
taskPane = createTaskPane(demo);
addTaskPane(taskPane, category);
container.add(taskPane);
}
addDemo(taskPane, demo);
}
JScrollPane pane = new JScrollPane(container);
return pane;
}
private void addDemo(JXTaskPane taskPane, Demo demo) {
taskPane.add(new DemoAction(demo));
}
private void addTaskPane(JXTaskPane taskPane, String category) {
if (categoryMap == null) {
categoryMap = new HashMap<String, JXTaskPane>();
}
categoryMap.put(category, taskPane);
}
private JXTaskPane createTaskPane(Demo demo) {
JXTaskPane taskPane = new JXTaskPane();
taskPane.setTitle(demo.getCategory());
taskPane.setName(demo.getCategory());
return taskPane;
}
private JXTaskPane getTaskPane(String category) {
if (categoryMap == null) return null;
return categoryMap.get(category);
}
public void setSelectedDemo(Demo demo) {
Object old = getSelectedDemo();
this.selectedDemo = demo;
firePropertyChange("selectedDemo", old, getSelectedDemo());
}
public Demo getSelectedDemo() {
return selectedDemo;
}
public class DemoAction extends AbstractHyperlinkAction<Demo> {
public DemoAction(Demo demo) {
super(demo);
}
@Override
protected void installTarget() {
if (getTarget() == null) return;
setSmallIcon(getTarget().getIcon());
setName(getTarget().getName());
setShortDescription(getTarget().getShortDescription());
}
public void actionPerformed(ActionEvent e) {
setSelectedDemo(getTarget());
setVisited(true);
}
}
}