📄 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 Smart Business Solution. The Initial
* Developer of the Original Code is Jorg Janke. Portions created by Jorg Janke
* are Copyright (C) 1999-2005 Jorg Janke.
* All parts are Copyright (C) 1999-2005 ComPiere, Inc. All Rights Reserved.
* Contributor(s): ______________________________________.
*****************************************************************************/
package org.compiere.grid.ed;
import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import java.sql.*;
import java.util.logging.*;
import javax.swing.*;
import org.compiere.apps.*;
import org.compiere.apps.search.*;
import org.compiere.model.*;
import org.compiere.swing.*;
import org.compiere.util.*;
/**
* Lookup Visual 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.87 2006/01/28 01:29:11 jjanke Exp $
*/
public class VLookup extends JComponent
implements VEditor, ActionListener, FocusListener
{
/**
* Create Optional BPartner Search 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.get (Env.getCtx(), WindowNo,
0, AD_Column_ID, DisplayType.Search);
return new VLookup ("C_BPartner_ID", false, false, true, lookup);
}
catch (Exception e)
{
log.log(Level.SEVERE, "", e);
}
return null;
} // createBPartner
/**
* Create Optional Product Search 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.get (Env.getCtx(), WindowNo, 0,
AD_Column_ID, DisplayType.Search);
return new VLookup ("M_Product_ID", false, false, true, lookup);
}
catch (Exception e)
{
log.log(Level.SEVERE, "", e);
}
return null;
} // createProduct
/**
* Create Optional User Search Lookup
* @param WindowNo window
* @return VLookup
*/
public static VLookup createUser (int WindowNo)
{
int AD_Column_ID = 10443; // AD_WF_Activity.AD_User_UD
try
{
Lookup lookup = MLookupFactory.get (Env.getCtx(), WindowNo, 0,
AD_Column_ID, DisplayType.Search);
return new VLookup ("AD_User_ID", false, false, true, lookup);
}
catch (Exception e)
{
log.log(Level.SEVERE, "", e);
}
return null;
} // createProduct
/*************************************************************************
* Detail Constructor
*
* @param columnName column
* @param mandatory mandatory
* @param isReadOnly read only
* @param isUpdateable updateable
* @param lookup lookup
*/
public VLookup (String columnName, boolean mandatory, boolean isReadOnly, boolean isUpdateable,
Lookup lookup)
{
super();
super.setName(columnName);
m_combo.setName(columnName);
m_columnName = columnName;
setMandatory(mandatory);
m_lookup = lookup;
//
setLayout(new BorderLayout());
VLookup_mouseAdapter mouse = new VLookup_mouseAdapter(this); // popup
// *** Text & Button ***
m_text.addActionListener(this);
m_text.addFocusListener(this);
m_text.addMouseListener(mouse);
// Button
m_button.addActionListener(this);
m_button.addMouseListener(mouse);
m_button.setFocusable(false); // don't focus when tabbing
m_button.setMargin(new Insets(0, 0, 0, 0));
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 && m_lookup.getDisplayType() != 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
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 ((m_lookup.getDisplayType() == DisplayType.List && Env.getContextAsInt(Env.getCtx(), "#AD_Role_ID") == 0)
|| m_lookup.getDisplayType() != DisplayType.List) // only system admins can change lists, so no need to zoom for others
{
mZoom = new CMenuItem(Msg.getMsg(Env.getCtx(), "Zoom"), Env.getImageIcon("Zoom16.gif"));
mZoom.addActionListener(this);
popupMenu.add(mZoom);
}
mRefresh = new CMenuItem(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 CMenuItem (Msg.getMsg(Env.getCtx(), "New"), Env.getImageIcon("InfoBPartner16.gif"));
mBPartnerNew.addActionListener(this);
popupMenu.add(mBPartnerNew);
mBPartnerUpd = new CMenuItem (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.removeFocusListener(this);
m_combo.removeActionListener(this);
m_combo.setModel(new DefaultComboBoxModel()); // remove reference
// m_combo.removeAllItems();
m_combo = null;
} // dispose
/** Display Length for Lookups (15) */
public final static int DISPLAY_LENGTH = 15;
/** Field Height */
public static int FIELD_HIGHT = 0;
/** 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;
/** Indicator that docus is being set */
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;
/** Last Display */
private String m_lastDisplay = "";
/** Column Name */
private String m_columnName;
/** Lookup */
private Lookup m_lookup;
/** Conbo Box Active */
private boolean m_comboActive = true;
/** The Value */
private Object m_value;
// Popup
JPopupMenu popupMenu = new JPopupMenu();
private CMenuItem mZoom;
private CMenuItem mRefresh;
private CMenuItem mBPartnerNew;
private CMenuItem mBPartnerUpd;
// Field for Value Preference
private MField m_mField = null;
/** Logger */
private static CLogger log = CLogger.getCLogger(VLookup.class);
/**
* 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));
setMinimumSize(new Dimension (30, size.height));
FIELD_HIGHT = size.height;
//
m_text.setBorder(null);
Dimension bSize = new Dimension(size.height, size.height);
m_button.setPreferredSize (bSize);
}
// 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_lookup != null && m_lookup.getDisplayType() != 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
/**
* Request Focus
*/
public void requestFocus ()
{
if (m_lookup != null && m_lookup.getDisplayType() != DisplayType.Search)
m_combo.requestFocus ();
else
m_text.requestFocus ();
} // requestFocus
/**
* Set Editor to value
* @param value new Value
*/
public void setValue (Object value)
{
log.fine(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_lastDisplay = "";
m_settingValue = false;
return;
}
if (m_lookup == null)
{
m_text.setText (value.toString());
m_lastDisplay = value.toString();
m_settingValue = false;
return;
}
// Set Display
m_lastDisplay = m_lookup.getDisplay(value);
if (m_lastDisplay.equals("<-1>"))
{
m_lastDisplay = "";
m_value = null;
}
boolean notFound = m_lastDisplay.startsWith("<") && m_lastDisplay.startsWith(">");
m_text.setText (m_lastDisplay);
m_text.setCaretPosition (0); // show beginning
// Nothing showing in Combo and should be showing
if (m_combo.getSelectedItem() == null
&& (m_comboActive || (m_inserting && m_lookup.getDisplayType() != DisplayType.Search)))
{
// lookup found nothing too
if (notFound)
{
log.finest(m_columnName + "=" + value + ": Not found - " + m_lastDisplay);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -