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
44 public class GUIUtility{
48 public static void decorateJComponent(Messages messages, JComponent component, String label){
49 if(messages.hasValue(label + ".tooltip")){
50 component.setToolTipText(messages.get(label + ".tooltip"));
52 if(messages.hasValue(label + ".border")){
53 component.setBorder(new TitledBorder(messages.get(label + ".border")));
56 Icon icon = getIcon(messages, label + ".icon");
58 Method[] methods = component.getClass().getMethods();
59 for(Method m: methods){
60 if(m.getName().equals("setIcon")){
61 m.invoke(component, icon);
65 } catch(IllegalAccessException e){
66 throw new InternalError(e.getMessage());
67 } catch(InvocationTargetException e){
68 throw new InternalError(e.getMessage());
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"));
79 Icon icon = getIcon(messages, label + ".button.icon");
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"));
93 Icon icon = getIcon(messages, label + ".button.icon");
101 public static JCheckBoxMenuItem createJCheckBoxMenuItem(Messages messages, String label){
102 return createJCheckBoxMenuItem(messages, label, false);
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"));
111 Icon icon = getIcon(messages, label + ".menuitem.icon");
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"));
125 Icon icon = getIcon(messages, label + ".menuitem.icon");
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"));
138 Icon icon = getIcon(messages, label + ".menuitem.icon");
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"));
151 Icon icon = getIcon(messages, label + ".menu.icon");
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;
164 return GUIUtility.class.getResource(resourcePath);
169 public static URL getResource(Messages messages, String resourcePathLabel){
170 return getResource(messages, resourcePathLabel, null);
173 public static Icon getIcon(Messages messages, String label){
174 URL url = getResource(messages, label, messages.get("icon.path"));
176 ImageIcon icon = new ImageIcon(url);
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();
191 public static void addNewTab(Messages messages, String key, JTabbedPane tabPane, Component comp){
192 addNewTab(messages, key, tabPane, comp, null, null);
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);
199 public static void addNewTab(Messages messages, String key, final JTabbedPane tabPane,
200 final Component comp, Object[] tabnameValues, Object[] values,
202 String tabName = messages.get(key + ".tab.label");
203 String tooltip = messages.get(key + ".tab.tooltip");
204 Icon icon = getIcon(messages, key + ".tab.icon");
206 if(tabnameValues != null){
207 tabName = MessageFormat.format(tabName, tabnameValues);
211 tooltip = MessageFormat.format(tooltip, values);
213 tabPane.addTab(tabName, icon, comp, tooltip);
214 tabPane.setSelectedIndex(tabPane.getTabCount() - 1);
216 JLabel label = new JLabel(tabName);
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(){
230 public void actionPerformed(ActionEvent e){
231 tabPane.remove(comp);
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);
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();
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());
254 JOptionPane.showMessageDialog(parent, panel, messages.get("error.dialog.title"), JOptionPane.WARNING_MESSAGE);