/****************************************************************************** * Product: Adempiere ERP & CRM Smart Business Solution * * Copyright (C) 1999-2006 ComPiere, Inc. 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 * * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA * * or via info@compiere.org or http://www.compiere.org/license.html * *****************************************************************************/ /** * 2007, Modified by Posterita Ltd. */ package org.adempiere.webui.window; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.StringTokenizer; import java.util.logging.Level; import org.adempiere.util.Callback; import org.adempiere.webui.ClientInfo; import org.adempiere.webui.LayoutUtils; import org.adempiere.webui.component.Button; import org.adempiere.webui.component.Checkbox; import org.adempiere.webui.component.Column; import org.adempiere.webui.component.Columns; import org.adempiere.webui.component.ConfirmPanel; import org.adempiere.webui.component.Grid; import org.adempiere.webui.component.GridFactory; import org.adempiere.webui.component.Label; 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.Textbox; import org.adempiere.webui.component.Window; import org.adempiere.webui.session.SessionManager; import org.adempiere.webui.theme.ThemeManager; import org.adempiere.webui.util.ZKUpdateUtil; import org.compiere.model.GridField; import org.compiere.model.MAddressValidation; import org.compiere.model.MBPartnerLocation; import org.compiere.model.MCountry; import org.compiere.model.MLocation; import org.compiere.model.MOrgInfo; import org.compiere.model.MRegion; import org.compiere.model.MSysConfig; import org.compiere.util.CLogger; import org.compiere.util.DB; import org.compiere.util.Env; import org.compiere.util.Msg; import org.compiere.util.Trx; import org.zkoss.zk.ui.Executions; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.event.Events; import org.zkoss.zul.Borderlayout; import org.zkoss.zul.Cell; import org.zkoss.zul.Center; import org.zkoss.zul.South; import org.zkoss.zul.Vbox; /** * Dialog to view and edit location address * @author Sendy Yagambrum * @date July 16, 2007 * @author Cristina Ghita, www.arhipac.ro *
  • FR [ 2794312 ] Location AutoComplete * @author Teo Sarca, teo.sarca@gmail.com *
  • BF [ 2995212 ] NPE on Location dialog * https://sourceforge.net/p/adempiere/zk-web-client/419/ * * @TODO: Implement fOnline button present in swing client * * @contributors - Carlos Ruiz / globalqss * - Show GoogleMap on Location Dialog (integrate approach from LBR) * - http://jira.idempiere.com/browse/IDEMPIERE-147 **/ public class WLocationDialog extends Window implements EventListener { /** * generated serial id */ private static final long serialVersionUID = -9116270523919373406L; /** Logger */ private static final CLogger log = CLogger.getCLogger(WLocationDialog.class); private Label lblAddress1; private Label lblAddress2; private Label lblAddress3; private Label lblAddress4; private Label lblAddress5; private Label lblComments; private Label lblCity; private Label lblZip; private Label lblRegion; private Label lblPostal; private Label lblPostalAdd; private Label lblCountry; private Textbox txtAddress1; private Textbox txtAddress2; private Textbox txtAddress3; private Textbox txtAddress4; private Textbox txtAddress5; private Textbox txtComments; private WAutoCompleterCity txtCity; private Textbox txtPostal; private Textbox txtPostalAdd; private Listbox lstRegion; private Listbox lstCountry; private ConfirmPanel confirmPanel; private Grid mainPanel; private boolean m_change = false; private MLocation m_location; private int m_origCountry_ID; private int s_oldCountry_ID = 0; private int m_WindowNo = 0; private boolean isCityMandatory = false; private boolean isRegionMandatory = false; private boolean isAddress1Mandatory = false; private boolean isAddress2Mandatory = false; private boolean isAddress3Mandatory = false; private boolean isAddress4Mandatory = false; private boolean isAddress5Mandatory = false; private boolean isCommentsMandatory = false; private boolean isPostalMandatory = false; private boolean isPostalAddMandatory = false; private boolean inCountryAction; private boolean inOKAction; private Button toLink; private Button toRoute; private Listbox lstAddressValidation; private Button btnOnline; private Textbox txtResult; private Checkbox cbxValid; private ArrayList enabledCountryList = new ArrayList(); private GridField m_GridField = null; private boolean onSaveError = false; /* SysConfig USE_ESC_FOR_TAB_CLOSING */ private boolean isUseEscForTabClosing = MSysConfig.getBooleanValue(MSysConfig.USE_ESC_FOR_TAB_CLOSING, false, Env.getAD_Client_ID(Env.getCtx())); /** * @param title * @param location */ public WLocationDialog(String title, MLocation location) { this (title, location, null); } /** * @param title * @param location * @param gridField */ public WLocationDialog(String title, MLocation location, GridField gridField) { m_GridField = gridField; m_location = location; if (m_location == null) m_location = new MLocation (Env.getCtx(), 0, null); // Overwrite title if (m_location.getC_Location_ID() == 0) setTitle(Msg.getMsg(Env.getCtx(), "LocationNew")); else setTitle(Msg.getMsg(Env.getCtx(), "LocationUpdate")); // // Reset TAB_INFO context Env.setContext(Env.getCtx(), m_WindowNo, Env.TAB_INFO, "C_Region_ID", null); Env.setContext(Env.getCtx(), m_WindowNo, Env.TAB_INFO, "C_Country_ID", null); // initComponents(); init(); // Current Country for (MCountry country:MCountry.getCountries()) { lstCountry.appendItem(country.toString(), country); } setCountry(); lstCountry.addEventListener(Events.ON_SELECT,this); lstRegion.addEventListener(Events.ON_SELECT,this); m_origCountry_ID = m_location.getC_Country_ID(); // Current Region lstRegion.appendItem("", null); for (MRegion region : MRegion.getRegions(m_origCountry_ID)) { lstRegion.appendItem(region.getTrlName(),region); } if (m_location.getCountry().isHasRegion()) { if (m_location.getCountry().get_Translation(MCountry.COLUMNNAME_RegionName) != null && m_location.getCountry().get_Translation(MCountry.COLUMNNAME_RegionName).trim().length() > 0) lblRegion.setValue(m_location.getCountry().get_Translation(MCountry.COLUMNNAME_RegionName)); else lblRegion.setValue(Msg.getMsg(Env.getCtx(), "Region")); } setRegion(); initLocation(); // if (!ThemeManager.isUseCSSForWindowSize()) { ZKUpdateUtil.setWindowWidthX(this, 380); ZKUpdateUtil.setWindowHeightX(this, 420); // required fixed height for ZK to auto adjust the position based on available space } else { addCallback(AFTER_PAGE_ATTACHED, t -> { ZKUpdateUtil.setCSSHeight(this); ZKUpdateUtil.setCSSWidth(this); }); } this.setSclass("popup-dialog location-dialog"); this.setClosable(true); this.setBorder("normal"); this.setShadow(true); this.setAttribute(Window.MODE_KEY, Window.MODE_HIGHLIGHTED); } /** * Create components */ private void initComponents() { lblAddress1 = new Label(Msg.getElement(Env.getCtx(), "Address1")); lblAddress1.setSclass("field-label"); lblAddress2 = new Label(Msg.getElement(Env.getCtx(), "Address2")); lblAddress2.setSclass("field-label"); lblAddress3 = new Label(Msg.getElement(Env.getCtx(), "Address3")); lblAddress3.setSclass("field-label"); lblAddress4 = new Label(Msg.getElement(Env.getCtx(), "Address4")); lblAddress4.setSclass("field-label"); lblAddress5 = new Label(Msg.getElement(Env.getCtx(), "Address5")); lblAddress5.setSclass("field-label"); lblComments = new Label(Msg.getElement(Env.getCtx(), "Comments")); lblComments.setSclass("field-label"); lblCity = new Label(Msg.getMsg(Env.getCtx(), "City")); lblCity.setSclass("field-label"); lblZip = new Label(Msg.getMsg(Env.getCtx(), "Postal")); lblZip.setSclass("field-label"); lblRegion = new Label(Msg.getMsg(Env.getCtx(), "Region")); lblRegion.setSclass("field-label"); lblPostal = new Label(Msg.getMsg(Env.getCtx(), "Postal")); lblPostal.setSclass("field-label"); lblPostalAdd = new Label(Msg.getMsg(Env.getCtx(), "PostalAdd")); lblPostalAdd.setSclass("field-label"); lblCountry = new Label(Msg.getMsg(Env.getCtx(), "Country")); lblCountry.setSclass("field-label"); txtAddress1 = new Textbox(); txtAddress1.setCols(20); txtAddress1.setMaxlength(MLocation.getFieldLength(MLocation.COLUMNNAME_Address1)); txtAddress2 = new Textbox(); txtAddress2.setCols(20); txtAddress2.setMaxlength(MLocation.getFieldLength(MLocation.COLUMNNAME_Address2)); txtAddress3 = new Textbox(); txtAddress3.setCols(20); txtAddress3.setMaxlength(MLocation.getFieldLength(MLocation.COLUMNNAME_Address3)); txtAddress4 = new Textbox(); txtAddress4.setCols(20); txtAddress4.setMaxlength(MLocation.getFieldLength(MLocation.COLUMNNAME_Address4)); txtAddress5 = new Textbox(); txtAddress5.setCols(20); txtAddress5.setMaxlength(MLocation.getFieldLength(MLocation.COLUMNNAME_Address5)); txtComments = new Textbox(); txtComments.setCols(20); txtComments.setMaxlength(MLocation.getFieldLength(MLocation.COLUMNNAME_Comments)); //autocomplete City txtCity = new WAutoCompleterCity(m_WindowNo); txtCity.setCols(20); txtCity.setMaxlength(MLocation.getFieldLength(MLocation.COLUMNNAME_City)); txtCity.setAutodrop(true); txtCity.setAutocomplete(true); txtCity.addEventListener(Events.ON_CHANGING, this); //txtCity txtPostal = new Textbox(); txtPostal.setCols(20); txtPostal.setMaxlength(MLocation.getFieldLength(MLocation.COLUMNNAME_Postal)); txtPostalAdd = new Textbox(); txtPostalAdd.setCols(20); txtPostalAdd.setMaxlength(MLocation.getFieldLength(MLocation.COLUMNNAME_Postal_Add)); lstRegion = new Listbox(); lstRegion.setMold("select"); ZKUpdateUtil.setWidth(lstRegion, "154px"); lstRegion.setRows(0); lstCountry = new Listbox(); lstCountry.setMold("select"); ZKUpdateUtil.setWidth(lstCountry, "154px"); lstCountry.setRows(0); confirmPanel = new ConfirmPanel(true); confirmPanel.addActionListener(this); toLink = new Button(Msg.getMsg(Env.getCtx(), "Map")); LayoutUtils.addSclass("txt-btn", toLink); toLink.addEventListener(Events.ON_CLICK,this); toRoute = new Button(Msg.getMsg(Env.getCtx(), "Route")); LayoutUtils.addSclass("txt-btn", toRoute); toRoute.addEventListener(Events.ON_CLICK,this); btnOnline = new Button(Msg.getElement(Env.getCtx(), "ValidateAddress")); LayoutUtils.addSclass("txt-btn", btnOnline); btnOnline.addEventListener(Events.ON_CLICK,this); txtResult = new Textbox(); txtResult.setCols(2); txtResult.setRows(3); txtResult.setReadonly(true); cbxValid = new Checkbox(); cbxValid.setText(Msg.getElement(Env.getCtx(), "IsValid")); cbxValid.setDisabled(true); lstAddressValidation = new Listbox(); lstAddressValidation.setMold("select"); ZKUpdateUtil.setWidth(lstAddressValidation, "154px"); lstAddressValidation.setRows(0); mainPanel = GridFactory.newGridLayout(); if (ClientInfo.isMobile()) { if (ClientInfo.maxWidth(ClientInfo.EXTRA_SMALL_WIDTH) || ClientInfo.maxHeight(ClientInfo.SMALL_HEIGHT)) { confirmPanel.addButtonSclass("btn-medium small-image-btn"); } } } /** * Layout dialog */ private void init() { Columns columns = new Columns(); mainPanel.appendChild(columns); Column column = new Column(); columns.appendChild(column); ZKUpdateUtil.setWidth(column, "30%"); column = new Column(); columns.appendChild(column); ZKUpdateUtil.setWidth(column, "70%"); Row pnlAddress1 = new Row(); pnlAddress1.appendChild(lblAddress1); pnlAddress1.appendChild(txtAddress1); ZKUpdateUtil.setHflex(txtAddress1, "1"); Row pnlAddress2 = new Row(); pnlAddress2.appendChild(lblAddress2); pnlAddress2.appendChild(txtAddress2); ZKUpdateUtil.setHflex(txtAddress2, "1"); Row pnlAddress3 = new Row(); pnlAddress3.appendChild(lblAddress3); pnlAddress3.appendChild(txtAddress3); ZKUpdateUtil.setHflex(txtAddress3, "1"); Row pnlAddress4 = new Row(); pnlAddress4.appendChild(lblAddress4); pnlAddress4.appendChild(txtAddress4); ZKUpdateUtil.setHflex(txtAddress4, "1"); Row pnlAddress5 = new Row(); pnlAddress5.appendChild(lblAddress5); pnlAddress5.appendChild(txtAddress5); ZKUpdateUtil.setHflex(txtAddress5, "1"); Row pnlComments = new Row(); pnlComments.appendChild(lblComments); pnlComments.appendChild(txtComments); ZKUpdateUtil.setHflex(txtComments, "1"); Row pnlCity = new Row(); pnlCity.appendChild(lblCity); pnlCity.appendChild(txtCity); ZKUpdateUtil.setHflex(txtCity, "1"); Row pnlPostal = new Row(); pnlPostal.appendChild(lblPostal); pnlPostal.appendChild(txtPostal); ZKUpdateUtil.setHflex(pnlPostal, "1"); Row pnlPostalAdd = new Row(); pnlPostalAdd.appendChild(lblPostalAdd); pnlPostalAdd.appendChild(txtPostalAdd); ZKUpdateUtil.setHflex(txtPostalAdd, "1"); Row pnlRegion = new Row(); pnlRegion.appendChild(lblRegion); pnlRegion.appendChild(lstRegion); ZKUpdateUtil.setHflex(lstRegion, "1"); Row pnlCountry = new Row(); pnlCountry.appendChild(lblCountry); pnlCountry.appendChild(lstCountry); ZKUpdateUtil.setHflex(lstCountry, "1"); Panel pnlLinks = new Panel(); pnlLinks.appendChild(toLink); if (MLocation.LOCATION_MAPS_URL_PREFIX == null) toLink.setVisible(false); pnlLinks.appendChild(toRoute); if (MLocation.LOCATION_MAPS_ROUTE_PREFIX == null || Env.getAD_Org_ID(Env.getCtx()) <= 0) toRoute.setVisible(false); ZKUpdateUtil.setWidth(pnlLinks, "100%"); pnlLinks.setStyle("text-align:right"); Borderlayout borderlayout = new Borderlayout(); this.appendChild(borderlayout); ZKUpdateUtil.setHflex(borderlayout, "1"); ZKUpdateUtil.setVflex(borderlayout, "1"); Center centerPane = new Center(); centerPane.setSclass("dialog-content"); centerPane.setAutoscroll(true); borderlayout.appendChild(centerPane); Vbox vbox = new Vbox(); centerPane.appendChild(vbox); vbox.appendChild(mainPanel); if (MLocation.LOCATION_MAPS_URL_PREFIX != null || MLocation.LOCATION_MAPS_ROUTE_PREFIX != null) vbox.appendChild(pnlLinks); String addressValidation = MSysConfig.getValue(MSysConfig.ADDRESS_VALIDATION, null, Env.getAD_Client_ID(Env.getCtx())); enabledCountryList.clear(); if (addressValidation != null && addressValidation.trim().length() > 0) { StringTokenizer st = new StringTokenizer(addressValidation, ";"); while (st.hasMoreTokens()) { String token = st.nextToken().trim(); enabledCountryList.add(token); } } if (enabledCountryList.size() > 0) { Grid grid = GridFactory.newGridLayout(); vbox.appendChild(grid); columns = new Columns(); grid.appendChild(columns); Rows rows = new Rows(); grid.appendChild(rows); Row row = new Row(); rows.appendChild(row); row.appendCellChild(lstAddressValidation, 2); ZKUpdateUtil.setHflex(lstAddressValidation, "1"); MAddressValidation[] validations = MAddressValidation.getAddressValidation(Env.getCtx(), Env.getAD_Client_ID(Env.getCtx()), null); for (MAddressValidation validation : validations) { ListItem li = lstAddressValidation.appendItem(validation.getName(), validation); if (m_location.getC_AddressValidation_ID() == validation.getC_AddressValidation_ID()) lstAddressValidation.setSelectedItem(li); } if (lstAddressValidation.getSelectedIndex() == -1 && lstAddressValidation.getChildren().size() > 0) lstAddressValidation.setSelectedIndex(0); row = new Row(); rows.appendChild(row); row.appendCellChild(txtResult, 2); ZKUpdateUtil.setHflex(txtResult, "1"); txtResult.setText(m_location.getResult()); row = new Row(); rows.appendChild(row); row.appendChild(cbxValid); cbxValid.setChecked(m_location.isValid()); Cell cell = new Cell(); cell.setColspan(1); cell.setRowspan(1); cell.appendChild(btnOnline); cell.setAlign("right"); row.appendChild(cell); if (!enabledCountryList.isEmpty()) { boolean isEnabled = false; if (m_location.getCountry() != null) { for (String enabledCountry : enabledCountryList) { if (enabledCountry.equals(m_location.getCountry().getCountryCode().trim())) { isEnabled = true; break; } } } btnOnline.setEnabled(isEnabled); } } ZKUpdateUtil.setVflex(vbox, "1"); ZKUpdateUtil.setHflex(vbox, "1"); South southPane = new South(); southPane.setSclass("dialog-footer"); borderlayout.appendChild(southPane); southPane.appendChild(confirmPanel); addEventListener("onSaveError", this); addEventListener(Events.ON_CANCEL, e -> onCancel()); } /** * Add a new row of components to {@link #mainPanel} * @param row Row of components */ private void addComponents(Row row) { if (mainPanel.getRows() != null) mainPanel.getRows().appendChild(row); else mainPanel.newRows().appendChild(row); } /** * Load location details */ private void initLocation() { if (mainPanel.getRows() != null) mainPanel.getRows().getChildren().clear(); MCountry country = m_location.getCountry(); if (log.isLoggable(Level.FINE)) log.fine(country.getName() + ", Region=" + country.isHasRegion() + " " + country.getCaptureSequence() + ", C_Location_ID=" + m_location.getC_Location_ID()); // new Country if (m_location.getC_Country_ID() != s_oldCountry_ID) { lstRegion.getChildren().clear(); if (country.isHasRegion()) { lstRegion.appendItem("", null); for (MRegion region : MRegion.getRegions(country.getC_Country_ID())) { lstRegion.appendItem(region.getTrlName(),region); } if (m_location.getCountry().get_Translation(MCountry.COLUMNNAME_RegionName) != null && m_location.getCountry().get_Translation(MCountry.COLUMNNAME_RegionName).trim().length() > 0) lblRegion.setValue(m_location.getCountry().get_Translation(MCountry.COLUMNNAME_RegionName)); else lblRegion.setValue(Msg.getMsg(Env.getCtx(), "Region")); } s_oldCountry_ID = m_location.getC_Country_ID(); } if (m_location.getC_Region_ID() > 0 && m_location.getC_Region().getC_Country_ID() == country.getC_Country_ID()) { setRegion(); } else { lstRegion.setSelectedItem(null); m_location.setC_Region_ID(0); } if (country.isHasRegion() && m_location.getC_Region_ID() > 0) { Env.setContext(Env.getCtx(), m_WindowNo, Env.TAB_INFO, "C_Region_ID", String.valueOf(m_location.getC_Region_ID())); } else { Env.setContext(Env.getCtx(), m_WindowNo, Env.TAB_INFO, "C_Region_ID", "0"); } Env.setContext(Env.getCtx(), m_WindowNo, Env.TAB_INFO, "C_Country_ID", String.valueOf(country.get_ID())); txtCity.fillList(); // sequence of City Postal Region - @P@ @C@ - @C@, @R@ @P@ String ds = country.getCaptureSequence(); if (ds == null || ds.length() == 0) { log.log(Level.SEVERE, "CaptureSequence empty - " + country); ds = ""; // @C@, @P@ } isCityMandatory = false; isRegionMandatory = false; isAddress1Mandatory = false; isAddress2Mandatory = false; isAddress3Mandatory = false; isAddress4Mandatory = false; isAddress5Mandatory = false; isCommentsMandatory = false; isPostalMandatory = false; isPostalAddMandatory = false; StringTokenizer st = new StringTokenizer(ds, "@", false); while (st.hasMoreTokens()) { String s = st.nextToken(); if (s.startsWith("CO")) { // Country Last addComponents((Row)lstCountry.getParent()); // TODO: Add Online // if (m_location.getCountry().isPostcodeLookup()) { // addLine(line++, lOnline, fOnline); // } } else if (s.startsWith("Com")) { addComponents((Row)txtComments.getParent()); isCommentsMandatory = s.endsWith("!"); } else if (s.startsWith("A1")) { addComponents((Row)txtAddress1.getParent()); isAddress1Mandatory = s.endsWith("!"); } else if (s.startsWith("A2")) { addComponents((Row)txtAddress2.getParent()); isAddress2Mandatory = s.endsWith("!"); } else if (s.startsWith("A3")) { addComponents((Row)txtAddress3.getParent()); isAddress3Mandatory = s.endsWith("!"); } else if (s.startsWith("A4")) { addComponents((Row)txtAddress4.getParent()); isAddress4Mandatory = s.endsWith("!"); } else if (s.startsWith("A5")) { addComponents((Row)txtAddress5.getParent()); isAddress5Mandatory = s.endsWith("!"); } else if (s.startsWith("C")) { addComponents((Row)txtCity.getParent()); isCityMandatory = s.endsWith("!"); } else if (s.startsWith("P")) { addComponents((Row)txtPostal.getParent()); isPostalMandatory = s.endsWith("!"); } else if (s.startsWith("A")) { addComponents((Row)txtPostalAdd.getParent()); isPostalAddMandatory = s.endsWith("!"); } else if (s.startsWith("R") && m_location.getCountry().isHasRegion()) { addComponents((Row)lstRegion.getParent()); isRegionMandatory = s.endsWith("!"); } } setPlaceholders(); // Fill it if (m_location.getC_Location_ID() != 0) { txtAddress1.setText(m_location.getAddress1()); txtAddress2.setText(m_location.getAddress2()); txtAddress3.setText(m_location.getAddress3()); txtAddress4.setText(m_location.getAddress4()); txtAddress5.setText(m_location.getAddress5()); txtComments.setText(m_location.getComments()); txtCity.setText(m_location.getCity()); txtPostal.setText(m_location.getPostal()); txtPostalAdd.setText(m_location.getPostal_Add()); if (m_location.getCountry().isHasRegion()) { if (m_location.getCountry().get_Translation(MCountry.COLUMNNAME_RegionName) != null && m_location.getCountry().get_Translation(MCountry.COLUMNNAME_RegionName).trim().length() > 0) lblRegion.setValue(m_location.getCountry().get_Translation(MCountry.COLUMNNAME_RegionName)); else lblRegion.setValue(Msg.getMsg(Env.getCtx(), "Region")); setRegion(); } setCountry(); } } /** * Set selected country from {@link #m_location} */ private void setCountry() { List listCountry = lstCountry.getChildren(); Iterator iter = listCountry.iterator(); while (iter.hasNext()) { ListItem listitem = (ListItem)iter.next(); if (m_location.getCountry().equals(listitem.getValue())) { lstCountry.setSelectedItem(listitem); } } } /** * Set selected region from {@link #m_location} */ private void setRegion() { if (m_location.getRegion() != null) { List listState = lstRegion.getChildren(); Iterator iter = listState.iterator(); while (iter.hasNext()) { ListItem listitem = (ListItem)iter.next(); if (m_location.getRegion().equals(listitem.getValue())) { lstRegion.setSelectedItem(listitem); } } } else { lstRegion.setSelectedItem(null); } } /** * @return true if changed */ public boolean isChanged() { return m_change; } // isChanged /** * @return location */ public MLocation getValue() { return m_location; } @Override public void onEvent(Event event) throws Exception { if (event.getTarget() == confirmPanel.getButton(ConfirmPanel.A_OK)) { onSaveError = false; inOKAction = true; if (m_location.getCountry().isHasRegion() && lstRegion.getSelectedItem() == null) { if (txtCity.getC_Region_ID() > 0 && txtCity.getC_Region_ID() != m_location.getC_Region_ID()) { m_location.setRegion(MRegion.get(Env.getCtx(), txtCity.getC_Region_ID())); setRegion(); } } String msg = validate_OK(); if (msg != null) { onSaveError = true; Dialog.error(0, "FillMandatory", Msg.parseTranslation(Env.getCtx(), msg), new Callback() { @Override public void onCallback(Integer result) { Events.echoEvent("onSaveError", WLocationDialog.this, null); } }); inOKAction = false; return; } if (action_OK()) { m_change = true; inOKAction = false; this.dispose(); } else { onSaveError = true; Dialog.error(0, "CityNotFound", (String)null, new Callback() { @Override public void onCallback(Integer result) { Events.echoEvent("onSaveError", WLocationDialog.this, null); } }); } inOKAction = false; } else if (event.getTarget() == confirmPanel.getButton(ConfirmPanel.A_CANCEL)) { onCancel(); } else if (toLink.equals(event.getTarget())) { String urlString = MLocation.LOCATION_MAPS_URL_PREFIX + getFullAdress(); String message = null; try { Executions.getCurrent().sendRedirect(urlString, "_blank"); } catch (Exception e) { message = e.getMessage(); Dialog.warn(0, "URLnotValid", message, null); } } else if (toRoute.equals(event.getTarget())) { int AD_Org_ID = Env.getAD_Org_ID(Env.getCtx()); if (AD_Org_ID != 0){ MOrgInfo orgInfo = MOrgInfo.get(Env.getCtx(), AD_Org_ID,null); MLocation orgLocation = new MLocation(Env.getCtx(),orgInfo.getC_Location_ID(),null); String urlString = MLocation.LOCATION_MAPS_ROUTE_PREFIX + MLocation.LOCATION_MAPS_SOURCE_ADDRESS + orgLocation.getMapsLocation() + //org MLocation.LOCATION_MAPS_DESTINATION_ADDRESS + getFullAdress(); //partner String message = null; try { Executions.getCurrent().sendRedirect(urlString, "_blank"); } catch (Exception e) { message = e.getMessage(); Dialog.warn(0, "URLnotValid", message, null); } } } else if (btnOnline.equals(event.getTarget())) { btnOnline.setEnabled(false); onSaveError = false; inOKAction = true; if (m_location.getCountry().isHasRegion() && lstRegion.getSelectedItem() == null) { if (txtCity.getC_Region_ID() > 0 && txtCity.getC_Region_ID() != m_location.getC_Region_ID()) { m_location.setRegion(MRegion.get(Env.getCtx(), txtCity.getC_Region_ID())); setRegion(); } } String msg = validate_OK(); if (msg != null) { onSaveError = true; Dialog.error(0, "FillMandatory", Msg.parseTranslation(Env.getCtx(), msg), new Callback() { @Override public void onCallback(Integer result) { Events.echoEvent("onSaveError", WLocationDialog.this, null); } }); inOKAction = false; return; } MLocation m_location = new MLocation(Env.getCtx(), 0, null); m_location.setAddress1(txtAddress1.getValue()); m_location.setAddress2(txtAddress2.getValue()); m_location.setAddress3(txtAddress3.getValue()); m_location.setAddress4(txtAddress4.getValue()); m_location.setAddress5(txtAddress5.getValue()); m_location.setComments(txtComments.getValue()); m_location.setC_City_ID(txtCity.getC_City_ID()); m_location.setCity(txtCity.getValue()); m_location.setPostal(txtPostal.getValue()); // Country/Region MCountry country = (MCountry)lstCountry.getSelectedItem().getValue(); m_location.setCountry(country); if (country.isHasRegion() && lstRegion.getSelectedItem() != null) { MRegion r = (MRegion)lstRegion.getSelectedItem().getValue(); m_location.setRegion(r); } else { m_location.setC_Region_ID(0); } MAddressValidation validation = lstAddressValidation.getSelectedItem().getValue(); if (validation == null && lstAddressValidation.getChildren().size() > 0) validation = lstAddressValidation.getItemAtIndex(0).getValue(); if (validation != null) { boolean ok = m_location.processOnline(validation.getC_AddressValidation_ID()); txtResult.setText(m_location.getResult()); cbxValid.setChecked(m_location.isValid()); List list = lstAddressValidation.getChildren(); Iterator iter = list.iterator(); while (iter.hasNext()) { ListItem listitem = (ListItem)iter.next(); if (m_location.getC_AddressValidation().equals(listitem.getValue())) { lstAddressValidation.setSelectedItem(listitem); break; } } if (!ok) { onSaveError = true; Dialog.error(0, "Error", m_location.getErrorMessage(), new Callback() { @Override public void onCallback(Integer result) { Events.echoEvent("onSaveError", WLocationDialog.this, null); } }); } } inOKAction = false; btnOnline.setEnabled(true); } // Country Changed - display in new Format else if (lstCountry.equals(event.getTarget())) { inCountryAction = true; MCountry c = (MCountry)lstCountry.getSelectedItem().getValue(); m_location.setCountry(c); m_location.setC_City_ID(0); m_location.setCity(null); // refresh initLocation(); if (!enabledCountryList.isEmpty()) { boolean isEnabled = false; if (c != null) { for (String enabledCountry : enabledCountryList) { if (enabledCountry.equals(c.getCountryCode().trim())) { isEnabled = true; break; } } } btnOnline.setEnabled(isEnabled); } inCountryAction = false; lstCountry.focus(); } // Region Changed else if (lstRegion.equals(event.getTarget())) { if (inCountryAction || inOKAction) return; MRegion r = (MRegion)lstRegion.getSelectedItem().getValue(); m_location.setRegion(r); m_location.setC_City_ID(0); m_location.setCity(null); // refresh initLocation(); lstRegion.focus(); } else if ("onSaveError".equals(event.getName())) { onSaveError = false; doPopup(); focus(); } } /** * Handle onCancel event */ private void onCancel() { // do not allow to close tab for Events.ON_CTRL_KEY event if(isUseEscForTabClosing) SessionManager.getAppDesktop().setCloseTabWithShortcut(false); m_change = false; this.dispose(); } /** * Validate mandatory fields.
    * LCO - address 1, region and city required * @return error messages or null */ private String validate_OK() { String fields = ""; if (isAddress1Mandatory && txtAddress1.getText().trim().length() == 0) { fields = fields + " " + "@Address1@, "; } if (isAddress2Mandatory && txtAddress2.getText().trim().length() == 0) { fields = fields + " " + "@Address2@, "; } if (isAddress3Mandatory && txtAddress3.getText().trim().length() == 0) { fields = fields + " " + "@Address3@, "; } if (isAddress4Mandatory && txtAddress4.getText().trim().length() == 0) { fields = fields + " " + "@Address4@, "; } if (isAddress5Mandatory && txtAddress5.getText().trim().length() == 0) { fields = fields + " " + "@Address5@, "; } if (isCommentsMandatory && txtComments.getText().trim().length() == 0) { fields = fields + " " + "@Comments@, "; } if (isCityMandatory && txtCity.getValue().trim().length() == 0) { fields = fields + " " + "@C_City_ID@, "; } if (isRegionMandatory && lstRegion.getSelectedItem() == null) { fields = fields + " " + "@C_Region_ID@, "; } if (isPostalMandatory && txtPostal.getText().trim().length() == 0) { fields = fields + " " + "@Postal@, "; } if (isPostalAddMandatory && txtPostalAdd.getText().trim().length() == 0) { fields = fields + " " + "@PostalAdd@, "; } if (fields.trim().length() > 0) return fields.substring(0, fields.length() -2); return null; } /** * Handle OK button event - check for changes (save them) & Exit */ private boolean action_OK() { Trx trx = Trx.get(Trx.createTrxName("WLocationDialog"), true); trx.setDisplayName(getClass().getName()+"_action_Ok"); m_location.set_TrxName(trx.getTrxName()); m_location.setAddress1(txtAddress1.getValue()); m_location.setAddress2(txtAddress2.getValue()); m_location.setAddress3(txtAddress3.getValue()); m_location.setAddress4(txtAddress4.getValue()); m_location.setAddress5(txtAddress5.getValue()); m_location.setComments(txtComments.getValue()); m_location.setC_City_ID(txtCity.getC_City_ID()); m_location.setCity(txtCity.getValue()); m_location.setPostal(txtPostal.getValue()); m_location.setPostal_Add(txtPostalAdd.getValue()); // Country/Region MCountry country = (MCountry)lstCountry.getSelectedItem().getValue(); m_location.setCountry(country); if (country.isHasRegion() && lstRegion.getSelectedItem() != null) { MRegion r = (MRegion)lstRegion.getSelectedItem().getValue(); m_location.setRegion(r); } else { m_location.setC_Region_ID(0); } if (lstAddressValidation.getSelectedIndex() != -1) { MAddressValidation validation = (MAddressValidation) lstAddressValidation.getSelectedItem().getValue(); m_location.setC_AddressValidation_ID(validation.getC_AddressValidation_ID()); } boolean changedCity = m_location.is_ValueChanged(MLocation.COLUMNNAME_City) || m_location.is_ValueChanged(MLocation.COLUMNNAME_C_City_ID); boolean changedAddress1 = m_location.is_ValueChanged(MLocation.COLUMNNAME_Address1); boolean changedAddress2 = m_location.is_ValueChanged(MLocation.COLUMNNAME_Address2); boolean changedRegion = m_location.is_ValueChanged(MLocation.COLUMNNAME_RegionName) || m_location.is_ValueChanged(MLocation.COLUMNNAME_C_Region_ID); // Save changes boolean success = m_location.save(); if (success) { // IDEMPIERE-417 Force Update BPLocation.Name // just trigger BPLocation name change when the location change affects the name: // START_VALUE_BPLOCATION_NAME // 0 - City // 1 - City + Address1 // 2 - City + Address1 + Address2 // 3 - City + Address1 + Address2 + Region // 4 - City + Address1 + Address2 + Region + ID int bplocname = MSysConfig.getIntValue(MSysConfig.START_VALUE_BPLOCATION_NAME, 0, m_location.getAD_Client_ID(), m_location.getAD_Org_ID()); if (bplocname < 0 || bplocname > 4) bplocname = 0; if ( changedCity || (bplocname >= 1 && changedAddress1) || (bplocname >= 2 && changedAddress2) || (bplocname >= 3 && changedRegion) ) { if ( m_GridField != null && m_GridField.getGridTab() != null && "C_BPartner_Location".equals(m_GridField.getGridTab().getTableName()) && !m_GridField.getGridTab().getValueAsBoolean("IsPreserveCustomName")) { m_GridField.getGridTab().setValue("Name", "."); } else { //Update BP_Location name IDEMPIERE 417 int bplID = DB.getSQLValueEx(trx.getTrxName(), MLocation.updateBPLocName, m_location.getC_Location_ID()); if (bplID>0) { MBPartnerLocation bpl = new MBPartnerLocation(Env.getCtx(), bplID, trx.getTrxName()); bpl.setName(bpl.getBPLocName(m_location)); success = bpl.save(); } } } } if (success) { trx.commit(); } else { trx.rollback(); } trx.close(); return success; } // actionOK /** * @return true if there's error saving changes */ public boolean isOnSaveError() { return onSaveError; } @Override public void dispose() { if (!m_change && m_location != null && !m_location.is_new()) { m_location = new MLocation(m_location.getCtx(), m_location.get_ID(), null); } super.dispose(); } /** * @return string that contains all fields of current form */ protected String getFullAdress() { MRegion region = null; if (lstRegion.getSelectedItem()!=null) region = new MRegion(Env.getCtx(), ((MRegion)lstRegion.getSelectedItem().getValue()).getC_Region_ID(), null); MCountry c = (MCountry)lstCountry.getSelectedItem().getValue(); String address = ""; address = address + (txtAddress1.getText() != null ? txtAddress1.getText() + ", " : ""); address = address + (txtAddress2.getText() != null ? txtAddress2.getText() + ", " : ""); address = address + (txtAddress3.getText() != null ? txtAddress3.getText() + ", " : ""); address = address + (txtAddress4.getText() != null ? txtAddress4.getText() + ", " : ""); address = address + (txtCity.getText() != null ? txtCity.getText() + ", " : ""); if (region != null) address = address + (region.getName() != null ? region.getName() + ", " : ""); address = address + (c.getName() != null ? c.getName() : ""); return address.replace(" ", "+"); } /** * set place holder text for fields */ protected void setPlaceholders() { txtAddress1.setPlaceholder(MCountry.get(Env.getCtx(), s_oldCountry_ID).get_Translation("PlaceholderAddress1")); txtAddress2.setPlaceholder(MCountry.get(Env.getCtx(), s_oldCountry_ID).get_Translation("PlaceholderAddress2")); txtAddress3.setPlaceholder(MCountry.get(Env.getCtx(), s_oldCountry_ID).get_Translation("PlaceholderAddress3")); txtAddress4.setPlaceholder(MCountry.get(Env.getCtx(), s_oldCountry_ID).get_Translation("PlaceholderAddress4")); txtAddress5.setPlaceholder(MCountry.get(Env.getCtx(), s_oldCountry_ID).get_Translation("PlaceholderAddress5")); txtComments.setPlaceholder(MCountry.get(Env.getCtx(), s_oldCountry_ID).get_Translation("PlaceholderComments")); txtCity.setPlaceholder(MCountry.get(Env.getCtx(), s_oldCountry_ID).get_Translation("PlaceholderCity")); txtPostal.setPlaceholder(MCountry.get(Env.getCtx(), s_oldCountry_ID).get_Translation("PlaceholderPostal")); txtPostalAdd.setPlaceholder(MCountry.get(Env.getCtx(), s_oldCountry_ID).get_Translation("PlaceholderPostal_Add")); // TODO set the placeholder for Region (ATM, lstRegion doesn't handle placeholder) } }