OSDN Git Service

オーバーライドしているメソッド全てに @Override アノテーションを追加した.
[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  * @version $Revision$ 
44  */
45 public class GUIUtility{
46     private GUIUtility(){
47     }
48
49     public static void decorateJComponent(Messages messages, JComponent component, String label){
50         if(messages.hasValue(label + ".tooltip")){
51             component.setToolTipText(messages.get(label + ".tooltip"));
52         }
53         if(messages.hasValue(label + ".border")){
54             component.setBorder(new TitledBorder(messages.get(label + ".border")));
55         }
56         try{
57             Icon icon = getIcon(messages, label + ".icon");
58             if(icon != null){
59                 Method[] methods = component.getClass().getMethods();
60                 for(Method m: methods){
61                     if(m.getName().equals("setIcon")){
62                         m.invoke(component, icon);
63                     }
64                 }
65             }
66         } catch(IllegalAccessException e){
67             throw new InternalError(e.getMessage());
68         } catch(InvocationTargetException e){
69             throw new InternalError(e.getMessage());
70         }
71     }
72
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"));
79         }
80         Icon icon = getIcon(messages, label + ".button.icon");
81         if(icon != null){
82             button.setIcon(icon);
83         }
84
85         return button;
86     }
87
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"));
93         }
94         Icon icon = getIcon(messages, label + ".button.icon");
95         if(icon != null){
96             button.setIcon(icon);
97         }
98
99         return button;
100     }
101
102     public static JCheckBoxMenuItem createJCheckBoxMenuItem(Messages messages, String label){
103         return createJCheckBoxMenuItem(messages, label, false);
104     }
105
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"));
111         }
112         Icon icon = getIcon(messages, label + ".menuitem.icon");
113         if(icon != null){
114             item.setIcon(icon);
115         }
116         return item;
117     }
118
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"));
125         }
126         Icon icon = getIcon(messages, label + ".menuitem.icon");
127         if(icon != null){
128             item.setIcon(icon);
129         }
130         return item;
131     }
132
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"));
138         }
139         Icon icon = getIcon(messages, label + ".menuitem.icon");
140         if(icon != null){
141             item.setIcon(icon);
142         }
143         return item;
144     }
145
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"));
151         }
152         Icon icon = getIcon(messages, label + ".menu.icon");
153         if(icon != null){
154             menu.setIcon(icon);
155         }
156         return menu;
157     }
158
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;
164             }
165             return GUIUtility.class.getResource(resourcePath);
166         }
167         return null;
168     }
169
170     public static URL getResource(Messages messages, String resourcePathLabel){
171         return getResource(messages, resourcePathLabel, null);
172     }
173
174     public static Icon getIcon(Messages messages, String label){
175         URL url = getResource(messages, label, messages.get("icon.path"));
176         if(url != null){
177             ImageIcon icon = new ImageIcon(url);
178             return icon;
179         }
180
181         return null;
182     }
183
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();
188         }
189         return null;
190     }
191
192     public static void addNewTab(Messages messages, String key, JTabbedPane tabPane, Component comp){
193         addNewTab(messages, key, tabPane, comp, null, null);
194     }
195
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);
198     }
199
200     public static void addNewTab(Messages messages, String key, final JTabbedPane tabPane,
201                                  final Component comp, Object[] tabnameValues, Object[] values,
202                                  boolean closable){
203         String tabName = messages.get(key + ".tab.label");
204         String tooltip = messages.get(key + ".tab.tooltip");
205         Icon icon = getIcon(messages, key + ".tab.icon");
206
207         if(tabnameValues != null){
208             tabName = MessageFormat.format(tabName, tabnameValues);
209         }
210
211         if(values != null){
212             tooltip = MessageFormat.format(tooltip, values);
213         }
214         tabPane.addTab(tabName, icon, comp, tooltip);
215         tabPane.setSelectedIndex(tabPane.getTabCount() - 1);
216         if(closable){
217             JLabel label = new JLabel(tabName);
218             if(icon != null){
219                 label.setIcon(icon);
220             }
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(){
230                 @Override
231                 public void actionPerformed(ActionEvent e){
232                     tabPane.remove(comp);
233                 }
234             });
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);
238         }
239     }
240
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();
247
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());
254
255         JOptionPane.showMessageDialog(parent, panel, messages.get("error.dialog.title"), JOptionPane.WARNING_MESSAGE);
256     }
257 }