1 14 package org.compiere.grid; 15 16 import java.awt.*; 17 import java.awt.event.*; 18 import javax.swing.*; 19 import javax.swing.table.*; 20 import javax.swing.event.*; 21 import java.beans.*; 22 import java.util.*; 23 24 import org.compiere.grid.ed.*; 25 import org.compiere.grid.tree.*; 26 import org.compiere.apps.*; 27 import org.compiere.model.*; 28 import org.compiere.util.*; 29 import org.compiere.swing.*; 30 import org.compiere.plaf.*; 31 32 96 public class GridController extends CPanel 97 implements DataStatusListener, ListSelectionListener, VetoableChangeListener, PropertyChangeListener, MouseListener 98 { 99 102 public GridController() 103 { 104 try 105 { 106 jbInit(); 107 } 108 catch(Exception e) 109 { 110 Log.error("GridController", e); 111 } 112 } 114 118 public String toString() 119 { 120 return "GridController for " + m_mTab; 121 } 123 126 private BorderLayout mainLayout = new BorderLayout(); 127 private JSplitPane splitPane = new JSplitPane(); 128 private CPanel graphPanel = new CPanel(); 129 private BorderLayout graphLayout = new BorderLayout(); 130 private CPanel cardPanel = new CPanel(); 131 private CardLayout cardLayout = new CardLayout(); 132 private JSplitPane srPane = new JSplitPane(); 133 private JScrollPane vPane = new JScrollPane(); 134 private GridController vIncludedGC = null; 135 private JScrollPane mrPane = new JScrollPane(); 136 private CPanel xPanel = new CPanel(); 137 private FlowLayout xLayout = new FlowLayout(); 138 private VTable vTable = new VTable(); 139 private VPanel vPanel = new VPanel(); 140 141 145 private void jbInit() throws Exception  146 { 147 this.setLayout(mainLayout); 148 this.add(splitPane, BorderLayout.CENTER); 149 splitPane.setOpaque(false); 150 graphPanel.setLayout(graphLayout); 151 splitPane.add(graphPanel, JSplitPane.LEFT); 153 splitPane.add(cardPanel, JSplitPane.RIGHT); 154 splitPane.setBorder(null); 155 splitPane.setName("gc_splitPane"); 156 cardPanel.setLayout(cardLayout); 158 cardPanel.add(srPane, "srPane"); cardPanel.add(mrPane, "mrPane"); 160 cardPanel.setBorder(null); 161 cardPanel.setName("gc_cardPanel"); 162 srPane.setBorder(null); 164 srPane.setName("gc_srPane"); 165 srPane.setOrientation(JSplitPane.VERTICAL_SPLIT); 166 srPane.add(vPane, JSplitPane.TOP); 167 srPane.setTopComponent(vPane); 168 vPane.getViewport().add(xPanel, null); 169 xPanel.add(vPanel); 170 vPane.setBorder(null); 171 xPanel.setLayout(xLayout); 172 xPanel.setName("gc_xPanel"); 173 xLayout.setAlignment(FlowLayout.LEFT); 174 xLayout.setHgap(0); 175 xLayout.setVgap(0); 176 mrPane.setBorder(null); 178 mrPane.getViewport().add(vTable, null); 179 mrPane.setName("gc_mrPane"); 180 graphPanel.setBorder(null); 182 graphPanel.setName("gc_graphPanel"); 183 srPane.setDividerLocation(200); 184 } 186 189 public void dispose() 190 { 191 Log.trace(Log.l2_Sub, "GridController.dispose (" + m_mTab.toString() + ")"); 192 stopEditor(false); 194 if (m_mTab.needSave(true, false)) 195 m_mTab.dataIgnore(); 196 vIncludedGC = null; 197 198 m_mTab.getTableModel().removeDataStatusListener(this); 200 m_mTab.getTableModel().removeVetoableChangeListener(this); 201 vTable.getSelectionModel().removeListSelectionListener(this); 202 m_mTab.removePropertyChangeListener(vTable); 203 204 Component[] comp = vPanel.getComponents(); 206 for (int i = 0; i < comp.length; i++) 207 { 208 if (comp[i] instanceof VEditor) 209 { 210 VEditor vEditor = (VEditor)comp[i]; 211 vEditor.removeVetoableChangeListener(this); 212 String columnName = comp[i].getName(); 213 MField mField = m_mTab.getField(columnName); 214 if (mField != null) 215 mField.removePropertyChangeListener(vEditor); 216 vEditor.dispose(); 217 } 218 } 219 220 221 vTable.removeAll(); 222 vTable.setModel(new DefaultTableModel()); vTable = null; 224 vPanel.removeAll(); 225 vPanel = null; 226 splitPane.removeAll(); 227 splitPane = null; 228 m_mTab = null; 229 m_tree = null; 230 this.removeAll(); 231 } 233 234 private MTab m_mTab = null; 235 236 private int m_WindowNo; 237 238 private boolean m_onlyMultiRow = false; 239 240 private boolean m_singleRow = true; 241 242 private boolean m_vetoActive = false; 243 244 private VTreePanel m_tree; 245 246 247 248 263 public boolean initGrid (MTab mTab, boolean onlyMultiRow, int WindowNo, APanel aPanel, MWindow mWindow) 264 { 265 Log.trace(Log.l2_Sub, "GridController.initGrid (" + mTab.toString() + ")"); 266 m_mTab = mTab; 267 m_WindowNo = WindowNo; 268 m_onlyMultiRow = onlyMultiRow; 269 270 vTable.setModel(m_mTab.getTableModel()); 272 273 int size = setupVTable (aPanel, m_mTab, vTable); 275 276 279 if (!m_onlyMultiRow) 281 { 282 for (int i = 0; i < size; i++) 283 { 284 MField mField = m_mTab.getField(i); 285 286 if (mField.isDisplayed()) 287 { 288 VEditor vEditor = VEditorFactory.getEditor(m_mTab, mField, false); 289 mField.addPropertyChangeListener(vEditor); 291 vEditor.addVetoableChangeListener(this); 293 vPanel.addField(VEditorFactory.getLabel(mField), vEditor, 295 mField.isSameLine(), 296 mField.isLongField(), 297 mField.getDisplayType(), 298 mField.getFieldGroup()); 299 if (mField.getDisplayType() == DisplayType.Button && aPanel != null) 301 ((JButton)vEditor).addActionListener (aPanel); 302 } 303 } 305 srPane.setResizeWeight(1); srPane.setDividerSize (0); 308 srPane.setDividerLocation (9999); 309 310 mrPane.setPreferredSize(vPanel.getPreferredSize()); 312 } 314 int AD_Tree_ID = 0; 316 if (m_mTab.isTreeTab()) 317 AD_Tree_ID = MTree.getAD_Tree_ID (m_mTab.getKeyColumnName()); 318 if (m_mTab.isTreeTab() && AD_Tree_ID != 0) 319 { 320 m_tree = new VTreePanel(m_WindowNo, false, true); 321 if (m_mTab.getTabNo() == 0) m_tree.initTree(AD_Tree_ID); 323 m_tree.addPropertyChangeListener(VTreePanel.NODE_SELECTION, this); 324 graphPanel.add(m_tree, BorderLayout.CENTER); 325 splitPane.setDividerLocation(250); 326 } 328 else { 330 graphPanel.setPreferredSize(new Dimension(0,0)); 331 splitPane.setDividerSize(0); 332 splitPane.setDividerLocation(0); 333 } 334 335 m_mTab.addDataStatusListener(this); 337 m_mTab.getTableModel().addVetoableChangeListener(this); 339 vTable.getSelectionModel().addListSelectionListener(this); 341 m_mTab.addPropertyChangeListener(vTable); 343 344 vTable.autoSize(); 346 347 setTabLevel(m_mTab.getTabLevel()); 348 349 if (onlyMultiRow || !m_mTab.isSingleRow()) 351 switchMultiRow(); 352 else 353 switchSingleRow(); 354 return true; 356 } 358 363 public boolean includeTab (GridController gc) 364 { 365 MTab imcludedMTab = gc.getMTab(); 366 if (m_mTab.getIncluded_Tab_ID () != imcludedMTab.getAD_Tab_ID()) 367 return false; 368 vIncludedGC = gc; 370 vIncludedGC.switchMultiRow(); 371 Dimension size = getPreferredSize(); 373 srPane.setResizeWeight(.75); srPane.add(vIncludedGC, JSplitPane.BOTTOM); 375 srPane.setBottomComponent(vIncludedGC); 376 srPane.setDividerSize (5); 377 int height = 150; 379 vIncludedGC.setPreferredSize(new Dimension(600, height)); 380 setPreferredSize(new Dimension(size.width, size.height+height)); 381 srPane.setDividerLocation (size.height); 382 imcludedMTab.setIncluded (true); 384 imcludedMTab.query (false, 0); 385 JRootPane rt = SwingUtilities.getRootPane(this); 387 if (rt == null) 388 System.out.println("Root pane null"); 389 else 390 { 391 System.out.println("Root=" + rt); 392 rt.addMouseListener(vIncludedGC); 393 Component gp = rt.getGlassPane(); 394 if (gp == null) 395 System.out.println("No Glass Pane"); 396 else 397 { 398 System.out.println("Glass=" + gp); 399 gp.addMouseListener(vIncludedGC); 400 } 401 402 } 403 404 405 406 vIncludedGC.addMouseListener(vIncludedGC); 407 vIncludedGC.enableEvents(AWTEvent.HIERARCHY_EVENT_MASK + AWTEvent.MOUSE_EVENT_MASK); 408 414 return true; 415 } 417 424 private int setupVTable (APanel aPanel, MTab mTab, VTable table) 425 { 426 int size = mTab.getFieldCount (); 427 for (int i = 0; i < size; i++) 428 { 429 TableColumn tc = getTableColumn (table, i); 430 MField mField = mTab.getField (i); 431 if (mField.getColumnName ().equals (tc.getIdentifier ().toString ())) 433 { 434 if (mField.getDisplayType () == DisplayType.RowID) 435 { 436 tc.setCellRenderer (new VRowIDRenderer (false)); 437 tc.setCellEditor (new VRowIDEditor (false)); 438 tc.setHeaderValue (""); 439 tc.setMaxWidth (2); 440 } 441 else 442 { 443 if (mField.isDisplayed ()) 445 { 446 tc.setCellRenderer (new VCellRenderer (mField)); 447 VCellEditor ce = new VCellEditor (mField); 448 tc.setCellEditor (ce); 449 tc.setHeaderValue (mField.getHeader ()); 451 tc.setPreferredWidth (Math.max (mField.getDisplayLength (), 30)); 452 tc.setHeaderRenderer (new VHeaderRenderer (mField.getDisplayType ())); 453 454 if (mField.getDisplayType () == DisplayType.Button) 456 { 457 VEditor button = ce.getEditor (); 458 if (button != null && aPanel != null) 459 ((JButton)button).addActionListener (aPanel); 460 } 461 } 462 else { 464 tc.setHeaderValue (null); 465 tc.setMinWidth (0); 466 tc.setMaxWidth (0); 467 tc.setPreferredWidth (0); 468 } 469 } 470 474 tc.setMinWidth(30); 475 } else 477 Log.error ("GridController.setupVTable - TableColumn " + tc.getIdentifier () 478 + " <> MField " + mField.getColumnName() + mField.getHeader()); 479 } return size; 481 } 483 487 public void activate () 488 { 489 if (m_mTab.isTreeTab() && m_mTab.getTabNo() != 0) 491 { 492 int AD_Tree_ID = Env.getContextAsInt (Env.getCtx(), m_WindowNo, "AD_Tree_ID"); 493 if (AD_Tree_ID == 0) 494 AD_Tree_ID = MTree.getAD_Tree_ID (m_mTab.getKeyColumnName()); 495 m_tree.initTree (AD_Tree_ID); 496 } 497 } 499 500 505 public void registerESCAction (AppsAction aIgnore) 506 { 507 int c = VTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT; 508 vTable.getInputMap(c).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), aIgnore.getName()); 509 vTable.getActionMap().put(aIgnore.getName(), aIgnore); 510 511 } 514 520 public void query (boolean onlyCurrentRows, int onlyCurrentDays) 521 { 522 m_mTab.query(onlyCurrentRows, onlyCurrentDays); 524 vTable.autoSize(); 526 } 528 529 530 533 public void switchRowPresentation() 534 { 535 stopEditor(true); 536 if (m_singleRow) 537 switchMultiRow(); 538 else 539 switchSingleRow(); 540 } 542 545 public void switchSingleRow() 546 { 547 if (m_onlyMultiRow) 548 return; 549 cardLayout.first(cardPanel); 550 m_singleRow = true; 551 dynamicDisplay(0); 552 } 554 557 public void switchMultiRow() 558 { 559 cardLayout.last(cardPanel); 560 m_singleRow = false; 561 } 563 567 public boolean isSingleRow() 568 { 569 return m_singleRow; 570 } 572 573 574 578 public synchronized void removeDataStatusListener(DataStatusListener l) 579 { 580 m_mTab.removeDataStatusListener(l); 581 } 583 587 public synchronized void addDataStatusListener(DataStatusListener l) 588 { 589 m_mTab.addDataStatusListener(l); 590 } 591 592 601 public void dataStatusChanged(DataStatusEvent e) 602 { 603 int col = e.getChangedColumn(); 606 Log.trace(Log.l2_Sub, "GridController.dataStatusChanged (" + m_mTab + ") Col=" + col, e.toString()); 607 608 if (col != 0) 610 { 611 MField mField = m_mTab.getField(col); 612 if (mField != null && mField.getCallout().length() > 0) 613 { 614 String msg = m_mTab.processFieldChange(mField); if (msg.length() > 0) 616 ADialog.error(m_WindowNo, this, msg); 617 } 618 } 619 dynamicDisplay(col); 620 } 622 623 624 628 public void valueChanged(ListSelectionEvent e) 629 { 630 if (e.getValueIsAdjusting()) 632 return; 633 if (m_mTab.getRowCount() == 0) 635 return; 636 637 int rowTable = vTable.getSelectedRow(); 639 int rowCurrent = m_mTab.getCurrentRow(); 640 Log.trace(Log.l2_Sub, "GridController.valueChanged (" + m_mTab.toString() + ")", 641 "Row in Table=" + rowTable + ", in Model=" + rowCurrent); 642 643 if (rowTable == -1) { 645 if (rowCurrent >= 0) 646 { 647 vTable.setRowSelectionInterval(rowCurrent, rowCurrent); return; 649 } 650 } 651 else 652 { 653 if (rowTable != rowCurrent) 654 m_mTab.navigate(rowTable); 655 dynamicDisplay(0); 656 } 657 658 if (m_tree != null) 660 m_tree.setSelectedNode (m_mTab.getCurrentKeyID()); 662 665 if (vIncludedGC != null) 667 vIncludedGC.getMTab().query(false, 0); 668 } 670 674 public void propertyChange(PropertyChangeEvent e) 675 { 676 System.out.println("propertyChange"); 677 System.out.println(e); 678 if (e == null) 679 return; 680 Object value = e.getNewValue(); 681 if (value == null) 682 return; 683 Log.trace(Log.l2_Sub, "GridController.propertyChange", 684 e.getPropertyName() + "=" + value 685 + " - " + value.getClass().toString()); 686 if (!(value instanceof MTreeNode)) 687 return; 688 689 int nodeID = ((MTreeNode)value).getID(); 691 if (nodeID == 0) 693 return; 694 695 int size = m_mTab.getRowCount(); 697 int row = -1; 698 for (int i = 0; i < size; i++) 699 { 700 if (m_mTab.getKeyID(i) == nodeID) 701 { 702 row = i; 703 break; 704 } 705 } 706 if (row == -1) 707 { 708 Log.error("GridController.propertyChange - Tab does not have ID with Node_ID=" + nodeID); 709 return; 710 } 711 712 m_mTab.navigate(row); 714 } 716 744 public void dynamicDisplay (int col) 745 { 746 if (!isSingleRow() || m_onlyMultiRow) 749 return; 750 if (!m_mTab.isOpen()) 751 return; 752 if (col != 0) 754 { 755 MField changedField = m_mTab.getField(col); 756 String columnName = changedField.getColumnName(); 757 ArrayList dependents = m_mTab.getDependentFieldList(columnName); 758 Log.trace(Log.l3_Util, "GridController.dynamicDisplay (" + m_mTab.toString() + ") " 759 + columnName + " - Dependents=" + dependents.size()); 760 if (dependents.size() == 0 && changedField.getCallout().length() > 0) 762 { 763 Component[] comp = vPanel.getComponents(); 764 for (int i = 0; i < comp.length; i++) 765 { 766 if (columnName.equals(comp[i].getName ()) && comp[i] instanceof VEditor) 767 { 768 VEditor ve = (VEditor)comp[i]; 769 boolean manMissing = false; 770 boolean noValue = changedField.getValue() == null || changedField.getValue().toString().length() == 0; 771 if (noValue && changedField.isEditable(true) && changedField.isMandatory(true)) manMissing = true; 773 ve.setBackground(manMissing || changedField.isError()); 774 break; 775 } 776 } 777 return; 778 } 779 } 781 782 Log.trace(Log.l3_Util, "GridController.dynamicDisplay (" + m_mTab.toString() + ")"); 784 Component[] comp = vPanel.getComponents(); 786 for (int i = 0; i < comp.length; i++) 787 { 788 String columnName = comp[i].getName(); 789 if (columnName != null) 790 { 791 MField mField = m_mTab.getField(columnName); 792 if (mField != null) 793 { 794 if (mField.isDisplayed(true)) { 796 if (!comp[i].isVisible()) 797 comp[i].setVisible(true); if (comp[i] instanceof VEditor) 799 { 800 VEditor ve = (VEditor)comp[i]; 801 boolean rw = mField.isEditable(true); ve.setReadWrite(rw); 803 boolean manMissing = false; 805 if (rw && mField.getValue() == null && mField.isMandatory(true)) manMissing = true; 808 ve.setBackground(manMissing || mField.isError()); 809 } 810 } 811 else if (comp[i].isVisible()) 812 comp[i].setVisible(false); 813 } 814 } 815 } Log.trace(Log.l3_Util, "GridController.dynamicDisplay (" + m_mTab.toString() + ") - fini", col==0 ? "complete" : "seletive"); 817 } 819 825 public void rowChanged (boolean save, int keyID) 826 { 827 if (m_tree == null) 828 return; 829 String name = (String )m_mTab.getValue("Name"); 830 String description = (String )m_mTab.getValue("Description"); 831 String sum = (String )m_mTab.getValue("IsSummary"); 832 boolean isSummary = (sum == null ? false : sum.equals("Y")); 833 String imageIndicator = (String )m_mTab.getValue("Action"); m_tree.nodeChanged(save, keyID, name, description, isSummary, imageIndicator); 836 } 838 839 840 841 851 public void vetoableChange(PropertyChangeEvent e) throws PropertyVetoException 852 { 853 Log.trace(Log.l2_Sub, "GridController.vetoableChange (" + m_mTab.toString() + ")", 854 e.getPropertyName() + "=" + e.getNewValue() + " (" + e.getOldValue() + ")"); 855 856 if (e.getPropertyName().equals(MTable.PROPERTY)) 858 { 859 if (m_vetoActive) 861 { 862 m_vetoActive = false; 863 return; 864 } 865 if (!Env.isAutoCommit(Env.getCtx(), m_WindowNo) || m_mTab.getCommitWarning().length() > 0) 866 { 867 if (!ADialog.ask(m_WindowNo, this, "SaveChanges?", m_mTab.getCommitWarning())) 868 { 869 m_vetoActive = true; 870 throw new PropertyVetoException ("UserDeniedSave", e); 871 } 872 } 873 return; 874 } 876 877 MTable mTable = m_mTab.getTableModel(); 879 int row = m_mTab.getCurrentRow(); 880 int col = mTable.findColumn(e.getPropertyName()); 881 if (e.getNewValue() == null && e.getOldValue() != null) 883 mTable.setChanged (true); 884 else 885 mTable.setValueAt (e.getNewValue(), row, col); 888 } 891 892 893 897 public MTab getMTab() 898 { 899 return m_mTab; 900 } 902 909 protected TableColumn getTableColumn (VTable table, int index) 910 { 911 TableColumnModel tcm = table.getColumnModel(); 913 if (index >= 0 && index < tcm.getColumnCount()) 914 return tcm.getColumn(index); 915 Log.error("GridController.getTableColumn - No TableColumn for index=" + index); 916 return null; 917 } 919 923 public VTable getTable() 924 { 925 return vTable; 926 } 928 932 public void stopEditor (boolean saveValue) 933 { 934 Log.trace(Log.l2_Sub, "GridController.stopEditor (" + m_mTab.toString() + ")", 935 "TableEditing=" + vTable.isEditing()); 936 937 vTable.stopEditor(saveValue); 939 940 if (m_singleRow) 942 vPanel.transferFocus(); 943 } 949 950 public void mouseClicked(MouseEvent e) 951 { 952 System.out.println("mouseClicked - " + this + " - " + e); 953 } 954 public void mousePressed(MouseEvent e) 955 { 956 System.out.println("mousePressed - " + this + " - " + e); 957 } 958 public void mouseReleased(MouseEvent e) 959 { 960 System.out.println("mouseReleased - " + this + " - " + e); 961 } 962 public void mouseEntered(MouseEvent e) 963 { 964 System.out.println("mouseEntered - " + this + " - " + e); 965 } 966 public void mouseExited(MouseEvent e) 967 { 968 System.out.println("mouseExited - " + this + " - " + e); 969 } 970 971 public void processEvent (AWTEvent e) 972 { 973 super.processEvent(e); 975 } 976 977 } | Popular Tags |