001 package org.springframework.richclient.taskpane;
002
003 import com.l2fprod.common.swing.JLinkButton;
004 import com.l2fprod.common.swing.JTaskPane;
005 import com.l2fprod.common.swing.JTaskPaneGroup;
006 import org.springframework.richclient.application.ApplicationServicesLocator;
007 import org.springframework.richclient.command.AbstractCommand;
008 import org.springframework.richclient.command.CommandGroup;
009 import org.springframework.richclient.command.CommandGroupJComponentBuilder;
010 import org.springframework.richclient.image.IconSource;
011
012 import javax.swing.*;
013 import java.awt.*;
014 import java.beans.PropertyChangeEvent;
015 import java.beans.PropertyChangeListener;
016
017 public class JTaskPaneBuilder extends CommandGroupJComponentBuilder
018 {
019 private IconSource iconSource = null;
020
021 private boolean onlyOneExpanded = true;
022 private JTaskPaneCommandButtonConfigurer configurer = new JTaskPaneCommandButtonConfigurer();
023
024 private IconGenerator<AbstractCommand> iconGenerator;
025
026 protected JComponent buildRootComponent(AbstractCommand command)
027 {
028 JTaskPane pane = new JTaskPane();
029 pane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
030 pane.setOpaque(false);
031 return pane;
032 }
033
034 protected JComponent buildChildComponent(JComponent parentComponent, AbstractCommand command, int level)
035 {
036 if (command != null)
037 {
038 JLinkButton button = new JLinkButton();
039 command.attach(button, configurer);
040 parentComponent.add(button);
041 return button;
042 }
043 return null;
044 }
045
046 public boolean hasOnlyOneExpanded()
047 {
048 return onlyOneExpanded;
049 }
050
051 public void setOnlyOneExpanded(boolean onlyOneExpanded)
052 {
053 this.onlyOneExpanded = onlyOneExpanded;
054 }
055
056 protected JComponent buildGroupComponent(JComponent parentComponent, CommandGroup command, int level)
057 {
058 if (level == 0)
059 return parentComponent;
060
061 if (iconSource == null)
062 iconSource = (IconSource) ApplicationServicesLocator.services().getService(IconSource.class);
063 Icon icon;
064 if(command.getIcon() == null && iconGenerator != null)
065 {
066 icon = iconGenerator.generateIcon(command);
067 }
068 else
069 {
070 icon = command.getIcon();
071 }
072
073 if (parentComponent instanceof JTaskPaneGroup)
074 {
075 final JTaskPaneGroup parent = (JTaskPaneGroup) parentComponent;
076 final JTaskPaneGroup group = new JTaskPaneGroup();
077 group.setTitle(command.getText());
078 group.setIcon(icon);
079 group.setExpanded(false);
080
081 if (hasOnlyOneExpanded())
082 {
083 group.addPropertyChangeListener(JTaskPaneGroup.EXPANDED_CHANGED_KEY, new PropertyChangeListener()
084 {
085 public void propertyChange(PropertyChangeEvent evt)
086 {
087 if ((Boolean) evt.getNewValue())
088 {
089 Component[] comps = parent.getComponents();
090 for (int i = 0; i < comps.length; i++)
091 {
092 if (comps[i] instanceof JTaskPaneGroup && comps[i] != group)
093 {
094 JTaskPaneGroup g = ((JTaskPaneGroup) comps[i]);
095 if (g.isExpanded())
096 {
097 g.setExpanded(false);
098 }
099 }
100 }
101 }
102 }
103 });
104 }
105
106 parent.add(group);
107
108 return group;
109 }
110 else
111 {
112 final JTaskPane parent = (JTaskPane) parentComponent;
113 final JTaskPaneGroup group = new JTaskPaneGroup();
114 group.setTitle(command.getText());
115 group.setIcon(icon);
116 group.setExpanded(false);
117
118 if (hasOnlyOneExpanded())
119 {
120 group.addPropertyChangeListener(JTaskPaneGroup.EXPANDED_CHANGED_KEY, new PropertyChangeListener()
121 {
122 public void propertyChange(PropertyChangeEvent evt)
123 {
124 if ((Boolean) evt.getNewValue())
125 {
126 Component[] comps = parent.getComponents();
127 for (int i = 0; i < comps.length; i++)
128 {
129 if (comps[i] instanceof JTaskPaneGroup && comps[i] != group)
130 {
131 JTaskPaneGroup g = ((JTaskPaneGroup) comps[i]);
132 if (g.isExpanded())
133 {
134 g.setExpanded(false);
135 }
136 }
137 }
138 }
139 }
140 });
141 }
142
143 parent.add(group);
144
145 return group;
146 }
147 }
148
149 public IconGenerator<AbstractCommand> getIconGenerator()
150 {
151 return iconGenerator;
152 }
153
154 public void setIconGenerator(IconGenerator<AbstractCommand> iconGenerator)
155 {
156 this.iconGenerator = iconGenerator;
157 }
158 }