?? gridcontroller.java
字號(hào):
/******************************************************************************
* The contents of this file are subject to the Compiere License Version 1.1
* ("License"); You may not use this file except in compliance with the License
* You may obtain a copy of the License at http://www.compiere.org/license.html
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
* The Original Code is Compiere ERP & CRM Business Solution
* The Initial Developer of the Original Code is Jorg Janke and ComPiere, Inc.
* Portions created by Jorg Janke are Copyright (C) 1999-2001 Jorg Janke, parts
* created by ComPiere are Copyright (C) ComPiere, Inc.; All Rights Reserved.
* Contributor(s): ______________________________________.
*****************************************************************************/
package org.compiere.grid;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;
import java.beans.*;
import java.util.*;
import org.compiere.grid.ed.*;
import org.compiere.grid.tree.*;
import org.compiere.apps.*;
import org.compiere.model.*;
import org.compiere.util.*;
import org.compiere.swing.*;
import org.compiere.plaf.*;
/**
* The Grid Controller is the panel for single and multi-row presentation
* and links to the Model Tab.
* <pre>
* UI Structure:
* this (BorderLayout)
* splitPane (JSplitPane)
* left
* graphicPanel
* right
* cardPanel JPanel (CardLayout)
* srPane JScrollPane
* vPanel VPanel (GridBagLayout)
* mrPane JScrollPane
* vTable VTable
*
* <B>DataBinding:<B>
* - MultiRow - is automatic between VTable and MTable
* - SingleRow
* - from VEditors via fireVetoableChange(m_columnName, null, getText());
* (vetoableChange)
* - to VEditors via updateSingleRow -> Editor.setValue(object)
*
* Event Chains
* -- Navigation --
* (VTable selection -> GridController.valueChanged)
* (APanel selection)
* + MTab.navivate
* + MTab.setCurrentRow
* + Update all MFields
* + MField.setValue
* + setContext
* + fire PropertyChange "Value"
* + VEditor.propertyChange
* + VEditor.setValue
* + MTab.fireProperyChange "CurrentRow"
* + VTable.propertyChange (setRowSelectionInterval)
* + GridController.valueChange
* + GridController.dynamicDisplay(complete)
* + MTab.fireDataStatusChanged
* + APanel.statusChanged
*
* -- ValueChanges --
* VEditor.fireVetoableChange
* + (VCellEditor.vetoableChange/getCellEditorValue) -- multi-row source
* + (GridController.vetoableChange) -- single-row source
* + MTable.setValueAt
* + MField.setValue
* + setContext
* + fire PropertyChange "Value"
* + VEditor.setValue
* + MTable.fireDataStatusChanged
* + MTab.dataStatusChanged
* + MTab.fireDataStatusChanged
* + APanel.statusChanged
* + GridController.dataStatusChanged
* + GridController.dynamicDisplay(selective)
* </pre>
* @author Jorg Janke
* @version $Id: GridController.java,v 1.34 2003/05/04 06:41:17 jjanke Exp $
*/
public class GridController extends CPanel
implements DataStatusListener, ListSelectionListener, VetoableChangeListener, PropertyChangeListener
{
/**
* Constructor - you need to call initGrid for instanciation
*/
public GridController()
{
try
{
jbInit();
}
catch(Exception e)
{
Log.error("GridController", e);
}
} // GridController
/**
* toString
* @return string representation
*/
public String toString()
{
return "GridController for " + m_mTab;
} // toString
/**
* The Layout
*/
private BorderLayout mainLayout = new BorderLayout();
private JSplitPane splitPane = new JSplitPane();
private CPanel graphPanel = new CPanel();
private BorderLayout graphLayout = new BorderLayout();
private CPanel cardPanel = new CPanel();
private CardLayout cardLayout = new CardLayout();
private JScrollPane srPane = new JScrollPane();
private JScrollPane mrPane = new JScrollPane();
private CPanel xPanel = new CPanel();
private FlowLayout xLayout = new FlowLayout();
private VTable vTable = new VTable();
private VPanel vPanel = new VPanel();
/**
* Static Layout init
* @throws Exception
*/
private void jbInit() throws Exception
{
this.setLayout(mainLayout);
this.add(splitPane, BorderLayout.CENTER);
splitPane.setOpaque(false);
graphPanel.setLayout(graphLayout);
//
splitPane.add(graphPanel, JSplitPane.LEFT);
splitPane.add(cardPanel, JSplitPane.RIGHT);
splitPane.setBorder(null);
splitPane.setName("gc_splitPane");
//
cardPanel.setLayout(cardLayout);
cardPanel.add(srPane, "srPane");
cardPanel.add(mrPane, "mrPane");
cardPanel.setBorder(null);
cardPanel.setName("gc_cardPanel");
// single row (w/o xPane it would be centered)
srPane.setBorder(null);
srPane.getViewport().add(xPanel, null);
srPane.setName("gc_srPane");
xPanel.setLayout(xLayout);
xPanel.setName("gc_xPanel");
xLayout.setAlignment(FlowLayout.LEFT);
xLayout.setHgap(0);
xLayout.setVgap(0);
xPanel.add(vPanel);
// multi-row
mrPane.setBorder(null);
mrPane.getViewport().add(vTable, null);
mrPane.setName("gc_mrPane");
//
graphPanel.setBorder(null);
graphPanel.setName("gc_graphPanel");
} // jbInit
/**
* Displose
*/
public void dispose()
{
Log.trace(Log.l2_Sub, "GridController.dispose (" + m_mTab.toString() + ")");
// clear info
stopEditor(false);
if (m_mTab.needSave(true, false))
m_mTab.dataIgnore();
// Listeners
m_mTab.getTableModel().removeDataStatusListener(this);
m_mTab.getTableModel().removeVetoableChangeListener(this);
vTable.getSelectionModel().removeListSelectionListener(this);
m_mTab.removePropertyChangeListener(vTable);
// editors
Component[] comp = vPanel.getComponents();
for (int i = 0; i < comp.length; i++)
{
if (comp[i] instanceof VEditor)
{
VEditor vEditor = (VEditor)comp[i];
vEditor.removeVetoableChangeListener(this);
String columnName = comp[i].getName();
MField mField = m_mTab.getField(columnName);
if (mField != null)
mField.removePropertyChangeListener(vEditor);
vEditor.dispose();
}
}
/** @todo Remove APanel Button listeners */
vTable.removeAll();
vTable.setModel(new DefaultTableModel()); // remove reference
vTable = null;
vPanel.removeAll();
vPanel = null;
splitPane.removeAll();
splitPane = null;
m_mTab = null;
m_tree = null;
this.removeAll();
} // dispose
/** Model Tab */
private MTab m_mTab = null;
/** Window */
private int m_WindowNo;
/** Only Multi-Row exist */
private boolean m_onlyMultiRow = false;
/** Single/Multi Row indicator */
private boolean m_singleRow = true;
/** Veto Active */
private boolean m_vetoActive = false;
/** Tree Panel (optional) */
private VTreePanel m_tree;
/*************************************************************************/
/**
* Init Grid.
* <pre>
* - Map table to model
* - Update (multi-row) table info with renderers/editors
* - build single-row panel
* - initialize display
* </pre>
* @param mTab tab
* @param onlyMultiRow only table
* @param WindowNo window no
* @param aPanel optional Application Panel for adding button listeners
* @return true if initialized
*/
public boolean initGrid (MTab mTab, boolean onlyMultiRow, int WindowNo, APanel aPanel)
{
Log.trace(Log.l2_Sub, "GridController.initGrid (" + mTab.toString() + ")");
m_mTab = mTab;
m_WindowNo = WindowNo;
m_onlyMultiRow = onlyMultiRow;
// Set up Multi Row Table
vTable.setModel(mTab.getTableModel());
// Update Table Info -------------------------------------------------
int size = m_mTab.getFieldCount();
for (int i = 0; i < size; i++)
{
TableColumn tc = getTableColumn(i);
MField mField = m_mTab.getField(i);
//
if (mField.getColumnName().equals(tc.getIdentifier().toString()))
{
if (mField.getDisplayType() == DisplayType.RowID)
{
tc.setCellRenderer(new VRowIDRenderer(false));
tc.setCellEditor(new VRowIDEditor(false));
tc.setHeaderValue("");
tc.setMaxWidth(2);
}
else
{
// need to set CellEditor explicitly as default editor based on class causes problem (YesNo-> Boolean)
tc.setCellRenderer(new VCellRenderer(mField));
VCellEditor ce = new VCellEditor(mField);
tc.setCellEditor(ce);
if (mField.isDisplayed())
{
tc.setHeaderValue(mField.getHeader());
tc.setPreferredWidth(Math.max(mField.getDisplayLength(), 30));
// Enable Button actions in grid
if (mField.getDisplayType() == DisplayType.Button)
{
VEditor button = ce.getEditor();
if (button != null && aPanel != null)
((JButton)button).addActionListener(aPanel);
}
}
else // column not displayed
{
tc.setHeaderValue(null);
tc.setMinWidth(0);
tc.setMaxWidth(0);
tc.setPreferredWidth(0);
}
}
tc.setHeaderRenderer(new VHeaderRenderer(mField.getDisplayType()));
}
else
Log.error("GridController.initGrid - TableColumn <> MField");
} // Update Table Info
// Set Color on Tab Level
// this.setBackgroundColor (mTab.getColor());
// Single Row -------------------------------------------------------
if (!m_onlyMultiRow)
{
for (int i = 0; i < size; i++)
{
MField mField = m_mTab.getField(i);
if (mField.isDisplayed())
{
VEditor vEditor = VEditorFactory.getEditor(m_mTab, mField, false);
// MField => VEditor - New Field value to be updated to editor
mField.addPropertyChangeListener(vEditor);
// VEditor => this - New Editor value to be updated here (MTable)
vEditor.addVetoableChangeListener(this);
// Add to VPanel
vPanel.addField(VEditorFactory.getLabel(mField), vEditor,
mField.isSameLine(),
mField.isLongField(),
mField.getDisplayType(),
mField.getFieldGroup());
// APanel Listen to buttons
if (mField.getDisplayType() == DisplayType.Button && aPanel != null)
((JButton)vEditor).addActionListener (aPanel);
}
} // for all fields
// Use SR to size MR
mrPane.setPreferredSize(vPanel.getPreferredSize());
} // Single-Row
// Tree Graphics Layout
int AD_Tree_ID = 0;
if (mTab.isTreeTab())
AD_Tree_ID = MTree.getAD_Tree_ID (mTab.getKeyColumnName());
if (mTab.isTreeTab() && AD_Tree_ID != 0)
{
m_tree = new VTreePanel(m_WindowNo, false, true);
if (mTab.getTabNo() == 0) // initialize other tabs later
m_tree.initTree(AD_Tree_ID);
m_tree.addPropertyChangeListener(VTreePanel.NODE_SELECTION, this);
graphPanel.add(m_tree, BorderLayout.CENTER);
splitPane.setDividerLocation(250);
// splitPane.resetToPreferredSizes();
}
else // No Graphics - hide
{
graphPanel.setPreferredSize(new Dimension(0,0));
splitPane.setDividerSize(0);
splitPane.setDividerLocation(0);
}
// Receive DataStatusChanged info from MTab
mTab.addDataStatusListener(this);
// Receive vetoableChange info from MTable when saving
mTab.getTableModel().addVetoableChangeListener(this);
// Selection Listener -> valueChanged
vTable.getSelectionModel().addListSelectionListener(this);
// Navigation (RowChanged)
m_mTab.addPropertyChangeListener(vTable);
// Update UI
vTable.autoSize();
setTabLevel(mTab.getTabLevel());
// Set initial presentation
if (onlyMultiRow || !m_mTab.isSingleRow())
switchMultiRow();
else
switchSingleRow();
// Log.trace(Log.l2_Sub, "GridController.dynInit (" + mTab.toString() + ") - fini");
return true;
} // initGrid
/**
* Activate Grid Controller.
* Called by APanel when GridController is displayed (foreground)
*/
public void activate ()
{
// Tree to be initiated on second/.. tab
if (m_mTab.isTreeTab() && m_mTab.getTabNo() != 0)
{
int AD_Tree_ID = Env.getContextAsInt (Env.getCtx(), m_WindowNo, "AD_Tree_ID");
if (AD_Tree_ID == 0)
AD_Tree_ID = MTree.getAD_Tree_ID (m_mTab.getKeyColumnName());
m_tree.initTree (AD_Tree_ID);
}
} // activate
/**
* Register ESC Actions
* - overwrite VTable's Keystroks assigment for ESC
* @param aIgnore ignore
*/
public void registerESCAction (AppsAction aIgnore)
{
int c = VTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT;
vTable.getInputMap(c).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), aIgnore.getName());
vTable.getActionMap().put(aIgnore.getName(), aIgnore);
// AEnv.printActionInputMap(vTable);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -