OSDN Git Service

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