KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > terracotta > dso > editors > RuleTable


1 /*
2  * All content copyright (c) 2003-2006 Terracotta, Inc., except as may otherwise be noted in a separate copyright notice. All rights reserved.
3  */

4 package org.terracotta.dso.editors;
5
6 import org.apache.commons.lang.StringUtils;
7
8 import org.dijon.Button;
9 import org.dijon.CheckBox;
10 import org.dijon.Container;
11 import org.dijon.Label;
12 import org.dijon.jspring.Layout;
13
14 import com.tc.admin.common.XAbstractAction;
15 import com.tc.admin.common.XCellEditor;
16 import com.tc.admin.common.XCheckBox;
17 import com.tc.admin.common.XComboBox;
18 import com.tc.admin.common.XObjectTable;
19 import com.tc.admin.common.XTableCellRenderer;
20 import org.terracotta.dso.dialogs.OnLoadDialog;
21 import com.terracottatech.config.Include;
22 import com.terracottatech.config.OnLoad;
23
24 import java.awt.Color JavaDoc;
25 import java.awt.Frame JavaDoc;
26 import java.awt.Insets JavaDoc;
27 import java.awt.event.ActionEvent JavaDoc;
28 import java.awt.event.ActionListener JavaDoc;
29 import java.awt.event.InputEvent JavaDoc;
30 import java.awt.event.KeyEvent JavaDoc;
31 import java.awt.event.MouseEvent JavaDoc;
32
33 import javax.swing.ActionMap JavaDoc;
34 import javax.swing.DefaultComboBoxModel JavaDoc;
35 import javax.swing.InputMap JavaDoc;
36 import javax.swing.JComponent JavaDoc;
37 import javax.swing.JTable JavaDoc;
38 import javax.swing.KeyStroke JavaDoc;
39 import javax.swing.ListSelectionModel JavaDoc;
40 import javax.swing.SwingUtilities JavaDoc;
41 import javax.swing.UIManager JavaDoc;
42 import javax.swing.table.TableCellEditor JavaDoc;
43
44 public class RuleTable extends XObjectTable {
45   private OnLoadDialog m_onLoadDialog;
46   
47   private static final String JavaDoc MOVE_UP_ACTION = "MoveUp";
48   private static final String JavaDoc MOVE_DOWN_ACTION = "MoveDown";
49   
50   private static final KeyStroke JavaDoc MOVE_UP_STROKE =
51     KeyStroke.getKeyStroke(KeyEvent.VK_UP, InputEvent.CTRL_MASK);
52   private static final KeyStroke JavaDoc MOVE_DOWN_STROKE =
53     KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, InputEvent.CTRL_MASK);
54   
55   public RuleTable() {
56     super();
57
58     setDefaultRenderer(Integer JavaDoc.class, new RuleTypeRenderer());
59     setDefaultEditor(Integer JavaDoc.class, new RuleTypeEditor());
60
61     setDefaultRenderer(RuleDetail.class, new RuleDetailRenderer());
62     setDefaultEditor(RuleDetail.class, new RuleDetailEditor(true));
63     
64     getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
65
66     ActionMap JavaDoc actionMap = getActionMap();
67     actionMap.put(MOVE_UP_ACTION, new MoveUpAction());
68     actionMap.put(MOVE_DOWN_ACTION, new MoveDownAction());
69     
70     InputMap JavaDoc inputMap = getInputMap();
71     inputMap.put(MOVE_UP_STROKE, MOVE_UP_ACTION);
72     inputMap.put(MOVE_DOWN_STROKE, MOVE_DOWN_ACTION);
73   }
74   
75   public OnLoadDialog getOnLoadDialog() {
76     if(m_onLoadDialog == null) {
77       Frame JavaDoc frame = (Frame JavaDoc)getAncestorOfClass(Frame JavaDoc.class);
78       m_onLoadDialog = new OnLoadDialog(frame);
79     }
80     return m_onLoadDialog;
81   }
82   
83   class RuleTypeRenderer extends XTableCellRenderer {
84     public java.awt.Component JavaDoc getTableCellRendererComponent(
85       JTable JavaDoc table,
86       Object JavaDoc value,
87       boolean isSelected,
88       boolean hasFocus,
89       int row,
90       int col)
91     {
92       super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
93       
94       Rule rule = getRuleAt(row);
95       setText(rule.isExcludeRule() ? "Exclude" : "Include");
96
97       return this;
98     }
99   }
100   
101   class RuleTypeEditor extends XCellEditor {
102     private static final String JavaDoc INCLUDE_ITEM = "Include";
103     private static final String JavaDoc EXCLUDE_ITEM = "Exclude";
104
105     private final String JavaDoc[] MODEL_ITEMS = new String JavaDoc[] {INCLUDE_ITEM, EXCLUDE_ITEM};
106     
107     private int m_row;
108     private DefaultComboBoxModel JavaDoc m_model;
109     
110     RuleTypeEditor() {
111       super(new XComboBox());
112       m_model = new DefaultComboBoxModel JavaDoc(MODEL_ITEMS);
113       ((XComboBox)m_editorComponent).setModel(m_model);
114     }
115     
116     protected void fireEditingStopped() {
117       super.fireEditingStopped();
118       setRowSelectionInterval(m_row, m_row);
119     }
120     
121     public Object JavaDoc getCellEditorValue() {
122       Object JavaDoc value = super.getCellEditorValue();
123       return new Integer JavaDoc(value.equals(INCLUDE_ITEM) ? Rule.INCLUDE_RULE : Rule.EXCLUDE_RULE);
124     }
125
126     public java.awt.Component JavaDoc getTableCellEditorComponent(
127       JTable JavaDoc table,
128       Object JavaDoc value,
129       boolean isSelected,
130       int row,
131       int col)
132     {
133       super.getTableCellEditorComponent(table, value, isSelected, row, col);
134       
135       Rule rule = getRuleAt(row);
136       m_model.setSelectedItem(MODEL_ITEMS[rule.getType()]);
137       m_row = row;
138       
139       return (java.awt.Component JavaDoc)m_editorComponent;
140     }
141   }
142   
143   class RuleDetailRenderer extends XTableCellRenderer {
144     protected TableCellEditor JavaDoc m_editor;
145
146     public RuleDetailRenderer() {
147       super();
148       m_editor = createCellEditor();
149     }
150
151     protected TableCellEditor JavaDoc createCellEditor() {
152       return new RuleDetailEditor(false);
153     }
154
155     public java.awt.Component JavaDoc getTableCellRendererComponent(
156       JTable JavaDoc table,
157       Object JavaDoc value,
158       boolean isSelected,
159       boolean hasFocus,
160       int row,
161       int col)
162     {
163       JComponent JavaDoc c = (JComponent JavaDoc)
164         m_editor.getTableCellEditorComponent(table, value, isSelected, row, col);
165       
166       c.setBorder(hasFocus ? UIManager.getBorder("Table.focusCellHighlightBorder") : null);
167       
168       return c;
169     }
170   }
171   
172   private static String JavaDoc buildToolTip(Include include) {
173     OnLoad onLoad = include.getOnLoad();
174     String JavaDoc tip = null;
175     
176     if(onLoad != null) {
177       if((tip = onLoad.getMethod()) == null) {
178         if((tip = onLoad.getExecute()) != null) {
179           StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
180           String JavaDoc[] lines = StringUtils.split(onLoad.getExecute(),
181                                              System.getProperty("line.separator"));
182   
183           sb.append("<html>");
184           for(int i = 0; i < lines.length; i++) {
185             sb.append("<p>");
186             sb.append(lines[i]);
187           }
188           sb.append("</html>");
189   
190           tip = sb.toString();
191         }
192       }
193     }
194     
195     return tip;
196   }
197   
198   class OnLoadButton extends Button {
199     int m_row, m_col;
200     
201     OnLoadButton(String JavaDoc text) {
202       super(text);
203       setMargin(new Insets JavaDoc(0,2,0,2));
204     }
205     
206     void setCell(int row, int col) {
207       m_row = row;
208       m_col = col;
209     }
210
211     int getRow() {return m_row;}
212     int getCol() {return m_col;}
213   }
214   
215   class RuleDetailEditor extends XCellEditor {
216     OnLoadButton m_onLoadButton;
217     XCheckBox m_honorTransientToggle;
218     Label m_excludeRenderer;
219     boolean m_alwaysSelected;
220     
221     RuleDetailEditor(boolean alwaysSelected) {
222       super(new XCheckBox("Honor transient"));
223
224       m_alwaysSelected = alwaysSelected;
225       
226       m_honorTransientToggle = (XCheckBox)m_editorComponent;
227       m_honorTransientToggle.addActionListener(new ActionListener JavaDoc () {
228         public void actionPerformed(ActionEvent JavaDoc ae) {
229           boolean honor = m_honorTransientToggle.isSelected();
230           int row = m_onLoadButton.getRow();
231           int col = m_onLoadButton.getCol();
232           
233           getIncludeRuleAt(row).setHonorTransient(honor);
234           getRuleModel().fireTableCellUpdated(row, col);
235         }
236       });
237       m_honorTransientToggle.setMargin(new Insets JavaDoc(0,0,0,0));
238       
239       m_onLoadButton = new OnLoadButton("On load...");
240       m_onLoadButton.addActionListener(new ActionListener JavaDoc() {
241         public void actionPerformed(ActionEvent JavaDoc ae) {
242           int row = m_onLoadButton.getRow();
243           Include include = getIncludeAt(row);
244           String JavaDoc savedInclude = include.xmlText();
245           
246           getOnLoadDialog().edit(include);
247           if(!include.xmlText().equals(savedInclude)) {
248             getRuleModel().fireTableCellUpdated(row, m_onLoadButton.getCol());
249           }
250         }
251       });
252       m_editorComponent = new RuleDetailPanel(m_honorTransientToggle, m_onLoadButton);
253       m_excludeRenderer = new Label("");
254
255       m_clicksToStart = 1;
256     }
257     
258     public java.awt.Component JavaDoc getTableCellEditorComponent(
259       JTable JavaDoc table,
260       Object JavaDoc value,
261       boolean isSelected,
262       int row,
263       int col)
264     {
265       Rule rule = getRuleAt(row);
266       
267       if(m_alwaysSelected) {
268         isSelected = true;
269       }
270       
271       Color JavaDoc fg = isSelected ? table.getSelectionForeground() : table.getForeground();
272       Color JavaDoc bg = isSelected ? table.getSelectionBackground() : table.getBackground();
273       
274       if(rule.isIncludeRule()) {
275         Include include = getIncludeAt(row);
276         
277         m_onLoadButton.setCell(row, col);
278         m_onLoadButton.setForeground(table.getForeground());
279         m_onLoadButton.setBackground(table.getBackground());
280         m_onLoadButton.setFont(table.getFont());
281         m_onLoadButton.setToolTipText(buildToolTip(include));
282         
283         m_honorTransientToggle.setSelected(include.getHonorTransient());
284         m_honorTransientToggle.setForeground(fg);
285         m_honorTransientToggle.setBackground(bg);
286         m_honorTransientToggle.setFont(table.getFont());
287         m_honorTransientToggle.setOpaque(true);
288         
289         m_editorComponent.setForeground(fg);
290         m_editorComponent.setBackground(bg);
291         m_editorComponent.setOpaque(true);
292         
293         m_editorComponent.setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
294
295         return (java.awt.Component JavaDoc)m_editorComponent;
296       }
297       else {
298         m_excludeRenderer.setForeground(fg);
299         m_excludeRenderer.setBackground(bg);
300         m_excludeRenderer.setOpaque(true);
301         m_excludeRenderer.setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
302        
303         return m_excludeRenderer;
304       }
305     }
306   }
307   
308   public RuleModel getRuleModel() {
309     return (RuleModel)getModel();
310   }
311   
312   public Include getIncludeAt(int row) {
313     return getIncludeRuleAt(row).getInclude();
314   }
315   
316   public IncludeRule getIncludeRuleAt(int row) {
317     return (IncludeRule)getRuleAt(row);
318   }
319   
320   public Rule getRuleAt(int row) {
321     return getRuleModel().getRuleAt(row);
322   }
323
324   public void moveUp() {
325     int row = getSelectedRow();
326     
327     if(isEditing()) {
328       removeEditor();
329     }
330     
331     if(row > 0) {
332       getRuleModel().moveRuleUp(row--);
333       setRowSelectionInterval(row, row);
334     }
335   }
336   
337   class MoveUpAction extends XAbstractAction {
338     MoveUpAction() {
339       super("Move up");
340     }
341     
342     public void actionPerformed(ActionEvent JavaDoc ae) {
343       moveUp();
344     }
345   }
346
347   public void moveDown() {
348     int row = getSelectedRow();
349
350     if(isEditing()) {
351       removeEditor();
352     }
353     
354     if(row != -1 && row < getRuleModel().getRowCount()-1) {
355       getRuleModel().moveRuleDown(row++);
356       setRowSelectionInterval(row, row);
357     }
358   }
359   
360   class MoveDownAction extends XAbstractAction {
361     MoveDownAction() {
362       super("Move down");
363     }
364     
365     public void actionPerformed(ActionEvent JavaDoc ae) {
366       moveDown();
367     }
368   }
369 }
370
371 class RuleDetailPanel extends Container {
372   RuleDetailPanel(CheckBox checkBox, Button button) {
373     super();
374
375     String JavaDoc[] constraint1 = {"-1,left:ns", "-1,top:s", "1,left:n", "-1,bottom:s", "n","n"};
376     String JavaDoc[] constraint2 = {"0,right:n", "-1,top:s", "-1,right:ns", "-1,bottom:s", "n","n"};
377
378     setLayout(new Layout());
379     add(checkBox, constraint1);
380     add(button, constraint2);
381     
382     setBorder(null);
383   }
384   
385   public String JavaDoc getToolTipText(MouseEvent JavaDoc event) {
386     setSize(-getX(), -getY());
387     setLocation(0, 0);
388     JComponent JavaDoc c = (JComponent JavaDoc)SwingUtilities.getDeepestComponentAt(this, event.getX(), event.getY());
389     setLocation(-getWidth(), -getHeight());
390     setSize(0, 0);
391     return c != null ? c.getToolTipText() : null;
392   }
393 }
394
Popular Tags