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
47 public class WellknownClassesSettingsPane extends JPanel{
48 private static final long serialVersionUID = 329734546345634532L;
50 private StigmataFrame stigmata;
51 private WellknownClassManager manager;
53 private DefaultListModel listmodel;
55 private Map<String, String> matchTypeMap = new HashMap<String, String>();
56 private Map<String, String> partTypeMap = new HashMap<String, String>();
58 public WellknownClassesSettingsPane(StigmataFrame stigmata){
59 this.stigmata = stigmata;
60 this.manager = stigmata.getEnvironment().getWellknownClassManager();
66 public synchronized void setWellknownClasses(WellknownClassManager manager){
68 for(int i = 0; i < listmodel.getSize(); i++){
69 WellknownClassJudgeRule rule = (WellknownClassJudgeRule)listmodel.getElementAt(i);
74 public synchronized WellknownClassManager createWellknownClassManager(){
75 WellknownClassManager manager = new WellknownClassManager();
76 setWellknownClasses(manager);
85 private synchronized boolean isWellknownClass(String className){
86 WellknownClassManager manager = createWellknownClassManager();
88 return manager.isWellKnownClass(className);
91 private String findType(JComboBox combo, Map<String, String> map){
92 String item = (String)combo.getSelectedItem();
93 for(Map.Entry<String, String> entry: map.entrySet()){
94 if(item.equals(entry.getValue())){
95 return entry.getKey();
101 public void addRule(WellknownClassJudgeRule rule){
103 listmodel.addElement(rule);
104 stigmata.setNeedToSaveSettings(true);
108 public void editRule(int index){
109 WellknownClassJudgeRule rule = (WellknownClassJudgeRule)listmodel.getElementAt(index);
110 WellknownClassJudgeRule newrule = createOrUpdateRule(stigmata.getMessages(), rule);
112 listmodel.setElementAt(newrule, index);
113 stigmata.setNeedToSaveSettings(true);
118 private void initializeData(){
119 for(WellknownClassJudgeRule rule : manager){
120 listmodel.addElement(rule);
123 for(WellknownClassJudgeRule.MatchType type: WellknownClassJudgeRule.MatchType.values()){
124 matchTypeMap.put(type.name(), stigmata.getMessages().get("matchtype." + type.name()));
126 for(WellknownClassJudgeRule.MatchPartType type: WellknownClassJudgeRule.MatchPartType.values()){
127 partTypeMap.put(type.name(), stigmata.getMessages().get("matchparttype." + type.name()));
131 private void initLayouts(){
132 setLayout(new BorderLayout());
133 JPanel center = new JPanel(new BorderLayout());
134 listmodel = new DefaultListModel();
136 list = new JList(listmodel);
137 JScrollPane scroll = new JScrollPane(list);
139 center.add(scroll, BorderLayout.CENTER);
140 center.add(createSouthPane(stigmata.getMessages()), BorderLayout.SOUTH);
142 add(center, BorderLayout.CENTER);
143 add(createCheckPane(stigmata.getMessages()), BorderLayout.SOUTH);
146 private JComponent createCheckPane(final Messages messages){
147 final JTextField text = new JTextField();
148 final JButton checkButton = GUIUtility.createButton(messages, "checkwellknown");
149 final JLabel label = new JLabel(GUIUtility.getIcon(messages, "wellknownclasschecker.default.icon"));
150 checkButton.setEnabled(false);
152 ActionListener listener = new ActionListener(){
154 public void actionPerformed(ActionEvent e){
155 String t = text.getText().trim();
157 String message = messages.get("wellknownclasschecker.wellknown.tooltip");
158 if(isWellknownClass(t)){
159 label.setIcon(GUIUtility.getIcon(messages, "wellknownclasschecker.wellknown.icon"));
162 label.setIcon(GUIUtility.getIcon(messages, "wellknownclasschecker.notwellknown.icon"));
163 message = messages.get("wellknownclasschecker.notwellknown.tooltip");
165 label.setToolTipText(message);
166 String dm = String.format(
167 "<html><body><dl><dt>%s</dt><dd>%s</dd></body></html>", t, message
169 JOptionPane.showMessageDialog(
170 stigmata, dm, stigmata.getMessages().get("wellknownclasschecker.dialog.title"),
171 JOptionPane.INFORMATION_MESSAGE
176 checkButton.addActionListener(listener);
177 text.addActionListener(listener);
178 text.getDocument().addDocumentListener(new DocumentListener(){
180 public void changedUpdate(DocumentEvent arg0){
181 checkButton.setEnabled(text.getText().trim().length() > 0);
185 public void insertUpdate(DocumentEvent arg0){
186 checkButton.setEnabled(text.getText().trim().length() > 0);
190 public void removeUpdate(DocumentEvent arg0){
191 checkButton.setEnabled(text.getText().trim().length() > 0);
195 JComponent south = Box.createHorizontalBox();
196 south.add(Box.createHorizontalGlue());
198 south.add(Box.createHorizontalGlue());
199 south.add(checkButton);
200 south.add(Box.createHorizontalGlue());
202 south.add(Box.createHorizontalGlue());
204 south.setBorder(new TitledBorder(stigmata.getMessages().get("wellknownclasschecker.border")));
209 private JComponent createSouthPane(final Messages messages){
210 JComponent southPanel = Box.createHorizontalBox();
211 Action addAction = new AbstractAction(){
212 private static final long serialVersionUID = -8749957850400877529L;
215 public void actionPerformed(ActionEvent e){
216 addRule(createOrUpdateRule(messages, null));
219 final Action removeAction = new AbstractAction(){
220 private static final long serialVersionUID = 8776209200186477040L;
223 public void actionPerformed(ActionEvent e){
224 int[] indeces = list.getSelectedIndices();
225 for(int i = indeces.length - 1; i >= 0; i--){
226 listmodel.removeElementAt(indeces[i]);
228 list.getSelectionModel().clearSelection();
229 stigmata.setNeedToSaveSettings(true);
232 final Action updateAction = new AbstractAction(){
233 private static final long serialVersionUID = 852965501722574084L;
236 public void actionPerformed(ActionEvent e){
237 editRule(list.getSelectedIndex());
240 JButton addButton = GUIUtility.createButton(messages, "addwellknown", addAction);
241 JButton removeButton = GUIUtility.createButton(messages, "removewellknown", removeAction);
242 JButton updateButton = GUIUtility.createButton(messages, "updatewellknown", updateAction);
243 removeAction.setEnabled(false);
244 updateAction.setEnabled(false);
246 southPanel.add(Box.createHorizontalGlue());
247 southPanel.add(addButton);
248 southPanel.add(Box.createHorizontalGlue());
249 southPanel.add(updateButton);
250 southPanel.add(Box.createHorizontalGlue());
251 southPanel.add(removeButton);
252 southPanel.add(Box.createHorizontalGlue());
254 list.addMouseListener(new MouseAdapter(){
256 public void mouseClicked(MouseEvent e){
257 if(e.getClickCount() == 2){
258 editRule(list.getSelectedIndex());
262 JPopupMenu popup = new JPopupMenu();
263 popup.add(GUIUtility.createJMenuItem(messages, "addwellknown", addAction));
264 popup.add(GUIUtility.createJMenuItem(messages, "updatewellknown", updateAction));
265 popup.add(GUIUtility.createJMenuItem(messages, "removewellknown", removeAction));
267 list.addMouseListener(new PopupShowAction(popup));
268 list.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
270 public void valueChanged(ListSelectionEvent arg0){
271 int[] indeces = list.getSelectedIndices();
272 removeAction.setEnabled(indeces != null && indeces.length > 0);
273 updateAction.setEnabled(indeces != null && indeces.length == 1);
280 private WellknownClassJudgeRule createOrUpdateRule(Messages messages, WellknownClassJudgeRule rule){
281 JTextField text = new JTextField();
282 text.setOpaque(true);
283 GUIUtility.decorateJComponent(messages, text, "addwellknown.newrule.pattern");
284 JCheckBox excludeCheck = new JCheckBox(messages.get("addwellknown.newrule.exclude.label"), false);
285 GUIUtility.decorateJComponent(messages, excludeCheck, "addwellknown.newrule.exclude");
286 JComboBox matchTypeComboBox = new JComboBox();
287 for(Map.Entry<String, String> entry: matchTypeMap.entrySet()){
288 matchTypeComboBox.addItem(entry.getValue());
290 JComboBox partTypeComboBox = new JComboBox();
291 for(Map.Entry<String, String> entry: partTypeMap.entrySet()){
292 partTypeComboBox.addItem(entry.getValue());
295 text.setText(rule.getPattern());
296 excludeCheck.setSelected(rule.isExclude());
297 matchTypeComboBox.setSelectedItem(matchTypeMap.get(rule.getMatchType().name()));
298 partTypeComboBox.setSelectedItem(partTypeMap.get(rule.getMatchPartType().name()));
301 JPanel panel = new JPanel(new BorderLayout());
302 panel.setOpaque(true);
303 JPanel centerPanel = new JPanel(new FlowLayout());
305 centerPanel.add(partTypeComboBox);
306 centerPanel.add(matchTypeComboBox);
308 panel.add(excludeCheck, BorderLayout.NORTH);
309 panel.add(centerPanel, BorderLayout.CENTER);
310 panel.add(text, BorderLayout.SOUTH);
312 int value = JOptionPane.showConfirmDialog(
313 stigmata, panel, stigmata.getMessages().get("addwellknown.dialog.title"),
314 JOptionPane.OK_CANCEL_OPTION
316 if(value == JOptionPane.OK_OPTION){
317 String matchType = findType(matchTypeComboBox, matchTypeMap);
318 String partType = findType(partTypeComboBox, partTypeMap);
319 WellknownClassJudgeRule.MatchType match = null;
320 WellknownClassJudgeRule.MatchPartType part = null;
321 String pattern = text.getText();
322 boolean excludeFlag = excludeCheck.isSelected();
324 if(matchType != null && partType != null){
325 match = WellknownClassJudgeRule.MatchType.valueOf(matchType);
326 part = WellknownClassJudgeRule.MatchPartType.valueOf(partType);
329 if(match != null && partType != null && pattern != null && !pattern.equals("")){
330 return new WellknownClassJudgeRule(pattern, match, part, excludeFlag);