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    }