diff --git a/migration/i2.0z/oracle/201405311604_IDEMPIERE-1972.sql b/migration/i2.0z/oracle/201405311604_IDEMPIERE-1972.sql
new file mode 100644
index 0000000000..af84580815
--- /dev/null
+++ b/migration/i2.0z/oracle/201405311604_IDEMPIERE-1972.sql
@@ -0,0 +1,63 @@
+SET SQLBLANKLINES ON
+SET DEFINE OFF
+
+-- May 31, 2014 10:33:25 AM ICT
+-- I forgot to set the DICTIONARY_ID_COMMENTS System Configurator
+INSERT INTO AD_Column (SeqNoSelection,IsSyncDatabase,Version,AD_Column_ID,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsParent,FieldLength,IsSelectionColumn,IsKey,IsAutocomplete,IsAllowLogging,AD_Column_UU,IsUpdateable,ColumnName,Description,Help,Name,IsAllowCopy,Updated,CreatedBy,AD_Org_ID,IsActive,Created,UpdatedBy,IsToolbarButton,IsAlwaysUpdateable,AD_Client_ID,EntityType,IsEncrypted,IsSecure,AD_Element_ID,AD_Reference_ID,AD_Table_ID) VALUES (0,'N',0,211274,'N','N','N',0,'N',2000,'N','N','N','Y','f39fb481-a7f3-477b-924f-653478cf27b5','Y','DisplayLogic','If the Field is displayed, the result determines if the field is actually displayed','format := {expression} [{logic} {expression}]
+expression := @{context}@{operand}{value} or @{context}@{operand}{value}
+logic := {|}|{&}
+context := any global or window context
+value := strings or numbers
+logic operators := AND or OR with the previous result from left to right
+operand := eq{=}, gt{>}, le{<}, not{~^!}
+Examples:
+@AD_Table_ID@=14 | @Language@!GERGER
+@PriceLimit@>10 | @PriceList@>@PriceActual@
+@Name@>J
+Strings may be in single quotes (optional)','Display Logic','Y',TO_DATE('2014-05-31 10:33:19','YYYY-MM-DD HH24:MI:SS'),100,0,'Y',TO_DATE('2014-05-31 10:33:19','YYYY-MM-DD HH24:MI:SS'),100,'N','N',0,'D','N','N',283,14,200129)
+;
+
+-- May 31, 2014 10:33:35 AM ICT
+ALTER TABLE AD_InfoProcess ADD DisplayLogic VARCHAR2(2000) DEFAULT NULL
+;
+
+-- May 31, 2014 10:35:29 AM ICT
+INSERT INTO AD_Field (SortNo,IsEncrypted,AD_Tab_ID,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,AD_Field_ID,IsReadOnly,Help,Description,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,UpdatedBy,AD_Org_ID,CreatedBy,Updated,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,EntityType,Created) VALUES (0,'N',200142,0,'N','N',120,'Y',203050,'N','format := {expression} [{logic} {expression}]
+expression := @{context}@{operand}{value} or @{context}@{operand}{value}
+logic := {|}|{&}
+context := any global or window context
+value := strings or numbers
+logic operators := AND or OR with the previous result from left to right
+operand := eq{=}, gt{>}, le{<}, not{~^!}
+Examples:
+@AD_Table_ID@=14 | @Language@!GERGER
+@PriceLimit@>10 | @PriceList@>@PriceActual@
+@Name@>J
+Strings may be in single quotes (optional)','If the Field is displayed, the result determines if the field is actually displayed','Display Logic','c6112319-f905-4614-a2ee-f27945e414be','Y','N',100,0,100,TO_DATE('2014-05-31 10:35:23','YYYY-MM-DD HH24:MI:SS'),'Y','Y',60,1,'N',0,1,1,'N','N',211274,'D',TO_DATE('2014-05-31 10:35:23','YYYY-MM-DD HH24:MI:SS'))
+;
+
+-- May 31, 2014 10:36:44 AM ICT
+UPDATE AD_Field SET SeqNo=50,Updated=TO_DATE('2014-05-31 10:36:44','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=203035
+;
+
+-- May 31, 2014 10:36:44 AM ICT
+UPDATE AD_Field SET SeqNo=60,Updated=TO_DATE('2014-05-31 10:36:44','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=203036
+;
+
+-- May 31, 2014 10:36:44 AM ICT
+UPDATE AD_Field SET SeqNo=70,Updated=TO_DATE('2014-05-31 10:36:44','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=203037
+;
+
+-- May 31, 2014 10:36:44 AM ICT
+UPDATE AD_Field SET SeqNo=80,Updated=TO_DATE('2014-05-31 10:36:44','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=203038
+;
+
+-- May 31, 2014 10:36:44 AM ICT
+UPDATE AD_Field SET SeqNo=90, ColumnSpan=5,Updated=TO_DATE('2014-05-31 10:36:44','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=203050
+;
+
+-- May 31, 2014 10:39:24 AM ICT
+UPDATE AD_Field SET SeqNo=90, NumLines=2,Updated=TO_DATE('2014-05-31 10:39:24','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=203050
+;
+SELECT register_migration_script('201405311604_IDEMPIERE-1972.sql') FROM dual
+;
diff --git a/migration/i2.0z/postgresql/201405311604_IDEMPIERE-1972.sql b/migration/i2.0z/postgresql/201405311604_IDEMPIERE-1972.sql
new file mode 100644
index 0000000000..d5caaebe1d
--- /dev/null
+++ b/migration/i2.0z/postgresql/201405311604_IDEMPIERE-1972.sql
@@ -0,0 +1,60 @@
+-- May 31, 2014 10:33:25 AM ICT
+-- I forgot to set the DICTIONARY_ID_COMMENTS System Configurator
+INSERT INTO AD_Column (SeqNoSelection,IsSyncDatabase,Version,AD_Column_ID,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsParent,FieldLength,IsSelectionColumn,IsKey,IsAutocomplete,IsAllowLogging,AD_Column_UU,IsUpdateable,ColumnName,Description,Help,Name,IsAllowCopy,Updated,CreatedBy,AD_Org_ID,IsActive,Created,UpdatedBy,IsToolbarButton,IsAlwaysUpdateable,AD_Client_ID,EntityType,IsEncrypted,IsSecure,AD_Element_ID,AD_Reference_ID,AD_Table_ID) VALUES (0,'N',0,211274,'N','N','N',0,'N',2000,'N','N','N','Y','f39fb481-a7f3-477b-924f-653478cf27b5','Y','DisplayLogic','If the Field is displayed, the result determines if the field is actually displayed','format := {expression} [{logic} {expression}]
+expression := @{context}@{operand}{value} or @{context}@{operand}{value}
+logic := {|}|{&}
+context := any global or window context
+value := strings or numbers
+logic operators := AND or OR with the previous result from left to right
+operand := eq{=}, gt{>}, le{<}, not{~^!}
+Examples:
+@AD_Table_ID@=14 | @Language@!GERGER
+@PriceLimit@>10 | @PriceList@>@PriceActual@
+@Name@>J
+Strings may be in single quotes (optional)','Display Logic','Y',TO_TIMESTAMP('2014-05-31 10:33:19','YYYY-MM-DD HH24:MI:SS'),100,0,'Y',TO_TIMESTAMP('2014-05-31 10:33:19','YYYY-MM-DD HH24:MI:SS'),100,'N','N',0,'D','N','N',283,14,200129)
+;
+
+-- May 31, 2014 10:33:35 AM ICT
+ALTER TABLE AD_InfoProcess ADD COLUMN DisplayLogic VARCHAR(2000) DEFAULT NULL
+;
+
+-- May 31, 2014 10:35:29 AM ICT
+INSERT INTO AD_Field (SortNo,IsEncrypted,AD_Tab_ID,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,AD_Field_ID,IsReadOnly,Help,Description,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,UpdatedBy,AD_Org_ID,CreatedBy,Updated,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,EntityType,Created) VALUES (0,'N',200142,0,'N','N',120,'Y',203050,'N','format := {expression} [{logic} {expression}]
+expression := @{context}@{operand}{value} or @{context}@{operand}{value}
+logic := {|}|{&}
+context := any global or window context
+value := strings or numbers
+logic operators := AND or OR with the previous result from left to right
+operand := eq{=}, gt{>}, le{<}, not{~^!}
+Examples:
+@AD_Table_ID@=14 | @Language@!GERGER
+@PriceLimit@>10 | @PriceList@>@PriceActual@
+@Name@>J
+Strings may be in single quotes (optional)','If the Field is displayed, the result determines if the field is actually displayed','Display Logic','c6112319-f905-4614-a2ee-f27945e414be','Y','N',100,0,100,TO_TIMESTAMP('2014-05-31 10:35:23','YYYY-MM-DD HH24:MI:SS'),'Y','Y',60,1,'N',0,1,1,'N','N',211274,'D',TO_TIMESTAMP('2014-05-31 10:35:23','YYYY-MM-DD HH24:MI:SS'))
+;
+
+-- May 31, 2014 10:36:44 AM ICT
+UPDATE AD_Field SET SeqNo=50,Updated=TO_TIMESTAMP('2014-05-31 10:36:44','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=203035
+;
+
+-- May 31, 2014 10:36:44 AM ICT
+UPDATE AD_Field SET SeqNo=60,Updated=TO_TIMESTAMP('2014-05-31 10:36:44','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=203036
+;
+
+-- May 31, 2014 10:36:44 AM ICT
+UPDATE AD_Field SET SeqNo=70,Updated=TO_TIMESTAMP('2014-05-31 10:36:44','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=203037
+;
+
+-- May 31, 2014 10:36:44 AM ICT
+UPDATE AD_Field SET SeqNo=80,Updated=TO_TIMESTAMP('2014-05-31 10:36:44','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=203038
+;
+
+-- May 31, 2014 10:36:44 AM ICT
+UPDATE AD_Field SET SeqNo=90, ColumnSpan=5,Updated=TO_TIMESTAMP('2014-05-31 10:36:44','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=203050
+;
+
+-- May 31, 2014 10:39:24 AM ICT
+UPDATE AD_Field SET SeqNo=90, NumLines=2,Updated=TO_TIMESTAMP('2014-05-31 10:39:24','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=203050
+;
+SELECT register_migration_script('201405311604_IDEMPIERE-1972.sql') FROM dual
+;
diff --git a/org.adempiere.base/src/org/adempiere/model/MInfoProcess.java b/org.adempiere.base/src/org/adempiere/model/MInfoProcess.java
index 101eb3f568..00cdd8b63a 100644
--- a/org.adempiere.base/src/org/adempiere/model/MInfoProcess.java
+++ b/org.adempiere.base/src/org/adempiere/model/MInfoProcess.java
@@ -15,8 +15,12 @@ package org.adempiere.model;
import java.sql.ResultSet;
import java.util.Properties;
-
+import java.util.logging.Level;
+import org.compiere.model.MProcess;
import org.compiere.model.X_AD_InfoProcess;
+import org.compiere.util.Env;
+import org.compiere.util.Evaluatee;
+import org.compiere.util.Evaluator;
/**
* Contain info of process in info window
@@ -52,4 +56,34 @@ public class MInfoProcess extends X_AD_InfoProcess {
}
+ /**************************************************************************
+ * Is the Column Visible ? Evaluater base in display logic expression and context of this po
+ * @return true, if visible
+ */
+ public boolean isDisplayed (final int windowNo)
+ {
+ return isDisplayed(this.getCtx(), windowNo);
+}
+
+ /**************************************************************************
+ * Is the Column Visible ? Evaluater base in display logic expression and context
+ * @param ctx
+ * @return
+ */
+ public boolean isDisplayed(final Properties ctx, final int windowNo) {
+ if (getDisplayLogic() == null || getDisplayLogic().trim().length() == 0)
+ return true;
+
+ Evaluatee evaluatee = new Evaluatee() {
+ public String get_ValueAsString(String variableName) {
+ return Env.getContext (ctx, windowNo, variableName, true);
+ }
+ };
+
+ boolean retValue = Evaluator.evaluateLogic(evaluatee, getDisplayLogic());
+ if (log.isLoggable(Level.FINEST)) log.finest(MProcess.get(getCtx(), getAD_Process_ID()).getName()
+ + " (" + getDisplayLogic() + ") => " + retValue);
+ return retValue;
+ }
+
}
diff --git a/org.adempiere.base/src/org/compiere/model/I_AD_InfoProcess.java b/org.adempiere.base/src/org/compiere/model/I_AD_InfoProcess.java
index 8b4aeb384d..9adeeda0ef 100644
--- a/org.adempiere.base/src/org/compiere/model/I_AD_InfoProcess.java
+++ b/org.adempiere.base/src/org/compiere/model/I_AD_InfoProcess.java
@@ -126,6 +126,19 @@ public interface I_AD_InfoProcess
*/
public int getCreatedBy();
+ /** Column name DisplayLogic */
+ public static final String COLUMNNAME_DisplayLogic = "DisplayLogic";
+
+ /** Set Display Logic.
+ * If the Field is displayed, the result determines if the field is actually displayed
+ */
+ public void setDisplayLogic (String DisplayLogic);
+
+ /** Get Display Logic.
+ * If the Field is displayed, the result determines if the field is actually displayed
+ */
+ public String getDisplayLogic();
+
/** Column name ImageURL */
public static final String COLUMNNAME_ImageURL = "ImageURL";
diff --git a/org.adempiere.base/src/org/compiere/model/X_AD_InfoProcess.java b/org.adempiere.base/src/org/compiere/model/X_AD_InfoProcess.java
index 17f83277af..a88e564dce 100644
--- a/org.adempiere.base/src/org/compiere/model/X_AD_InfoProcess.java
+++ b/org.adempiere.base/src/org/compiere/model/X_AD_InfoProcess.java
@@ -30,7 +30,7 @@ public class X_AD_InfoProcess extends PO implements I_AD_InfoProcess, I_Persiste
/**
*
*/
- private static final long serialVersionUID = 20140529L;
+ private static final long serialVersionUID = 20140531L;
/** Standard Constructor */
public X_AD_InfoProcess (Properties ctx, int AD_InfoProcess_ID, String trxName)
@@ -174,6 +174,23 @@ public class X_AD_InfoProcess extends PO implements I_AD_InfoProcess, I_Persiste
return new KeyNamePair(get_ID(), String.valueOf(getAD_Process_ID()));
}
+ /** Set Display Logic.
+ @param DisplayLogic
+ If the Field is displayed, the result determines if the field is actually displayed
+ */
+ public void setDisplayLogic (String DisplayLogic)
+ {
+ set_Value (COLUMNNAME_DisplayLogic, DisplayLogic);
+ }
+
+ /** Get Display Logic.
+ @return If the Field is displayed, the result determines if the field is actually displayed
+ */
+ public String getDisplayLogic ()
+ {
+ return (String)get_Value(COLUMNNAME_DisplayLogic);
+ }
+
/** Set Image URL.
@param ImageURL
URL of image
diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/info/InfoWindow.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/info/InfoWindow.java
index b982ed8689..1631e19bb2 100644
--- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/info/InfoWindow.java
+++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/info/InfoWindow.java
@@ -78,7 +78,6 @@ import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.ComboitemRenderer;
import org.zkoss.zul.Div;
-import org.zkoss.zul.ListModel;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Menuitem;
import org.zkoss.zul.North;
@@ -123,7 +122,30 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
private List gridFields;
private int AD_InfoWindow_ID;
private Checkbox checkAND;
-
+ /**
+ * All info process of this infoWindow
+ */
+ protected MInfoProcess [] infoProcessList;
+ /**
+ * flag detect exists info process
+ */
+ protected boolean haveProcess = false;
+ /**
+ * Info process have style is button
+ */
+ protected List infoProcessBtList;
+ /**
+ * Info process have style is drop down list
+ */
+ protected List infoProcessDropList;
+ /**
+ * Info process have style is menu
+ */
+ protected List infoProcessMenuList;
+ /**
+ * Menu contail process menu item
+ */
+ protected Menupopup ipMenu;
/**
* @param WindowNo
* @param tableName
@@ -169,7 +191,7 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
// make process button only in windown mode
if (!m_lookup){
// IDEMPIERE-1334
- boolean haveProcess = initInfoProcess();
+ initInfoProcess();
// when have a process, force multi select mode
if (haveProcess)
p_multipleSelection = true;
@@ -194,29 +216,38 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
/**
* IDEMPIERE-1334
* load info process info
- * layout each info process as button or dropdown item
+ * separate by layout type
+ * init drop list and menu control
+ * set status of haveProcess flag
* @return true when have process, false when no process
*/
- protected boolean initInfoProcess() {
+ protected void initInfoProcess() {
if (infoWindow == null){
- return false;
+ return;
}
- MInfoProcess [] infoProcessList = infoWindow.getInfoProcess(false);
+ infoProcessList = infoWindow.getInfoProcess(false);
+
+ if (infoProcessList.length == 0)
+ return;
+
+ haveProcess = true;
// ** layout info process flow order (button list, drop down, dialog,...)
- // each layout type in a loop to ensure this order
-
- // get info from process (name, help, des), set to name of button, item menu,...
- MProcess process = null;
// make list process button
for (MInfoProcess infoProcess : infoProcessList){
// just add info process have layout is button
- if (!MInfoProcess.LAYOUTTYPE_Button.equals(infoProcess.getLayoutType())){
+ if (!MInfoProcess.LAYOUTTYPE_Button.equals(infoProcess.getLayoutType()))
continue;
- }
- process = MProcess.get(Env.getCtx(), infoProcess.getAD_Process_ID());
+
+ if (infoProcessBtList == null)
+ infoProcessBtList = new ArrayList ();
+
+ infoProcessBtList.add(infoProcess);
+
+ // make process button
+ MProcess process = MProcess.get(Env.getCtx(), infoProcess.getAD_Process_ID());
Button btProcess = confirmPanel.addProcessButton(process.get_Translation(MProcess.COLUMNNAME_Name), infoProcess.getImageURL());
if (Util.isEmpty(infoProcess.getImageURL(), true)) {
btProcess.setImage(null);
@@ -233,18 +264,21 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
btProcessList.add(btProcess);
}
- // filte just infoprocess have layout type is drop list for model of combobox
- List infoProcessDropList = new ArrayList();
+ // make list process for drop down
for (MInfoProcess infoProcess : infoProcessList){
- if (!MInfoProcess.LAYOUTTYPE_List.equals(infoProcess.getLayoutType())){
+ if (!MInfoProcess.LAYOUTTYPE_List.equals(infoProcess.getLayoutType()))
continue;
- }
+
+ if (infoProcessDropList == null)
+ infoProcessDropList = new ArrayList();
+
infoProcessDropList.add(infoProcess);
}
- // make combobox contain list info process
- if (infoProcessDropList.size() > 0){
+
+ // init combobox control
+ if (infoProcessDropList != null && infoProcessDropList.size() > 0){
cbbProcess = new Combobox ();
- ListModel infoProccessModel = new ListModelList(infoProcessDropList);
+
// render item, use name to display
cbbProcess.setItemRenderer(new ComboitemRenderer() {
public void render(Comboitem item, MInfoProcess data, int index){
@@ -260,22 +294,24 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
// update tooltip hepl when select a item
cbbProcess.addEventListener(Events.ON_SELECT, this);
- cbbProcess.setModel(infoProccessModel);
confirmPanel.addComponentsCenter(cbbProcess);
btCbbProcess = confirmPanel.addProcessButton(Msg.getMsg(Env.getCtx(), ConfirmPanel.A_PROCESS), null);
+
btCbbProcess.addEventListener(Events.ON_CLICK, this);
}
- // make menu button
- Menupopup ipMenu = null;
+ // make list process for menu
for (MInfoProcess infoProcess : infoProcessList){
// just add info process have layout is bt_menu
if (!MInfoProcess.LAYOUTTYPE_Menu.equals(infoProcess.getLayoutType())){
continue;
}
- process = MProcess.get(Env.getCtx(), infoProcess.getAD_Process_ID());
+ if (infoProcessMenuList == null)
+ infoProcessMenuList = new ArrayList();
+
+ infoProcessMenuList.add(infoProcess);
// init popup menu
if (ipMenu == null){
@@ -287,7 +323,88 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
btMenuProcess = confirmPanel.addProcessButton("ProcessMenu", null);
btMenuProcess.setPopup("ipMenu, before_start");
}
+ }
+ }
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected void bindInfoProcess (){
+ bindInfoProcessBt ();
+ bindInfoProcessDropDown ();
+ bindInfoProcessMenu ();
+ }
+
+ /**
+ * evel display logic of process info button
+ * set visible of button base in display logic
+ * when two button set for same process, two button can hiden too, or display too.
+ * this is bug of implementor by never have this case
+ */
+ protected void bindInfoProcessBt (){
+ if (infoProcessBtList == null){
+ return;
+ }
+
+ // display process in button style
+ for (MInfoProcess infoProcessBt : infoProcessBtList){
+ // eval display logic
+ for (Button evlBt: btProcessList){
+ Integer processId = (Integer)evlBt.getAttribute(PROCESS_ID_KEY);
+ if (processId.intValue() == infoProcessBt.getAD_Process_ID()){
+ // display or hiden button
+ evlBt.setVisible(infoProcessBt.isDisplayed(infoContext, p_WindowNo));
+ break;
+ }
+ }
+ }
+ }
+
+ /**
+ * recreate drop down item by recreate model to set hiden, display of drop down item
+ * when all item is hiden, hiden combobox and process button too
+ */
+ protected void bindInfoProcessDropDown (){
+ if (infoProcessDropList == null || infoProcessDropList.size() == 0){
+ return;
+ }
+
+ // list info process after eval display logic
+ List infoProcessDropListTmp = new ArrayList ();
+
+ // filter item not display
+ for (MInfoProcess infoProcessDropDown : infoProcessDropList){
+ if (infoProcessDropDown.isDisplayed(infoContext, p_WindowNo)){
+ infoProcessDropListTmp.add(infoProcessDropDown);
+ }
+ }
+
+ // when item is filter out all. don't show combobox
+ cbbProcess.setVisible(infoProcessDropListTmp.size() > 0);
+ btCbbProcess.setVisible(infoProcessDropListTmp.size() > 0);
+ if (infoProcessDropListTmp.size() > 0){
+ ListModelList infoProccessModel = new ListModelList(infoProcessDropListTmp);
+ cbbProcess.setModel(infoProccessModel);
+ }
+
+ }
+
+ /**
+ * recreate menu item by set hiden, display of menu item
+ * when all menu item is hiden, hiden process menu button too
+ */
+ protected void bindInfoProcessMenu (){
+ if (infoProcessMenuList == null || infoProcessMenuList == null)
+ return;
+
+ ipMenu.getChildren().clear();
+ for (MInfoProcess infoProcess : infoProcessMenuList){
+ if (!infoProcess.isDisplayed(infoContext, p_WindowNo)){
+ continue;
+ }
+
+ MProcess process = MProcess.get(Env.getCtx(), infoProcess.getAD_Process_ID());
// make menu item for each info process
Menuitem ipMenuItem = new Menuitem();
ipMenuItem.setLabel(process.get_Translation(MProcess.COLUMNNAME_Name));
@@ -299,7 +416,7 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
ipMenu.appendChild(ipMenuItem);
}
- return infoProcessList.length > 0;
+ btMenuProcess.setVisible(ipMenu.getChildren().size() > 0);
}
private void processQueryValue() {
@@ -837,6 +954,7 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
confirmPanel.getButton(ConfirmPanel.A_ZOOM).setDisabled(true);
// IDEMPIERE-1334 start when init all button process is disable because nothing record is selected
+
for (Button btProcess : btProcessList){
btProcess.setDisabled(true);
}
@@ -993,6 +1111,7 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
editor.getLabel().setVisible(true);
}
}
+
}
/**
diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/InfoPanel.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/InfoPanel.java
index 17fdb766d7..62e859c420 100644
--- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/InfoPanel.java
+++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/InfoPanel.java
@@ -1350,6 +1350,10 @@ public abstract class InfoPanel extends Window implements EventListener,
contentPanel.setSelectedByKeys(lsSelectedKey);
m_results.clear();
}
+ // just evaluate display logic of process button when requery by use click requery button
+ if (isQueryByUser){
+ bindInfoProcess();
+ }
// IDEMPIERE-1334 after refresh, restore prev selected item end
}
finally
@@ -1358,6 +1362,12 @@ public abstract class InfoPanel extends Window implements EventListener,
}
}
+ /**
+ * evaluate display logic of button process
+ * empty method. implement at child class extend
+ */
+ protected void bindInfoProcess (){}
+
private void onOk()
{
if (!contentPanel.getChildren().isEmpty() && contentPanel.getSelectedRowKey()!=null)