IDEMPIERE-3851 Filtering list box (AP2-671 TrekGlobal) - integrate development from Elaine Tan
This commit is contained in:
parent
1fd56b7609
commit
83f8ea2253
|
@ -0,0 +1,10 @@
|
||||||
|
SET SQLBLANKLINES ON
|
||||||
|
SET DEFINE OFF
|
||||||
|
|
||||||
|
-- Oct 11, 2018 5:49:00 PM SGT
|
||||||
|
-- AP2-671 Make a filtering list box
|
||||||
|
UPDATE AD_Field SET DisplayLogic='@AD_Reference_ID@=10 | @AD_Reference_ID@=17 | @AD_Reference_ID@=18 | @AD_Reference_ID@=19', AD_Val_Rule_ID=NULL, AD_Reference_Value_ID=NULL, IsToolbarButton=NULL,Updated=TO_DATE('2018-10-11 17:49:00','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=56279
|
||||||
|
;
|
||||||
|
|
||||||
|
SELECT register_migration_script('201810122100_Ticket_AP2-671.sql') FROM dual
|
||||||
|
;
|
|
@ -0,0 +1,7 @@
|
||||||
|
-- Oct 11, 2018 5:49:00 PM SGT
|
||||||
|
-- AP2-671 Make a filtering list box
|
||||||
|
UPDATE AD_Field SET DisplayLogic='@AD_Reference_ID@=10 | @AD_Reference_ID@=17 | @AD_Reference_ID@=18 | @AD_Reference_ID@=19', AD_Val_Rule_ID=NULL, AD_Reference_Value_ID=NULL, IsToolbarButton=NULL,Updated=TO_TIMESTAMP('2018-10-11 17:49:00','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=56279
|
||||||
|
;
|
||||||
|
|
||||||
|
SELECT register_migration_script('201810122100_Ticket_AP2-671.sql') FROM dual
|
||||||
|
;
|
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
package org.adempiere.webui.component;
|
package org.adempiere.webui.component;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
@ -36,7 +37,7 @@ public class AutoComplete extends Combobox
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = 8350448733668388572L;
|
private static final long serialVersionUID = 7437206681528058083L;
|
||||||
|
|
||||||
/** comboItems All menu labels */
|
/** comboItems All menu labels */
|
||||||
private String[] comboItems;
|
private String[] comboItems;
|
||||||
|
@ -48,6 +49,8 @@ public class AutoComplete extends Combobox
|
||||||
|
|
||||||
private String[] contents;
|
private String[] contents;
|
||||||
|
|
||||||
|
private Object[] values;
|
||||||
|
|
||||||
private HashMap<Comboitem, String> mapItems = new HashMap<Comboitem, String>();
|
private HashMap<Comboitem, String> mapItems = new HashMap<Comboitem, String>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -57,8 +60,18 @@ public class AutoComplete extends Combobox
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public void setDict(String[] vals)
|
public void setDict(String[] vals)
|
||||||
|
{
|
||||||
|
setDict(vals, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDict(String[] vals, boolean sort)
|
||||||
{
|
{
|
||||||
comboItems = vals;
|
comboItems = vals;
|
||||||
|
|
||||||
|
if (comboItems != null && sort)
|
||||||
|
{
|
||||||
|
Arrays.sort(comboItems);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -88,6 +101,11 @@ public class AutoComplete extends Combobox
|
||||||
this.images = images;
|
this.images = images;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setValues(Object[] values)
|
||||||
|
{
|
||||||
|
this.values = values;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*/
|
*/
|
||||||
|
@ -161,6 +179,8 @@ public class AutoComplete extends Combobox
|
||||||
}
|
}
|
||||||
|
|
||||||
comboitem.setLabel(comboItems[i]);
|
comboitem.setLabel(comboItems[i]);
|
||||||
|
if (values != null)
|
||||||
|
comboitem.setValue(values[i]);
|
||||||
comboitem.setDescription(strDescription[i]);
|
comboitem.setDescription(strDescription[i]);
|
||||||
|
|
||||||
if (images != null && i < images.length && images[i] != null && images[i].trim().length() > 0)
|
if (images != null && i < images.length && images[i] != null && images[i].trim().length() > 0)
|
||||||
|
|
|
@ -27,6 +27,7 @@ import javax.swing.event.ListDataListener;
|
||||||
|
|
||||||
import org.adempiere.webui.ValuePreference;
|
import org.adempiere.webui.ValuePreference;
|
||||||
import org.adempiere.webui.apps.AEnv;
|
import org.adempiere.webui.apps.AEnv;
|
||||||
|
import org.adempiere.webui.component.AutoComplete;
|
||||||
import org.adempiere.webui.component.Combobox;
|
import org.adempiere.webui.component.Combobox;
|
||||||
import org.adempiere.webui.event.ContextMenuEvent;
|
import org.adempiere.webui.event.ContextMenuEvent;
|
||||||
import org.adempiere.webui.event.ContextMenuListener;
|
import org.adempiere.webui.event.ContextMenuListener;
|
||||||
|
@ -53,6 +54,7 @@ import org.compiere.util.Msg;
|
||||||
import org.compiere.util.NamePair;
|
import org.compiere.util.NamePair;
|
||||||
import org.compiere.util.Util;
|
import org.compiere.util.Util;
|
||||||
import org.compiere.util.ValueNamePair;
|
import org.compiere.util.ValueNamePair;
|
||||||
|
import org.zkoss.zk.ui.Component;
|
||||||
import org.zkoss.zk.ui.Desktop;
|
import org.zkoss.zk.ui.Desktop;
|
||||||
import org.zkoss.zk.ui.Executions;
|
import org.zkoss.zk.ui.Executions;
|
||||||
import org.zkoss.zk.ui.Page;
|
import org.zkoss.zk.ui.Page;
|
||||||
|
@ -96,8 +98,13 @@ ContextMenuListener, IZoomableEditor
|
||||||
|
|
||||||
public WTableDirEditor(GridField gridField)
|
public WTableDirEditor(GridField gridField)
|
||||||
{
|
{
|
||||||
super(new EditorCombobox(), gridField);
|
this(gridField.isAutocomplete() ? new EditorAutoComplete() : new EditorCombobox(), gridField);
|
||||||
((EditorCombobox)getComponent()).editor = this;
|
}
|
||||||
|
|
||||||
|
private WTableDirEditor(Component comp, GridField gridField)
|
||||||
|
{
|
||||||
|
super(comp, gridField);
|
||||||
|
((ITableDirEditor)getComponent()).setEditor(this);
|
||||||
lookup = gridField.getLookup();
|
lookup = gridField.getLookup();
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
@ -114,8 +121,18 @@ ContextMenuListener, IZoomableEditor
|
||||||
*/
|
*/
|
||||||
public WTableDirEditor(Lookup lookup, String label, String description, boolean mandatory, boolean readonly, boolean updateable)
|
public WTableDirEditor(Lookup lookup, String label, String description, boolean mandatory, boolean readonly, boolean updateable)
|
||||||
{
|
{
|
||||||
super(new EditorCombobox(), label, description, mandatory, readonly, updateable);
|
this(lookup, label, description, mandatory, readonly, updateable, false);
|
||||||
((EditorCombobox)getComponent()).editor = this;
|
}
|
||||||
|
|
||||||
|
public WTableDirEditor(Lookup lookup, String label, String description, boolean mandatory, boolean readonly, boolean updateable, boolean autocomplete)
|
||||||
|
{
|
||||||
|
this(autocomplete ? new EditorAutoComplete() : new EditorCombobox(), lookup, label, description, mandatory, readonly, updateable);
|
||||||
|
}
|
||||||
|
|
||||||
|
private WTableDirEditor(Component comp, Lookup lookup, String label, String description, boolean mandatory, boolean readonly, boolean updateable)
|
||||||
|
{
|
||||||
|
super(comp, label, description, mandatory, readonly, updateable);
|
||||||
|
((ITableDirEditor)getComponent()).setEditor(this);
|
||||||
|
|
||||||
if (lookup == null)
|
if (lookup == null)
|
||||||
{
|
{
|
||||||
|
@ -135,11 +152,20 @@ ContextMenuListener, IZoomableEditor
|
||||||
* @param isUpdateable
|
* @param isUpdateable
|
||||||
* @param lookup
|
* @param lookup
|
||||||
*/
|
*/
|
||||||
public WTableDirEditor(String columnName, boolean mandatory, boolean isReadOnly, boolean isUpdateable,
|
public WTableDirEditor(String columnName, boolean mandatory, boolean isReadOnly, boolean isUpdateable, Lookup lookup)
|
||||||
Lookup lookup)
|
|
||||||
{
|
{
|
||||||
super(new EditorCombobox(), columnName, null, null, mandatory, isReadOnly, isUpdateable);
|
this(columnName, mandatory, isReadOnly, isUpdateable, lookup, false);
|
||||||
((EditorCombobox)getComponent()).editor = this;
|
}
|
||||||
|
|
||||||
|
public WTableDirEditor(String columnName, boolean mandatory, boolean isReadOnly, boolean isUpdateable, Lookup lookup, boolean autocomplete)
|
||||||
|
{
|
||||||
|
this(autocomplete ? new EditorAutoComplete() : new EditorCombobox(), columnName, mandatory, isReadOnly, isUpdateable, lookup);
|
||||||
|
}
|
||||||
|
|
||||||
|
private WTableDirEditor(Component comp, String columnName, boolean mandatory, boolean isReadOnly, boolean isUpdateable, Lookup lookup)
|
||||||
|
{
|
||||||
|
super(comp, columnName, null, null, mandatory, isReadOnly, isUpdateable);
|
||||||
|
((ITableDirEditor)getComponent()).setEditor(this);
|
||||||
if (lookup == null)
|
if (lookup == null)
|
||||||
{
|
{
|
||||||
throw new IllegalArgumentException("Lookup cannot be null");
|
throw new IllegalArgumentException("Lookup cannot be null");
|
||||||
|
@ -153,10 +179,12 @@ ContextMenuListener, IZoomableEditor
|
||||||
ZKUpdateUtil.setWidth(getComponent(), "200px");
|
ZKUpdateUtil.setWidth(getComponent(), "200px");
|
||||||
getComponent().setAutocomplete(true);
|
getComponent().setAutocomplete(true);
|
||||||
getComponent().setAutodrop(true);
|
getComponent().setAutodrop(true);
|
||||||
getComponent().addEventListener(Events.ON_BLUR, this);
|
getComponent().addEventListener(Events.ON_BLUR, this);
|
||||||
getComponent().addEventListener(Events.ON_CHANGING, this);
|
if (getComponent() instanceof EditorAutoComplete) {
|
||||||
getComponent().addEventListener(Events.ON_OPEN, this);
|
;
|
||||||
getComponent().addEventListener("onPostSelect", this);
|
} else {
|
||||||
|
getComponent().addEventListener(Events.ON_CHANGING, this);
|
||||||
|
}
|
||||||
|
|
||||||
boolean zoom= false;
|
boolean zoom= false;
|
||||||
if (lookup != null)
|
if (lookup != null)
|
||||||
|
@ -309,6 +337,9 @@ ContextMenuListener, IZoomableEditor
|
||||||
getComponent().setValue(null);
|
getComponent().setValue(null);
|
||||||
getComponent().setSelectedItem(null);
|
getComponent().setSelectedItem(null);
|
||||||
oldValue = value;
|
oldValue = value;
|
||||||
|
|
||||||
|
if (getComponent() instanceof EditorAutoComplete)
|
||||||
|
updateStyle();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -394,6 +425,26 @@ ContextMenuListener, IZoomableEditor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (getComponent() instanceof EditorAutoComplete) {
|
||||||
|
EditorAutoComplete editor = (EditorAutoComplete) getComponent();
|
||||||
|
editor.setDict(null);
|
||||||
|
editor.setValues(null);
|
||||||
|
editor.setDescription(null);
|
||||||
|
|
||||||
|
String[] dict = new String[getComponent().getItemCount()];
|
||||||
|
Object[] values = new Object[getComponent().getItemCount()];
|
||||||
|
String[] description = new String[getComponent().getItemCount()];
|
||||||
|
for (int i = 0; i < dict.length; i++) {
|
||||||
|
Comboitem item = getComponent().getItemAtIndex(i);
|
||||||
|
dict[i] = item.getLabel();
|
||||||
|
values[i] = item.getValue();
|
||||||
|
}
|
||||||
|
editor.setDict(dict, false);
|
||||||
|
editor.setDescription(description);
|
||||||
|
editor.setValues(values);
|
||||||
|
}
|
||||||
|
|
||||||
getComponent().setValue(oldValue);
|
getComponent().setValue(oldValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -673,15 +724,27 @@ ContextMenuListener, IZoomableEditor
|
||||||
super.dynamicDisplay(ctx);
|
super.dynamicDisplay(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class EditorCombobox extends Combobox {
|
private interface ITableDirEditor {
|
||||||
|
public void setEditor(WTableDirEditor editor);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class EditorCombobox extends Combobox implements ITableDirEditor {
|
||||||
/**
|
/**
|
||||||
* generated serial id
|
* generated serial id
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = 4540856986889452983L;
|
private static final long serialVersionUID = 9087317631313577239L;
|
||||||
protected WTableDirEditor editor;
|
private WTableDirEditor editor;
|
||||||
private DesktopCleanup listener = null;
|
private DesktopCleanup listener = null;
|
||||||
|
|
||||||
|
protected EditorCombobox() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPage(Page page) {
|
||||||
|
super.setPage(page);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPageAttached(Page newpage, Page oldpage) {
|
public void onPageAttached(Page newpage, Page oldpage) {
|
||||||
super.onPageAttached(newpage, oldpage);
|
super.onPageAttached(newpage, oldpage);
|
||||||
|
@ -716,6 +779,78 @@ ContextMenuListener, IZoomableEditor
|
||||||
editor.tableCacheListener = null;
|
editor.tableCacheListener = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setEditor(WTableDirEditor editor) {
|
||||||
|
this.editor = editor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class EditorAutoComplete extends AutoComplete implements ITableDirEditor {
|
||||||
|
/**
|
||||||
|
* generated serial id
|
||||||
|
*/
|
||||||
|
private static final long serialVersionUID = 8435677226644775152L;
|
||||||
|
protected WTableDirEditor editor;
|
||||||
|
private DesktopCleanup listener = null;
|
||||||
|
|
||||||
|
protected EditorAutoComplete() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPage(Page page) {
|
||||||
|
super.setPage(page);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPageAttached(Page newpage, Page oldpage) {
|
||||||
|
super.onPageAttached(newpage, oldpage);
|
||||||
|
if (editor.tableCacheListener == null) {
|
||||||
|
editor.createCacheListener();
|
||||||
|
if (listener == null) {
|
||||||
|
listener = new DesktopCleanup() {
|
||||||
|
@Override
|
||||||
|
public void cleanup(Desktop desktop) throws Exception {
|
||||||
|
EditorAutoComplete.this.cleanup();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
newpage.getDesktop().addListener(listener);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPageDetached(Page page) {
|
||||||
|
super.onPageDetached(page);
|
||||||
|
if (listener != null && page.getDesktop() != null)
|
||||||
|
page.getDesktop().removeListener(listener);
|
||||||
|
cleanup();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
protected void cleanup() {
|
||||||
|
if (editor.tableCacheListener != null) {
|
||||||
|
CacheMgt.get().unregister(editor.tableCacheListener);
|
||||||
|
editor.tableCacheListener = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setEditor(WTableDirEditor editor) {
|
||||||
|
this.editor = editor;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setValue(String value)
|
||||||
|
{
|
||||||
|
setText(value);
|
||||||
|
if (Util.isEmpty(value)) {
|
||||||
|
refresh("");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class CCacheListener extends CCache<String, Object> {
|
private static class CCacheListener extends CCache<String, Object> {
|
||||||
|
|
Loading…
Reference in New Issue