OSDN Git Service

remove Revision tag
[stigmata/stigmata.git] / src / main / java / jp / sourceforge / stigmata / ui / swing / ClasspathSettingsPane.java
1 package jp.sourceforge.stigmata.ui.swing;
2
3 /*
4  * $Id$
5  */
6
7 import java.awt.BorderLayout;
8 import java.awt.GridLayout;
9 import java.awt.event.ActionEvent;
10 import java.awt.event.ActionListener;
11 import java.io.File;
12 import java.io.IOException;
13 import java.net.MalformedURLException;
14 import java.net.URL;
15
16 import javax.swing.Box;
17 import javax.swing.JButton;
18 import javax.swing.JComponent;
19 import javax.swing.JLabel;
20 import javax.swing.JOptionPane;
21 import javax.swing.JPanel;
22 import javax.swing.JTextField;
23 import javax.swing.border.TitledBorder;
24 import javax.swing.event.DocumentEvent;
25 import javax.swing.event.DocumentListener;
26
27 import jp.sourceforge.stigmata.Stigmata;
28 import jp.sourceforge.stigmata.digger.ClasspathContext;
29 import jp.sourceforge.talisman.i18n.Messages;
30
31 /**
32  * 
33  * 
34  *
35  * @author Haruaki TAMADA
36  */
37 public class ClasspathSettingsPane extends JPanel{
38     private static final long serialVersionUID = 320973463423634L;
39
40     private StigmataFrame stigmata;
41     private TargetSelectionPane classpath;
42     private TargetSelectionPane bootClasspath;
43
44     public ClasspathSettingsPane(StigmataFrame frame){
45         this.stigmata = frame;
46
47         initLayouts();
48     }
49
50     public void updateClasspathContext(ClasspathContext context){
51         String[] cplist = classpath.getValues();
52         if(cplist != null && cplist.length >= 0){
53             for(int i = 0; i < cplist.length; i++){
54                 try{
55                     URL url = null;
56                     try{
57                         url = new URL(cplist[i]);
58                     } catch(MalformedURLException e){
59                         url = new File(cplist[i]).toURI().toURL();
60                     }
61                     context.addClasspath(url);
62                 }catch(IOException ee){
63                 }
64             }
65         }
66     }
67
68     public void reset(){
69         classpath.removeAllElements();
70         bootClasspath.removeAllElements();
71         try{
72             ClasspathContext context = stigmata.getEnvironment().getClasspathContext();
73             for(URL url: context){
74                 classpath.addValue(url.toString());
75             }
76
77             addClasspath(bootClasspath, System.getProperty("java.class.path"));
78             addClasspath(bootClasspath, System.getProperty("sun.boot.class.path"));
79         } catch(SecurityException e){
80             e.printStackTrace();
81         }
82     }
83     
84     private void addClasspath(TargetSelectionPane target, String classpath){
85         if(classpath != null){
86             target.addValues(classpath.split(System.getProperty("path.separator")));
87             stigmata.setNeedToSaveSettings(true);
88         }
89     }
90
91     private boolean findClass(String className){
92         try{
93             ClasspathContext b = Stigmata.getInstance().createEnvironment().getClasspathContext();
94             ClasspathContext bytecode = new ClasspathContext(b);
95             String[] path = classpath.getValues();
96             for(String cp: path){
97                 bytecode.addClasspath(new File(cp).toURI().toURL());
98             }
99             return bytecode.findClass(className) != null;
100         }catch(ClassNotFoundException e){
101         }catch(MalformedURLException e){
102         }
103         return false;
104     }
105
106     private void initLayouts(){
107         final Messages messages = stigmata.getMessages();
108         JComponent panel = new JPanel(new GridLayout(1, 2));
109         classpath = new TargetSelectionPane(stigmata);
110         bootClasspath = new TargetSelectionPane(stigmata);
111         JComponent south = Box.createHorizontalBox();
112         final JButton findButton = GUIUtility.createButton(messages, "findclass");
113         final JTextField text = new JTextField();
114         final JLabel label = new JLabel();
115
116         classpath.setBorder(new TitledBorder(stigmata.getMessages().get("userclasspath.border")));
117         classpath.addTargetExtensions(stigmata.getMessages().getArray("userclasspath.extensions"));
118         classpath.setDescription(stigmata.getMessages().get("userclasspath.description"));
119         classpath.setDirectorySelectable(true);
120
121         bootClasspath.setBorder(new TitledBorder(stigmata.getMessages().get("bootclasspath.border")));
122         bootClasspath.setEnabled(false);
123
124         findButton.setEnabled(false);
125
126         south.setBorder(new TitledBorder(stigmata.getMessages().get("classpathchecker.border")));
127
128         label.setIcon(GUIUtility.getIcon(messages, "classpathchecker.default.icon"));
129         label.setToolTipText(stigmata.getMessages().get("classpathchecker.default.tooltip"));
130
131         setLayout(new BorderLayout());
132         add(panel, BorderLayout.CENTER);
133         add(south, BorderLayout.SOUTH);
134
135         panel.add(classpath);
136         panel.add(bootClasspath);
137
138         south.add(Box.createHorizontalGlue());
139         south.add(text);
140         south.add(Box.createHorizontalGlue());
141         south.add(findButton);
142         south.add(Box.createHorizontalGlue());
143         south.add(label);
144         south.add(Box.createHorizontalGlue());
145
146         text.getDocument().addDocumentListener(new DocumentListener(){
147             @Override
148             public void changedUpdate(DocumentEvent arg0){
149                 String t = text.getText();
150                 findButton.setEnabled(t.trim().length() > 0);
151             }
152
153             @Override
154             public void insertUpdate(DocumentEvent arg0){
155                 String t = text.getText();
156                 findButton.setEnabled(t.trim().length() > 0);
157             }
158
159             @Override
160             public void removeUpdate(DocumentEvent arg0){
161                 String t = text.getText();
162                 findButton.setEnabled(t.trim().length() > 0);
163             }
164         });
165         ActionListener action = new ActionListener(){
166             @Override
167             public void actionPerformed(ActionEvent e){
168                 String t = text.getText().trim();
169                 boolean flag = findClass(t);
170                 String message = stigmata.getMessages().get("classpathchecker.found.tooltip");
171                 if(flag){
172                     label.setIcon(GUIUtility.getIcon(messages, "classpathchecker.found.icon"));
173                 }
174                 else{
175                     label.setIcon(GUIUtility.getIcon(messages, "classpathchecker.notfound.icon"));
176                     message = stigmata.getMessages().get("classpathchecker.notfound.tooltip");
177                 }
178                 label.setToolTipText(message);
179                 String dm = String.format(
180                     "<html><body><dl><dt>%s</dt><dd>%s</dd></body></html>", t, message
181                 );
182                 JOptionPane.showMessageDialog(
183                     stigmata, dm, stigmata.getMessages().get("classpathchecker.dialog.title"),
184                     JOptionPane.INFORMATION_MESSAGE
185                 );
186             }
187         };
188
189         classpath.addDataChangeListener(new DataChangeListener(){
190             @Override
191             public void valueChanged(Object source){
192                 stigmata.setNeedToSaveSettings(true);
193             }
194         });
195
196         findButton.addActionListener(action);
197         text.addActionListener(action);
198     }
199 }