diff options
author | Roberto E. Escobar | 2012-01-07 01:25:40 +0000 |
---|---|---|
committer | Roberto E. Escobar | 2012-01-07 01:25:40 +0000 |
commit | d69f34f497b0132d80f8de75c891d113976dff7f (patch) | |
tree | bd8a50a589e0cac327de16b07003b62613fae0d2 /plugins/org.eclipse.osee.vaadin | |
parent | 7164447695ad244f2fd5e7a68f3af335a7566a72 (diff) | |
download | org.eclipse.osee-d69f34f497b0132d80f8de75c891d113976dff7f.tar.gz org.eclipse.osee-d69f34f497b0132d80f8de75c891d113976dff7f.tar.xz org.eclipse.osee-d69f34f497b0132d80f8de75c891d113976dff7f.zip |
feature[ats_Y5ZXT]: Add multi-tab, multi-window support0.9.9.v201111091249_XS_REL
Diffstat (limited to 'plugins/org.eclipse.osee.vaadin')
6 files changed, 236 insertions, 6 deletions
diff --git a/plugins/org.eclipse.osee.vaadin/build.properties b/plugins/org.eclipse.osee.vaadin/build.properties index bd38ae27181..e7fa11f1930 100644 --- a/plugins/org.eclipse.osee.vaadin/build.properties +++ b/plugins/org.eclipse.osee.vaadin/build.properties @@ -8,4 +8,5 @@ additional.bundles = org.eclipse.osee.event,\ org.eclipse.osee.logger,\ org.eclipse.osgi,\ javax.servlet,\ - com.vaadin + com.vaadin,\ + org.eclipse.osee.framework.jdk.core diff --git a/plugins/org.eclipse.osee.vaadin/src/org/eclipse/osee/vaadin/AbstractApplication.java b/plugins/org.eclipse.osee.vaadin/src/org/eclipse/osee/vaadin/AbstractApplication.java new file mode 100644 index 00000000000..d51f4dc3809 --- /dev/null +++ b/plugins/org.eclipse.osee.vaadin/src/org/eclipse/osee/vaadin/AbstractApplication.java @@ -0,0 +1,134 @@ +/******************************************************************************* + * Copyright (c) 2004, 2007 Boeing. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Boeing - initial API and implementation + *******************************************************************************/ +package org.eclipse.osee.vaadin; + +import java.util.Locale; +import javax.servlet.http.HttpServletRequest; +import org.eclipse.osee.vaadin.internal.ApplicationState; +import com.vaadin.Application; +import com.vaadin.service.ApplicationContext.TransactionListener; +import com.vaadin.ui.Window; + +/** + * @author Roberto E. Escobar + */ +public abstract class AbstractApplication extends Application implements TransactionListener { + + private static final long serialVersionUID = -3069770596395717931L; + + private static final ApplicationState applicationState = new ApplicationState(); + + protected AbstractApplication() { + super(); + } + + protected Window getCurrentWindow() { + return applicationState.getWindow(); + } + + @Override + public final void init() { + getContext().addTransactionListener(this); + + boolean isApplicationValid = applicationState.isApplicationValid(); + if (!isApplicationValid) { + applicationState.setApplication(this); + } + + Window currentWindow = createWindow(); + currentWindow.setName(getWindowName()); + setMainWindow(currentWindow); + + if (!isApplicationValid) { + applicationState.removeApplication(); + } + } + + @Override + public final void transactionStart(Application application, Object transactionData) { + if (this == application) { + + if (!applicationState.isApplicationValid()) { + applicationState.setApplication(this); + } + + HttpServletRequest request = (HttpServletRequest) transactionData; + String paramValue = request.getParameter("fr"); + applicationState.setUriFragment(paramValue); + } + } + + @Override + public final void transactionEnd(Application application, Object transactionData) { + if (this == application) { + applicationState.clearAll(); + } + } + + //https://vaadin.com/web/joonas/wiki/-/wiki/Main/Supporting%20Multible%20Tabs + @Override + public final Window getWindow(String name) { + Window toReturn = null; + if (isRunning()) { + toReturn = super.getWindow(name); + + Window mainWindow = getMainWindow(); + if (mainWindow != null && matchesWindowName(mainWindow.getName(), name)) { + if (toReturn == null) { + toReturn = createWindow(); + toReturn.setName(name); + addWindow(toReturn); + } + applicationState.setWindow(toReturn); + + // SEE: http://vaadin.com/forum/-/message_boards/message/57240 + // Empty string is a call for home page. + if ("".equals(applicationState.getUriFragment())) { + if (mainWindow instanceof HasMultiplePages) { + HasMultiplePages multiPaged = (HasMultiplePages) mainWindow; + if (multiPaged.getCurrentPage() == null) { + multiPaged.setToDefault(); + } + } + } + } + } + return toReturn; + } + + private Window createWindow() { + try { + Application application = applicationState.getApplication(); + return createApplicationWindow(application.getLocale()); + } catch (Exception ex) { + throw new IllegalStateException(ex); + } + } + + private String getWindowName() { + return getApplicationWindowName(); + } + + protected boolean matchesWindowName(String windowName, String name) { + boolean result = name.equals(windowName); + if (!result) { + String[] nameParts = name.split("_"); + if (nameParts.length == 2) { + result = windowName.equals(nameParts[0]); + } + } + return result; + } + + protected abstract Window createApplicationWindow(Locale locale) throws Exception; + + protected abstract String getApplicationWindowName(); +}
\ No newline at end of file diff --git a/plugins/org.eclipse.osee.vaadin/src/org/eclipse/osee/vaadin/ApplicationFactory.java b/plugins/org.eclipse.osee.vaadin/src/org/eclipse/osee/vaadin/ApplicationFactory.java index 6313cf42ba7..650a3769359 100644 --- a/plugins/org.eclipse.osee.vaadin/src/org/eclipse/osee/vaadin/ApplicationFactory.java +++ b/plugins/org.eclipse.osee.vaadin/src/org/eclipse/osee/vaadin/ApplicationFactory.java @@ -10,15 +10,13 @@ *******************************************************************************/ package org.eclipse.osee.vaadin; -import com.vaadin.Application; - /** * @author Roberto E. Escobar */ public interface ApplicationFactory { - Application createInstance() throws Exception; + AbstractApplication createInstance() throws Exception; - Class<? extends Application> getApplicationClass(); + Class<? extends AbstractApplication> getApplicationClass(); } diff --git a/plugins/org.eclipse.osee.vaadin/src/org/eclipse/osee/vaadin/HasMultiplePages.java b/plugins/org.eclipse.osee.vaadin/src/org/eclipse/osee/vaadin/HasMultiplePages.java new file mode 100644 index 00000000000..fab4feb6e09 --- /dev/null +++ b/plugins/org.eclipse.osee.vaadin/src/org/eclipse/osee/vaadin/HasMultiplePages.java @@ -0,0 +1,23 @@ +/******************************************************************************* + * Copyright (c) 2004, 2007 Boeing. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Boeing - initial API and implementation + *******************************************************************************/ +package org.eclipse.osee.vaadin; + +import com.vaadin.ui.Component; + +/** + * @author Roberto E. Escobar + */ +public interface HasMultiplePages { + + void setToDefault(); + + Component getCurrentPage(); +} diff --git a/plugins/org.eclipse.osee.vaadin/src/org/eclipse/osee/vaadin/internal/ApplicationServlet.java b/plugins/org.eclipse.osee.vaadin/src/org/eclipse/osee/vaadin/internal/ApplicationServlet.java index fbbd52708c1..7128637c17f 100644 --- a/plugins/org.eclipse.osee.vaadin/src/org/eclipse/osee/vaadin/internal/ApplicationServlet.java +++ b/plugins/org.eclipse.osee.vaadin/src/org/eclipse/osee/vaadin/internal/ApplicationServlet.java @@ -23,6 +23,7 @@ import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import org.eclipse.osee.logger.Log; +import org.eclipse.osee.vaadin.AbstractApplication; import org.eclipse.osee.vaadin.ApplicationFactory; import com.vaadin.Application; import com.vaadin.terminal.gwt.server.AbstractApplicationServlet; @@ -63,8 +64,10 @@ public class ApplicationServlet extends AbstractApplicationServlet { throw new ServletException(String.format("Error creating vaading application using [%s]", factory.getClass().getName())); } + setApplicationMetaData(request, application); HttpSession httpSession = request.getSession(); + final ApplicationSession session = new ApplicationSession(application, httpSession); sessions.add(session); httpSession.setAttribute(ApplicationSession.class.getName(), new HttpSessionListener() { @@ -164,7 +167,7 @@ public class ApplicationServlet extends AbstractApplicationServlet { @Override protected Class<? extends Application> getApplicationClass() { - return factory.getApplicationClass(); + return AbstractApplication.class; } @Override @@ -393,4 +396,5 @@ public class ApplicationServlet extends AbstractApplicationServlet { return string; } + } diff --git a/plugins/org.eclipse.osee.vaadin/src/org/eclipse/osee/vaadin/internal/ApplicationState.java b/plugins/org.eclipse.osee.vaadin/src/org/eclipse/osee/vaadin/internal/ApplicationState.java new file mode 100644 index 00000000000..7f35650eb8c --- /dev/null +++ b/plugins/org.eclipse.osee.vaadin/src/org/eclipse/osee/vaadin/internal/ApplicationState.java @@ -0,0 +1,70 @@ +/******************************************************************************* + * Copyright (c) 2004, 2007 Boeing. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Boeing - initial API and implementation + *******************************************************************************/ +package org.eclipse.osee.vaadin.internal; + +import com.vaadin.Application; +import com.vaadin.ui.Window; + +/** + * @author Roberto E. Escobar + */ +public class ApplicationState { + + private final ThreadLocal<Application> application = new ThreadLocal<Application>(); + private final ThreadLocal<Window> window = new ThreadLocal<Window>(); + private final ThreadLocal<String> uriFragment = new ThreadLocal<String>(); + + public Application getApplication() { + return application.get(); + } + + public void setApplication(Application application) { + this.application.set(application); + } + + public boolean isApplicationValid() { + return getApplication() != null; + } + + public Window getWindow() { + return window.get(); + } + + public void setWindow(Window window) { + this.window.set(window); + } + + public String getUriFragment() { + return uriFragment.get(); + } + + public void setUriFragment(String fragment) { + uriFragment.set(fragment); + } + + public void removeApplication() { + application.remove(); + } + + public void removeWindow() { + window.remove(); + } + + public void removeUriFragment() { + uriFragment.remove(); + } + + public void clearAll() { + removeApplication(); + removeWindow(); + removeUriFragment(); + } +} |