OSDN Git Service

65a1979f2fd4929a47e94f0b4857b3acfb807036
[stigmata/stigmata.git] / src / main / java / jp / sourceforge / stigmata / ui / swing / PropertyEditPane.java
1 package jp.sourceforge.stigmata.ui.swing;
2
3 /*
4  * $Id$
5  */
6
7 import java.awt.BorderLayout;
8 import java.awt.GridBagConstraints;
9 import java.awt.GridBagLayout;
10 import java.awt.Insets;
11 import java.awt.event.ActionEvent;
12 import java.awt.event.MouseAdapter;
13 import java.awt.event.MouseEvent;
14 import java.beans.PropertyChangeEvent;
15 import java.beans.PropertyChangeListener;
16 import java.util.Iterator;
17
18 import javax.swing.AbstractAction;
19 import javax.swing.Action;
20 import javax.swing.Box;
21 import javax.swing.JButton;
22 import javax.swing.JLabel;
23 import javax.swing.JOptionPane;
24 import javax.swing.JPanel;
25 import javax.swing.JPopupMenu;
26 import javax.swing.JScrollPane;
27 import javax.swing.JTable;
28 import javax.swing.JTextField;
29 import javax.swing.ListSelectionModel;
30 import javax.swing.event.ListSelectionEvent;
31 import javax.swing.event.ListSelectionListener;
32 import javax.swing.table.DefaultTableModel;
33
34 import jp.sourceforge.stigmata.BirthmarkEnvironment;
35 import jp.sourceforge.stigmata.ui.swing.actions.PopupShowAction;
36 import jp.sourceforge.talisman.i18n.Messages;
37
38 /**
39  * 
40  * @author Haruaki Tamada
41  * @version $Revision$ 
42  */
43 public class PropertyEditPane extends JPanel{
44     private static final long serialVersionUID = 12397342543653L;
45
46     private StigmataFrame stigmata;
47     private JTable table;
48     private DefaultTableModel model;
49
50     public PropertyEditPane(StigmataFrame stigmata){
51         this.stigmata = stigmata;
52
53         initLayouts();
54         initData();
55     }
56
57     public void updateEnvironment(BirthmarkEnvironment environment){
58         environment.clearProperties();
59         for(int i = 0; i < model.getRowCount(); i++){
60             environment.addProperty(
61                 (String)model.getValueAt(i, 0),
62                 (String)model.getValueAt(i, 1)
63             );
64         }
65     }
66
67     private void initData(){
68         BirthmarkEnvironment environment = stigmata.getEnvironment();
69         environment.addPropertyListener(new PropertyChangeListener(){
70             @Override
71             public void propertyChange(PropertyChangeEvent evt){
72                 String name = evt.getPropertyName();
73                 String value = (String)evt.getNewValue();
74                 if(value == null){
75                     removeProperty(name);
76                 }
77                 else{
78                     addOrUpdateProperty(name, value);
79                 }
80             }
81         });
82         for(Iterator<String> i = environment.propertyKeys(); i.hasNext(); ){
83             String key = i.next();
84             model.addRow(new Object[] { key, environment.getProperty(key), });
85         }
86     }
87
88     private void removeProperty(String name){
89         int index = findIndex(name);
90         if(index >= 0){
91             model.removeRow(index);
92         }
93         stigmata.setNeedToSaveSettings(true);
94     }
95
96     private void addOrUpdateProperty(String name, String value){
97         int index = findIndex(name);
98         if(index >= 0){
99             model.setValueAt(value, index, 1);
100         }
101         else{
102             model.addRow(new Object[] { name, value, });
103         }
104         stigmata.setNeedToSaveSettings(true);
105     }
106
107     private int findIndex(String name){
108         for(int i = 0; i < model.getRowCount(); i++){
109             String v = (String)model.getValueAt(i, 0);
110             if(v.equals(name)){
111                 return i;
112             }
113         }
114         return -1;
115     }
116
117     private void addNewProperty(int index){
118         final Messages messages = stigmata.getMessages();
119         JPanel panel = new JPanel(new GridBagLayout());
120         JLabel nameLabel = new JLabel(messages.get("propertyname.label"));
121         JLabel valueLabel = new JLabel(messages.get("propertyvalue.label"));
122         JTextField name = new JTextField(15);
123         JTextField value = new JTextField(15);
124
125         GridBagConstraints gbc = new GridBagConstraints();
126         gbc.gridx = 0; gbc.gridwidth = 1;
127         gbc.gridy = 0; gbc.gridheight = 1;
128         gbc.insets = new Insets(5, 5, 5, 0);
129         gbc.weightx = 0d;
130         panel.add(nameLabel, gbc);
131
132         gbc.gridy = 1;
133         panel.add(valueLabel, gbc);
134
135         gbc.gridx = 1;
136         gbc.weightx = 1d;
137         panel.add(value, gbc);
138
139         gbc.gridy = 0;
140         gbc.fill = GridBagConstraints.HORIZONTAL;
141         panel.add(name, gbc);
142
143         if(index >= 0){
144             String keyValue = String.valueOf(table.getValueAt(index, 0));
145             String valueValue = String.valueOf(table.getValueAt(index, 1));
146             if(keyValue != null)   name.setText(keyValue);
147             if(valueValue != null) value.setText(valueValue);
148         }
149
150         int val = JOptionPane.showConfirmDialog(
151             stigmata, panel, messages.get("propertyadd.dialog.title"),
152             JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE
153         );
154         if(val == JOptionPane.YES_OPTION){
155             if(index >= 0){
156                 model.setValueAt(name.getText(), index, 0);
157                 model.setValueAt(value.getText(), index, 1);
158             }
159             else{
160                 model.addRow(new Object[] {
161                     name.getText().trim(),
162                     value.getText()
163                 });
164             }
165             stigmata.setNeedToSaveSettings(true);
166         }
167     }
168
169     private void removeSelectedProperty(){
170         int[] indexes = table.getSelectedRows();
171         for(int i = indexes.length - 1; i >= 0; i--){
172             model.removeRow(indexes[i]);
173         }
174         stigmata.setNeedToSaveSettings(true);
175     }
176
177     private void initLayouts(){
178         final Messages messages = stigmata.getMessages();
179         model = new UneditableDefaultTableModel();
180         model.addColumn(messages.get("propertyname.label"));
181         model.addColumn(messages.get("propertyvalue.label"));
182         table = new JTable(model);
183         table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
184         table.setColumnSelectionAllowed(false);
185
186         Action addAction = new AbstractAction(){
187             private static final long serialVersionUID = 1283676936119122278L;
188
189             @Override
190             public void actionPerformed(ActionEvent e){
191                 addNewProperty(-1);
192             }
193         };
194         final Action removeAction = new AbstractAction(){
195             private static final long serialVersionUID = -411260949451039374L;
196
197             @Override
198             public void actionPerformed(ActionEvent e){
199                 removeSelectedProperty();
200             }
201         };
202         final Action editAction = new AbstractAction(){
203             private static final long serialVersionUID = -7406073660916286349L;
204
205             @Override
206             public void actionPerformed(ActionEvent e){
207                 addNewProperty(table.getSelectedRow());
208             }
209         };
210         table.addMouseListener(new MouseAdapter(){
211             @Override
212             public void mouseClicked(MouseEvent e){
213                 if(e.getClickCount() == 2){
214                     addNewProperty(table.getSelectedRow());
215                 }
216             }
217         });
218         JButton addButton = GUIUtility.createButton(messages, "propertyadd", addAction);
219         JButton changeButton = GUIUtility.createButton(messages, "propertychange", editAction);
220         JButton removeButton = GUIUtility.createButton(messages, "propertyremove", removeAction);
221
222         final JPopupMenu popup = new JPopupMenu();
223         popup.add(GUIUtility.createJMenuItem(messages, "propertyadd", addAction));
224         popup.add(GUIUtility.createJMenuItem(messages, "propertychange", editAction));
225         popup.add(GUIUtility.createJMenuItem(messages, "propertyremove", removeAction));
226
227         setLayout(new BorderLayout());
228         JScrollPane scroll = new JScrollPane(table);
229         Box box = Box.createHorizontalBox();
230         box.add(Box.createHorizontalGlue());
231         box.add(addButton);
232         box.add(Box.createHorizontalGlue());
233         box.add(changeButton);
234         box.add(Box.createHorizontalGlue());
235         box.add(removeButton);
236         box.add(Box.createHorizontalGlue());
237
238         add(scroll, BorderLayout.CENTER);
239         add(box, BorderLayout.SOUTH);
240
241         table.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
242             @Override
243             public void valueChanged(ListSelectionEvent arg0){
244                 removeAction.setEnabled(table.getSelectedRowCount() != 0);
245                 editAction.setEnabled(table.getSelectedRowCount() == 1);
246             }
247         });
248         table.addMouseListener(new PopupShowAction(popup));
249         editAction.setEnabled(false);
250         removeAction.setEnabled(false);
251     }
252 }