IDEMPIERE-1044 Load testing. Fixed memory leak.
This commit is contained in:
parent
73a562b73c
commit
b55c3ca70f
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
package org.adempiere.webui;
|
package org.adempiere.webui;
|
||||||
|
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
@ -53,6 +54,7 @@ import org.zkoss.web.Attributes;
|
||||||
import org.zkoss.web.servlet.Servlets;
|
import org.zkoss.web.servlet.Servlets;
|
||||||
import org.zkoss.zk.au.out.AuScript;
|
import org.zkoss.zk.au.out.AuScript;
|
||||||
import org.zkoss.zk.ui.Component;
|
import org.zkoss.zk.ui.Component;
|
||||||
|
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;
|
||||||
import org.zkoss.zk.ui.Session;
|
import org.zkoss.zk.ui.Session;
|
||||||
|
@ -238,10 +240,14 @@ public class AdempiereWebUI extends Window implements EventListener<Event>, IWeb
|
||||||
keyListener.setCtrlKeys("@a@c@d@e@f@h@n@o@p@r@s@t@z@x@#left@#right@#up@#down@#home@#end#enter^u@u");
|
keyListener.setCtrlKeys("@a@c@d@e@f@h@n@o@p@r@s@t@z@x@#left@#right@#up@#down@#home@#end#enter^u@u");
|
||||||
keyListener.setAutoBlur(false);
|
keyListener.setAutoBlur(false);
|
||||||
|
|
||||||
IDesktop d = (IDesktop) currSess.getAttribute(APPLICATION_DESKTOP_KEY);
|
@SuppressWarnings("unchecked")
|
||||||
|
WeakReference<IDesktop> desktopRef = (WeakReference<IDesktop>) currSess.getAttribute(APPLICATION_DESKTOP_KEY);
|
||||||
|
IDesktop d = desktopRef != null ? desktopRef.get() : null;
|
||||||
if (d != null && d instanceof IDesktop)
|
if (d != null && d instanceof IDesktop)
|
||||||
{
|
{
|
||||||
ExecutionCarryOver eco = (ExecutionCarryOver) currSess.getAttribute(EXECUTION_CARRYOVER_SESSION_KEY);
|
@SuppressWarnings("unchecked")
|
||||||
|
WeakReference<ExecutionCarryOver> ecoRef = (WeakReference<ExecutionCarryOver>) currSess.getAttribute(EXECUTION_CARRYOVER_SESSION_KEY);;
|
||||||
|
ExecutionCarryOver eco = ecoRef != null ? ecoRef.get() : null;
|
||||||
if (eco != null) {
|
if (eco != null) {
|
||||||
//try restore
|
//try restore
|
||||||
try {
|
try {
|
||||||
|
@ -299,11 +305,11 @@ public class AdempiereWebUI extends Window implements EventListener<Event>, IWeb
|
||||||
}
|
}
|
||||||
appDesktop.setPage(this.getPage());
|
appDesktop.setPage(this.getPage());
|
||||||
Clients.response(new AuScript("$('.slimScroll .z-anchorlayout-body').slimScroll({height: '100%',railVisible: true, alwaysVisible: false});"));
|
Clients.response(new AuScript("$('.slimScroll .z-anchorlayout-body').slimScroll({height: '100%',railVisible: true, alwaysVisible: false});"));
|
||||||
currSess.setAttribute(EXECUTION_CARRYOVER_SESSION_KEY, current);
|
currSess.setAttribute(EXECUTION_CARRYOVER_SESSION_KEY, new WeakReference<ExecutionCarryOver>(current));
|
||||||
}
|
}
|
||||||
|
|
||||||
currSess.setAttribute(ZK_DESKTOP_SESSION_KEY, this.getPage().getDesktop());
|
currSess.setAttribute(ZK_DESKTOP_SESSION_KEY, new WeakReference<Desktop>(this.getPage().getDesktop()));
|
||||||
ctx.put(ZK_DESKTOP_SESSION_KEY, this.getPage().getDesktop());
|
ctx.put(ZK_DESKTOP_SESSION_KEY, new WeakReference<Desktop>(this.getPage().getDesktop()));
|
||||||
ClientInfo sessionClientInfo = (ClientInfo) currSess.getAttribute(CLIENT_INFO);
|
ClientInfo sessionClientInfo = (ClientInfo) currSess.getAttribute(CLIENT_INFO);
|
||||||
if (sessionClientInfo != null) {
|
if (sessionClientInfo != null) {
|
||||||
clientInfo = sessionClientInfo;
|
clientInfo = sessionClientInfo;
|
||||||
|
@ -329,11 +335,11 @@ public class AdempiereWebUI extends Window implements EventListener<Event>, IWeb
|
||||||
createDesktop();
|
createDesktop();
|
||||||
appDesktop.setClientInfo(clientInfo);
|
appDesktop.setClientInfo(clientInfo);
|
||||||
appDesktop.createPart(this.getPage());
|
appDesktop.createPart(this.getPage());
|
||||||
currSess.setAttribute(APPLICATION_DESKTOP_KEY, appDesktop);
|
currSess.setAttribute(APPLICATION_DESKTOP_KEY, new WeakReference<IDesktop>(appDesktop));
|
||||||
ExecutionCarryOver eco = new ExecutionCarryOver(this.getPage().getDesktop());
|
ExecutionCarryOver eco = new ExecutionCarryOver(this.getPage().getDesktop());
|
||||||
currSess.setAttribute(EXECUTION_CARRYOVER_SESSION_KEY, eco);
|
currSess.setAttribute(EXECUTION_CARRYOVER_SESSION_KEY, new WeakReference<ExecutionCarryOver>(eco));
|
||||||
currSess.setAttribute(ZK_DESKTOP_SESSION_KEY, this.getPage().getDesktop());
|
currSess.setAttribute(ZK_DESKTOP_SESSION_KEY, new WeakReference<Desktop>(this.getPage().getDesktop()));
|
||||||
ctx.put(ZK_DESKTOP_SESSION_KEY, this.getPage().getDesktop());
|
ctx.put(ZK_DESKTOP_SESSION_KEY, new WeakReference<Desktop>(this.getPage().getDesktop()));
|
||||||
}
|
}
|
||||||
|
|
||||||
//ensure server push is on
|
//ensure server push is on
|
||||||
|
|
|
@ -21,6 +21,7 @@ import java.io.File;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
|
@ -811,8 +812,13 @@ public final class AEnv
|
||||||
*/
|
*/
|
||||||
public static Desktop getDesktop() {
|
public static Desktop getDesktop() {
|
||||||
boolean inUIThread = Executions.getCurrent() != null;
|
boolean inUIThread = Executions.getCurrent() != null;
|
||||||
return inUIThread ? Executions.getCurrent().getDesktop()
|
if (inUIThread) {
|
||||||
: (Desktop) Env.getCtx().get(AdempiereWebUI.ZK_DESKTOP_SESSION_KEY);
|
return Executions.getCurrent().getDesktop();
|
||||||
|
} else {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
WeakReference<Desktop> ref = (WeakReference<Desktop>) Env.getCtx().get(AdempiereWebUI.ZK_DESKTOP_SESSION_KEY);
|
||||||
|
return ref != null ? ref.get() : null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -6,6 +6,7 @@ import static org.compiere.model.SystemIDs.PROCESS_M_INOUT_GENERATE;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
@ -347,7 +348,7 @@ public class ProcessDialog extends Window implements EventListener<Event>, IProc
|
||||||
Properties context = ServerContext.getCurrentInstance();
|
Properties context = ServerContext.getCurrentInstance();
|
||||||
if (context.get(AdempiereWebUI.ZK_DESKTOP_SESSION_KEY) == null) {
|
if (context.get(AdempiereWebUI.ZK_DESKTOP_SESSION_KEY) == null) {
|
||||||
Desktop desktop = this.getDesktop();
|
Desktop desktop = this.getDesktop();
|
||||||
context.put(AdempiereWebUI.ZK_DESKTOP_SESSION_KEY, desktop);
|
context.put(AdempiereWebUI.ZK_DESKTOP_SESSION_KEY, new WeakReference<Desktop>(desktop));
|
||||||
}
|
}
|
||||||
|
|
||||||
processDialogRunnable = new ProcessDialogRunnable();
|
processDialogRunnable = new ProcessDialogRunnable();
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
package org.adempiere.webui.apps;
|
package org.adempiere.webui.apps;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
@ -382,7 +383,7 @@ public class ProcessModalDialog extends Window implements EventListener<Event>,
|
||||||
Properties context = ServerContext.getCurrentInstance();
|
Properties context = ServerContext.getCurrentInstance();
|
||||||
if (context.get(AdempiereWebUI.ZK_DESKTOP_SESSION_KEY) == null) {
|
if (context.get(AdempiereWebUI.ZK_DESKTOP_SESSION_KEY) == null) {
|
||||||
Desktop desktop = this.getDesktop();
|
Desktop desktop = this.getDesktop();
|
||||||
context.put(AdempiereWebUI.ZK_DESKTOP_SESSION_KEY, desktop);
|
context.put(AdempiereWebUI.ZK_DESKTOP_SESSION_KEY, new WeakReference<Desktop>(desktop));
|
||||||
}
|
}
|
||||||
|
|
||||||
processDialogRunnable = new ProcessDialogRunnable();
|
processDialogRunnable = new ProcessDialogRunnable();
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
package org.adempiere.webui.dashboard;
|
package org.adempiere.webui.dashboard;
|
||||||
|
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
|
@ -56,6 +57,7 @@ import org.zkoss.zk.ui.Page;
|
||||||
import org.zkoss.zk.ui.event.Event;
|
import org.zkoss.zk.ui.event.Event;
|
||||||
import org.zkoss.zk.ui.event.EventListener;
|
import org.zkoss.zk.ui.event.EventListener;
|
||||||
import org.zkoss.zk.ui.event.Events;
|
import org.zkoss.zk.ui.event.Events;
|
||||||
|
import org.zkoss.zk.ui.util.DesktopCleanup;
|
||||||
import org.zkoss.zul.Label;
|
import org.zkoss.zul.Label;
|
||||||
import org.zkoss.zul.impl.LabelImageElement;
|
import org.zkoss.zul.impl.LabelImageElement;
|
||||||
|
|
||||||
|
@ -84,8 +86,9 @@ public class DPCalendar extends DashboardPanel implements EventListener<Event>,
|
||||||
|
|
||||||
private EventWindow eventWin;
|
private EventWindow eventWin;
|
||||||
private Properties ctx;
|
private Properties ctx;
|
||||||
private Desktop desktop;
|
private WeakReference<Desktop> desktop;
|
||||||
private ArrayList<ADCalendarEvent> events;
|
private ArrayList<ADCalendarEvent> events;
|
||||||
|
private DesktopCleanup listener;
|
||||||
|
|
||||||
private static RequestEventHandler eventHandler;
|
private static RequestEventHandler eventHandler;
|
||||||
private static TopicSubscriber subscriber;
|
private static TopicSubscriber subscriber;
|
||||||
|
@ -126,6 +129,13 @@ public class DPCalendar extends DashboardPanel implements EventListener<Event>,
|
||||||
calendars.addEventListener("onEventEdit", this);
|
calendars.addEventListener("onEventEdit", this);
|
||||||
|
|
||||||
createStaticListeners();
|
createStaticListeners();
|
||||||
|
|
||||||
|
listener = new DesktopCleanup() {
|
||||||
|
@Override
|
||||||
|
public void cleanup(Desktop desktop) throws Exception {
|
||||||
|
DPCalendar.this.cleanup();
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void createStaticListeners() {
|
private synchronized void createStaticListeners() {
|
||||||
|
@ -348,7 +358,17 @@ public class DPCalendar extends DashboardPanel implements EventListener<Event>,
|
||||||
public void refresh(ServerPushTemplate template) {
|
public void refresh(ServerPushTemplate template) {
|
||||||
refreshModel();
|
refreshModel();
|
||||||
template.executeAsync(this);
|
template.executeAsync(this);
|
||||||
desktop = getDesktop();
|
if (desktop != null && desktop.get() != null) {
|
||||||
|
if (desktop.get() != getDesktop()) {
|
||||||
|
desktop.get().removeListener(listener);
|
||||||
|
desktop = new WeakReference<Desktop>(getDesktop());
|
||||||
|
desktop.get().addListener(listener);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
desktop = new WeakReference<Desktop>(getDesktop());
|
||||||
|
desktop.get().addListener(listener);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -405,8 +425,8 @@ public class DPCalendar extends DashboardPanel implements EventListener<Event>,
|
||||||
if (clientId.equals(AD_Client_ID) && !"0".equals(AD_User_ID)) {
|
if (clientId.equals(AD_Client_ID) && !"0".equals(AD_User_ID)) {
|
||||||
if (salesRepId.equals(AD_User_ID) || userId.equals(AD_User_ID) || createdBy.equals(AD_User_ID)) {
|
if (salesRepId.equals(AD_User_ID) || userId.equals(AD_User_ID) || createdBy.equals(AD_User_ID)) {
|
||||||
try {
|
try {
|
||||||
if (desktop != null && desktop.isAlive()) {
|
if (desktop != null && desktop.get() != null && desktop.get().isAlive()) {
|
||||||
ServerPushTemplate template = new ServerPushTemplate(desktop);
|
ServerPushTemplate template = new ServerPushTemplate(desktop.get());
|
||||||
refresh(template);
|
refresh(template);
|
||||||
} else {
|
} else {
|
||||||
EventManager.getInstance().unregister(this);
|
EventManager.getInstance().unregister(this);
|
||||||
|
@ -424,13 +444,24 @@ public class DPCalendar extends DashboardPanel implements EventListener<Event>,
|
||||||
super.onPageAttached(newpage, oldpage);
|
super.onPageAttached(newpage, oldpage);
|
||||||
if (newpage != null) {
|
if (newpage != null) {
|
||||||
EventManager.getInstance().register(ON_REQUEST_CHANGED_TOPIC, this);
|
EventManager.getInstance().register(ON_REQUEST_CHANGED_TOPIC, this);
|
||||||
desktop = getDesktop();
|
if (desktop != null && desktop.get() != null) {
|
||||||
|
desktop.get().removeListener(listener);
|
||||||
|
}
|
||||||
|
desktop = new WeakReference<Desktop>(getDesktop());
|
||||||
|
desktop.get().addListener(listener);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPageDetached(Page page) {
|
public void onPageDetached(Page page) {
|
||||||
super.onPageDetached(page);
|
super.onPageDetached(page);
|
||||||
|
cleanup();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
protected void cleanup() {
|
||||||
EventManager.getInstance().unregister(this);
|
EventManager.getInstance().unregister(this);
|
||||||
desktop = null;
|
desktop = null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
package org.adempiere.webui.dashboard;
|
package org.adempiere.webui.dashboard;
|
||||||
|
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
|
@ -39,6 +40,7 @@ import org.zkoss.zk.ui.event.DropEvent;
|
||||||
import org.zkoss.zk.ui.event.Event;
|
import org.zkoss.zk.ui.event.Event;
|
||||||
import org.zkoss.zk.ui.event.EventListener;
|
import org.zkoss.zk.ui.event.EventListener;
|
||||||
import org.zkoss.zk.ui.event.Events;
|
import org.zkoss.zk.ui.event.Events;
|
||||||
|
import org.zkoss.zk.ui.util.DesktopCleanup;
|
||||||
import org.zkoss.zul.A;
|
import org.zkoss.zul.A;
|
||||||
import org.zkoss.zul.Box;
|
import org.zkoss.zul.Box;
|
||||||
import org.zkoss.zul.Image;
|
import org.zkoss.zul.Image;
|
||||||
|
@ -71,7 +73,9 @@ public class DPRecentItems extends DashboardPanel implements EventListener<Event
|
||||||
|
|
||||||
private Properties ctx;
|
private Properties ctx;
|
||||||
|
|
||||||
private Desktop desktop;
|
private WeakReference<Desktop> desktop;
|
||||||
|
|
||||||
|
private DesktopCleanup listener;
|
||||||
|
|
||||||
public DPRecentItems()
|
public DPRecentItems()
|
||||||
{
|
{
|
||||||
|
@ -109,6 +113,18 @@ public class DPRecentItems extends DashboardPanel implements EventListener<Event
|
||||||
img.addEventListener(Events.ON_DROP, this);
|
img.addEventListener(Events.ON_DROP, this);
|
||||||
//
|
//
|
||||||
createTopicSubscriber();
|
createTopicSubscriber();
|
||||||
|
|
||||||
|
listener = new DesktopCleanup() {
|
||||||
|
@Override
|
||||||
|
public void cleanup(Desktop desktop) throws Exception {
|
||||||
|
DPRecentItems.this.cleanup();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void cleanup() {
|
||||||
|
EventManager.getInstance().unregister(this);
|
||||||
|
desktop = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static synchronized void createTopicSubscriber() {
|
private static synchronized void createTopicSubscriber() {
|
||||||
|
@ -256,7 +272,21 @@ public class DPRecentItems extends DashboardPanel implements EventListener<Event
|
||||||
public void updateUI() {
|
public void updateUI() {
|
||||||
refresh();
|
refresh();
|
||||||
bxRecentItems.invalidate();
|
bxRecentItems.invalidate();
|
||||||
desktop = getDesktop();
|
updateDesktopReference();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
protected void updateDesktopReference() {
|
||||||
|
if ((desktop == null || desktop.get() == null) || (desktop.get() != null && desktop.get() != getDesktop())) {
|
||||||
|
if (desktop != null && desktop.get() != null)
|
||||||
|
desktop.get().removeListener(listener);
|
||||||
|
|
||||||
|
desktop = new WeakReference<Desktop>(getDesktop());
|
||||||
|
desktop.get().addListener(listener);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -267,8 +297,8 @@ public class DPRecentItems extends DashboardPanel implements EventListener<Event
|
||||||
int id = ((Number)property).intValue();
|
int id = ((Number)property).intValue();
|
||||||
if (id == AD_User_ID) {
|
if (id == AD_User_ID) {
|
||||||
try {
|
try {
|
||||||
if (desktop != null && desktop.isAlive()) {
|
if (desktop != null && desktop.get() != null && desktop.get().isAlive()) {
|
||||||
ServerPushTemplate template = new ServerPushTemplate(desktop);
|
ServerPushTemplate template = new ServerPushTemplate(desktop.get());
|
||||||
refresh(template);
|
refresh(template);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -284,15 +314,14 @@ public class DPRecentItems extends DashboardPanel implements EventListener<Event
|
||||||
super.onPageAttached(newpage, oldpage);
|
super.onPageAttached(newpage, oldpage);
|
||||||
if (newpage != null) {
|
if (newpage != null) {
|
||||||
EventManager.getInstance().register(MRecentItem.ON_RECENT_ITEM_CHANGED_TOPIC, this);
|
EventManager.getInstance().register(MRecentItem.ON_RECENT_ITEM_CHANGED_TOPIC, this);
|
||||||
desktop = getDesktop();
|
updateDesktopReference();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPageDetached(Page page) {
|
public void onPageDetached(Page page) {
|
||||||
super.onPageDetached(page);
|
super.onPageDetached(page);
|
||||||
EventManager.getInstance().unregister(this);
|
cleanup();
|
||||||
desktop = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static class TopicSubscriber implements ITopicSubscriber<Integer> {
|
static class TopicSubscriber implements ITopicSubscriber<Integer> {
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
package org.adempiere.webui.dashboard;
|
package org.adempiere.webui.dashboard;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
@ -26,6 +27,7 @@ import org.compiere.util.CLogger;
|
||||||
import org.zkoss.util.Locales;
|
import org.zkoss.util.Locales;
|
||||||
import org.zkoss.zk.ui.Desktop;
|
import org.zkoss.zk.ui.Desktop;
|
||||||
import org.zkoss.zk.ui.event.Events;
|
import org.zkoss.zk.ui.event.Events;
|
||||||
|
import org.zkoss.zk.ui.util.DesktopCleanup;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -38,10 +40,12 @@ public class DashboardRunnable implements Runnable, Serializable
|
||||||
|
|
||||||
private static final long serialVersionUID = 5995227773511788894L;
|
private static final long serialVersionUID = 5995227773511788894L;
|
||||||
|
|
||||||
private Desktop desktop;
|
private WeakReference<Desktop> desktop;
|
||||||
private List<DashboardPanel> dashboardPanels;
|
private List<DashboardPanel> dashboardPanels;
|
||||||
private Locale locale;
|
private Locale locale;
|
||||||
|
|
||||||
|
private DesktopCleanup listener;
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
private static final CLogger logger = CLogger.getCLogger(DashboardRunnable.class);
|
private static final CLogger logger = CLogger.getCLogger(DashboardRunnable.class);
|
||||||
|
|
||||||
|
@ -51,25 +55,43 @@ public class DashboardRunnable implements Runnable, Serializable
|
||||||
* @param appDesktop adempiere desktop interface
|
* @param appDesktop adempiere desktop interface
|
||||||
*/
|
*/
|
||||||
public DashboardRunnable(Desktop desktop) {
|
public DashboardRunnable(Desktop desktop) {
|
||||||
this.desktop = desktop;
|
this.desktop = new WeakReference<Desktop>(desktop);
|
||||||
|
|
||||||
dashboardPanels = new ArrayList<DashboardPanel>();
|
dashboardPanels = new ArrayList<DashboardPanel>();
|
||||||
locale = Locales.getCurrent();
|
locale = Locales.getCurrent();
|
||||||
|
|
||||||
|
listener = new DesktopCleanup() {
|
||||||
|
@Override
|
||||||
|
public void cleanup(Desktop desktop) throws Exception {
|
||||||
|
DashboardRunnable.this.cleanup();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
this.desktop.get().addListener(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void cleanup() {
|
||||||
|
dashboardPanels = null;
|
||||||
|
if (desktop != null && desktop.get() != null)
|
||||||
|
desktop.get().removeListener(listener);
|
||||||
|
desktop = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DashboardRunnable(DashboardRunnable tmp, Desktop desktop) {
|
public DashboardRunnable(DashboardRunnable tmp, Desktop desktop) {
|
||||||
this(desktop);
|
this(desktop);
|
||||||
this.dashboardPanels = tmp.dashboardPanels;
|
this.dashboardPanels = tmp.dashboardPanels;
|
||||||
|
tmp.cleanup();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void run()
|
public void run()
|
||||||
{
|
{
|
||||||
Locales.setThreadLocal(locale);
|
if (dashboardPanels != null && desktop != null && desktop.get() != null)
|
||||||
try {
|
{
|
||||||
refreshDashboard(true);
|
Locales.setThreadLocal(locale);
|
||||||
} catch (Exception e) {
|
try {
|
||||||
// logger.log(Level.INFO, e.getLocalizedMessage(), (e.getCause() != null ? e.getCause() : e));
|
refreshDashboard(true);
|
||||||
throw new RuntimeException(e);
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,7 +101,7 @@ public class DashboardRunnable implements Runnable, Serializable
|
||||||
public void refreshDashboard(boolean pooling)
|
public void refreshDashboard(boolean pooling)
|
||||||
{
|
{
|
||||||
|
|
||||||
ServerPushTemplate template = new ServerPushTemplate(desktop);
|
ServerPushTemplate template = new ServerPushTemplate(desktop.get());
|
||||||
//set thread local context if not in event thread
|
//set thread local context if not in event thread
|
||||||
Properties ctx = null;
|
Properties ctx = null;
|
||||||
boolean isEventThread = Events.inEventListener();
|
boolean isEventThread = Events.inEventListener();
|
||||||
|
@ -122,7 +144,8 @@ public class DashboardRunnable implements Runnable, Serializable
|
||||||
* @param dashboardPanel
|
* @param dashboardPanel
|
||||||
*/
|
*/
|
||||||
public void add(DashboardPanel dashboardPanel) {
|
public void add(DashboardPanel dashboardPanel) {
|
||||||
dashboardPanels.add(dashboardPanel);
|
if (dashboardPanels != null)
|
||||||
|
dashboardPanels.add(dashboardPanel);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -384,12 +384,12 @@ public class DashboardController implements EventListener<Event> {
|
||||||
{
|
{
|
||||||
dashboardRunnable.refreshDashboard(false);
|
dashboardRunnable.refreshDashboard(false);
|
||||||
|
|
||||||
// default Update every one minutes
|
// default Update every one minutes
|
||||||
int interval = MSysConfig.getIntValue(MSysConfig.ZK_DASHBOARD_REFRESH_INTERVAL, 60000);
|
int interval = MSysConfig.getIntValue(MSysConfig.ZK_DASHBOARD_REFRESH_INTERVAL, 60000);
|
||||||
dashboardFuture = Adempiere.getThreadPoolExecutor().scheduleWithFixedDelay(dashboardRunnable, interval, interval, TimeUnit.MILLISECONDS);
|
dashboardFuture = Adempiere.getThreadPoolExecutor().scheduleWithFixedDelay(dashboardRunnable, interval, interval, TimeUnit.MILLISECONDS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onEvent(Event event) throws Exception {
|
public void onEvent(Event event) throws Exception {
|
||||||
Component comp = event.getTarget();
|
Component comp = event.getTarget();
|
||||||
String eventName = event.getName();
|
String eventName = event.getName();
|
||||||
|
@ -598,8 +598,9 @@ public class DashboardController implements EventListener<Event> {
|
||||||
public void onSetPage(Page page, Desktop desktop) {
|
public void onSetPage(Page page, Desktop desktop) {
|
||||||
if (dashboardFuture != null && !dashboardFuture.isDone()) {
|
if (dashboardFuture != null && !dashboardFuture.isDone()) {
|
||||||
dashboardFuture.cancel(true);
|
dashboardFuture.cancel(true);
|
||||||
|
Adempiere.getThreadPoolExecutor().remove((Runnable) dashboardFuture);
|
||||||
DashboardRunnable tmp = dashboardRunnable;
|
|
||||||
|
DashboardRunnable tmp = dashboardRunnable;
|
||||||
dashboardRunnable = new DashboardRunnable(tmp, desktop);
|
dashboardRunnable = new DashboardRunnable(tmp, desktop);
|
||||||
// default Update every one minutes
|
// default Update every one minutes
|
||||||
int interval = MSysConfig.getIntValue(MSysConfig.ZK_DASHBOARD_REFRESH_INTERVAL, 60000);
|
int interval = MSysConfig.getIntValue(MSysConfig.ZK_DASHBOARD_REFRESH_INTERVAL, 60000);
|
||||||
|
@ -613,7 +614,14 @@ public class DashboardController implements EventListener<Event> {
|
||||||
public void onLogOut() {
|
public void onLogOut() {
|
||||||
if (dashboardFuture != null && !dashboardFuture.isDone()) {
|
if (dashboardFuture != null && !dashboardFuture.isDone()) {
|
||||||
dashboardFuture.cancel(true);
|
dashboardFuture.cancel(true);
|
||||||
|
Adempiere.getThreadPoolExecutor().remove((Runnable) dashboardFuture);
|
||||||
|
dashboardFuture = null;
|
||||||
}
|
}
|
||||||
|
if (dashboardRunnable != null) {
|
||||||
|
dashboardRunnable = null;
|
||||||
|
}
|
||||||
|
dashboardLayout.detach();
|
||||||
|
dashboardLayout = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addDashboardPanel(DashboardPanel dashboardPanel) {
|
public void addDashboardPanel(DashboardPanel dashboardPanel) {
|
||||||
|
|
|
@ -108,8 +108,6 @@ public class DefaultDesktop extends TabbedDesktop implements MenuListener, Seria
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
private static final CLogger logger = CLogger.getCLogger(DefaultDesktop.class);
|
private static final CLogger logger = CLogger.getCLogger(DefaultDesktop.class);
|
||||||
|
|
||||||
private Center windowArea;
|
|
||||||
|
|
||||||
private Borderlayout layout;
|
private Borderlayout layout;
|
||||||
|
|
||||||
private int noOfNotice;
|
private int noOfNotice;
|
||||||
|
@ -124,12 +122,9 @@ public class DefaultDesktop extends TabbedDesktop implements MenuListener, Seria
|
||||||
|
|
||||||
private DashboardController dashboardController, sideController;
|
private DashboardController dashboardController, sideController;
|
||||||
|
|
||||||
private BroadcastMessageWindow messageWindow;
|
|
||||||
private BroadcastMessageWindow testMessageWindow;
|
|
||||||
private HeaderPanel pnlHead;
|
private HeaderPanel pnlHead;
|
||||||
|
|
||||||
private Desktop m_desktop = null;
|
private Desktop m_desktop = null;
|
||||||
private TimeoutPanel panel = null;
|
|
||||||
|
|
||||||
private HelpController helpController;
|
private HelpController helpController;
|
||||||
|
|
||||||
|
@ -217,7 +212,7 @@ public class DefaultDesktop extends TabbedDesktop implements MenuListener, Seria
|
||||||
|
|
||||||
helpController.render(e, this);
|
helpController.render(e, this);
|
||||||
|
|
||||||
windowArea = layout.getCenter();
|
Center windowArea = layout.getCenter();
|
||||||
|
|
||||||
windowContainer.createPart(windowArea);
|
windowContainer.createPart(windowArea);
|
||||||
|
|
||||||
|
@ -229,7 +224,7 @@ public class DefaultDesktop extends TabbedDesktop implements MenuListener, Seria
|
||||||
busyDialog.setShadow(false);
|
busyDialog.setShadow(false);
|
||||||
homeTab.appendChild(busyDialog);
|
homeTab.appendChild(busyDialog);
|
||||||
|
|
||||||
messageWindow = new BroadcastMessageWindow(pnlHead);
|
BroadcastMessageWindow messageWindow = new BroadcastMessageWindow(pnlHead);
|
||||||
BroadcastMsgUtil.showPendingMessage(Env.getAD_User_ID(Env.getCtx()), messageWindow);
|
BroadcastMsgUtil.showPendingMessage(Env.getAD_User_ID(Env.getCtx()), messageWindow);
|
||||||
|
|
||||||
if (!layout.getDesktop().isServerPushEnabled())
|
if (!layout.getDesktop().isServerPushEnabled())
|
||||||
|
@ -422,11 +417,18 @@ public class DefaultDesktop extends TabbedDesktop implements MenuListener, Seria
|
||||||
unbindEventManager();
|
unbindEventManager();
|
||||||
if (dashboardController != null) {
|
if (dashboardController != null) {
|
||||||
dashboardController.onLogOut();
|
dashboardController.onLogOut();
|
||||||
|
dashboardController = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sideController != null) {
|
if (sideController != null) {
|
||||||
sideController.onLogOut();
|
sideController.onLogOut();
|
||||||
|
sideController = null;
|
||||||
}
|
}
|
||||||
|
layout.detach();
|
||||||
|
layout = null;
|
||||||
|
pnlHead = null;
|
||||||
|
max = null;
|
||||||
|
m_desktop = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateUI() {
|
public void updateUI() {
|
||||||
|
@ -499,8 +501,7 @@ public class DefaultDesktop extends TabbedDesktop implements MenuListener, Seria
|
||||||
.toString(Env.getContextAsInt(Env.getCtx(),
|
.toString(Env.getContextAsInt(Env.getCtx(),
|
||||||
"AD_Session_ID"));
|
"AD_Session_ID"));
|
||||||
if (currSession.equals(msg.getTarget())) {
|
if (currSession.equals(msg.getTarget())) {
|
||||||
if (testMessageWindow == null)
|
BroadcastMessageWindow testMessageWindow = new BroadcastMessageWindow(
|
||||||
testMessageWindow = new BroadcastMessageWindow(
|
|
||||||
pnlHead);
|
pnlHead);
|
||||||
testMessageWindow.appendMessage(mbMessage, true);
|
testMessageWindow.appendMessage(mbMessage, true);
|
||||||
testMessageWindow = null;
|
testMessageWindow = null;
|
||||||
|
@ -512,8 +513,7 @@ public class DefaultDesktop extends TabbedDesktop implements MenuListener, Seria
|
||||||
Env.getCtx(), msg.getIntData());
|
Env.getCtx(), msg.getIntData());
|
||||||
if (mbMessage.isValidUserforMessage()) {
|
if (mbMessage.isValidUserforMessage()) {
|
||||||
|
|
||||||
if (messageWindow == null)
|
BroadcastMessageWindow messageWindow = new BroadcastMessageWindow(
|
||||||
messageWindow = new BroadcastMessageWindow(
|
|
||||||
pnlHead);
|
pnlHead);
|
||||||
messageWindow.appendMessage(mbMessage, false);
|
messageWindow.appendMessage(mbMessage, false);
|
||||||
}
|
}
|
||||||
|
@ -522,12 +522,8 @@ public class DefaultDesktop extends TabbedDesktop implements MenuListener, Seria
|
||||||
|
|
||||||
currSession = Integer.toString(Env.getContextAsInt(
|
currSession = Integer.toString(Env.getContextAsInt(
|
||||||
Env.getCtx(), "AD_Session_ID"));
|
Env.getCtx(), "AD_Session_ID"));
|
||||||
System.out.println("Current Session" + currSession);
|
|
||||||
if (currSession.equalsIgnoreCase(msg.getTarget())) {
|
if (currSession.equalsIgnoreCase(msg.getTarget())) {
|
||||||
if (panel == null) {
|
new TimeoutPanel(pnlHead, msg.getIntData());
|
||||||
panel = new TimeoutPanel(pnlHead,
|
|
||||||
msg.getIntData());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -536,10 +532,7 @@ public class DefaultDesktop extends TabbedDesktop implements MenuListener, Seria
|
||||||
currSession = WebUtil.getServerName();
|
currSession = WebUtil.getServerName();
|
||||||
|
|
||||||
if (currSession.equalsIgnoreCase(msg.getTarget())) {
|
if (currSession.equalsIgnoreCase(msg.getTarget())) {
|
||||||
if (panel == null) {
|
new TimeoutPanel(pnlHead, msg.getIntData());
|
||||||
panel = new TimeoutPanel(pnlHead,
|
|
||||||
msg.getIntData());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,11 +53,13 @@ import org.compiere.util.KeyNamePair;
|
||||||
import org.compiere.util.Msg;
|
import org.compiere.util.Msg;
|
||||||
import org.compiere.util.NamePair;
|
import org.compiere.util.NamePair;
|
||||||
import org.compiere.util.ValueNamePair;
|
import org.compiere.util.ValueNamePair;
|
||||||
|
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;
|
||||||
import org.zkoss.zk.ui.event.Event;
|
import org.zkoss.zk.ui.event.Event;
|
||||||
import org.zkoss.zk.ui.event.EventListener;
|
import org.zkoss.zk.ui.event.EventListener;
|
||||||
import org.zkoss.zk.ui.event.Events;
|
import org.zkoss.zk.ui.event.Events;
|
||||||
|
import org.zkoss.zk.ui.util.DesktopCleanup;
|
||||||
import org.zkoss.zul.Comboitem;
|
import org.zkoss.zul.Comboitem;
|
||||||
import org.zkoss.zul.Menuitem;
|
import org.zkoss.zul.Menuitem;
|
||||||
|
|
||||||
|
@ -656,18 +658,37 @@ ContextMenuListener, IZoomableEditor
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = 4540856986889452983L;
|
private static final long serialVersionUID = 4540856986889452983L;
|
||||||
protected WTableDirEditor editor;
|
protected WTableDirEditor editor;
|
||||||
|
private DesktopCleanup listener = null;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPageAttached(Page newpage, Page oldpage) {
|
public void onPageAttached(Page newpage, Page oldpage) {
|
||||||
super.onPageAttached(newpage, oldpage);
|
super.onPageAttached(newpage, oldpage);
|
||||||
if (editor.tableCacheListener == null) {
|
if (editor.tableCacheListener == null) {
|
||||||
editor.createCacheListener();
|
editor.createCacheListener();
|
||||||
|
if (listener == null) {
|
||||||
|
listener = new DesktopCleanup() {
|
||||||
|
@Override
|
||||||
|
public void cleanup(Desktop desktop) throws Exception {
|
||||||
|
EditorCombobox.this.cleanup();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
newpage.getDesktop().addListener(listener);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPageDetached(Page page) {
|
public void onPageDetached(Page page) {
|
||||||
super.onPageDetached(page);
|
super.onPageDetached(page);
|
||||||
|
if (listener != null && page.getDesktop() != null)
|
||||||
|
page.getDesktop().removeListener(listener);
|
||||||
|
cleanup();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
protected void cleanup() {
|
||||||
if (editor.tableCacheListener != null) {
|
if (editor.tableCacheListener != null) {
|
||||||
CacheMgt.get().unregister(editor.tableCacheListener);
|
CacheMgt.get().unregister(editor.tableCacheListener);
|
||||||
editor.tableCacheListener = null;
|
editor.tableCacheListener = null;
|
||||||
|
|
|
@ -33,8 +33,10 @@ import org.compiere.model.MTreeNode;
|
||||||
import org.compiere.util.DB;
|
import org.compiere.util.DB;
|
||||||
import org.compiere.util.Env;
|
import org.compiere.util.Env;
|
||||||
import org.zkoss.zk.ui.Component;
|
import org.zkoss.zk.ui.Component;
|
||||||
|
import org.zkoss.zk.ui.Page;
|
||||||
import org.zkoss.zk.ui.event.Event;
|
import org.zkoss.zk.ui.event.Event;
|
||||||
import org.zkoss.zk.ui.event.EventListener;
|
import org.zkoss.zk.ui.event.EventListener;
|
||||||
|
import org.zkoss.zk.ui.event.EventQueue;
|
||||||
import org.zkoss.zk.ui.event.EventQueues;
|
import org.zkoss.zk.ui.event.EventQueues;
|
||||||
import org.zkoss.zk.ui.event.Events;
|
import org.zkoss.zk.ui.event.Events;
|
||||||
import org.zkoss.zul.A;
|
import org.zkoss.zul.A;
|
||||||
|
@ -65,57 +67,14 @@ public abstract class AbstractMenuPanel extends Panel implements EventListener<E
|
||||||
|
|
||||||
private Properties ctx;
|
private Properties ctx;
|
||||||
private Tree menuTree;
|
private Tree menuTree;
|
||||||
|
|
||||||
|
private EventListener<Event> listener;
|
||||||
|
|
||||||
public AbstractMenuPanel(Component parent)
|
public AbstractMenuPanel(Component parent)
|
||||||
{
|
{
|
||||||
if (parent != null)
|
if (parent != null)
|
||||||
this.setParent(parent);
|
this.setParent(parent);
|
||||||
init();
|
init();
|
||||||
|
|
||||||
EventQueues.lookup(MENU_ITEM_SELECTED_QUEUE, EventQueues.DESKTOP, true).subscribe(new EventListener<Event>() {
|
|
||||||
public void onEvent(Event event) throws Exception {
|
|
||||||
if (event.getName() == Events.ON_SELECT)
|
|
||||||
{
|
|
||||||
Treeitem selectedItem = (Treeitem) event.getData();
|
|
||||||
|
|
||||||
if (selectedItem != null)
|
|
||||||
{
|
|
||||||
Object value = selectedItem.getValue();
|
|
||||||
if (value != null)
|
|
||||||
{
|
|
||||||
if (menuTree.getSelectedItem() != null && menuTree.getSelectedItem().getValue() != null && menuTree.getSelectedItem().getValue().equals(value))
|
|
||||||
return;
|
|
||||||
|
|
||||||
Collection<Treeitem> items = menuTree.getItems();
|
|
||||||
for (Treeitem item : items)
|
|
||||||
{
|
|
||||||
if (item != null && item.getValue() != null && item.getValue().equals(value))
|
|
||||||
{
|
|
||||||
TreeSearchPanel.select(item);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
String label = selectedItem.getLabel();
|
|
||||||
if (menuTree.getSelectedItem() != null && menuTree.getSelectedItem().getLabel() != null && menuTree.getSelectedItem().getLabel().equals(label))
|
|
||||||
return;
|
|
||||||
|
|
||||||
Collection<Treeitem> items = menuTree.getItems();
|
|
||||||
for (Treeitem item : items)
|
|
||||||
{
|
|
||||||
if (item != null && item.getLabel() != null && item.getLabel().equals(label))
|
|
||||||
{
|
|
||||||
TreeSearchPanel.select(item);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void init() {
|
protected void init() {
|
||||||
|
@ -350,4 +309,75 @@ public abstract class AbstractMenuPanel extends Panel implements EventListener<E
|
||||||
{
|
{
|
||||||
return ctx;
|
return ctx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.zkoss.zk.ui.AbstractComponent#onPageDetached(org.zkoss.zk.ui.Page)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void onPageDetached(Page page) {
|
||||||
|
super.onPageDetached(page);
|
||||||
|
if (listener != null) {
|
||||||
|
try {
|
||||||
|
EventQueue<Event> queue = EventQueues.lookup(MENU_ITEM_SELECTED_QUEUE, EventQueues.DESKTOP, true);
|
||||||
|
if (queue != null)
|
||||||
|
queue.unsubscribe(listener);
|
||||||
|
} finally {
|
||||||
|
listener = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPageAttached(Page newpage, Page oldpage) {
|
||||||
|
super.onPageAttached(newpage, oldpage);
|
||||||
|
if (listener == null) {
|
||||||
|
listener = new EventListener<Event>() {
|
||||||
|
public void onEvent(Event event) throws Exception {
|
||||||
|
if (event.getName() == Events.ON_SELECT)
|
||||||
|
{
|
||||||
|
Treeitem selectedItem = (Treeitem) event.getData();
|
||||||
|
|
||||||
|
if (selectedItem != null)
|
||||||
|
{
|
||||||
|
Object value = selectedItem.getValue();
|
||||||
|
if (value != null)
|
||||||
|
{
|
||||||
|
if (menuTree.getSelectedItem() != null && menuTree.getSelectedItem().getValue() != null && menuTree.getSelectedItem().getValue().equals(value))
|
||||||
|
return;
|
||||||
|
|
||||||
|
Collection<Treeitem> items = menuTree.getItems();
|
||||||
|
for (Treeitem item : items)
|
||||||
|
{
|
||||||
|
if (item != null && item.getValue() != null && item.getValue().equals(value))
|
||||||
|
{
|
||||||
|
TreeSearchPanel.select(item);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
String label = selectedItem.getLabel();
|
||||||
|
if (menuTree.getSelectedItem() != null && menuTree.getSelectedItem().getLabel() != null && menuTree.getSelectedItem().getLabel().equals(label))
|
||||||
|
return;
|
||||||
|
|
||||||
|
Collection<Treeitem> items = menuTree.getItems();
|
||||||
|
for (Treeitem item : items)
|
||||||
|
{
|
||||||
|
if (item != null && item.getLabel() != null && item.getLabel().equals(label))
|
||||||
|
{
|
||||||
|
TreeSearchPanel.select(item);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
EventQueues.lookup(MENU_ITEM_SELECTED_QUEUE, EventQueues.DESKTOP, true).subscribe(listener);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,8 +15,10 @@
|
||||||
package org.adempiere.webui.panel;
|
package org.adempiere.webui.panel;
|
||||||
|
|
||||||
import org.zkoss.zk.ui.Component;
|
import org.zkoss.zk.ui.Component;
|
||||||
|
import org.zkoss.zk.ui.Page;
|
||||||
import org.zkoss.zk.ui.event.Event;
|
import org.zkoss.zk.ui.event.Event;
|
||||||
import org.zkoss.zk.ui.event.EventListener;
|
import org.zkoss.zk.ui.event.EventListener;
|
||||||
|
import org.zkoss.zk.ui.event.EventQueue;
|
||||||
import org.zkoss.zk.ui.event.EventQueues;
|
import org.zkoss.zk.ui.event.EventQueues;
|
||||||
import org.zkoss.zk.ui.event.Events;
|
import org.zkoss.zk.ui.event.Events;
|
||||||
import org.zkoss.zul.Checkbox;
|
import org.zkoss.zul.Checkbox;
|
||||||
|
@ -35,6 +37,8 @@ public class MenuSearchPanel extends AbstractMenuPanel
|
||||||
private static final long serialVersionUID = 5308522340852904168L;
|
private static final long serialVersionUID = 5308522340852904168L;
|
||||||
|
|
||||||
protected MenuTreeSearchPanel pnlSearch;
|
protected MenuTreeSearchPanel pnlSearch;
|
||||||
|
|
||||||
|
private EventListener<Event> listener;
|
||||||
|
|
||||||
public MenuSearchPanel(Component parent)
|
public MenuSearchPanel(Component parent)
|
||||||
{
|
{
|
||||||
|
@ -45,26 +49,7 @@ public class MenuSearchPanel extends AbstractMenuPanel
|
||||||
protected void init()
|
protected void init()
|
||||||
{
|
{
|
||||||
super.init();
|
super.init();
|
||||||
pnlSearch.initialise();
|
pnlSearch.initialise();
|
||||||
|
|
||||||
EventQueues.lookup(MenuTreeFilterPanel.MENU_TREE_FILTER_CHECKED_QUEUE, EventQueues.DESKTOP, true).subscribe(new EventListener<Event>() {
|
|
||||||
public void onEvent(Event event) throws Exception {
|
|
||||||
if (event.getName() == Events.ON_CHECK)
|
|
||||||
{
|
|
||||||
Checkbox chk = (Checkbox) event.getData();
|
|
||||||
if (chk != null)
|
|
||||||
{
|
|
||||||
if ("flatView".equals(chk.getId()))
|
|
||||||
MenuTreeFilterPanel.toggleFlatView(getMenuTree(), chk);
|
|
||||||
else
|
|
||||||
MenuTreeFilterPanel.toggle(getMenuTree(), chk);
|
|
||||||
if (pnlSearch != null)
|
|
||||||
pnlSearch.refreshSearchList();
|
|
||||||
getMenuTree().invalidate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void initComponents()
|
protected void initComponents()
|
||||||
|
@ -83,4 +68,50 @@ public class MenuSearchPanel extends AbstractMenuPanel
|
||||||
pnlSearch.setSclass("menu-search-panel");
|
pnlSearch.setSclass("menu-search-panel");
|
||||||
toolbar.appendChild(pnlSearch);
|
toolbar.appendChild(pnlSearch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.zkoss.zk.ui.AbstractComponent#onPageDetached(org.zkoss.zk.ui.Page)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void onPageDetached(Page page) {
|
||||||
|
super.onPageDetached(page);
|
||||||
|
if (listener != null) {
|
||||||
|
try {
|
||||||
|
EventQueue<Event> queue = EventQueues.lookup(MenuTreeFilterPanel.MENU_TREE_FILTER_CHECKED_QUEUE, EventQueues.DESKTOP, true);
|
||||||
|
if (queue != null)
|
||||||
|
queue.unsubscribe(listener);
|
||||||
|
} finally {
|
||||||
|
listener = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPageAttached(Page newpage, Page oldpage) {
|
||||||
|
super.onPageAttached(newpage, oldpage);
|
||||||
|
if (listener == null) {
|
||||||
|
listener = new EventListener<Event>() {
|
||||||
|
public void onEvent(Event event) throws Exception {
|
||||||
|
if (event.getName() == Events.ON_CHECK)
|
||||||
|
{
|
||||||
|
Checkbox chk = (Checkbox) event.getData();
|
||||||
|
if (chk != null)
|
||||||
|
{
|
||||||
|
if ("flatView".equals(chk.getId()))
|
||||||
|
MenuTreeFilterPanel.toggleFlatView(getMenuTree(), chk);
|
||||||
|
else
|
||||||
|
MenuTreeFilterPanel.toggle(getMenuTree(), chk);
|
||||||
|
if (pnlSearch != null)
|
||||||
|
pnlSearch.refreshSearchList();
|
||||||
|
getMenuTree().invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
EventQueues.lookup(MenuTreeFilterPanel.MENU_TREE_FILTER_CHECKED_QUEUE, EventQueues.DESKTOP, true).subscribe(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
package org.adempiere.webui.session;
|
package org.adempiere.webui.session;
|
||||||
|
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
import org.adempiere.webui.AdempiereWebUI;
|
import org.adempiere.webui.AdempiereWebUI;
|
||||||
|
@ -53,8 +54,17 @@ public class SessionManager
|
||||||
private static Session getSession()
|
private static Session getSession()
|
||||||
{
|
{
|
||||||
Execution execution = Executions.getCurrent();
|
Execution execution = Executions.getCurrent();
|
||||||
Desktop desktop = execution != null ? execution.getDesktop()
|
Desktop desktop = null;
|
||||||
: (Desktop) Env.getCtx().get(AdempiereWebUI.ZK_DESKTOP_SESSION_KEY);
|
if (execution != null)
|
||||||
|
{
|
||||||
|
desktop = execution.getDesktop();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
WeakReference<Desktop> ref = (WeakReference<Desktop>) Env.getCtx().get(AdempiereWebUI.ZK_DESKTOP_SESSION_KEY);
|
||||||
|
desktop = ref != null ? ref.get() : null;
|
||||||
|
}
|
||||||
return desktop != null ? desktop.getSession() : null;
|
return desktop != null ? desktop.getSession() : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,7 +72,7 @@ public class SessionManager
|
||||||
{
|
{
|
||||||
Session session = getSession();
|
Session session = getSession();
|
||||||
if (session != null)
|
if (session != null)
|
||||||
session.setAttribute(SESSION_APPLICATION, app);
|
session.setAttribute(SESSION_APPLICATION, new WeakReference<IWebClient>(app));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IDesktop getAppDesktop()
|
public static IDesktop getAppDesktop()
|
||||||
|
@ -74,7 +84,13 @@ public class SessionManager
|
||||||
public static IWebClient getSessionApplication()
|
public static IWebClient getSessionApplication()
|
||||||
{
|
{
|
||||||
Session session = getSession();
|
Session session = getSession();
|
||||||
IWebClient app = session != null ? (IWebClient)session.getAttribute(SESSION_APPLICATION) : null;
|
IWebClient app = null;
|
||||||
|
if (session != null)
|
||||||
|
{
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
WeakReference<IWebClient> wref = (WeakReference<IWebClient>) session.getAttribute(SESSION_APPLICATION);
|
||||||
|
app = wref != null ? wref.get() : null;
|
||||||
|
}
|
||||||
return app;
|
return app;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue