/****************************************************************************** * Product: Posterita Ajax UI * * Copyright (C) 2007 Posterita Ltd. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify it * * under the terms version 2 of the GNU General Public License as published * * by the Free Software Foundation. This program is distributed in the hope * * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * * For the text or an alternative of this public license, you may reach us * * Posterita Ltd., 3, Draper Avenue, Quatre Bornes, Mauritius * * or via info@posterita.org or http://www.posterita.org/ * *****************************************************************************/ package org.adempiere.webui.window; import java.math.BigDecimal; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Arrays; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Vector; import java.util.logging.Level; import java.util.regex.Pattern; import org.adempiere.webui.LayoutUtils; import org.adempiere.webui.apps.AEnv; import org.adempiere.webui.component.Button; import org.adempiere.webui.component.Combobox; import org.adempiere.webui.component.Grid; import org.adempiere.webui.component.Label; import org.adempiere.webui.component.ListCell; import org.adempiere.webui.component.ListHead; import org.adempiere.webui.component.ListHeader; import org.adempiere.webui.component.ListItem; import org.adempiere.webui.component.Listbox; import org.adempiere.webui.component.Panel; import org.adempiere.webui.component.Row; import org.adempiere.webui.component.Rows; import org.adempiere.webui.component.Tabpanel; import org.adempiere.webui.component.Textbox; import org.adempiere.webui.component.ToolBar; import org.adempiere.webui.component.ToolBarButton; import org.adempiere.webui.component.Window; import org.adempiere.webui.editor.WEditor; import org.adempiere.webui.editor.WNumberEditor; import org.adempiere.webui.editor.WStringEditor; import org.adempiere.webui.editor.WebEditorFactory; import org.adempiere.webui.event.ValueChangeEvent; import org.adempiere.webui.event.ValueChangeListener; import org.adempiere.webui.part.MultiTabPart; import org.compiere.model.GridField; import org.compiere.model.GridFieldVO; import org.compiere.model.GridTab; import org.compiere.model.MColumn; import org.compiere.model.MLookupFactory; import org.compiere.model.MProduct; import org.compiere.model.MQuery; import org.compiere.model.MRole; import org.compiere.model.MUserQuery; import org.compiere.model.X_AD_Column; import org.compiere.util.AdempiereSystemError; import org.compiere.util.CLogger; import org.compiere.util.DB; import org.compiere.util.DisplayType; import org.compiere.util.Env; import org.compiere.util.Msg; import org.compiere.util.SecureEngine; import org.compiere.util.ValueNamePair; import org.zkoss.zk.au.out.AuFocus; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.event.Events; import org.zkoss.zk.ui.util.Clients; import org.zkoss.zkex.zul.Borderlayout; import org.zkoss.zkex.zul.Center; import org.zkoss.zkex.zul.North; import org.zkoss.zkex.zul.South; import org.zkoss.zul.Comboitem; import org.zkoss.zul.Hbox; /** * This class is based on org.compiere.apps.search.Find written by Jorg Janke. * Find/Search Records. * * @author Sendy Yagambrum * @date June 27, 2007 */ public class FindWindow extends Window implements EventListener,ValueChangeListener { /** * */ private static final long serialVersionUID = 4937678675702382252L; /** Main Window for the Lookup Panel */ private MultiTabPart winMain; /** Simple Window Tab */ private Window winLookupRecord; /** Advanced Window Tab */ private Window winAdvanced; // private Label lblDocumentNo; private Label lblDescription; private Label lblName; private Label lblValue; // private Textbox fieldDocumentNo; private Textbox fieldDescription; private Textbox fieldName; private Textbox fieldValue; // private Combobox fQueryName; // private Listbox advancedPanel; /** container of Simple Window contents */ private Grid contentSimple; /** Target Window No */ private int m_targetWindowNo; /** Table ID */ private int m_AD_Table_ID; /** Table Name */ private String m_tableName; /** Where */ private String m_whereExtended; /** Search Fields */ private GridField[] m_findFields; /** Resulting query */ private MQuery m_query = null; /** Is cancel ? */ private boolean m_isCancel = false; // teo_sarca [ 1708717 ] /** Logger */ private static CLogger log = CLogger.getCLogger(FindWindow.class); /** Number of records */ private int m_total; private PreparedStatement m_pstmt; // private boolean hasValue = false; private boolean hasDocNo = false; private boolean hasName = false; private boolean hasDescription = false; /** List of WEditors */ private ArrayList<WEditor> m_sEditors = new ArrayList<WEditor>(); /** Target Fields with AD_Column_ID as key */ private Hashtable<Integer,GridField> m_targetFields = new Hashtable<Integer,GridField>(); /** For Grid Controller */ public static final int TABNO = 99; /** Length of Fields on first tab */ public static final int FIELDLENGTH = 20; /** Reference ID for Yes/No */ public static final int AD_REFERENCE_ID_YESNO = 319; private int m_AD_Tab_ID = 0; private MUserQuery[] userQueries; private Rows contentSimpleRows; private Row pnlDocument; private Row pnlDescription; private Row pnlValue; private Row pnlName; private boolean m_createNew = false; /** Index ColumnName = 0 */ public static final int INDEX_COLUMNNAME = 0; /** Index Operator = 1 */ public static final int INDEX_OPERATOR = 1; /** Index Value = 2 */ public static final int INDEX_VALUE = 2; /** Index Value2 = 3 */ public static final int INDEX_VALUE2 = 3; private static final String FIELD_SEPARATOR = "<^>"; private static final String SEGMENT_SEPARATOR = "<~>"; /** * FindPanel Constructor * @param targetWindowNo targetWindowNo * @param title title * @param AD_Table_ID AD_Table_ID * @param tableName tableName * @param whereExtended whereExtended * @param findFields findFields * @param minRecords minRecords * @param adTabId **/ public FindWindow (int targetWindowNo, String title, int AD_Table_ID, String tableName, String whereExtended, GridField[] findFields, int minRecords, int adTabId) { m_targetWindowNo = targetWindowNo; m_AD_Table_ID = AD_Table_ID; m_tableName = tableName; m_whereExtended = whereExtended; m_findFields = findFields; m_AD_Tab_ID = adTabId; // m_query = new MQuery (m_tableName); m_query.addRestriction(m_whereExtended); // Required for Column Validation Env.setContext(Env.getCtx(), m_targetWindowNo, "Find_Table_ID", m_AD_Table_ID); // Context for Advanced Search Grid is WINDOW_FIND Env.setContext(Env.getCtx(), Env.WINDOW_FIND, "Find_Table_ID", m_AD_Table_ID); // initPanel(); initFind(); initFindAdvanced(); if (m_total < minRecords) { dispose(); return; } this.setBorder("normal"); this.setWidth("750px"); this.setHeight("350px"); this.setTitle(Msg.getMsg(Env.getCtx(), "Find").replaceAll("&", "") + ": " + title); this.setAttribute(Window.MODE_KEY, Window.MODE_MODAL); this.setClosable(false); this.setSizable(true); this.setVisible(true); AEnv.showWindow(this); } /** * initialise lookup record tab * **/ private void initSimple() { lblDocumentNo = new Label(); lblDocumentNo.setValue(Msg.translate(Env.getCtx(),"DocumentNo").replaceAll("&", "")); lblDescription = new Label(); lblDescription.setValue(Msg.translate(Env.getCtx(),"Description").replaceAll("&", "")); lblName = new Label(); lblName.setValue(Msg.translate(Env.getCtx(),"Name").replaceAll("&", "")); lblValue = new Label(); lblValue.setValue(Msg.translate(Env.getCtx(),"Value").replaceAll("&", "")); fieldDocumentNo = new Textbox(); fieldDocumentNo.setId("fieldDocumentNo"); fieldDocumentNo.setMaxlength(40); fieldDescription = new Textbox(); fieldDescription.setId("fieldDescription"); fieldDescription.setMaxlength(40); fieldName = new Textbox(); fieldName.setMaxlength(40); fieldValue = new Textbox(); fieldValue.setMaxlength(40); Button btnNew = new Button(); btnNew.setName("btnNew"); btnNew.setImage("/images/New24.png"); btnNew.addEventListener(Events.ON_CLICK,this); LayoutUtils.addSclass("action-button", btnNew); Button btnOk = new Button(); btnOk.setName("btnOkSimple"); btnOk.setImage("/images/Ok24.png"); btnOk.addEventListener(Events.ON_CLICK,this); LayoutUtils.addSclass("action-button", btnOk); Button btnCancel = new Button(); btnCancel.setName("btnCancel"); btnCancel.setImage("/images/Cancel24.png"); btnCancel.addEventListener(Events.ON_CLICK,this); LayoutUtils.addSclass("action-button", btnCancel); Panel pnlButtonRight = new Panel(); pnlButtonRight.appendChild(btnOk); pnlButtonRight.appendChild(btnCancel); pnlButtonRight.setAlign("right"); pnlButtonRight.setWidth("100%"); Panel pnlButtonLeft = new Panel(); pnlButtonLeft.appendChild(btnNew); Hbox hboxButton = new Hbox(); hboxButton.appendChild(pnlButtonLeft); hboxButton.appendChild(pnlButtonRight); hboxButton.setWidth("100%"); pnlDocument = new Row(); pnlDocument.setId("pnlDocument"); pnlDocument.appendChild(LayoutUtils.makeRightAlign(lblDocumentNo)); pnlDocument.appendChild(fieldDocumentNo); pnlDescription = new Row(); pnlDescription.appendChild(LayoutUtils.makeRightAlign(lblDescription)); pnlDescription.appendChild(fieldDescription); pnlValue = new Row(); pnlValue.appendChild(LayoutUtils.makeRightAlign(lblValue)); pnlValue.appendChild(fieldValue); pnlName = new Row(); pnlName.appendChild(LayoutUtils.makeRightAlign(lblName)); pnlName.appendChild(fieldName); contentSimple = new Grid(); contentSimple.setId("contentSimple"); contentSimple.setWidth("100%"); contentSimple.makeNoStrip(); contentSimpleRows = new Rows(); contentSimple.appendChild(contentSimpleRows); contentSimpleRows.appendChild(pnlValue); contentSimpleRows.appendChild(pnlName); contentSimpleRows.appendChild(pnlDocument); contentSimpleRows.appendChild(pnlDescription); contentSimple.setVflex(true); Borderlayout layout = new Borderlayout(); layout.setStyle("height: 100%; width: 99%; position: relative"); winLookupRecord.appendChild(layout); Center center = new Center(); layout.appendChild(center); center.appendChild(contentSimple); center.setFlex(true); South south = new South(); layout.appendChild(south); south.appendChild(hboxButton); winLookupRecord.setWidth("100%"); winLookupRecord.setHeight("100%"); winLookupRecord.addEventListener(Events.ON_OK, this); } // initSimple /** * initialise Advanced Tab * **/ private void initAdvanced() { ToolBarButton btnNew = new ToolBarButton(); btnNew.setImage("/images/New24.png"); btnNew.setAttribute("name", "btnNewAdv"); btnNew.addEventListener(Events.ON_CLICK, this); ToolBarButton btnDelete = new ToolBarButton(); btnDelete.setAttribute("name","btnDeleteAdv"); btnDelete.setImage("/images/Delete24.png"); btnDelete.addEventListener(Events.ON_CLICK, this); ToolBarButton btnSave = new ToolBarButton(); btnSave.setAttribute("name","btnSaveAdv"); btnSave.setImage("/images/Save24.png"); btnSave.addEventListener(Events.ON_CLICK, this); fQueryName = new Combobox(); fQueryName.setTooltiptext(Msg.getMsg(Env.getCtx(),"QueryName")); fQueryName.setReadonly(false); //user query userQueries = MUserQuery.get(Env.getCtx(), m_AD_Tab_ID); for (int i = 0; i < userQueries.length; i++) fQueryName.appendItem(userQueries[i].getName()); fQueryName.setValue(""); fQueryName.addEventListener(Events.ON_SELECT, this); Button btnOk = new Button(); btnOk.setName("btnOkAdv"); btnOk.setImage("/images/Ok24.png"); btnOk.addEventListener(Events.ON_CLICK, this); LayoutUtils.addSclass("action-button", btnOk); Button btnCancel = new Button(); btnCancel.setName("btnCancel"); btnCancel.setImage("/images/Cancel24.png"); btnCancel.addEventListener(Events.ON_CLICK, this); LayoutUtils.addSclass("action-button", btnCancel); Panel pnlButtonRight = new Panel(); pnlButtonRight.appendChild(btnOk); pnlButtonRight.appendChild(btnCancel); pnlButtonRight.setAlign("right"); ToolBar toolBar = new ToolBar(); toolBar.appendChild(btnNew); toolBar.appendChild(btnDelete); toolBar.appendChild(fQueryName); toolBar.appendChild(btnSave); toolBar.setWidth("100%"); fQueryName.setStyle("margin-left: 3px; margin-right: 3px; position: relative; top: 5px;"); btnSave.setDisabled(m_AD_Tab_ID <= 0); Hbox confirmPanel = new Hbox(); confirmPanel.appendChild(pnlButtonRight); confirmPanel.setWidth("100%"); advancedPanel = new Listbox(); ListHead listhead = new ListHead(); listhead.setSizable(true); ListHeader lstHColumn = new ListHeader(); lstHColumn.setLabel(Msg.translate(Env.getCtx(), "AD_Column_ID")); lstHColumn.setWidth("100px"); ListHeader lstHOperator = new ListHeader(); lstHOperator.setLabel(Msg.getMsg(Env.getCtx(), "Operator")); ListHeader lstHQueryValue = new ListHeader(); lstHQueryValue.setLabel(Msg.getMsg(Env.getCtx(), "QueryValue")); lstHQueryValue.setWidth("210px"); ListHeader lstHQueryTo = new ListHeader(); lstHQueryTo.setLabel(Msg.getMsg(Env.getCtx(), "QueryValue2")); lstHQueryTo.setWidth("210px"); listhead.appendChild(lstHColumn); listhead.appendChild(lstHOperator); listhead.appendChild(lstHQueryValue); listhead.appendChild(lstHQueryTo); advancedPanel.appendChild(listhead); advancedPanel.setVflex(true); Borderlayout layout = new Borderlayout(); layout.setStyle("height: 100%; width: 99%; position: relative;"); winAdvanced.appendChild(layout); North north = new North(); layout.appendChild(north); north.appendChild(toolBar); Center center = new Center(); layout.appendChild(center); center.appendChild(advancedPanel); center.setFlex(true); South south = new South(); layout.appendChild(south); south.appendChild(confirmPanel); winAdvanced.setHeight("100%"); winAdvanced.setWidth("100%"); winAdvanced.addEventListener(Events.ON_OK,this); } // initAdvanced /** * initialise Main Window * **/ private void initPanel() { winMain = new MultiTabPart(); winMain.createPart(this); winMain.getComponent().setStyle("height: 100%; width: 100%; position: relative;"); winAdvanced = new Window(); winLookupRecord = new Window(); Tabpanel tabPanel = new Tabpanel(); tabPanel.setStyle("height: 100%; width: 100%"); tabPanel.appendChild(winLookupRecord); winMain.addTab(tabPanel, Msg.getMsg(Env.getCtx(), "Find").replaceAll("&", ""),false, true); tabPanel = new Tabpanel(); tabPanel.setStyle("height: 100%; width: 100%"); tabPanel.appendChild(winAdvanced); winMain.addTab(tabPanel, Msg.getMsg(Env.getCtx(), "Advanced").replaceAll("&", ""), false, false); initSimple(); initAdvanced(); } // initPanel /** * Dynamic Init.6 * Set up GridController **/ private void initFind() { log.config(""); // Get Info from target Tab for (int i = 0; i < m_findFields.length; i++) { GridField mField = m_findFields[i]; String columnName = mField.getColumnName(); // Make Yes-No searchable as list if (mField.getVO().displayType == DisplayType.YesNo) { GridFieldVO vo = mField.getVO(); GridFieldVO ynvo = vo.clone(vo.ctx, vo.WindowNo, vo.TabNo, vo.AD_Window_ID, vo.AD_Tab_ID, vo.tabReadOnly); ynvo.IsDisplayed = true; ynvo.displayType = DisplayType.List; ynvo.AD_Reference_Value_ID = AD_REFERENCE_ID_YESNO; ynvo.lookupInfo = MLookupFactory.getLookupInfo (ynvo.ctx, ynvo.WindowNo, ynvo.AD_Column_ID, ynvo.displayType, Env.getLanguage(ynvo.ctx), ynvo.ColumnName, ynvo.AD_Reference_Value_ID, ynvo.IsParent, ynvo.ValidationCode); ynvo.lookupInfo.InfoFactoryClass = ynvo.InfoFactoryClass; GridField ynfield = new GridField(ynvo); // replace the original field by the YN List field m_findFields[i] = ynfield; mField = ynfield; } // Make Buttons searchable if ( mField.getVO().displayType == DisplayType.Button ) { GridFieldVO vo = mField.getVO(); if ( vo.AD_Reference_Value_ID > 0 ) { GridFieldVO postedvo = vo.clone(vo.ctx, vo.WindowNo, vo.TabNo, vo.AD_Window_ID, vo.AD_Tab_ID, vo.tabReadOnly); postedvo.IsDisplayed = true; postedvo.displayType = DisplayType.List; postedvo.lookupInfo = MLookupFactory.getLookupInfo (postedvo.ctx, postedvo.WindowNo, postedvo.AD_Column_ID, postedvo.displayType, Env.getLanguage(postedvo.ctx), postedvo.ColumnName, postedvo.AD_Reference_Value_ID, postedvo.IsParent, postedvo.ValidationCode); postedvo.lookupInfo.InfoFactoryClass = postedvo.InfoFactoryClass; GridField postedfield = new GridField(postedvo); // replace the original field by the Posted List field m_findFields[i] = postedfield; mField = postedfield; } } /** metas: teo_sarca: Specify exactly which are the search fields - http://sourceforge.net/projects/adempiere/forums/forum/610548/topic/3736214 if (columnName.equals("Value")) hasValue = true; else if (columnName.equals("Name")) hasName = true; else if (columnName.equals("DocumentNo")) hasDocNo = true; else if (columnName.equals("Description")) hasDescription = true; else /**/ if (mField.isSelectionColumn()) addSelectionColumn (mField); /** metas: teo_sarca: Specify exactly which are the search fields - http://sourceforge.net/projects/adempiere/forums/forum/610548/topic/3736214 else if (columnName.indexOf("Name") != -1) addSelectionColumn (mField); /**/ // TargetFields m_targetFields.put (new Integer(mField.getAD_Column_ID()), mField); } // for all target tab fields // Disable simple query fields pnlValue.setVisible(hasValue); if (hasValue) fieldValue.addEventListener(Events.ON_CHANGE,this); pnlDocument.setVisible(hasDocNo); if (hasDocNo) fieldDocumentNo.addEventListener(Events.ON_CHANGE,this); pnlName.setVisible(hasName); if (hasName) fieldName.addEventListener(Events.ON_CHANGE,this); pnlDescription.setVisible(hasDescription); if (hasDescription) fieldDescription.addEventListener(Events.ON_CHANGE,this); m_total = getNoOfRecords(null, false); } // initFind /** * initialise Advanced tab **/ private void initFindAdvanced() { log.config(""); createFields(); } // initFindAdvanced /** * create respective fields in the advanced window tab * **/ private void createFields() { ListItem listItem = new ListItem(); listItem.setWidth("100%"); Listbox listColumn = new Listbox(); listColumn.setId("listColumn"+listItem.getId()); listColumn.setName("listColumn"); listColumn.setMold("select"); listColumn.setRows(0); listColumn.addEventListener(Events.ON_SELECT,this); Listbox listOperator = new Listbox(); listOperator.setId("listOperator"+listItem.getId()); listOperator.setName("listOperator"); listOperator.setMold("select"); listOperator.setRows(0); listOperator.addEventListener(Events.ON_SELECT,this); setValues(listColumn, listOperator); ListCell cellColumn = new ListCell(); cellColumn.appendChild(listColumn); cellColumn.setId("cellColumn"+listItem.getId()); ListCell cellOperator = new ListCell(); cellOperator.appendChild(listOperator); cellOperator.setId("cellOperator"+listItem.getId()); ListCell cellQueryFrom = new ListCell(); cellQueryFrom.setId("cellQueryFrom"+listItem.getId()); ListCell cellQueryTo = new ListCell(); cellQueryTo.setId("cellQueryTo"+listItem.getId()); listItem.appendChild(cellColumn); listItem.appendChild(cellOperator); listItem.appendChild(cellQueryFrom); listItem.appendChild(cellQueryTo); advancedPanel.appendChild(listItem); advancedPanel.setSelectedItem(listItem); } // createFields /** * sets the list of values of column and operator listboxes * @param listColumn column * @param listOperator operator **/ private void setValues(Listbox listColumn, Listbox listOperator) { setValues(listColumn, listOperator, null); } private void setValues(Listbox listColumn, Listbox listOperator, String[] fields) { // 0 = Columns ArrayList<ValueNamePair> items = new ArrayList<ValueNamePair>(); for (int c = 0; c < m_findFields.length; c++) { GridField field = m_findFields[c]; String columnName = field.getColumnName(); String header = field.getHeader(); if (header == null || header.length() == 0) { header = Msg.translate(Env.getCtx(), columnName); if (header == null || header.length() == 0) continue; } if (field.isKey()) header += (" (ID)"); ValueNamePair pp = new ValueNamePair(columnName, header); items.add(pp); } ValueNamePair[] cols = new ValueNamePair[items.size()]; items.toArray(cols); Arrays.sort(cols); // sort alpha ValueNamePair[] op = MQuery.OPERATORS; if(fields == null) { listColumn.appendItem("","" ); for (ValueNamePair item: cols) listColumn.appendItem(item.getName(), item.getValue()); listColumn.setSelectedIndex(0); for (ValueNamePair item: op) listOperator.appendItem(item.getName(), item.getValue()); listOperator.setSelectedIndex(0); } else { String columnName = fields.length > INDEX_COLUMNNAME ? fields[INDEX_COLUMNNAME] : ""; String operator = fields.length > INDEX_OPERATOR ? fields[INDEX_OPERATOR] : ""; boolean selected = false; listColumn.appendItem("",""); for (int i = 0; i < cols.length; i++) { ValueNamePair item = cols[i]; ListItem li = listColumn.appendItem(item.getName(), item.getValue()); if(item.getValue().equals(columnName)) { listColumn.setSelectedItem(li); selected = true; } } if(!selected) listColumn.setSelectedIndex(0); selected = false; for (int i = 0; i < op.length; i++) { ValueNamePair item = op[i]; ListItem li = listOperator.appendItem(item.getName(), item.getValue()); if(item.getValue().equals(operator)) { listOperator.setSelectedItem(li); selected = true; } } if(!selected) listOperator.setSelectedIndex(0); } } // setValues /** * Add Selection Column to first Tab * @param mField field **/ public void addSelectionColumn(GridField mField) { log.config(mField.getHeader()); int displayLength = mField.getDisplayLength(); if (displayLength <= 0 || displayLength > FIELDLENGTH) mField.setDisplayLength(FIELDLENGTH); else displayLength = 0; // Editor WEditor editor = null; editor = WebEditorFactory.getEditor(mField, false); editor.setMandatory(false); editor.setReadWrite(true); editor.dynamicDisplay(); Label label = editor.getLabel(); Component fieldLabel = editor.getComponent(); // if (displayLength > 0) // set it back mField.setDisplayLength(displayLength); // Row panel = new Row(); panel.appendChild(LayoutUtils.makeRightAlign(label)); panel.appendChild(fieldLabel); contentSimpleRows.appendChild(panel); m_sEditors.add(editor); fieldLabel.addEventListener(Events.ON_OK,this); } // addSelectionColumn public void onEvent(Event event) throws Exception { if (Events.ON_SELECT.equals(event.getName())) { if (event.getTarget() instanceof Listbox) { ListItem row = (ListItem)(event.getTarget().getParent().getParent()); Listbox listbox = (Listbox)event.getTarget(); advancedPanel.setSelectedItem(row); Listbox listColumn = (Listbox)row.getFellow("listColumn"+row.getId()); Listbox listOperator = (Listbox)row.getFellow("listOperator"+row.getId()); if (listbox.getId().equals(listColumn.getId())) { ListItem column = listColumn.getSelectedItem(); if (column != null) { addOperators(column, listOperator); } } Component componentFrom = getEditorCompQueryFrom(row); Component componentTo = getEditorCompQueryTo(row); addRowEditor(componentFrom, (ListCell)row.getFellow("cellQueryFrom"+row.getId())); addRowEditor(componentTo,(ListCell)row.getFellow("cellQueryTo"+row.getId())); } else if (event.getTarget() == fQueryName) { int index = fQueryName.getSelectedIndex(); if(index < 0) return; parseUserQuery(userQueries[index]); } } // else if (Events.ON_CLICK.equals(event.getName())) { // Toolbar Buttons actions if(event.getTarget() instanceof ToolBarButton) { ToolBarButton button = (ToolBarButton)event.getTarget(); if ("btnNewAdv".equals(button.getAttribute("name").toString())) { initFindAdvanced(); } else if ("btnDeleteAdv".equals(button.getAttribute("name").toString())) { int index = advancedPanel.getSelectedIndex(); advancedPanel.getSelectedItem().detach(); advancedPanel.setSelectedIndex(--index); } else if ("btnSaveAdv".equals(button.getAttribute("name").toString())) { cmd_save(true); } } // Confirm panel actions else if(event.getTarget() instanceof Button) { Button btn = (Button)event.getTarget(); if ("btnOkSimple".equals(btn.getName())) { cmd_ok_Simple(); dispose(); } else if ("btnOkAdv".equals(btn.getName())) { cmd_ok_Advanced(); dispose(); } else if("btnCancel".equals(btn.getName())) { m_isCancel = true; dispose(); } else if ("btnNew".equals(btn.getName())) { m_query = MQuery.getNoRecordQuery(m_tableName, true); m_total = 0; m_createNew = true; dispose(); } } } else if (Events.ON_OK.equals(event.getName())) { if (winLookupRecord.equals(event.getTarget())) { cmd_ok_Simple(); dispose(); } else if (winAdvanced.equals(event.getTarget())) { cmd_ok_Advanced(); dispose(); } // Check simple panel fields for (WEditor editor : m_sEditors) { if (editor.getComponent() == event.getTarget()) { cmd_ok_Simple(); dispose(); } } } } // onEvent private void parseUserQuery(MUserQuery userQuery) { String code = userQuery.getCode(); String[] segments = code.split(Pattern.quote(SEGMENT_SEPARATOR)); List<?> rowList = advancedPanel.getChildren(); for (int rowIndex = rowList.size() - 1; rowIndex >= 1; rowIndex--) rowList.remove(rowIndex); for (int i = 0; i < segments.length; i++) { String[] fields = segments[i].split(Pattern.quote(FIELD_SEPARATOR)); ListItem listItem = new ListItem(); listItem.setWidth("100%"); advancedPanel.appendChild(listItem); Listbox listColumn = new Listbox(); listColumn.setId("listColumn"+listItem.getId()); listColumn.setName("listColumn"); listColumn.setMold("select"); listColumn.setRows(0); listColumn.addEventListener(Events.ON_SELECT,this); Listbox listOperator = new Listbox(); listOperator.setId("listOperator"+listItem.getId()); listOperator.setName("listOperator"); listOperator.setMold("select"); listOperator.setRows(0); listOperator.addEventListener(Events.ON_SELECT,this); setValues(listColumn, listOperator, fields); ListCell cellColumn = new ListCell(); cellColumn.appendChild(listColumn); cellColumn.setId("cellColumn"+listItem.getId()); ListCell cellOperator = new ListCell(); cellOperator.appendChild(listOperator); cellOperator.setId("cellOperator"+listItem.getId()); ListCell cellQueryFrom = new ListCell(); cellQueryFrom.setId("cellQueryFrom"+listItem.getId()); ListCell cellQueryTo = new ListCell(); cellQueryTo.setId("cellQueryTo"+listItem.getId()); listItem.appendChild(cellColumn); listItem.appendChild(cellOperator); listItem.appendChild(cellQueryFrom); listItem.appendChild(cellQueryTo); String columnName = listColumn.getSelectedItem().getValue().toString(); String value = fields.length > INDEX_VALUE ? fields[INDEX_VALUE] : ""; if(value.length() > 0) { cellQueryFrom.setAttribute("value", value); // Elaine 2009/03/16 - set attribute value cellQueryFrom.appendChild(parseString(getTargetMField(columnName), value, listItem, false)); } String value2 = fields.length > INDEX_VALUE2 ? fields[INDEX_VALUE2] : ""; if(value2.length() > 0) { cellQueryTo.setAttribute("value", value); // Elaine 2009/03/16 - set attribute value cellQueryTo.appendChild(parseString(getTargetMField(columnName), value2, listItem, true)); } } advancedPanel.invalidate(); } /** * Parse String * @param field column * @param in value * @param to * @param listItem * @return data type corected value */ private Component parseString(GridField field, String in, ListItem listItem, boolean to) { if (in == null) return null; int dt = field.getDisplayType(); try { WEditor editor = null; if (field.isKey()) editor = new WNumberEditor(field); else editor = WebEditorFactory.getEditor(field, true); if (editor == null) editor = new WStringEditor(field); // Return Integer if (dt == DisplayType.Integer || (DisplayType.isID(dt) && field.getColumnName().endsWith("_ID"))) { int i = Integer.parseInt(in); editor.setValue(new Integer(i)); } // Return BigDecimal else if (DisplayType.isNumeric(dt)) { editor.setValue(DisplayType.getNumberFormat(dt).parse(in)); } // Return Timestamp else if (DisplayType.isDate(dt)) { long time = 0; try { time = DisplayType.getDateFormat_JDBC().parse(in).getTime(); editor.setValue(new Timestamp(time)); } catch (Exception e) { log.log(Level.SEVERE, in + "(" + in.getClass() + ")" + e); time = DisplayType.getDateFormat(dt).parse(in).getTime(); } editor.setValue(new Timestamp(time)); } else if (dt == DisplayType.YesNo) editor.setValue(Boolean.valueOf(in)); else editor.setValue(in); editor.addValueChangeListener(this); boolean between = false; Listbox listOp = (Listbox) listItem.getFellow("listOperator"+listItem.getId()); String betweenValue = listOp.getSelectedItem().getValue().toString(); String opValue = MQuery.OPERATORS[MQuery.BETWEEN_INDEX].getValue(); if (to && betweenValue != null && betweenValue.equals(opValue)) between = true; boolean enabled = !to || (to && between); editor.setReadWrite(enabled); editor.setVisible(enabled); editor.dynamicDisplay(); return editor.getComponent(); } catch (Exception ex) { log.log(Level.SEVERE, "Object=" + in, ex); return null; } } // parseValue private void cmd_save(boolean saveQuery) { // m_query = new MQuery(m_tableName); StringBuffer code = new StringBuffer(); List<?> rowList = advancedPanel.getChildren(); for (int rowIndex = 1; rowIndex < rowList.size() ; rowIndex++) { // Column ListItem row = (ListItem)rowList.get(rowIndex); Listbox column = (Listbox)row.getFellow("listColumn"+row.getId()); if (column == null) continue; String ColumnName = column.getSelectedItem().getValue().toString(); String infoName = column.toString(); // GridField field = getTargetMField(ColumnName); if(field == null) continue; // Elaine 2008/07/29 boolean isProductCategoryField = isProductCategoryField(field.getAD_Column_ID()); String ColumnSQL = field.getColumnSQL(false); // Op Listbox op = (Listbox)row.getFellow("listOperator"+row.getId()); if (op == null) continue; String Operator = op.getSelectedItem().getValue().toString(); // Value ****** ListCell cellQueryFrom = (ListCell)row.getFellow("cellQueryFrom"+row.getId()); Object value = cellQueryFrom.getAttribute("value"); if (value == null) continue; Object parsedValue = parseValue(field, value); if (parsedValue == null) continue; String infoDisplay = value.toString(); if (field.isLookup()) infoDisplay = field.getLookup().getDisplay(value); else if (field.getDisplayType() == DisplayType.YesNo) infoDisplay = Msg.getMsg(Env.getCtx(), infoDisplay); // Value2 ****** Object value2 = null; if (MQuery.OPERATORS[MQuery.BETWEEN_INDEX].equals(op)) { ListCell cellQueryTo = (ListCell)row.getFellow("cellQueryTo"+row.getId()); value2 = cellQueryTo.getAttribute("value"); if (value2 == null) continue; Object parsedValue2 = parseValue(field, value2); String infoDisplay_to = value2.toString(); if (parsedValue2 == null) continue; m_query.addRangeRestriction(ColumnSQL, parsedValue, parsedValue2, infoName, infoDisplay, infoDisplay_to); } else if (isProductCategoryField && MQuery.OPERATORS[MQuery.EQUAL_INDEX].equals(op)) { if (!(parsedValue instanceof Integer)) { continue; } m_query .addRestriction(getSubCategoryWhereClause(((Integer) parsedValue).intValue())); } else m_query.addRestriction(ColumnSQL, Operator, parsedValue, infoName, infoDisplay); if (code.length() > 0) code.append(SEGMENT_SEPARATOR); code.append(ColumnName) .append(FIELD_SEPARATOR) .append(Operator) .append(FIELD_SEPARATOR) .append(value.toString()) .append(FIELD_SEPARATOR) .append(value2 != null ? value2.toString() : ""); } String selected = fQueryName.getValue(); if (selected != null && saveQuery) { String name = selected; MUserQuery uq = MUserQuery.get(Env.getCtx(), m_AD_Tab_ID, name); if (uq == null && code.length() > 0) { uq = new MUserQuery (Env.getCtx(), 0, null); uq.setName (name); uq.setAD_Tab_ID(m_AD_Tab_ID); //red1 UserQuery [ 1798539 ] taking in new field from Compiere uq.setAD_User_ID(Env.getAD_User_ID(Env.getCtx())); //red1 - [ 1798539 ] missing in Compiere delayed source :-) } else if (uq != null && code.length() == 0) { if (uq.delete(true)) { FDialog.info (m_targetWindowNo, this, "Deleted", name); refreshUserQueries(); } else FDialog.warn (m_targetWindowNo, this, "DeleteError", name); return; } else return; uq.setCode (code.toString()); uq.setAD_Table_ID (m_AD_Table_ID); // if (uq.save()) { FDialog.info (m_targetWindowNo, this, "Saved", name); refreshUserQueries(); } else FDialog.warn (m_targetWindowNo, this, "SaveError", name); } } // cmd_save private void refreshUserQueries() { String value = fQueryName.getValue(); userQueries = MUserQuery.get(Env.getCtx(), m_AD_Tab_ID); fQueryName.getItems().clear(); boolean selected = false; for (int i = 0; i < userQueries.length; i++) { Comboitem ci = fQueryName.appendItem(userQueries[i].getName()); if(value.equals(userQueries[i].getName())) { fQueryName.setSelectedItem(ci); selected = true; } } if(!selected) fQueryName.setValue(""); } /** * retrieve the columnName of the Column item selected * @param label label **/ private String getColumnName(ListItem row) { Listbox listColumn = (Listbox)row.getFellow("listColumn"+row.getId()); String columnName = listColumn.getSelectedItem().getValue().toString(); return columnName; } // getColumnName /** * get editor component for 'query' field * @param row row * @return editor component **/ private Component getEditorCompQueryFrom(ListItem row) { return getEditorComponent(row, false); } /** * get editor component for 'query to' field * @param row row * @return editor component **/ private Component getEditorCompQueryTo(ListItem row) { return getEditorComponent(row, true); } /** * add the editor component in the 'QueryValue' field * @param component editor component * @param label label to replace by editor component **/ private void addRowEditor(Component component, ListCell listcell) { listcell.setLabel(""); listcell.getChildren().clear(); listcell.appendChild(component); } // addComponent /** * Retrieve operators depending on the item selected in the 'Column' field * and add them to the selection * @param column Column field selected **/ private void addOperators(ListItem column, Listbox listOperator) { String columnName = column.getValue().toString(); log.config("Column: " + columnName); if (columnName.endsWith("_ID") || columnName.endsWith("_Acct")) { addOperators(MQuery.OPERATORS_ID, listOperator); } else if (columnName.startsWith("Is")) { addOperators(MQuery.OPERATORS_YN, listOperator); } else { addOperators(MQuery.OPERATORS, listOperator); } } // addOperators /** * add Operators * @param op array of operators **/ private void addOperators(ValueNamePair[] op, Listbox listOperator) { List<?> itemList = listOperator.getChildren(); itemList.clear(); for (ValueNamePair item: op) { listOperator.appendItem(item.getName(), item.getValue()); } listOperator.setSelectedIndex(0); } // addOperators /** * Get Editor * @param row row * @return Editor component **/ public Component getEditorComponent(ListItem row, boolean to) { String columnName = getColumnName(row); boolean between = false; Listbox listOp = (Listbox) row.getFellow("listOperator"+row.getId()); String betweenValue = listOp.getSelectedItem().getValue().toString(); String opValue = MQuery.OPERATORS[MQuery.BETWEEN_INDEX].getValue(); if (to && betweenValue != null && betweenValue.equals(opValue)) between = true; boolean enabled = !to || (to && between); // Create Editor GridField field = getTargetMField(columnName); if(field == null) return new Label(""); WEditor editor = null; if (field.isKey()) editor = new WNumberEditor(field); else editor = WebEditorFactory.getEditor(field, true); if (editor == null) editor = new WStringEditor(field); field.addPropertyChangeListener(editor); editor.addValueChangeListener(this); editor.setValue(null); editor.setReadWrite(enabled); editor.setVisible(enabled); editor.dynamicDisplay(); // return editor.getComponent(); } // getTableCellEditorComponent /** * Get Target MField * @param columnName column name * @return MField **/ public GridField getTargetMField (String columnName) { if (columnName == null) return null; for (int c = 0; c < m_findFields.length; c++) { GridField field = m_findFields[c]; if (columnName.equals(field.getColumnName())) return field; } return null; } // getTargetMField /** * Simple OK Button pressed **/ private void cmd_ok_Simple() { // Create Query String m_query = new MQuery(m_tableName); if (hasValue && !fieldValue.getText().equals("%") && fieldValue.getText().length() != 0) { String value = fieldValue.getText().toUpperCase(); if (!value.endsWith("%")) value += "%"; m_query.addRestriction("UPPER(Value)", MQuery.LIKE, value, lblValue.getValue(), value); } // if (hasDocNo && !fieldDocumentNo.getText().equals("%") && fieldDocumentNo.getText().length() != 0) { String value = fieldDocumentNo.getText().toUpperCase(); if (!value.endsWith("%")) value += "%"; m_query.addRestriction("UPPER(DocumentNo)", MQuery.LIKE, value, lblDocumentNo.getValue(),value); } // if ((hasName) && !fieldName.getText().equals("%") && fieldName.getText().length() != 0) { String value = fieldName.getText().toUpperCase(); if (!value.endsWith("%")) value += "%"; m_query.addRestriction("UPPER(Name)", MQuery.LIKE, value, lblName.getValue(), value); } // if (hasDescription && !fieldDescription.getText().equals("%") && fieldDescription.getText().length() != 0) { String value = fieldDescription.getText().toUpperCase(); if (!value.endsWith("%")) value += "%"; m_query.addRestriction("UPPER(Description)", MQuery.LIKE, value, lblDescription.getValue(), value); } // Special Editors for (int i = 0; i < m_sEditors.size(); i++) { WEditor wed = (WEditor)m_sEditors.get(i); Object value = wed.getValue(); if (value != null && value.toString().length() > 0) { String ColumnName = wed.getColumnName(); log.fine(ColumnName + "=" + value); // globalqss - Carlos Ruiz - 20060711 // fix a bug with virtualColumn + isSelectionColumn not yielding results GridField field = getTargetMField(ColumnName); // add encryption here if the field is encrypted. if (field.isEncryptedColumn()) { value = SecureEngine.encrypt(value); } boolean isProductCategoryField = isProductCategoryField(field.getAD_Column_ID()); String ColumnSQL = field.getColumnSQL(false); // // Be more permissive for String columns if (isSearchLike(field)) { String valueStr = value.toString().toUpperCase(); if (!valueStr.endsWith("%")) valueStr += "%"; // ColumnSQL = "UPPER("+ColumnSQL+")"; value = valueStr; } // if (value.toString().indexOf('%') != -1) m_query.addRestriction(ColumnSQL, MQuery.LIKE, value, ColumnName, wed.getDisplay()); else if (isProductCategoryField && value instanceof Integer) m_query.addRestriction(getSubCategoryWhereClause(((Integer) value).intValue())); else m_query.addRestriction(ColumnSQL, MQuery.EQUAL, value, ColumnName, wed.getDisplay()); /* if (value.toString().indexOf('%') != -1) m_query.addRestriction(ColumnName, MQuery.LIKE, value, ColumnName, ved.getDisplay()); else m_query.addRestriction(ColumnName, MQuery.EQUAL, value, ColumnName, ved.getDisplay()); */ // end globalqss patch } } // editors m_isCancel = false; // teo_sarca [ 1708717 ] // Test for no records if (getNoOfRecords(m_query, true) != 0) dispose(); } // cmd_ok_Simple public void dispose() { log.config(""); // Find SQL if (m_pstmt != null) { try { m_pstmt.close(); } catch (SQLException e) {} } m_pstmt = null; // TargetFields if (m_targetFields != null) m_targetFields.clear(); m_targetFields = null; // super.dispose(); } // dispose /** * Advanced OK Button pressed */ private void cmd_ok_Advanced() { m_isCancel = false; // teo_sarca [ 1708717 ] // save pending cmd_save(); if (getNoOfRecords(m_query, true) != 0) dispose(); } // cmd_ok_Advanced /** * Save (Advanced) */ private void cmd_save() { log.info(""); // m_query = new MQuery(m_tableName); List<?> rowList = advancedPanel.getChildren(); for (int rowIndex = 1; rowIndex < rowList.size() ; rowIndex++) { // Column ListItem row = (ListItem)rowList.get(rowIndex); Listbox column = (Listbox)row.getFellow("listColumn"+row.getId()); if (column == null) continue; String ColumnName = column.getSelectedItem().getValue().toString(); String infoName = column.toString(); // GridField field = getTargetMField(ColumnName); if(field == null) continue; // Elaine 2008/07/29 boolean isProductCategoryField = isProductCategoryField(field.getAD_Column_ID()); String ColumnSQL = field.getColumnSQL(false); // Op Listbox op = (Listbox)row.getFellow("listOperator"+row.getId()); if (op == null) continue; String Operator = op.getSelectedItem().getValue().toString(); // Value ****** ListCell cellQueryFrom = (ListCell)row.getFellow("cellQueryFrom"+row.getId()); Object value = cellQueryFrom.getAttribute("value"); if (value == null) continue; Object parsedValue = parseValue(field, value); if (parsedValue == null) continue; //encrypt the value if we are searching an encrypted column. if (field.isEncryptedColumn()) { value = SecureEngine.encrypt(value); } String infoDisplay = value.toString(); if (field.isLookup()) infoDisplay = field.getLookup().getDisplay(value); else if (field.getDisplayType() == DisplayType.YesNo) infoDisplay = Msg.getMsg(Env.getCtx(), infoDisplay); // Value2 ****** if (MQuery.OPERATORS[MQuery.BETWEEN_INDEX].equals(op.getSelectedItem().toValueNamePair())) { ListCell cellQueryTo = (ListCell)row.getFellow("cellQueryTo"+row.getId()); Object value2 = cellQueryTo.getAttribute("value"); if (value2 == null) continue; Object parsedValue2 = parseValue(field, value2); String infoDisplay_to = value2.toString(); if (parsedValue2 == null) continue; m_query.addRangeRestriction(ColumnSQL, parsedValue, parsedValue2, infoName, infoDisplay, infoDisplay_to); } else if (isProductCategoryField && MQuery.OPERATORS[MQuery.EQUAL_INDEX].equals(op)) { if (!(parsedValue instanceof Integer)) { continue; } m_query .addRestriction(getSubCategoryWhereClause(((Integer) parsedValue).intValue())); } else m_query.addRestriction(ColumnSQL, Operator, parsedValue, infoName, infoDisplay); } } // cmd_save /** * Get the number of records of target tab * @param query where clause for target tab * @param alertZeroRecords show dialog if there are no records * @return number of selected records; * if the results are more then allowed this method will return 0 **/ private int getNoOfRecords (MQuery query, boolean alertZeroRecords) { log.config("" + query); StringBuffer sql = new StringBuffer("SELECT COUNT(*) FROM "); sql.append(m_tableName); boolean hasWhere = false; if (m_whereExtended != null && m_whereExtended.length() > 0) { sql.append(" WHERE ").append(m_whereExtended); hasWhere = true; } if (query != null && query.isActive()) { if (hasWhere) sql.append(" AND "); else sql.append(" WHERE "); sql.append(query.getWhereClause()); } // Add Access String finalSQL = MRole.getDefault().addAccessSQL(sql.toString(), m_tableName, MRole.SQL_NOTQUALIFIED, MRole.SQL_RO); finalSQL = Env.parseContext(Env.getCtx(), m_targetWindowNo, finalSQL, false); Env.setContext(Env.getCtx(), m_targetWindowNo, TABNO, GridTab.CTX_FindSQL, finalSQL); // Execute Qusery m_total = 999999; try { Statement stmt = DB.createStatement(); ResultSet rs = stmt.executeQuery(finalSQL); if (rs.next()) m_total = rs.getInt(1); rs.close(); stmt.close(); } catch (SQLException e) { log.log(Level.SEVERE, finalSQL, e); } MRole role = MRole.getDefault(); // No Records /* if (m_total == 0 && alertZeroRecords) FDialog.warn(m_targetWindowNo, this, "FindZeroRecords");*/ // More then allowed if (query != null && role.isQueryMax(m_total)) { FDialog.error(m_targetWindowNo, this, "FindOverMax", m_total + " > " + role.getMaxQueryRecords()); m_total = 0; // return 0 if more then allowed - teo_sarca [ 1708717 ] } else log.config("#" + m_total); // /*if (query != null) statusBar.setStatusToolTip (query.getWhereClause());*/ return m_total; } // getNoOfRecords /** * Checks the given column. * @param columnId * @return true if the column is a product category column **/ private boolean isProductCategoryField(int columnId) { X_AD_Column col = new X_AD_Column(Env.getCtx(), columnId, null); if (col.get_ID() == 0) { return false; // column not found... } return MProduct.COLUMNNAME_M_Product_Category_ID.equals(col.getColumnName()); } // isProductCategoryField /** * Returns a sql where string with the given category id and all of its subcategory ids. * It is used as restriction in MQuery. * @param productCategoryId * @return **/ private String getSubCategoryWhereClause(int productCategoryId) { //if a node with this id is found later in the search we have a loop in the tree int subTreeRootParentId = 0; String retString = " M_Product_Category_ID IN ("; String sql = " SELECT M_Product_Category_ID, M_Product_Category_Parent_ID FROM M_Product_Category"; final Vector<SimpleTreeNode> categories = new Vector<SimpleTreeNode>(100); try { Statement stmt = DB.createStatement(); ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { if(rs.getInt(1)==productCategoryId) { subTreeRootParentId = rs.getInt(2); } categories.add(new SimpleTreeNode(rs.getInt(1), rs.getInt(2))); } retString += getSubCategoriesString(productCategoryId, categories, subTreeRootParentId); retString += ") "; rs.close(); stmt.close(); } catch (SQLException e) { log.log(Level.SEVERE, sql, e); retString = ""; } catch (AdempiereSystemError e) { log.log(Level.SEVERE, sql, e); retString = ""; } return retString; } // getSubCategoryWhereClause /** * Recursive search for subcategories with loop detection. * @param productCategoryId * @param categories * @param loopIndicatorId * @return comma seperated list of category ids * @throws AdempiereSystemError if a loop is detected **/ private String getSubCategoriesString(int productCategoryId, Vector<SimpleTreeNode> categories, int loopIndicatorId) throws AdempiereSystemError { String ret = ""; final Iterator<SimpleTreeNode> iter = categories.iterator(); while (iter.hasNext()) { SimpleTreeNode node = (SimpleTreeNode) iter.next(); if (node.getParentId() == productCategoryId) { if (node.getNodeId() == loopIndicatorId) { throw new AdempiereSystemError("The product category tree contains a loop on categoryId: " + loopIndicatorId); } ret = ret + getSubCategoriesString(node.getNodeId(), categories, loopIndicatorId) + ","; } } log.fine(ret); return ret + productCategoryId; } // getSubCategoriesString /** * Simple tree node class for product category tree search. * @author Karsten Thiemann, kthiemann@adempiere.org * **/ private class SimpleTreeNode { private int nodeId; private int parentId; public SimpleTreeNode(int nodeId, int parentId) { this.nodeId = nodeId; this.parentId = parentId; } public int getNodeId() { return nodeId; } public int getParentId() { return parentId; } } // SimpleTreeNode /** * Parse Value * @param field column * @param in value * @return data type corected value **/ private Object parseValue (GridField field, Object in) { if (in == null) return null; int dt = field.getDisplayType(); try { // Return Integer if (dt == DisplayType.Integer || (DisplayType.isID(dt) && field.getColumnName().endsWith("_ID"))) { if (in instanceof Integer) return in; int i = Integer.parseInt(in.toString()); return new Integer(i); } // Return BigDecimal else if (DisplayType.isNumeric(dt)) { if (in instanceof BigDecimal) return in; return DisplayType.getNumberFormat(dt).parse(in.toString()); } // Return Timestamp else if (DisplayType.isDate(dt)) { if (in instanceof Timestamp) return in; long time = 0; try { time = DisplayType.getDateFormat_JDBC().parse(in.toString()).getTime(); return new Timestamp(time); } catch (Exception e) { log.log(Level.SEVERE, in + "(" + in.getClass() + ")" + e); time = DisplayType.getDateFormat(dt).parse(in.toString()).getTime(); } return new Timestamp(time); } // Return Y/N for Boolean else if (in instanceof Boolean) return ((Boolean)in).booleanValue() ? "Y" : "N"; } catch (Exception ex) { log.log(Level.SEVERE, "Object=" + in, ex); String error = ex.getLocalizedMessage(); if (error == null || error.length() == 0) error = ex.toString(); StringBuffer errMsg = new StringBuffer(); errMsg.append(field.getColumnName()).append(" = ").append(in).append(" - ").append(error); // FDialog.error(0, this, "ValidationError", errMsg.toString()); return null; } return in; } // parseValue /************************************************************************** * Get Query - Retrieve result * @return String representation of query */ public MQuery getQuery() { MRole role = MRole.getDefault(); if (role.isQueryMax(getTotalRecords()) && !m_isCancel) { m_query = MQuery.getNoRecordQuery (m_tableName, false); m_total = 0; log.warning("Query - over max"); } else log.info("Query=" + m_query); return m_query; } // getQuery /** * Get Total Records * @return no of records **/ public int getTotalRecords() { return m_total; } // getTotalRecords public void valueChange(ValueChangeEvent evt) { if (evt != null && evt.getSource() instanceof WEditor) { WEditor editor = (WEditor)evt.getSource(); // Editor component Component component = editor.getComponent(); ListCell listcell = (ListCell)component.getParent(); listcell.setAttribute("value", evt.getNewValue()); } } public void OnPostVisible() { if (hasDocNo) Clients.response(new AuFocus(fieldDocumentNo)); else if (hasValue) Clients.response(new AuFocus(fieldValue)); else if (hasName) Clients.response(new AuFocus(fieldName)); else if (m_sEditors.size() > 0 && m_sEditors.get(0) != null) Clients.response(new AuFocus(m_sEditors.get(0).getComponent())); } /** * * @return true if dialog cancel by user, false otherwise */ public boolean isCancel() { return m_isCancel; } /** * @return true if user press the new button */ public boolean isCreateNew() { return m_createNew; } @Override public boolean setVisible(boolean visible) { boolean ret = super.setVisible(visible); if (ret && visible) { Events.echoEvent("OnPostVisible", this, null); } return ret; } private boolean isSearchLike(GridField field) { return DisplayType.isText(field.getDisplayType()) && MColumn.isSuggestSelectionColumn(field.getColumnName(), true); } } // FindPanel