1 package jp.sourceforge.stigmata.ui.swing;
7 import java.awt.BorderLayout;
8 import java.awt.Component;
9 import java.awt.Dimension;
10 import java.awt.Image;
11 import java.awt.event.ActionEvent;
12 import java.awt.event.ActionListener;
13 import java.io.PrintWriter;
14 import java.io.StringWriter;
15 import java.lang.reflect.InvocationTargetException;
16 import java.lang.reflect.Method;
18 import java.text.MessageFormat;
20 import javax.swing.Action;
21 import javax.swing.Icon;
22 import javax.swing.ImageIcon;
23 import javax.swing.JButton;
24 import javax.swing.JCheckBoxMenuItem;
25 import javax.swing.JComponent;
26 import javax.swing.JLabel;
27 import javax.swing.JMenu;
28 import javax.swing.JMenuItem;
29 import javax.swing.JOptionPane;
30 import javax.swing.JPanel;
31 import javax.swing.JScrollPane;
32 import javax.swing.JTabbedPane;
33 import javax.swing.JTextArea;
34 import javax.swing.border.EmptyBorder;
35 import javax.swing.border.TitledBorder;
37 import jp.sourceforge.talisman.i18n.Messages;
40 * Utility routines for building GUI.
42 * @author Haruaki TAMADA
45 public class GUIUtility{
49 public static void decorateJComponent(Messages messages, JComponent component, String label){
50 if(messages.hasValue(label + ".tooltip")){
51 component.setToolTipText(messages.get(label + ".tooltip"));
53 if(messages.hasValue(label + ".border")){
54 component.setBorder(new TitledBorder(messages.get(label + ".border")));
57 Icon icon = getIcon(messages, label + ".icon");
59 Method[] methods = component.getClass().getMethods();
60 for(Method m: methods){
61 if(m.getName().equals("setIcon")){
62 m.invoke(component, icon);
66 } catch(IllegalAccessException e){
67 throw new InternalError(e.getMessage());
68 } catch(InvocationTargetException e){
69 throw new InternalError(e.getMessage());
73 public static JButton createButton(Messages messages, String label, Action action){
74 JButton button = new JButton(action);
75 button.setText(messages.get(label + ".button.label"));
76 button.setActionCommand(label);
77 if(messages.hasValue(label + ".button.tooltip")){
78 button.setToolTipText(messages.get(label + ".button.tooltip"));
80 Icon icon = getIcon(messages, label + ".button.icon");
88 public static JButton createButton(Messages messages, String label){
89 JButton button = new JButton(messages.get(label + ".button.label"));
90 button.setActionCommand(label);
91 if(messages.hasValue(label + ".button.tooltip")){
92 button.setToolTipText(messages.get(label + ".button.tooltip"));
94 Icon icon = getIcon(messages, label + ".button.icon");
102 public static JCheckBoxMenuItem createJCheckBoxMenuItem(Messages messages, String label){
103 return createJCheckBoxMenuItem(messages, label, false);
106 public static JCheckBoxMenuItem createJCheckBoxMenuItem(Messages messages, String label, boolean status){
107 JCheckBoxMenuItem item = new JCheckBoxMenuItem(messages.get(label + ".menuitem.label"), status);
108 item.setActionCommand(label);
109 if(messages.hasValue(label + ".menuitem.tooltip")){
110 item.setToolTipText(messages.get(label + ".menuitem.tooltip"));
112 Icon icon = getIcon(messages, label + ".menuitem.icon");
119 public static JMenuItem createJMenuItem(Messages messages, String label, Action action){
120 JMenuItem item = new JMenuItem(action);
121 item.setText(messages.get(label + ".menuitem.label"));
122 item.setActionCommand(label);
123 if(messages.hasValue(label + ".menuitem.tooltip")){
124 item.setToolTipText(messages.get(label + ".menuitem.tooltip"));
126 Icon icon = getIcon(messages, label + ".menuitem.icon");
133 public static JMenuItem createJMenuItem(Messages messages, String label){
134 JMenuItem item = new JMenuItem(messages.get(label + ".menuitem.label"));
135 item.setActionCommand(label);
136 if(messages.hasValue(label + ".menuitem.tooltip")){
137 item.setToolTipText(messages.get(label + ".menuitem.tooltip"));
139 Icon icon = getIcon(messages, label + ".menuitem.icon");
146 public static JMenu createJMenu(Messages messages, String label){
147 JMenu menu = new JMenu(messages.get(label + ".menu.label"));
148 menu.setActionCommand(label);
149 if(messages.hasValue(label + ".menu.tooltip")){
150 menu.setToolTipText(messages.get(label + ".menu.tooltip"));
152 Icon icon = getIcon(messages, label + ".menu.icon");
159 public static URL getResource(Messages messages, String resourcePathLabel, String resourcePathPrefix){
160 if(messages.hasValue(resourcePathLabel)){
161 String resourcePath = messages.get(resourcePathLabel);
162 if(resourcePathPrefix != null){
163 resourcePath = resourcePathPrefix + resourcePath;
165 return GUIUtility.class.getResource(resourcePath);
170 public static URL getResource(Messages messages, String resourcePathLabel){
171 return getResource(messages, resourcePathLabel, null);
174 public static Icon getIcon(Messages messages, String label){
175 URL url = getResource(messages, label, messages.get("icon.path"));
177 ImageIcon icon = new ImageIcon(url);
184 public static Image getImage(Messages messages, String imageFilePathLabel){
185 Icon icon = getIcon(messages, imageFilePathLabel);
186 if(icon != null && icon instanceof ImageIcon){
187 return ((ImageIcon)icon).getImage();
192 public static void addNewTab(Messages messages, String key, JTabbedPane tabPane, Component comp){
193 addNewTab(messages, key, tabPane, comp, null, null);
196 public static void addNewTab(Messages messages, String key, JTabbedPane tabPane, Component comp, Object[] tabnameValues, Object[] values){
197 addNewTab(messages, key, tabPane, comp, tabnameValues, values, false);
200 public static void addNewTab(Messages messages, String key, final JTabbedPane tabPane,
201 final Component comp, Object[] tabnameValues, Object[] values,
203 String tabName = messages.get(key + ".tab.label");
204 String tooltip = messages.get(key + ".tab.tooltip");
205 Icon icon = getIcon(messages, key + ".tab.icon");
207 if(tabnameValues != null){
208 tabName = MessageFormat.format(tabName, tabnameValues);
212 tooltip = MessageFormat.format(tooltip, values);
214 tabPane.addTab(tabName, icon, comp, tooltip);
215 tabPane.setSelectedIndex(tabPane.getTabCount() - 1);
217 JLabel label = new JLabel(tabName);
221 Icon closeIcon = getIcon(messages, "closetab.tabicon");
222 JButton button = new JButton(closeIcon);
223 button.setPreferredSize(new Dimension(closeIcon.getIconWidth(), closeIcon.getIconHeight()));
224 JPanel panel = new JPanel(new BorderLayout());
225 panel.setOpaque(false);
226 label.setBorder(new EmptyBorder(0, 0, 0, 4));
227 panel.add(label, BorderLayout.WEST);
228 panel.add(button, BorderLayout.EAST);
229 button.addActionListener(new ActionListener(){
231 public void actionPerformed(ActionEvent e){
232 tabPane.remove(comp);
235 button.setBorder(new EmptyBorder(1, 1, 1, 1));
236 panel.setBorder(new EmptyBorder(2, 1, 1, 1));
237 tabPane.setTabComponentAt(tabPane.getTabCount() - 1, panel);
241 public static void showErrorDialog(Component parent, Messages messages, Exception e){
242 JPanel panel = new JPanel(new BorderLayout());
243 JTextArea area = new JTextArea();
244 StringWriter out = new StringWriter();
245 e.printStackTrace(new PrintWriter(out));
246 String stackTrace = out.toString();
248 panel.add(new JLabel(e.getLocalizedMessage()), BorderLayout.NORTH);
249 panel.add(new JScrollPane(area), BorderLayout.CENTER);
250 area.setText(stackTrace);
251 area.setEditable(false);
252 panel.setPreferredSize(new Dimension(500, 400));
253 panel.setSize(panel.getPreferredSize());
255 JOptionPane.showMessageDialog(parent, panel, messages.get("error.dialog.title"), JOptionPane.WARNING_MESSAGE);