1 package jp.sourceforge.stigmata.ui.swing;
7 import java.awt.BorderLayout;
8 import java.awt.FlowLayout;
9 import java.awt.event.ActionEvent;
10 import java.awt.event.ActionListener;
11 import java.awt.event.MouseAdapter;
12 import java.awt.event.MouseEvent;
13 import java.util.HashMap;
16 import javax.swing.AbstractAction;
17 import javax.swing.Action;
18 import javax.swing.Box;
19 import javax.swing.DefaultListModel;
20 import javax.swing.JButton;
21 import javax.swing.JCheckBox;
22 import javax.swing.JComboBox;
23 import javax.swing.JComponent;
24 import javax.swing.JLabel;
25 import javax.swing.JList;
26 import javax.swing.JOptionPane;
27 import javax.swing.JPanel;
28 import javax.swing.JPopupMenu;
29 import javax.swing.JScrollPane;
30 import javax.swing.JTextField;
31 import javax.swing.border.TitledBorder;
32 import javax.swing.event.DocumentEvent;
33 import javax.swing.event.DocumentListener;
34 import javax.swing.event.ListSelectionEvent;
35 import javax.swing.event.ListSelectionListener;
37 import jp.sourceforge.stigmata.ui.swing.actions.PopupShowAction;
38 import jp.sourceforge.stigmata.utils.WellknownClassJudgeRule;
39 import jp.sourceforge.stigmata.utils.WellknownClassManager;
40 import jp.sourceforge.talisman.i18n.Messages;
43 * Well-known classes judge rules management pane.
45 * @author Haruaki TAMADA
48 public class WellknownClassesSettingsPane extends JPanel{
49 private static final long serialVersionUID = 329734546345634532L;
51 private StigmataFrame stigmata;
52 private WellknownClassManager manager;
54 private DefaultListModel listmodel;
56 private Map<String, String> matchTypeMap = new HashMap<String, String>();
57 private Map<String, String> partTypeMap = new HashMap<String, String>();
59 public WellknownClassesSettingsPane(StigmataFrame stigmata){
60 this.stigmata = stigmata;
61 this.manager = stigmata.getEnvironment().getWellknownClassManager();
67 public synchronized void setWellknownClasses(WellknownClassManager manager){
69 for(int i = 0; i < listmodel.getSize(); i++){
70 WellknownClassJudgeRule rule = (WellknownClassJudgeRule)listmodel.getElementAt(i);
75 public synchronized WellknownClassManager createWellknownClassManager(){
76 WellknownClassManager manager = new WellknownClassManager();
77 setWellknownClasses(manager);
86 private synchronized boolean isWellknownClass(String className){
87 WellknownClassManager manager = createWellknownClassManager();
89 return manager.isWellKnownClass(className);
92 private String findType(JComboBox combo, Map<String, String> map){
93 String item = (String)combo.getSelectedItem();
94 for(Map.Entry<String, String> entry: map.entrySet()){
95 if(item.equals(entry.getValue())){
96 return entry.getKey();
102 public void addRule(WellknownClassJudgeRule rule){
104 listmodel.addElement(rule);
105 stigmata.setNeedToSaveSettings(true);
109 public void editRule(int index){
110 WellknownClassJudgeRule rule = (WellknownClassJudgeRule)listmodel.getElementAt(index);
111 WellknownClassJudgeRule newrule = createOrUpdateRule(stigmata.getMessages(), rule);
113 listmodel.setElementAt(newrule, index);
114 stigmata.setNeedToSaveSettings(true);
119 private void initializeData(){
120 for(WellknownClassJudgeRule rule : manager){
121 listmodel.addElement(rule);
124 for(WellknownClassJudgeRule.MatchType type: WellknownClassJudgeRule.MatchType.values()){
125 matchTypeMap.put(type.name(), stigmata.getMessages().get("matchtype." + type.name()));
127 for(WellknownClassJudgeRule.MatchPartType type: WellknownClassJudgeRule.MatchPartType.values()){
128 partTypeMap.put(type.name(), stigmata.getMessages().get("matchparttype." + type.name()));
132 private void initLayouts(){
133 setLayout(new BorderLayout());
134 JPanel center = new JPanel(new BorderLayout());
135 listmodel = new DefaultListModel();
137 list = new JList(listmodel);
138 JScrollPane scroll = new JScrollPane(list);
140 center.add(scroll, BorderLayout.CENTER);
141 center.add(createSouthPane(stigmata.getMessages()), BorderLayout.SOUTH);
143 add(center, BorderLayout.CENTER);
144 add(createCheckPane(stigmata.getMessages()), BorderLayout.SOUTH);
147 private JComponent createCheckPane(final Messages messages){
148 final JTextField text = new JTextField();
149 final JButton checkButton = GUIUtility.createButton(messages, "checkwellknown");
150 final JLabel label = new JLabel(GUIUtility.getIcon(messages, "wellknownclasschecker.default.icon"));
151 checkButton.setEnabled(false);
153 ActionListener listener = new ActionListener(){
155 public void actionPerformed(ActionEvent e){
156 String t = text.getText().trim();
158 String message = messages.get("wellknownclasschecker.wellknown.tooltip");
159 if(isWellknownClass(t)){
160 label.setIcon(GUIUtility.getIcon(messages, "wellknownclasschecker.wellknown.icon"));
163 label.setIcon(GUIUtility.getIcon(messages, "wellknownclasschecker.notwellknown.icon"));
164 message = messages.get("wellknownclasschecker.notwellknown.tooltip");
166 label.setToolTipText(message);
167 String dm = String.format(
168 "<html><body><dl><dt>%s</dt><dd>%s</dd></body></html>", t, message
170 JOptionPane.showMessageDialog(
171 stigmata, dm, stigmata.getMessages().get("wellknownclasschecker.dialog.title"),
172 JOptionPane.INFORMATION_MESSAGE
177 checkButton.addActionListener(listener);
178 text.addActionListener(listener);
179 text.getDocument().addDocumentListener(new DocumentListener(){
181 public void changedUpdate(DocumentEvent arg0){
182 checkButton.setEnabled(text.getText().trim().length() > 0);
186 public void insertUpdate(DocumentEvent arg0){
187 checkButton.setEnabled(text.getText().trim().length() > 0);
191 public void removeUpdate(DocumentEvent arg0){
192 checkButton.setEnabled(text.getText().trim().length() > 0);
196 JComponent south = Box.createHorizontalBox();
197 south.add(Box.createHorizontalGlue());
199 south.add(Box.createHorizontalGlue());
200 south.add(checkButton);
201 south.add(Box.createHorizontalGlue());
203 south.add(Box.createHorizontalGlue());
205 south.setBorder(new TitledBorder(stigmata.getMessages().get("wellknownclasschecker.border")));
210 private JComponent createSouthPane(final Messages messages){
211 JComponent southPanel = Box.createHorizontalBox();
212 Action addAction = new AbstractAction(){
213 private static final long serialVersionUID = -8749957850400877529L;
216 public void actionPerformed(ActionEvent e){
217 addRule(createOrUpdateRule(messages, null));
220 final Action removeAction = new AbstractAction(){
221 private static final long serialVersionUID = 8776209200186477040L;
224 public void actionPerformed(ActionEvent e){
225 int[] indeces = list.getSelectedIndices();
226 for(int i = indeces.length - 1; i >= 0; i--){
227 listmodel.removeElementAt(indeces[i]);
229 list.getSelectionModel().clearSelection();
230 stigmata.setNeedToSaveSettings(true);
233 final Action updateAction = new AbstractAction(){
234 private static final long serialVersionUID = 852965501722574084L;
237 public void actionPerformed(ActionEvent e){
238 editRule(list.getSelectedIndex());
241 JButton addButton = GUIUtility.createButton(messages, "addwellknown", addAction);
242 JButton removeButton = GUIUtility.createButton(messages, "removewellknown", removeAction);
243 JButton updateButton = GUIUtility.createButton(messages, "updatewellknown", updateAction);
244 removeAction.setEnabled(false);
245 updateAction.setEnabled(false);
247 southPanel.add(Box.createHorizontalGlue());
248 southPanel.add(addButton);
249 southPanel.add(Box.createHorizontalGlue());
250 southPanel.add(updateButton);
251 southPanel.add(Box.createHorizontalGlue());
252 southPanel.add(removeButton);
253 southPanel.add(Box.createHorizontalGlue());
255 list.addMouseListener(new MouseAdapter(){
257 public void mouseClicked(MouseEvent e){
258 if(e.getClickCount() == 2){
259 editRule(list.getSelectedIndex());
263 JPopupMenu popup = new JPopupMenu();
264 popup.add(GUIUtility.createJMenuItem(messages, "addwellknown", addAction));
265 popup.add(GUIUtility.createJMenuItem(messages, "updatewellknown", updateAction));
266 popup.add(GUIUtility.createJMenuItem(messages, "removewellknown", removeAction));
268 list.addMouseListener(new PopupShowAction(popup));
269 list.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
271 public void valueChanged(ListSelectionEvent arg0){
272 int[] indeces = list.getSelectedIndices();
273 removeAction.setEnabled(indeces != null && indeces.length > 0);
274 updateAction.setEnabled(indeces != null && indeces.length == 1);
281 private WellknownClassJudgeRule createOrUpdateRule(Messages messages, WellknownClassJudgeRule rule){
282 JTextField text = new JTextField();
283 text.setOpaque(true);
284 GUIUtility.decorateJComponent(messages, text, "addwellknown.newrule.pattern");
285 JCheckBox excludeCheck = new JCheckBox(messages.get("addwellknown.newrule.exclude.label"), false);
286 GUIUtility.decorateJComponent(messages, excludeCheck, "addwellknown.newrule.exclude");
287 JComboBox matchTypeComboBox = new JComboBox();
288 for(Map.Entry<String, String> entry: matchTypeMap.entrySet()){
289 matchTypeComboBox.addItem(entry.getValue());
291 JComboBox partTypeComboBox = new JComboBox();
292 for(Map.Entry<String, String> entry: partTypeMap.entrySet()){
293 partTypeComboBox.addItem(entry.getValue());
296 text.setText(rule.getPattern());
297 excludeCheck.setSelected(rule.isExclude());
298 matchTypeComboBox.setSelectedItem(matchTypeMap.get(rule.getMatchType().name()));
299 partTypeComboBox.setSelectedItem(partTypeMap.get(rule.getMatchPartType().name()));
302 JPanel panel = new JPanel(new BorderLayout());
303 panel.setOpaque(true);
304 JPanel centerPanel = new JPanel(new FlowLayout());
306 centerPanel.add(partTypeComboBox);
307 centerPanel.add(matchTypeComboBox);
309 panel.add(excludeCheck, BorderLayout.NORTH);
310 panel.add(centerPanel, BorderLayout.CENTER);
311 panel.add(text, BorderLayout.SOUTH);
313 int value = JOptionPane.showConfirmDialog(
314 stigmata, panel, stigmata.getMessages().get("addwellknown.dialog.title"),
315 JOptionPane.OK_CANCEL_OPTION
317 if(value == JOptionPane.OK_OPTION){
318 String matchType = findType(matchTypeComboBox, matchTypeMap);
319 String partType = findType(partTypeComboBox, partTypeMap);
320 WellknownClassJudgeRule.MatchType match = null;
321 WellknownClassJudgeRule.MatchPartType part = null;
322 String pattern = text.getText();
323 boolean excludeFlag = excludeCheck.isSelected();
325 if(matchType != null && partType != null){
326 match = WellknownClassJudgeRule.MatchType.valueOf(matchType);
327 part = WellknownClassJudgeRule.MatchPartType.valueOf(partType);
330 if(match != null && partType != null && pattern != null && !pattern.equals("")){
331 return new WellknownClassJudgeRule(pattern, match, part, excludeFlag);