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 }