📄 vlookup.java
字号:
/******************************************************************************
* 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.ed;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;
import java.text.*;
import java.util.*;
import java.math.*;
import java.beans.*;
import java.sql.*;
import org.compiere.apps.*;
import org.compiere.util.*;
import org.compiere.model.*;
import org.compiere.apps.search.*;
import org.compiere.plaf.*;
import org.compiere.swing.*;
/**
* Lookup Field.
* <p>
* When r/o - display a Label
* When STABLE - display a ComboBox
* Otherwise show Selection Dialog
* <p>
* Sepecial handling of BPartner and Product
*
* @author Jorg Janke
* @version $Id: VLookup.java,v 1.40 2003/02/23 19:42:47 jjanke Exp $
*/
public class VLookup extends JComponent
implements VEditor, ActionListener, FocusListener
{
/**
* Create BPartner Lookup
* @param WindowNo window
* @return VLookup
*/
public static VLookup createBPartner (int WindowNo)
{
int AD_Column_ID = 3499; // C_Invoice.C_BPartner_ID
try
{
Lookup lookup = MLookupFactory.create(Env.getCtx(), AD_Column_ID, WindowNo, DisplayType.Search, false);
return new VLookup ("C_BPartner_ID", false, false, true, lookup, DisplayType.Search, WindowNo);
}
catch (Exception e)
{
Log.error("VLookup.createBPartner", e);
}
return null;
} // createBPartner
/**
* Create Product Lookup
* @param WindowNo window
* @return VLookup
*/
public static VLookup createProduct (int WindowNo)
{
int AD_Column_ID = 3840; // C_InvoiceLine.M_Product_ID
try
{
Lookup lookup = MLookupFactory.create(Env.getCtx(), AD_Column_ID, WindowNo, DisplayType.Search, false);
return new VLookup ("M_Product_ID", false, false, true, lookup, DisplayType.Search, WindowNo);
}
catch (Exception e)
{
Log.error("VLookup.createProduct", e);
}
return null;
} // createProduct
/*************************************************************************/
/**
* IDE Default Constructor
*/
public VLookup()
{
this("Lookup", false, false, true, null, 0, 0);
} // VLookup
/**
* Detail Constructor
*
* @param columnName column
* @param mandatory mandatory
* @param isReadOnly read only
* @param isUpdateable updateable
* @param lookup lookup
* @param displayType display type
* @param WindowNo window no
*/
public VLookup (String columnName, boolean mandatory, boolean isReadOnly, boolean isUpdateable,
Lookup lookup, int displayType, int WindowNo)
{
super();
m_columnName = columnName;
m_lookup = lookup;
if (lookup == null)
Log.trace(Log.l3_Util, "VLookup", "Lookup is NULL = " + columnName);
setMandatory(mandatory);
m_displayType = displayType;
m_WindowNo = WindowNo; // for Info
//
setLayout(new BorderLayout());
VLookup_mouseAdapter mouse = new VLookup_mouseAdapter(this); // popup
// *** Text & Button ***
m_text.addActionListener(this);
m_text.addMouseListener(mouse);
// Button
m_button.addActionListener(this);
m_button.addMouseListener(mouse);
m_button.setFocusable(false); // don't focus when tabbing
if (columnName.equals("C_BPartner_ID"))
m_button.setIcon(Env.getImageIcon("BPartner10.gif"));
else if (columnName.equals("M_Product_ID"))
m_button.setIcon(Env.getImageIcon("Product10.gif"));
else
m_button.setIcon(Env.getImageIcon("PickOpen10.gif"));
// *** VComboBox ***
if (m_lookup != null && displayType != DisplayType.Search) // No Search
{
// Memory Leak after executing the next two lines ??
m_lookup.fillComboBox (isMandatory(), false, false, false);
m_combo.setModel(m_lookup);
//
m_combo.addActionListener(this); // Selection
m_combo.addMouseListener(mouse); // popup
// FocusListener to refresh selection before opening
if (!m_lookup.isValidated() || m_lookup.hasInactive())
m_combo.addFocusListener(this);
}
setUI (true);
// ReadWrite - decides what components to show
if (isReadOnly || !isUpdateable || m_lookup == null)
setReadWrite(false);
else
setReadWrite(true);
// Popup
if (m_lookup != null)
{
if ((displayType == DisplayType.List && Env.getContextAsInt(Env.getCtx(), "#AD_Role_ID") == 0)
|| displayType != DisplayType.List) // only system admins can change lists, so no need to zoom for others
{
mZoom = new JMenuItem(Msg.getMsg(Env.getCtx(), "Zoom"), Env.getImageIcon("Zoom16.gif"));
mZoom.addActionListener(this);
popupMenu.add(mZoom);
}
mRefresh = new JMenuItem(Msg.getMsg(Env.getCtx(), "Refresh"), Env.getImageIcon("Refresh16.gif"));
mRefresh.addActionListener(this);
popupMenu.add(mRefresh);
}
// VBPartner quick entry link
if (columnName.equals("C_BPartner_ID"))
{
mBPartnerNew = new JMenuItem (Msg.getMsg(Env.getCtx(), "New"), Env.getImageIcon("InfoBPartner16.gif"));
mBPartnerNew.addActionListener(this);
popupMenu.add(mBPartnerNew);
mBPartnerUpd = new JMenuItem (Msg.getMsg(Env.getCtx(), "Update"), Env.getImageIcon("InfoBPartner16.gif"));
mBPartnerUpd.addActionListener(this);
popupMenu.add(mBPartnerUpd);
}
//
if (m_lookup != null && m_lookup.getZoom() == 0)
mZoom.setEnabled(false);
} // VLookup
/**
* Dispose
*/
public void dispose()
{
m_text = null;
m_button = null;
m_lookup = null;
m_mField = null;
m_combo.removeActionListener(this);
m_combo.setModel(new DefaultComboBoxModel()); // remove reference
// m_combo.removeAllItems();
m_combo = null;
} // dispose
/** Display Length for Lookups (18) */
public final static int DISPLAY_LENGTH = 18;
/** Search: The Editable Text Field */
private CTextField m_text = new CTextField (DISPLAY_LENGTH);
/** Search: The Button to open Editor */
private CButton m_button = new CButton();
/** The Combo Box if not a Search Lookup */
private VComboBox m_combo = new VComboBox();
/** Indicator that value is being set */
private volatile boolean m_settingValue = false;
private volatile boolean m_settingFocus = false;
/** Indicator that Lookup has focus */
private volatile boolean m_haveFocus = false;
/** Indicator - inserting new value */
private volatile boolean m_inserting = false;
//
private String m_columnName;
private Lookup m_lookup;
private int m_displayType;
private int m_WindowNo;
private boolean m_comboActive = true;
private Object m_value;
// Popup
JPopupMenu popupMenu = new JPopupMenu();
private JMenuItem mZoom;
private JMenuItem mRefresh;
private JMenuItem mBPartnerNew;
private JMenuItem mBPartnerUpd;
private MField m_mField = null;
/**
* Set Content and Size of Compoments
* @param initial if true, size and margins will be set
*/
private void setUI (boolean initial)
{
if (initial)
{
Dimension size = m_text.getPreferredSize();
setPreferredSize(new Dimension(size)); // causes r/o to be the same length
m_combo.setPreferredSize(new Dimension(size));
//
m_text.setBorder(null);
Dimension bSize = new Dimension(size.height, size.height);
m_button.setPreferredSize (bSize);
m_button.setMargin(new Insets(0, 0, 0, 0));
}
// What to show
this.remove(m_combo);
this.remove(m_button);
this.remove(m_text);
//
if (!isReadWrite()) // r/o - show text only
{
LookAndFeel.installBorder(this, "TextField.border");
this.add(m_text, BorderLayout.CENTER);
m_text.setReadWrite(false);
m_combo.setReadWrite(false);
m_comboActive = false;
}
else if (m_displayType != DisplayType.Search) // show combo if not Search
{
this.setBorder(null);
this.add(m_combo, BorderLayout.CENTER);
m_comboActive = true;
}
else // Search or unstable - show text & button
{
LookAndFeel.installBorder(this, "TextField.border");
this.add(m_text, BorderLayout.CENTER);
this.add(m_button, BorderLayout.EAST);
m_text.setReadWrite (true);
m_comboActive = false;
}
} // setUI
/**
* Set ReadWrite
* @param value ReadWrite
*/
public void setReadWrite (boolean value)
{
boolean rw = value;
if (m_lookup == null)
rw = false;
if (m_combo.isReadWrite() != value)
{
m_combo.setReadWrite(rw);
setUI (false);
if (m_comboActive)
setValue (m_value);
}
} // setReadWrite
/**
* IsEditable
* @return is lookup ReadWrite
*/
public boolean isReadWrite()
{
return m_combo.isReadWrite();
} // isReadWrite
/**
* Set Mandatory (and back bolor)
* @param mandatory mandatory
*/
public void setMandatory (boolean mandatory)
{
m_combo.setMandatory(mandatory);
m_text.setMandatory(mandatory);
} // setMandatory
/**
* Is it mandatory
* @return true if mandatory
*/
public boolean isMandatory()
{
return m_combo.isMandatory();
} // isMandatory
/**
* Set Background
* @param color color
*/
public void setBackground(Color color)
{
m_text.setBackground(color);
m_combo.setBackground(color);
} // setBackground
/**
* Set Background
* @param error error
*/
public void setBackground (boolean error)
{
m_text.setBackground(error);
m_combo.setBackground(error);
} // setBackground
/**
* Set Foreground
* @param fg Foreground color
*/
public void setForeground(Color fg)
{
m_text.setForeground(fg);
m_combo.setForeground(fg);
} // setForeground
/**
* Set Editor to value
* @param value new Value
*/
public void setValue (Object value)
{
Log.trace(Log.l6_Database, "VLookup.setValue", m_columnName + "=" + value);
m_settingValue = true; // disable actions
m_value = value;
// Set both for switching
m_combo.setValue (value);
if (value == null)
{
m_text.setText (null);
m_settingValue = false;
return;
}
if (m_lookup == null)
{
m_text.setText (value.toString());
m_settingValue = false;
return;
}
// Set Display
String display = m_lookup.getDisplay(value);
boolean notFound = display.startsWith("<") && display.startsWith(">");
m_text.setText (display);
m_text.setCaretPosition (0); // show beginning
// Nothing showing in Combo and should be showing
if (m_combo.getSelectedItem() == null
&& (m_comboActive || (m_inserting && m_displayType != DisplayType.Search)))
{
// lookup found nothing too
if (notFound)
{
Log.trace(8, "VLookup.setValue - Not found (1)", display);
// we may have a new value
m_lookup.refresh();
m_combo.setValue (value);
display = m_lookup.getDisplay(value);
m_text.setText (display);
m_text.setCaretPosition (0); // show beginning
notFound = display.startsWith("<") && display.endsWith(">");
}
if (notFound) // <key>
{
m_value = null;
actionCombo (null); // data binding
Log.trace(Log.l6_Database, "VLookup.setValue - not found - " + value);
}
// we have lookup
else if (m_combo.getSelectedItem() == null)
{
NamePair pp = m_lookup.get(value);
if (pp != null)
{
Log.trace (Log.l6_Database, "VLookup.setValue - added to combo - " + pp);
// Add to Combo
m_combo.addItem (pp);
m_combo.setValue (value);
}
}
// Not in Lookup - set to Null
if (m_combo.getSelectedItem() == null)
{
Log.trace(Log.l1_User, "VLookup.setValue - not in Lookup - set to NULL");
actionCombo (null); // data binding (calls setValue again)
m_value = null;
}
}
m_settingValue = false;
} // setValue
/**
* Property Change Listener
* @param evt PropertyChangeEvent
*/
public void propertyChange (PropertyChangeEvent evt)
{
// Log.trace(Log.l5_DData, "VLookup.propertyChange", evt);
if (evt.getPropertyName().equals(MField.PROPERTY))
{
m_inserting = MField.INSERTING.equals(evt.getOldValue());
setValue(evt.getNewValue());
m_inserting = false;
}
} // propertyChange
/**
* Return Editor value (Integer)
* @return value
*/
public Object getValue()
{
if (m_comboActive)
return m_combo.getValue ();
return m_value;
} // getValue
/**
* Return editor display
* @return display value
*/
public String getDisplay()
{
String retValue = null;
if (m_comboActive)
retValue = m_combo.getDisplay();
// check lookup
else if (m_lookup == null)
retValue = m_value.toString();
else
retValue = m_lookup.getDisplay(m_value);
// Log.trace(Log.l6_Database, "VLookup.getDisplay - " + retValue, "ComboActive=" + m_comboActive);
return retValue;
} // getDisplay
/**
* Set Field/WindowNo for ValuePreference
* @param mField Model Field for Lookup
*/
public void setField (MField mField)
{
m_mField = mField;
if (m_mField != null)
ValuePreference.addMenu (this, popupMenu);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -