OSDN Git Service

4c97a8a05ade367b952a6a4ab4131255b255f599
[stigmata/stigmata.git] / src / main / java / jp / sourceforge / stigmata / ui / swing / GUIUtility.java
1 package jp.sourceforge.stigmata.ui.swing;
2
3 /*
4  * $Id$
5  */
6
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;
17 import java.net.URL;
18 import java.text.MessageFormat;
19
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;
36
37 import jp.sourceforge.talisman.i18n.Messages;
38
39 /**
40  * Utility routines for building GUI.
41  *
42  * @author Haruaki TAMADA
43  */
44 public class GUIUtility{
45     private GUIUtility(){
46     }
47
48     public static void decorateJComponent(Messages messages, JComponent component, String label){
49         if(messages.hasValue(label + ".tooltip")){
50             component.setToolTipText(messages.get(label + ".tooltip"));
51         }
52         if(messages.hasValue(label + ".border")){
53             component.setBorder(new TitledBorder(messages.get(label + ".border")));
54         }
55         try{
56             Icon icon = getIcon(messages, label + ".icon");
57             if(icon != null){
58                 Method[] methods = component.getClass().getMethods();
59                 for(Method m: methods){
60                     if(m.getName().equals("setIcon")){
61                         m.invoke(component, icon);
62                     }
63                 }
64             }
65         } catch(IllegalAccessException e){
66             throw new InternalError(e.getMessage());
67         } catch(InvocationTargetException e){
68             throw new InternalError(e.getMessage());
69         }
70     }
71
72     public static JButton createButton(Messages messages, String label, Action action){
73         JButton button = new JButton(action);
74         button.setText(messages.get(label + ".button.label"));
75         button.setActionCommand(label);
76         if(messages.hasValue(label + ".button.tooltip")){
77             button.setToolTipText(messages.get(label + ".button.tooltip"));
78         }
79         Icon icon = getIcon(messages, label + ".button.icon");
80         if(icon != null){
81             button.setIcon(icon);
82         }
83
84         return button;
85     }
86
87     public static JButton createButton(Messages messages, String label){
88         JButton button = new JButton(messages.get(label + ".button.label"));
89         button.setActionCommand(label);
90         if(messages.hasValue(label + ".button.tooltip")){
91             button.setToolTipText(messages.get(label + ".button.tooltip"));
92         }
93         Icon icon = getIcon(messages, label + ".button.icon");
94         if(icon != null){
95             button.setIcon(icon);
96         }
97
98         return button;
99     }
100
101     public static JCheckBoxMenuItem createJCheckBoxMenuItem(Messages messages, String label){
102         return createJCheckBoxMenuItem(messages, label, false);
103     }
104
105     public static JCheckBoxMenuItem createJCheckBoxMenuItem(Messages messages, String label, boolean status){
106         JCheckBoxMenuItem item = new JCheckBoxMenuItem(messages.get(label + ".menuitem.label"), status);
107         item.setActionCommand(label);
108         if(messages.hasValue(label + ".menuitem.tooltip")){
109             item.setToolTipText(messages.get(label + ".menuitem.tooltip"));
110         }
111         Icon icon = getIcon(messages, label + ".menuitem.icon");
112         if(icon != null){
113             item.setIcon(icon);
114         }
115         return item;
116     }
117
118     public static JMenuItem createJMenuItem(Messages messages, String label, Action action){
119         JMenuItem item = new JMenuItem(action);
120         item.setText(messages.get(label + ".menuitem.label"));
121         item.setActionCommand(label);
122         if(messages.hasValue(label + ".menuitem.tooltip")){
123             item.setToolTipText(messages.get(label + ".menuitem.tooltip"));
124         }
125         Icon icon = getIcon(messages, label + ".menuitem.icon");
126         if(icon != null){
127             item.setIcon(icon);
128         }
129         return item;
130     }
131
132     public static JMenuItem createJMenuItem(Messages messages, String label){
133         JMenuItem item = new JMenuItem(messages.get(label + ".menuitem.label"));
134         item.setActionCommand(label);
135         if(messages.hasValue(label + ".menuitem.tooltip")){
136             item.setToolTipText(messages.get(label + ".menuitem.tooltip"));
137         }
138         Icon icon = getIcon(messages, label + ".menuitem.icon");
139         if(icon != null){
140             item.setIcon(icon);
141         }
142         return item;
143     }
144
145     public static JMenu createJMenu(Messages messages, String label){
146         JMenu menu = new JMenu(messages.get(label + ".menu.label"));
147         menu.setActionCommand(label);
148         if(messages.hasValue(label + ".menu.tooltip")){
149             menu.setToolTipText(messages.get(label + ".menu.tooltip"));
150         }
151         Icon icon = getIcon(messages, label + ".menu.icon");
152         if(icon != null){
153             menu.setIcon(icon);
154         }
155         return menu;
156     }
157
158     public static URL getResource(Messages messages, String resourcePathLabel, String resourcePathPrefix){
159         if(messages.hasValue(resourcePathLabel)){
160             String resourcePath = messages.get(resourcePathLabel);
161             if(resourcePathPrefix != null){
162                 resourcePath = resourcePathPrefix + resourcePath;
163             }
164             return GUIUtility.class.getResource(resourcePath);
165         }
166         return null;
167     }
168
169     public static URL getResource(Messages messages, String resourcePathLabel){
170         return getResource(messages, resourcePathLabel, null);
171     }
172
173     public static Icon getIcon(Messages messages, String label){
174         URL url = getResource(messages, label, messages.get("icon.path"));
175         if(url != null){
176             ImageIcon icon = new ImageIcon(url);
177             return icon;
178         }
179
180         return null;
181     }
182
183     public static Image getImage(Messages messages, String imageFilePathLabel){
184         Icon icon = getIcon(messages, imageFilePathLabel);
185         if(icon != null && icon instanceof ImageIcon){
186             return ((ImageIcon)icon).getImage();
187         }
188         return null;
189     }
190
191     public static void addNewTab(Messages messages, String key, JTabbedPane tabPane, Component comp){
192         addNewTab(messages, key, tabPane, comp, null, null);
193     }
194
195     public static void addNewTab(Messages messages, String key, JTabbedPane tabPane, Component comp, Object[] tabnameValues, Object[] values){
196         addNewTab(messages, key, tabPane, comp, tabnameValues, values, false);
197     }
198
199     public static void addNewTab(Messages messages, String key, final JTabbedPane tabPane,
200                                  final Component comp, Object[] tabnameValues, Object[] values,
201                                  boolean closable){
202         String tabName = messages.get(key + ".tab.label");
203         String tooltip = messages.get(key + ".tab.tooltip");
204         Icon icon = getIcon(messages, key + ".tab.icon");
205
206         if(tabnameValues != null){
207             tabName = MessageFormat.format(tabName, tabnameValues);
208         }
209
210         if(values != null){
211             tooltip = MessageFormat.format(tooltip, values);
212         }
213         tabPane.addTab(tabName, icon, comp, tooltip);
214         tabPane.setSelectedIndex(tabPane.getTabCount() - 1);
215         if(closable){
216             JLabel label = new JLabel(tabName);
217             if(icon != null){
218                 label.setIcon(icon);
219             }
220             Icon closeIcon = getIcon(messages, "closetab.tabicon");
221             JButton button = new JButton(closeIcon);
222             button.setPreferredSize(new Dimension(closeIcon.getIconWidth(), closeIcon.getIconHeight()));
223             JPanel panel = new JPanel(new BorderLayout());
224             panel.setOpaque(false);
225             label.setBorder(new EmptyBorder(0, 0, 0, 4));
226             panel.add(label, BorderLayout.WEST);
227             panel.add(button, BorderLayout.EAST);
228             button.addActionListener(new ActionListener(){
229                 @Override
230                 public void actionPerformed(ActionEvent e){
231                     tabPane.remove(comp);
232                 }
233             });
234             button.setBorder(new EmptyBorder(1, 1, 1, 1));
235             panel.setBorder(new EmptyBorder(2, 1, 1, 1));
236             tabPane.setTabComponentAt(tabPane.getTabCount() - 1, panel);
237         }
238     }
239
240     public static void showErrorDialog(Component parent, Messages messages, Exception e){
241         JPanel panel = new JPanel(new BorderLayout());
242         JTextArea area = new JTextArea();
243         StringWriter out = new StringWriter();
244         e.printStackTrace(new PrintWriter(out));
245         String stackTrace = out.toString();
246
247         panel.add(new JLabel(e.getLocalizedMessage()), BorderLayout.NORTH);
248         panel.add(new JScrollPane(area), BorderLayout.CENTER);
249         area.setText(stackTrace);
250         area.setEditable(false);
251         panel.setPreferredSize(new Dimension(500, 400));
252         panel.setSize(panel.getPreferredSize());
253
254         JOptionPane.showMessageDialog(parent, panel, messages.get("error.dialog.title"), JOptionPane.WARNING_MESSAGE);
255     }
256 }