1 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 ; 25 import java.awt.Frame ; 26 import java.awt.Insets ; 27 import java.awt.event.ActionEvent ; 28 import java.awt.event.ActionListener ; 29 import java.awt.event.InputEvent ; 30 import java.awt.event.KeyEvent ; 31 import java.awt.event.MouseEvent ; 32 33 import javax.swing.ActionMap ; 34 import javax.swing.DefaultComboBoxModel ; 35 import javax.swing.InputMap ; 36 import javax.swing.JComponent ; 37 import javax.swing.JTable ; 38 import javax.swing.KeyStroke ; 39 import javax.swing.ListSelectionModel ; 40 import javax.swing.SwingUtilities ; 41 import javax.swing.UIManager ; 42 import javax.swing.table.TableCellEditor ; 43 44 public class RuleTable extends XObjectTable { 45 private OnLoadDialog m_onLoadDialog; 46 47 private static final String MOVE_UP_ACTION = "MoveUp"; 48 private static final String MOVE_DOWN_ACTION = "MoveDown"; 49 50 private static final KeyStroke MOVE_UP_STROKE = 51 KeyStroke.getKeyStroke(KeyEvent.VK_UP, InputEvent.CTRL_MASK); 52 private static final KeyStroke MOVE_DOWN_STROKE = 53 KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, InputEvent.CTRL_MASK); 54 55 public RuleTable() { 56 super(); 57 58 setDefaultRenderer(Integer .class, new RuleTypeRenderer()); 59 setDefaultEditor(Integer .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 actionMap = getActionMap(); 67 actionMap.put(MOVE_UP_ACTION, new MoveUpAction()); 68 actionMap.put(MOVE_DOWN_ACTION, new MoveDownAction()); 69 70 InputMap 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 frame = (Frame )getAncestorOfClass(Frame .class); 78 m_onLoadDialog = new OnLoadDialog(frame); 79 } 80 return m_onLoadDialog; 81 } 82 83 class RuleTypeRenderer extends XTableCellRenderer { 84 public java.awt.Component getTableCellRendererComponent( 85 JTable table, 86 Object 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 INCLUDE_ITEM = "Include"; 103 private static final String EXCLUDE_ITEM = "Exclude"; 104 105 private final String [] MODEL_ITEMS = new String [] {INCLUDE_ITEM, EXCLUDE_ITEM}; 106 107 private int m_row; 108 private DefaultComboBoxModel m_model; 109 110 RuleTypeEditor() { 111 super(new XComboBox()); 112 m_model = new DefaultComboBoxModel (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 getCellEditorValue() { 122 Object value = super.getCellEditorValue(); 123 return new Integer (value.equals(INCLUDE_ITEM) ? Rule.INCLUDE_RULE : Rule.EXCLUDE_RULE); 124 } 125 126 public java.awt.Component getTableCellEditorComponent( 127 JTable table, 128 Object 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 )m_editorComponent; 140 } 141 } 142 143 class RuleDetailRenderer extends XTableCellRenderer { 144 protected TableCellEditor m_editor; 145 146 public RuleDetailRenderer() { 147 super(); 148 m_editor = createCellEditor(); 149 } 150 151 protected TableCellEditor createCellEditor() { 152 return new RuleDetailEditor(false); 153 } 154 155 public java.awt.Component getTableCellRendererComponent( 156 JTable table, 157 Object value, 158 boolean isSelected, 159 boolean hasFocus, 160 int row, 161 int col) 162 { 163 JComponent c = (JComponent ) 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 buildToolTip(Include include) { 173 OnLoad onLoad = include.getOnLoad(); 174 String tip = null; 175 176 if(onLoad != null) { 177 if((tip = onLoad.getMethod()) == null) { 178 if((tip = onLoad.getExecute()) != null) { 179 StringBuffer sb = new StringBuffer (); 180 String [] 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 text) { 202 super(text); 203 setMargin(new Insets (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 () { 228 public void actionPerformed(ActionEvent 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 (0,0,0,0)); 238 239 m_onLoadButton = new OnLoadButton("On load..."); 240 m_onLoadButton.addActionListener(new ActionListener () { 241 public void actionPerformed(ActionEvent ae) { 242 int row = m_onLoadButton.getRow(); 243 Include include = getIncludeAt(row); 244 String 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 getTableCellEditorComponent( 259 JTable table, 260 Object 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 fg = isSelected ? table.getSelectionForeground() : table.getForeground(); 272 Color 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 )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 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 ae) { 366 moveDown(); 367 } 368 } 369 } 370 371 class RuleDetailPanel extends Container { 372 RuleDetailPanel(CheckBox checkBox, Button button) { 373 super(); 374 375 String [] constraint1 = {"-1,left:ns", "-1,top:s", "1,left:n", "-1,bottom:s", "n","n"}; 376 String [] 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 getToolTipText(MouseEvent event) { 386 setSize(-getX(), -getY()); 387 setLocation(0, 0); 388 JComponent c = (JComponent )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 |