Author: sohil.shah(a)jboss.com
Date: 2007-10-03 00:07:22 -0400 (Wed, 03 Oct 2007)
New Revision: 8519
Added:
branches/UIServer/uiserver/gwt-dev-env/AsyncPages(uiserver).launch
branches/UIServer/uiserver/src/main/org/jboss/portal/uiserver/ajax/client/AsyncPages.java
branches/UIServer/uiserver/src/resources/client/ajax/src/org/jboss/portal/uiserver/ajax/AsyncPages.gwt.xml
branches/UIServer/uiserver/src/resources/client/ajax/src/org/jboss/portal/uiserver/ajax/public/asyncPages.html
branches/UIServer/uiserver/src/resources/client/ajax/src/org/jboss/portal/uiserver/ajax/public/portal.css
branches/UIServer/uiserver/src/resources/client/ajax/uiserver-poc.war/asyncPages.html
Modified:
branches/UIServer/uiserver/build.xml
branches/UIServer/uiserver/gwt-dev-env/
branches/UIServer/uiserver/src/main/org/jboss/portal/uiserver/service/PortletServiceImpl.java
branches/UIServer/uiserver/src/resources/client/ajax/src/org/jboss/portal/uiserver/ajax/public/layout.html
branches/UIServer/uiserver/src/resources/client/ajax/src/org/jboss/portal/uiserver/ajax/public/partialRefresh.html
branches/UIServer/uiserver/src/resources/client/ajax/uiserver-poc.war/WEB-INF/web.xml
Log:
Proof of Concept of Asynchronous Portal Page Management
Modified: branches/UIServer/uiserver/build.xml
===================================================================
--- branches/UIServer/uiserver/build.xml 2007-10-02 21:23:07 UTC (rev 8518)
+++ branches/UIServer/uiserver/build.xml 2007-10-03 04:07:22 UTC (rev 8519)
@@ -268,6 +268,16 @@
<arg line="-out ${build.resources}/client/ajax/uiserver-poc.war/"/>
<arg line="org.jboss.portal.uiserver.ajax.PartialRefresh"/>
</java>
+
+ <delete
dir="${build.resources}/client/ajax/uiserver-poc.war/org.jboss.portal.uiserver.ajax.AsyncPages"/>
+ <java classpathref="gwt.gwt.classpath" fork="true"
classname="com.google.gwt.dev.GWTCompiler">
+ <classpath>
+ <pathelement path="src/main"/>
+ <pathelement path="src/resources/client/ajax/src"/>
+ </classpath>
+ <arg line="-out ${build.resources}/client/ajax/uiserver-poc.war/"/>
+ <arg line="org.jboss.portal.uiserver.ajax.AsyncPages"/>
+ </java>
<copy file="${build.lib}/portal-uiserver-lib.jar"
todir="${build.resources}/client/ajax/uiserver-poc.war/WEB-INF/lib"
overwrite="true"/>
<copy
file="src/resources/client/ajax/uiserver-poc.war/WEB-INF/lib/gwt-user.jar"
todir="${build.resources}/client/ajax/uiserver-poc.war/WEB-INF/lib"
overwrite="true"/>
Property changes on: branches/UIServer/uiserver/gwt-dev-env
___________________________________________________________________
Name: svn:ignore
+ .gwt-cache
tomcat
www
Added: branches/UIServer/uiserver/gwt-dev-env/AsyncPages(uiserver).launch
===================================================================
--- branches/UIServer/uiserver/gwt-dev-env/AsyncPages(uiserver).launch
(rev 0)
+++ branches/UIServer/uiserver/gwt-dev-env/AsyncPages(uiserver).launch 2007-10-03 04:07:22
UTC (rev 8519)
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<launchConfiguration
type="org.eclipse.jdt.launching.localJavaApplication">
+<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH"
value="false"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE"
value="com.google.gwt.dev.GWTShell"/>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="4"/>
+</listAttribute>
+<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
+<listEntry value="<?xml version="1.0"
encoding="UTF-8"?> <runtimeClasspathEntry
containerPath="org.eclipse.jdt.launching.JRE_CONTAINER"
javaProject="UIServer" path="1"
type="4"/> "/>
+<listEntry value="<?xml version="1.0"
encoding="UTF-8"?> <runtimeClasspathEntry
internalArchive="/UIServer/uiserver/src/main" path="3"
type="2"/> "/>
+<listEntry value="<?xml version="1.0"
encoding="UTF-8"?> <runtimeClasspathEntry
internalArchive="/UIServer/uiserver/src/resources/client/ajax/src"
path="3" type="2"/> "/>
+<listEntry value="<?xml version="1.0"
encoding="UTF-8"?> <runtimeClasspathEntry
internalArchive="/UIServer/uiserver/gwt-dev-env/src"
path="3" type="2"/> "/>
+<listEntry value="<?xml version="1.0"
encoding="UTF-8"?> <runtimeClasspathEntry
id="org.eclipse.jdt.launching.classpathentry.defaultClasspath"> <memento
exportedEntriesOnly="false"
project="UIServer"/> </runtimeClasspathEntry> "/>
+<listEntry value="<?xml version="1.0"
encoding="UTF-8"?> <runtimeClasspathEntry
internalArchive="/UIServer/uiserver/gwt-dev-env/gwt-dev-linux.jar"
path="3" type="2"/> "/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS"
value="-out www org.jboss.portal.uiserver.ajax.AsyncPages/asyncPages.html"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR"
value="UIServer"/>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/UIServer"/>
+</listAttribute>
+<mapAttribute key="org.eclipse.debug.core.environmentVariables">
+<mapEntry key="GWT_EXTERNAL_BROWSER"
value="/home/soshah/firefox/firefox"/>
+</mapAttribute>
+<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY"
value="${workspace_loc:UIServer/uiserver/gwt-dev-env}"/>
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables"
value="true"/>
+</launchConfiguration>
Added:
branches/UIServer/uiserver/src/main/org/jboss/portal/uiserver/ajax/client/AsyncPages.java
===================================================================
---
branches/UIServer/uiserver/src/main/org/jboss/portal/uiserver/ajax/client/AsyncPages.java
(rev 0)
+++
branches/UIServer/uiserver/src/main/org/jboss/portal/uiserver/ajax/client/AsyncPages.java 2007-10-03
04:07:22 UTC (rev 8519)
@@ -0,0 +1,429 @@
+package org.jboss.portal.uiserver.ajax.client;
+
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.EntryPoint;
+
+import com.google.gwt.user.client.DOM;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.Event;
+import com.google.gwt.user.client.HTTPRequest;
+import com.google.gwt.user.client.ResponseTextHandler;
+import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.Widget;
+import com.google.gwt.user.client.ui.Panel;
+import com.google.gwt.user.client.ui.RootPanel;
+import com.google.gwt.user.client.ui.HorizontalPanel;
+import com.google.gwt.user.client.ui.VerticalPanel;
+import com.google.gwt.user.client.ui.Button;
+import com.google.gwt.user.client.ui.ClickListener;
+import com.google.gwt.user.client.ui.TabBar;
+import com.google.gwt.user.client.ui.TabListener;
+import com.google.gwt.user.client.ui.SourcesTabEvents;
+
+import com.google.gwt.user.client.rpc.ServiceDefTarget;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
+/**
+ * Entry point classes define <code>onModuleLoad()</code>.
+ */
+public class AsyncPages implements EntryPoint
+{
+ /**
+ * This is the entry point method.
+ */
+ public void onModuleLoad()
+ {
+ this.loadPortal();
+ }
+
+ /**
+ *
+ *
+ */
+ private void loadPortal()
+ {
+ //Load the navigation bar....use a tabbed bar
+ TabBar pageNavigator = new TabBar();
+ pageNavigator.addTab("Page 1");
+ pageNavigator.addTab("Page 2");
+ pageNavigator.addTab("Page 3");
+ pageNavigator.selectTab(0);
+ pageNavigator.addTabListener(new TabListenerImpl());
+ RootPanel.get("pageNavigator").add(pageNavigator);
+
+ //Load the main page to be displayed
+ HorizontalPanel page = new HorizontalPanel();
+ RootPanel.get("currentPage").add(page);
+ this.loadPartialRefreshPage("Page 1");
+ }
+
+ /**
+ *
+ *
+ */
+ private void loadPartialRefreshPage(String pageId)
+ {
+ PortletServiceAsync portletService =
(PortletServiceAsync)GWT.create(PortletService.class);
+
((ServiceDefTarget)portletService).setServiceEntryPoint(GWT.getModuleBaseURL()+"/portletService");
+
+ AsyncCallback callback = new AsyncCallback()
+ {
+ public void onSuccess(Object result)
+ {
+ Page portalPage = (Page)result;
+ displayPortalPage(portalPage);
+ }
+
+ public void onFailure(Throwable caught)
+ {
+ }
+ };
+
+ portletService.getPage(pageId, callback);
+ }
+
+ /**
+ *
+ * @param window
+ * @param newState
+ */
+ private void handleWindowStateChanged(String window, String newState)
+ {
+ PortletServiceAsync portletService =
(PortletServiceAsync)GWT.create(PortletService.class);
+
((ServiceDefTarget)portletService).setServiceEntryPoint(GWT.getModuleBaseURL()+"/portletService");
+
+ AsyncCallback callback = new AsyncCallback()
+ {
+ public void onSuccess(Object result)
+ {
+ Page portalPage = (Page)result;
+ displayPortalPage(portalPage);
+ }
+
+ public void onFailure(Throwable caught)
+ {
+ }
+ };
+
+ portletService.setState(window, newState, callback);
+ }
+
+ /**
+ *
+ * @param window
+ * @param newState
+ */
+ private void handleWindowModeChanged(String window, String newMode)
+ {
+ PortletServiceAsync portletService =
(PortletServiceAsync)GWT.create(PortletService.class);
+
((ServiceDefTarget)portletService).setServiceEntryPoint(GWT.getModuleBaseURL()+"/portletService");
+
+ AsyncCallback callback = new AsyncCallback()
+ {
+ public void onSuccess(Object result)
+ {
+ Page portalPage = (Page)result;
+ displayPortalPage(portalPage);
+ }
+
+ public void onFailure(Throwable caught)
+ {
+ }
+ };
+
+ portletService.setMode(window, newMode, callback);
+ }
+
+ /**
+ *
+ * @param url
+ * @param portletWindow
+ */
+ private void handlePartialRefreshLink(String url, Widget windowContent)
+ {
+ HTTPRequest.asyncGet(url, new ResponseTextHandlerImpl(windowContent));
+ }
+
+ /**
+ *
+ * @param url
+ * @param portletWindow
+ */
+ private void handlePartialRefreshForm(String url, String method, String postData,
Widget windowContent)
+ {
+ if(method.equalsIgnoreCase("post"))
+ {
+ HTTPRequest.asyncPost(url, postData, new
ResponseTextHandlerImpl(windowContent));
+ }
+ else if(method.equalsIgnoreCase("get"))
+ {
+ if(postData != null && postData.trim().length() > 0)
+ {
+ url = url + "?" + postData;
+ }
+ HTTPRequest.asyncGet(url, new ResponseTextHandlerImpl(windowContent));
+ }
+ }
+
+ /**
+ *
+ * @author soshah
+ *
+ */
+ private class ResponseTextHandlerImpl implements ResponseTextHandler
+ {
+ private Widget windowContent = null;
+
+ public ResponseTextHandlerImpl(Widget windowContent)
+ {
+ this.windowContent = windowContent;
+ }
+ public void onCompletion(String responseText)
+ {
+ HTML html = new HTML(responseText);
+ Panel window = (Panel)this.windowContent.getParent();
+ this.windowContent.removeFromParent();
+ window.add(html);
+ }
+ }
+
+ /**
+ *
+ * @param url
+ * @return
+ */
+ private boolean isPartialRefreshAllowed(String url)
+ {
+ String basePortalURL = GWT.getModuleBaseURL();
+ String portalContext = "org.jboss.portal.uiserver.Portal"; //This is hard
coded for now, but must be populated from the Portal deployment environment
+ //If Portal is installed at Root context, this value will be an empty string
+
+ if(url.startsWith(basePortalURL))
+ {
+ //This is an Absolute URL, but it points back to
+ //the Portal
+ //An Async Page Refresh call should be allowed in this case
+ return true;
+ }
+
+ if(url.startsWith("http://"))
+ {
+ //This is an Absolute URL and does not point back
+ //to the Portal
+ //Async Page Refresh call should not be allowed
+ return false;
+ }
+ else
+ {
+ //This is a relative URL.
+
+ //Make sure it points back to the Portal for an Async Page Refresh
+ //If it points to some other resource like another third-party web application
etc, the response
+ //has nothing to do with Portal
+ //(unless ofcourse the client side processor of the Portal, wants to
+ //take this response and aggregate this inside the current Portal Page and
Window being displayed. This is an exceptional usecase
+ //and not desired behavior for every scenario from end user standpoint)
+ //As standard behavior, Async Page Refresh to be done, only when Portlet Markup
is sending a request back to the Portal
+ if(url.startsWith("/"))
+ {
+ if(!portalContext.equals(""))
+ {
+ String urlContext = null;
+ int index = url.indexOf('/', 1);
+ if(index != -1)
+ {
+ urlContext = url.substring(1, index);
+ }
+ else
+ {
+ urlContext = url.substring(1);
+ }
+
+ if(!portalContext.equals(urlContext))
+ {
+ //This request is not being sent to the Portal. It is being sent to
some other web application
+ return false;
+ }
+ }
+ else
+ {
+ //If Portal is running on root context, there is no way to tell from
client side, if this request is actually
+ //to be sent to the Portal or some other web application. Hence, in the
interest of functional safety/correctness
+ //no Async Page Refresh here
+ //If Portal is running on Root context, Partial Refresh will happen only
for pure relative links
+ return false;
+ }
+ }
+
+ //If I get here, Async Page Refresh through the Portal should be allowed
+ return true;
+ }
+ }
+
+ /**
+ *
+ * @param currentForm
+ * @return
+ */
+ public native String serializeForm(Element currentForm)
+ /*-{
+ var formData = $wnd.Form.serialize(currentForm);
+ return formData;
+ }-*/;
+
+ /**
+ *
+ * @param portalPage
+ */
+ private void displayPortalPage(Page portalPage)
+ {
+ //Event Listener for the decoration components like
+ //Normal, Maximized, Minimized
+ ClickListener listener = new ClickListener()
+ {
+ public void onClick(Widget sender)
+ {
+ Button cour = (Button)sender;
+ String windowName = sender.getParent().getTitle();
+ if(cour.getText().equals("Normal"))
+ {
+ handleWindowStateChanged(windowName, Window.NORMAL);
+ }
+ else if(cour.getText().equals("Minimized"))
+ {
+ handleWindowStateChanged(windowName, Window.MINIMIZED);
+ }
+ else if(cour.getText().equals("Maximized"))
+ {
+ handleWindowStateChanged(windowName, Window.MAXIMIZED);
+ }
+ else if(cour.getText().equals("Edit"))
+ {
+ handleWindowModeChanged(windowName, Window.EDIT);
+ }
+ }
+ };
+
+ //Event Listener for actions perfomed inside the portlet window content
+ //itself.
+ ClickListener contentListener = new ClickListener()
+ {
+ public void onClick(Widget sender)
+ {
+ Event event = DOM.eventGetCurrentEvent();
+ Element target = DOM.eventGetTarget(event);
+
+ if(target.toString().toUpperCase().trim().indexOf("</A>") !=
-1)
+ {
+ String link = DOM.getElementAttribute(target, "HREF");
+
+ //A link inside the portlet window was clicked
+ //Load its content asynchronously inside this window
+ boolean isPartialRefreshAllowed = isPartialRefreshAllowed(link);
+ if(isPartialRefreshAllowed)
+ {
+ DOM.eventPreventDefault(event);
+ handlePartialRefreshLink(link, sender);
+ }
+ }
+ else if(target.toString().toUpperCase().trim().indexOf("INPUT") !=
-1 &&
+ target.toString().toUpperCase().trim().indexOf("SUBMIT") !=
-1
+ )
+ {
+ Element currentForm = DOM.getParent(target);
+ String enctype = DOM.getElementAttribute(currentForm,
"enctype");
+ String action = DOM.getElementAttribute(currentForm, "action");
+ boolean isPartialRefreshAllowed = isPartialRefreshAllowed(action);
+ if((isPartialRefreshAllowed) && (enctype == null ||
!enctype.equals("multipart/form-data")))
+ {
+ DOM.eventPreventDefault(event);
+
+ //Call a native javascript function here
+ String method = DOM.getElementAttribute(currentForm,
"method");
+ String serializedForm = serializeForm(currentForm);
+
+ handlePartialRefreshForm(action, method, serializedForm, sender);
+ }
+ }
+ }
+ };
+
+ //Dispalying the fully aggregated page
+ Window[] windows = portalPage.windows;
+ HorizontalPanel page =
(HorizontalPanel)RootPanel.get("currentPage").getWidget(0);
+ page.clear();
+ for(int i=0; i<windows.length; i++)
+ {
+ Window pageWindow = windows[i];
+ if(pageWindow.isVisible)
+ {
+ VerticalPanel window = new VerticalPanel();
+ window.setBorderWidth(2);
+
+ //Create the decoration panel
+ HorizontalPanel decoration = new HorizontalPanel();
+ decoration.setTitle(pageWindow.name);
+
+ Button normal = new Button("Normal");
+ Button minimized = new Button("Minimized");
+ Button maximized = new Button("Maximized");
+ Button edit = new Button("Edit");
+
+ decoration.add(normal);
+ decoration.add(minimized);
+ decoration.add(maximized);
+ decoration.add(edit);
+ window.add(decoration);
+
+ //Create the actual content of the portlet to be displayed inside the window
+ HTML windowContent = new HTML(pageWindow.content);
+ window.add(windowContent);
+
+ //Event listeners for this Window
+ normal.addClickListener(listener);
+ minimized.addClickListener(listener);
+ maximized.addClickListener(listener);
+ edit.addClickListener(listener);
+ windowContent.addClickListener(contentListener);
+
+ //Add this window to the Page
+ page.add(window);
+ }
+ }
+ }
+
+ //------------Page Navigation related
logic-----------------------------------------------------------------------------------------------------
+ /**
+ *
+ */
+ private class TabListenerImpl implements TabListener
+ {
+ /**
+ *
+ */
+ public boolean onBeforeTabSelected(SourcesTabEvents sender, int tabIndex)
+ {
+ return true;
+ }
+
+ /**
+ *
+ */
+ public void onTabSelected(SourcesTabEvents sender, int tabIndex)
+ {
+ if(tabIndex == 0)
+ {
+ loadPartialRefreshPage("Page 1");
+ }
+ else if(tabIndex == 1)
+ {
+ loadPartialRefreshPage("Page 2");
+ }
+ else if(tabIndex == 2)
+ {
+ loadPartialRefreshPage("Page 3");
+ }
+ }
+ }
+}
Modified:
branches/UIServer/uiserver/src/main/org/jboss/portal/uiserver/service/PortletServiceImpl.java
===================================================================
---
branches/UIServer/uiserver/src/main/org/jboss/portal/uiserver/service/PortletServiceImpl.java 2007-10-02
21:23:07 UTC (rev 8518)
+++
branches/UIServer/uiserver/src/main/org/jboss/portal/uiserver/service/PortletServiceImpl.java 2007-10-03
04:07:22 UTC (rev 8519)
@@ -70,23 +70,51 @@
Page page = new Page();
page.name = pageId;
- String weatherContent = this.getPortlet("weatherPortlet.html");
- String cmsContent = this.getPortlet("cmsPortlet.html");
- Window[] windows = new Window[2];
- page.windows = windows;
+ if(pageId.equals("index") || pageId.equals("Page 1"))
+ {
+ String weatherContent = this.getPortlet("weatherPortlet.html");
+ String cmsContent = this.getPortlet("cmsPortlet.html");
+ Window[] windows = new Window[2];
+ page.windows = windows;
+
+
+ Window weatherWindow = new Window();
+ weatherWindow.name = "weatherPortlet";
+ weatherWindow.content = weatherContent;
+
+ Window cmsWindow = new Window();
+ cmsWindow.name = "cmsPortlet";
+ cmsWindow.content = cmsContent;
+
+ windows[0] = weatherWindow;
+ windows[1] = cmsWindow;
+ }
+ else if(pageId.equals("Page 2"))
+ {
+ String weatherContent = this.getPortlet("weatherPortlet.html");
+ Window[] windows = new Window[1];
+ page.windows = windows;
+
+
+ Window weatherWindow = new Window();
+ weatherWindow.name = "weatherPortlet";
+ weatherWindow.content = weatherContent;
+
+ windows[0] = weatherWindow;
+ }
+ else if(pageId.equals("Page 3"))
+ {
+ String cmsContent = this.getPortlet("cmsPortlet.html");
+ Window[] windows = new Window[1];
+ page.windows = windows;
+
+ Window cmsWindow = new Window();
+ cmsWindow.name = "cmsPortlet";
+ cmsWindow.content = cmsContent;
+
+ windows[0] = cmsWindow;
+ }
-
- Window weatherWindow = new Window();
- weatherWindow.name = "weatherPortlet";
- weatherWindow.content = weatherContent;
-
- Window cmsWindow = new Window();
- cmsWindow.name = "cmsPortlet";
- cmsWindow.content = cmsContent;
-
- windows[0] = weatherWindow;
- windows[1] = cmsWindow;
-
HttpServletRequest request = this.getThreadLocalRequest();
request.getSession().setAttribute("currentPage", page);
Added:
branches/UIServer/uiserver/src/resources/client/ajax/src/org/jboss/portal/uiserver/ajax/AsyncPages.gwt.xml
===================================================================
---
branches/UIServer/uiserver/src/resources/client/ajax/src/org/jboss/portal/uiserver/ajax/AsyncPages.gwt.xml
(rev 0)
+++
branches/UIServer/uiserver/src/resources/client/ajax/src/org/jboss/portal/uiserver/ajax/AsyncPages.gwt.xml 2007-10-03
04:07:22 UTC (rev 8519)
@@ -0,0 +1,10 @@
+<module>
+ <!-- Inherit the core Web Toolkit stuff -->
+ <inherits name="com.google.gwt.user.User"/>
+
+ <!-- Specify the app entry point class -->
+ <entry-point class="org.jboss.portal.uiserver.ajax.client.AsyncPages"/>
+
+ <!-- RPC related configuration -->
+ <servlet path="/portletService"
class="org.jboss.portal.uiserver.service.PortletServiceImpl"/>
+</module>
Added:
branches/UIServer/uiserver/src/resources/client/ajax/src/org/jboss/portal/uiserver/ajax/public/asyncPages.html
===================================================================
---
branches/UIServer/uiserver/src/resources/client/ajax/src/org/jboss/portal/uiserver/ajax/public/asyncPages.html
(rev 0)
+++
branches/UIServer/uiserver/src/resources/client/ajax/src/org/jboss/portal/uiserver/ajax/public/asyncPages.html 2007-10-03
04:07:22 UTC (rev 8519)
@@ -0,0 +1,44 @@
+<html>
+ <head>
+
+ <!-- -->
+ <!-- Any title is fine -->
+ <!-- -->
+ <title>JBoss Portal</title>
+
+ <link href="portal.css" rel="stylesheet"
type="text/css">
+
+ <!-- -->
+ <!-- This script loads your compiled module. -->
+ <!-- If you add any GWT meta tags, they must -->
+ <!-- be added before this line. -->
+ <!-- -->
+ <script language='javascript'
src='prototype.js'></script>
+ <script language='javascript'
src='org.jboss.portal.uiserver.ajax.AsyncPages.nocache.js'></script>
+ </head>
+
+ <!-- -->
+ <!-- The body can have arbitrary html, or -->
+ <!-- you can leave the body empty if you want -->
+ <!-- to create a completely dynamic ui -->
+ <!-- -->
+ <body>
+ <!-- OPTIONAL: include this if you want history support -->
+ <iframe src="javascript:''" id="__gwt_historyFrame"
style="width:0;height:0;border:0"></iframe>
+
+ <h1>JBoss Portal</h1>
+
+ <!-- Asynchronous Portal Page Management Proof of Concept -->
+ <p>
+ Asynchronous Page Management
+ </p>
+ <table align="center">
+ <tr>
+ <td id="pageNavigator"></td>
+ </tr>
+ <tr>
+ <td id="currentPage"></td>
+ </tr>
+ </table>
+ </body>
+</html>
Modified:
branches/UIServer/uiserver/src/resources/client/ajax/src/org/jboss/portal/uiserver/ajax/public/layout.html
===================================================================
---
branches/UIServer/uiserver/src/resources/client/ajax/src/org/jboss/portal/uiserver/ajax/public/layout.html 2007-10-02
21:23:07 UTC (rev 8518)
+++
branches/UIServer/uiserver/src/resources/client/ajax/src/org/jboss/portal/uiserver/ajax/public/layout.html 2007-10-03
04:07:22 UTC (rev 8519)
@@ -6,16 +6,7 @@
<!-- -->
<title>JBoss Portal</title>
- <!-- -->
- <!-- Use normal html, such as style -->
- <!-- -->
- <style>
- body,td,a,div,.p{font-family:arial,sans-serif}
- div,td{color:#000000}
- a:link,.w,.w a:link{color:#0000cc}
- a:visited{color:#551a8b}
- a:active{color:#ff0000}
- </style>
+ <link href="portal.css" rel="stylesheet"
type="text/css">
<!-- -->
<!-- This script loads your compiled module. -->
Modified:
branches/UIServer/uiserver/src/resources/client/ajax/src/org/jboss/portal/uiserver/ajax/public/partialRefresh.html
===================================================================
---
branches/UIServer/uiserver/src/resources/client/ajax/src/org/jboss/portal/uiserver/ajax/public/partialRefresh.html 2007-10-02
21:23:07 UTC (rev 8518)
+++
branches/UIServer/uiserver/src/resources/client/ajax/src/org/jboss/portal/uiserver/ajax/public/partialRefresh.html 2007-10-03
04:07:22 UTC (rev 8519)
@@ -6,16 +6,7 @@
<!-- -->
<title>JBoss Portal</title>
- <!-- -->
- <!-- Use normal html, such as style -->
- <!-- -->
- <style>
- body,td,a,div,.p{font-family:arial,sans-serif}
- div,td{color:#000000}
- a:link,.w,.w a:link{color:#0000cc}
- a:visited{color:#551a8b}
- a:active{color:#ff0000}
- </style>
+ <link href="portal.css" rel="stylesheet"
type="text/css">
<!-- -->
<!-- This script loads your compiled module. -->
Added:
branches/UIServer/uiserver/src/resources/client/ajax/src/org/jboss/portal/uiserver/ajax/public/portal.css
===================================================================
---
branches/UIServer/uiserver/src/resources/client/ajax/src/org/jboss/portal/uiserver/ajax/public/portal.css
(rev 0)
+++
branches/UIServer/uiserver/src/resources/client/ajax/src/org/jboss/portal/uiserver/ajax/public/portal.css 2007-10-03
04:07:22 UTC (rev 8519)
@@ -0,0 +1,469 @@
+body {
+ background-color: white;
+ color: black;
+ font-family: Helvetica, Arial, sans-serif;
+ font-size: 10pt;
+ margin: 0px 20px 20px 20px;
+}
+
+h2 {
+ font-weight: normal;
+}
+
+table {
+ font-size: 100%;
+}
+
+code {
+ font-size: small;
+}
+
+a {
+ color: darkblue;
+}
+
+a:visited {
+ color: darkblue;
+}
+
+.gwt-BorderedPanel {
+}
+
+.gwt-Button {
+ background:#f5f5f5;
+ border:1px solid #aaa;
+ border-top:1px solid #ddd;
+ border-left:1px solid #ddd;
+ padding: 2px;
+ width: 12em;
+}
+
+.gwt-Button:active {
+ border:1px solid #aaa;
+ border-bottom:1px solid #ccc;
+ border-right:1px solid #ccc;
+}
+
+.gwt-Button[disabled] {
+ background: #ccc;
+ border:1px solid #999;
+ border-top:1px solid #ccc;
+ border-left:1px solid #ccc;
+ color: #888;
+}
+
+.gwt-Canvas {
+}
+
+.gwt-CheckBox {
+}
+
+.gwt-DialogBox {
+ border: 2px outset;
+ background-color: white;
+}
+
+.gwt-DialogBox .Caption {
+ background-color: #C3D9FF;
+ padding: 3px;
+ margin: 2px;
+ font-weight: bold;
+ cursor: default;
+}
+
+.gwt-FileUpload {
+}
+
+.gwt-Frame {
+}
+
+.gwt-HTML {
+}
+
+.gwt-Hyperlink {
+}
+
+.gwt-Image {
+}
+
+.gwt-Label {
+}
+
+.gwt-ListBox {
+}
+
+.gwt-MenuBar {
+ background-color: #C3D9FF;
+ border: 1px solid #87B3FF;
+ cursor: default;
+}
+
+.gwt-MenuBar .gwt-MenuItem {
+ padding: 1px 4px 1px 4px;
+ cursor: default;
+}
+
+.gwt-MenuBar .gwt-MenuItem-selected {
+ background-color: #E8EEF7;
+}
+
+.gwt-PasswordTextBox {
+}
+
+.gwt-RadioButton {
+}
+
+.gwt-TabPanel {
+ margin-top: 4px;
+}
+
+.gwt-TabPanelBottom {
+ background-color: #E8EEF7;
+}
+
+.gwt-TabBar {
+ padding-top: 2px;
+ border-bottom: 4px solid #87B3FF;
+ background-color: #fff;
+}
+
+.gwt-TabBar .gwt-TabBarFirst {
+}
+
+.gwt-TabBar .gwt-TabBarRest {
+}
+
+.gwt-TabBar .gwt-TabBarItem {
+ padding: 4px;
+ cursor: pointer;
+ cursor: hand;
+
+ background-color: #e8eef7;
+ border-bottom: 2px solid white;
+ margin-right: 2px;
+}
+
+.gwt-TabBar .gwt-TabBarItem-selected {
+ padding: 4px;
+ font-weight: bold;
+ cursor: default;
+
+ background-color: #87b3ff;
+ border-bottom: 2px solid #87b3ff;
+ margin-right: 2px;
+}
+
+.gwt-TextArea {
+}
+
+.gwt-TextBox {
+}
+
+.gwt-TextBox-readonly {
+ color: #888;
+}
+
+.gwt-Tree {
+ background: white;
+}
+
+.gwt-Tree .gwt-TreeItem {
+}
+
+.gwt-Tree .gwt-TreeItem-selected {
+ background-color: #C3D9FF;
+}
+
+.gwt-StackPanel {
+}
+
+.gwt-StackPanel .gwt-StackPanelItem {
+ background-color: #C3D9FF;
+ cursor: pointer;
+ cursor: hand;
+}
+
+.gwt-StackPanel .gwt-StackPanelItem-selected {
+}
+
+.gwt-PushButton-up {
+ background-color: #C3D9FF;
+ padding: 2px;
+ border: 2px solid transparent;
+ border-color: #E8F1FF rgb(157, 174, 205) rgb(157, 174, 205) rgb(232, 241, 255);
+ cursor: pointer;
+ cursor: hand;
+}
+
+.gwt-PushButton-up-hovering {
+ background-color: #C3D9FF;
+ padding: 2px;
+ border: 2px solid transparent;
+ border-color: #E8F1FF rgb(157, 174, 205) rgb(157, 174, 205) rgb(232, 241, 255);
+ cursor: pointer;
+ cursor: hand;
+}
+
+.gwt-PushButton-down {
+ background-color: #C3D9FF;
+ padding: 2px;
+ border: 2px solid transparent;
+ border-color: #9DAECD rgb(232, 241, 255) rgb(232, 241, 255) rgb(157, 174, 205);
+ cursor: pointer;
+ cursor: hand;
+}
+
+.gwt-PushButton-down-hovering {
+ background-color: #C3D9FF;
+ padding: 2px;
+ border: 2px solid transparent;
+ border-color: #9DAECD rgb(232, 241, 255) rgb(232, 241, 255) rgb(157, 174, 205);
+ cursor: pointer;
+ cursor: hand;
+}
+
+.gwt-ToggleButton-up {
+ background-color: #C3D9FF;
+ padding: 2px;
+ border: 2px solid transparent;
+ border-color: #E8F1FF rgb(157, 174, 205) rgb(157, 174, 205) rgb(232, 241, 255);
+ cursor: pointer;
+ cursor: hand;
+}
+
+.gwt-ToggleButton-up-hovering {
+ background-color: #C3D9FF;
+ padding: 2px;
+ border: 2px solid transparent;
+ border-color: #E8F1FF rgb(157, 174, 205) rgb(157, 174, 205) rgb(232, 241, 255);
+ cursor: pointer;
+ cursor: hand;
+}
+
+.gwt-ToggleButton-down {
+ background-color: #C3D9FF;
+ padding: 2px;
+ background-color: #E8F1FF;
+ border: 2px solid transparent;
+ border-color: #9DAECD rgb(232, 241, 255) rgb(232, 241, 255) rgb(157, 174, 205);
+ cursor: pointer;
+ cursor: hand;
+}
+
+.gwt-ToggleButton-down-hovering {
+ background-color: #C3D9FF;
+ padding: 2px;
+ background-color: #E8F1FF;
+ border: 2px solid transparent;
+ border-color: #9DAECD rgb(232, 241, 255) rgb(232, 241, 255) rgb(157, 174, 205);
+ cursor: pointer;
+ cursor: hand;
+}
+
+.gwt-RichTextArea {
+ border: 1px solid black;
+ background-color: white;
+}
+
+.gwt-RichTextToolbar {
+ background-color: #C3D9FF;
+ padding: 2px;
+}
+
+.gwt-RichTextToolbar .gwt-PushButton-up {
+ margin-right: 2px;
+ border: 1px solid #C3D9FF;
+}
+
+.gwt-RichTextToolbar .gwt-PushButton-up-hovering {
+ margin-right: 2px;
+ border: 1px solid #C3D9FF;
+ border-color: #E8F1FF rgb(157, 174, 205) rgb(157, 174, 205) rgb(232, 241, 255);
+}
+
+.gwt-RichTextToolbar .gwt-PushButton-down {
+ margin-right: 2px;
+ border: 1px solid #C3D9FF;
+ border-color: #9DAECD rgb(232, 241, 255) rgb(232, 241, 255) rgb(157, 174, 205);
+}
+
+.gwt-RichTextToolbar .gwt-PushButton-down-hovering {
+ margin-right: 2px;
+ border: 1px solid #C3D9FF;
+ border-color: #9DAECD rgb(232, 241, 255) rgb(232, 241, 255) rgb(157, 174, 205);
+}
+
+.gwt-RichTextToolbar .gwt-ToggleButton-up {
+ margin-right: 2px;
+ border: 1px solid #C3D9FF;
+}
+
+.gwt-RichTextToolbar .gwt-ToggleButton-up-hovering {
+ margin-right: 2px;
+ border: 1px solid #C3D9FF;
+ border-color: #E8F1FF rgb(157, 174, 205) rgb(157, 174, 205) rgb(232, 241, 255);
+}
+
+.gwt-RichTextToolbar .gwt-ToggleButton-down {
+ margin-right: 2px;
+ background-color: #E8F1FF;
+ border: 1px solid #C3D9FF;
+ border-color: #9DAECD rgb(232, 241, 255) rgb(232, 241, 255) rgb(157, 174, 205);
+}
+
+.gwt-RichTextToolbar .gwt-ToggleButton-down-hovering {
+ margin-right: 2px;
+ background-color: #E8F1FF;
+ border: 1px solid #C3D9FF;
+ border-color: #9DAECD rgb(232, 241, 255) rgb(232, 241, 255) rgb(157, 174, 205);
+}
+
+.gwt-HorizontalSplitPanel {
+ border: 8px solid #C3D9FF;
+}
+
+.gwt-HorizontalSplitPanel .hsplitter {
+ background-color: #C3D9FF;
+ cursor: move;
+}
+
+.gwt-HorizontalSplitPanel .left {
+ background-color: #E8EEF7;
+}
+
+.gwt-VerticalSplitPanel {
+}
+
+.gwt-VerticalSplitPanel .splitter {
+ background-color: #C3D9FF;
+ height: 8px;
+ cursor: move;
+}
+
+.gwt-SuggestBoxPopup {
+ border: 2px solid #C3D9FF;
+}
+
+.gwt-SuggestBoxPopup .item {
+ padding: 2px;
+}
+
+.gwt-SuggestBoxPopup .item-selected {
+ background-color: #C3D9FF;
+ padding: 2px;
+}
+
+/* -------------------------------------------------------------------------- */
+.ks-Sink {
+ width: 100%;
+ height: 24em;
+}
+
+.ks-Info {
+ color: white;
+ padding: 20px 10px 20px 40px;
+ margin-bottom: 10px;
+}
+
+.ks-List {
+}
+
+.ks-List .gwt-Image {
+ position: relative;
+ top: 8px;
+}
+
+.ks-List .ks-SinkItem a {
+ text-decoration: none;
+ color: white;
+}
+
+.ks-List .ks-SinkItem-selected a {
+ text-decoration: none;
+ color: white;
+}
+
+.ks-List .ks-FirstSinkItem a {
+ text-decoration: none;
+ color: white;
+}
+
+.ks-List .ks-FirstSinkItem-selected a {
+ text-decoration: none;
+ color: white;
+}
+
+.ks-List .ks-SinkItem {
+ background: #c6cab7;
+ padding: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ margin-right: 3px;
+ border-bottom: 3px solid white;
+ cursor: pointer;
+ cursor: hand;
+}
+
+.ks-List .ks-SinkItem-selected {
+ background: #c6cab7;
+ padding: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ margin-right: 3px;
+ padding-bottom: 7px;
+}
+
+.ks-List .ks-FirstSinkItem {
+ background: #c6cab7 url(images/corner.gif) no-repeat top left;
+ padding: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ margin-right: 3px;
+ border-bottom: 3px solid white;
+ cursor: pointer;
+ cursor: hand;
+}
+
+.ks-List .ks-FirstSinkItem-selected {
+ background: #c3d9ff url(images/corner.gif) no-repeat top left;
+ padding: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ margin-right: 3px;
+ padding-bottom: 7px;
+}
+
+.ks-images-Image {
+ margin: 8px;
+}
+
+.ks-images-Button {
+ margin: 8px;
+ cursor: pointer;
+ cursor: hand;
+}
+
+.ks-layouts {
+ margin: 8px;
+}
+
+.ks-layouts-Label {
+ background-color: #C3D9FF;
+ font-weight: bold;
+ margin-top: 1em;
+ padding: 2px 0px 2px 0px;
+ width: 100%;
+}
+
+.ks-layouts-Scroller {
+ height: 128px;
+ border: 2px solid #C3D9FF;
+ padding: 8px;
+ margin: 8px;
+}
+
+.ks-popups-Popup {
+ background-color: white;
+ border: 1px solid #87B3FF;
+ padding: 4px;
+}
Modified:
branches/UIServer/uiserver/src/resources/client/ajax/uiserver-poc.war/WEB-INF/web.xml
===================================================================
---
branches/UIServer/uiserver/src/resources/client/ajax/uiserver-poc.war/WEB-INF/web.xml 2007-10-02
21:23:07 UTC (rev 8518)
+++
branches/UIServer/uiserver/src/resources/client/ajax/uiserver-poc.war/WEB-INF/web.xml 2007-10-03
04:07:22 UTC (rev 8519)
@@ -41,4 +41,8 @@
<servlet-name>PortletService</servlet-name>
<url-pattern>/org.jboss.portal.uiserver.ajax.PartialRefresh/portletService/*</url-pattern>
</servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>PortletService</servlet-name>
+
<url-pattern>/org.jboss.portal.uiserver.ajax.AsyncPages/portletService/*</url-pattern>
+ </servlet-mapping>
</web-app>
Added:
branches/UIServer/uiserver/src/resources/client/ajax/uiserver-poc.war/asyncPages.html
===================================================================
--- branches/UIServer/uiserver/src/resources/client/ajax/uiserver-poc.war/asyncPages.html
(rev 0)
+++
branches/UIServer/uiserver/src/resources/client/ajax/uiserver-poc.war/asyncPages.html 2007-10-03
04:07:22 UTC (rev 8519)
@@ -0,0 +1,7 @@
+<html>
+ <head>
+ <meta http-equiv="refresh"
content="0;url=org.jboss.portal.uiserver.ajax.AsyncPages/asyncPages.html">
+ </head>
+ <body>
+ </body>
+</html>
\ No newline at end of file