You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2013/05/14 13:23:18 UTC

svn commit: r1482302 - in /openmeetings/trunk/singlewebapp: ./ src/org/apache/openmeetings/web/app/ src/org/apache/openmeetings/web/components/ src/org/apache/openmeetings/web/components/user/dashboard/ src/org/apache/openmeetings/web/components/user/r...

Author: solomax
Date: Tue May 14 11:23:17 2013
New Revision: 1482302

URL: http://svn.apache.org/r1482302
Log:
[OPENMEETINGS-626] "hand-made" url fragment processing is replaced with wicketstuff library

Added:
    openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/UrlFragment.java
Modified:
    openmeetings/trunk/singlewebapp/ivy.xml
    openmeetings/trunk/singlewebapp/ivysettings.xml
    openmeetings/trunk/singlewebapp/ivysettings.xsd
    openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/app/WebSession.java
    openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/BasePanel.java
    openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/MenuPanel.java
    openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/dashboard/StartWidgetView.java
    openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/dashboard/WelcomeWidgetView.java
    openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/rooms/RoomsSelectorPanel.java
    openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/BasePage.java
    openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/MainPage.java
    openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/SignInDialog.html
    openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/SignInDialog.java
    openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/SignInPage.java

Modified: openmeetings/trunk/singlewebapp/ivy.xml
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/ivy.xml?rev=1482302&r1=1482301&r2=1482302&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/ivy.xml (original)
+++ openmeetings/trunk/singlewebapp/ivy.xml Tue May 14 11:23:17 2013
@@ -273,6 +273,9 @@
 			<include type="jar" />
 		</dependency>
 		-->
+		<dependency org="org.wicketstuff" name="wicketstuff-urlfragment" rev="6.0-SNAPSHOT" conf="openmeetings->*" transitive="false">
+			<include type="jar" />
+		</dependency>
 		
 		<!-- iCal4j seems to need this JAR -->
 		<dependency org="edu.emory.mathcs" name="backport-util-concurrent" rev="3.1" conf="openmeetings->*"/>

Modified: openmeetings/trunk/singlewebapp/ivysettings.xml
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/ivysettings.xml?rev=1482302&r1=1482301&r2=1482302&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/ivysettings.xml (original)
+++ openmeetings/trunk/singlewebapp/ivysettings.xml Tue May 14 11:23:17 2013
@@ -34,6 +34,9 @@
 			<url name="smslib" m2compatible="true">
 				<artifact pattern="http://smslib.org/maven2/v3/[organisation]/[artifact]/[revision]/[artifact]-[revision].[ext]" />
 			</url>
+			<url name="urlfragment" m2compatible="false" checksums=""> <!-- FIXME need to be removed in favor of wicketstuff -->
+				<artifact pattern="https://github.com/Horsed/WicketUrlFragment/raw/master/[artifact]-[revision].[ext]" />
+			</url>
 		</chain>
 	</resolvers>
 	<triggers>

Modified: openmeetings/trunk/singlewebapp/ivysettings.xsd
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/ivysettings.xsd?rev=1482302&r1=1482301&r2=1482302&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/ivysettings.xsd (original)
+++ openmeetings/trunk/singlewebapp/ivysettings.xsd Tue May 14 11:23:17 2013
@@ -36,14 +36,14 @@
   <xs:element name="resolvers">
     <xs:complexType>
       <xs:sequence>
-        <xs:element ref="chain"/>
+        <xs:element ref="chain" maxOccurs="unbounded"/>
       </xs:sequence>
     </xs:complexType>
   </xs:element>
   <xs:element name="chain">
     <xs:complexType>
       <xs:sequence>
-        <xs:element maxOccurs="unbounded" ref="ibiblio"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="ibiblio"/>
         <xs:element maxOccurs="unbounded" ref="url"/>
       </xs:sequence>
       <xs:attribute name="name" use="required" type="xs:NCName"/>
@@ -63,6 +63,7 @@
       </xs:sequence>
       <xs:attribute name="name" use="required" type="xs:NCName"/>
       <xs:attribute name="m2compatible" use="optional" type="xs:NCName"/>
+      <xs:attribute name="checksums" use="optional" type="xs:string"/>
     </xs:complexType>
   </xs:element>
   <xs:element name="artifact">

Modified: openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/app/WebSession.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/app/WebSession.java?rev=1482302&r1=1482301&r2=1482302&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/app/WebSession.java (original)
+++ openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/app/WebSession.java Tue May 14 11:23:17 2013
@@ -44,6 +44,7 @@ import org.apache.openmeetings.web.compo
 import org.apache.openmeetings.web.components.user.dashboard.RssWidgetDescriptor;
 import org.apache.openmeetings.web.components.user.dashboard.StartWidgetDescriptor;
 import org.apache.openmeetings.web.components.user.dashboard.WelcomeWidgetDescriptor;
+import org.apache.openmeetings.web.util.UrlFragment;
 import org.apache.wicket.authroles.authentication.AbstractAuthenticatedWebSession;
 import org.apache.wicket.authroles.authorization.strategies.role.Roles;
 import org.apache.wicket.request.Request;
@@ -59,7 +60,7 @@ public class WebSession extends Abstract
 	private long userId = -1;
 	private long userLevel = -1;
 	private String SID = null;
-	private String area = null;
+	private UrlFragment area = null;
 	private TimeZone tz;
 	private SimpleDateFormat ISO8601FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
 	private Dashboard dashboard;
@@ -158,11 +159,11 @@ public class WebSession extends Abstract
 		return get().userLevel;
 	}
 
-	public String getArea() {
+	public UrlFragment getArea() {
 		return area;
 	}
 
-	public void setArea(String area) {
+	public void setArea(UrlFragment area) {
 		this.area = area;
 	}
 

Modified: openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/BasePanel.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/BasePanel.java?rev=1482302&r1=1482301&r2=1482302&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/BasePanel.java (original)
+++ openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/BasePanel.java Tue May 14 11:23:17 2013
@@ -38,5 +38,4 @@ public abstract class BasePanel extends 
 	public void onMenuPanelLoad(AjaxRequestTarget target) {
 
 	}
-
 }

Modified: openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/MenuPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/MenuPanel.java?rev=1482302&r1=1482301&r2=1482302&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/MenuPanel.java (original)
+++ openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/MenuPanel.java Tue May 14 11:23:17 2013
@@ -23,26 +23,12 @@ import org.apache.openmeetings.persisten
 import org.apache.openmeetings.persistence.beans.basic.Navimain;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.app.WebSession;
-import org.apache.openmeetings.web.components.admin.backup.BackupPanel;
-import org.apache.openmeetings.web.components.admin.configurations.ConfigsPanel;
-import org.apache.openmeetings.web.components.admin.groups.GroupsPanel;
-import org.apache.openmeetings.web.components.admin.labels.LangPanel;
-import org.apache.openmeetings.web.components.admin.ldaps.LdapsPanel;
-import org.apache.openmeetings.web.components.admin.rooms.RoomsPanel;
-import org.apache.openmeetings.web.components.admin.servers.ServersPanel;
-import org.apache.openmeetings.web.components.admin.users.UsersPanel;
-import org.apache.openmeetings.web.components.user.calendar.CalendarPanel;
-import org.apache.openmeetings.web.components.user.dashboard.OmDashboardPanel;
-import org.apache.openmeetings.web.components.user.rooms.RoomsSelectorPanel;
-import org.apache.wicket.AttributeModifier;
-import org.apache.wicket.Component;
-import org.apache.wicket.MarkupContainer;
+import org.apache.openmeetings.web.pages.MainPage;
+import org.apache.openmeetings.web.util.UrlFragment;
+import org.apache.openmeetings.web.util.UrlFragment.MenuActions;
+import org.apache.openmeetings.web.util.UrlFragment.MenuParams;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.AjaxLink;
-import org.apache.wicket.behavior.Behavior;
-import org.apache.wicket.core.util.string.JavaScriptUtils;
-import org.apache.wicket.markup.head.IHeaderResponse;
-import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
@@ -56,32 +42,7 @@ import org.apache.wicket.markup.html.lis
 public class MenuPanel extends BasePanel {
 	private static final long serialVersionUID = 6626039612808753514L;
 
-	private enum MenuActions {
-		dashboardModuleStartScreen
-		, dashboardModuleCalendar
-		, recordModule
-		, conferenceModuleRoomList
-		, eventModuleRoomList
-		, moderatorModuleUser
-		, moderatorModuleRoom
-		, adminModuleUser
-		, adminModuleConnections
-		, adminModuleOrg
-		, adminModuleRoom
-		, adminModuleConfiguration
-		, adminModuleLanguages
-		, adminModuleLDAP
-		, adminModuleBackup
-		, adminModuleServers
-	}
-
-	public enum MenuParams {
-		publicTabButton
-		, privateTabButton
-		, myTabButton
-	}
-	
-	public MenuPanel(String id, final MarkupContainer contents) {
+	public MenuPanel(String id) {
 		super(id);
 		setMarkupId(id);
 		
@@ -104,7 +65,6 @@ public class MenuPanel extends BasePanel
 						final String desc = m.getTooltip().getValue();
 						final MenuActions action = MenuActions.valueOf(m.getAction());
 						final MenuParams params = m.getParams() != null ? MenuParams.valueOf(m.getParams()) : MenuParams.publicTabButton;
-						final String hash = getHash(action, params);
 						item.add(new AjaxLink<Void>("link") {
 							private static final long serialVersionUID = 5632618935550133709L;
 							{
@@ -113,144 +73,12 @@ public class MenuPanel extends BasePanel
 							}
 							
 							public void onClick(AjaxRequestTarget target) {
-								
-								BasePanel basePanel = null;
-								
-								switch(action) {
-									case dashboardModuleCalendar:
-										basePanel = new CalendarPanel("child");
-										break;
-									case recordModule:
-										break;
-									case conferenceModuleRoomList:
-										basePanel = new RoomsSelectorPanel("child", params);
-										break;
-									case eventModuleRoomList:
-										break;
-									case moderatorModuleUser:
-										break;
-									case moderatorModuleRoom:
-										break;
-									case adminModuleUser:
-										basePanel = new UsersPanel("child");
-										break;
-									case adminModuleConnections:
-										break;
-									case adminModuleOrg:
-										basePanel = new GroupsPanel("child");
-										break;
-									case adminModuleRoom:
-										basePanel = new RoomsPanel("child");
-										break;
-									case adminModuleConfiguration:
-										basePanel = new ConfigsPanel("child");
-										break;
-									case adminModuleLanguages:
-										basePanel = new LangPanel("child");
-										break;
-									case adminModuleLDAP:
-										basePanel = new LdapsPanel("child");
-										break;
-									case adminModuleBackup:
-										basePanel = new BackupPanel("child");
-										break;
-									case adminModuleServers:
-										basePanel = new ServersPanel("child");
-										break;
-									case dashboardModuleStartScreen:
-									default:
-										basePanel = new OmDashboardPanel("child");
-										break;
-								}
-								
-								if (basePanel != null) {
-									target.add(contents.replace(basePanel));
-									basePanel.onMenuPanelLoad(target);
-								}
-								
-								target.appendJavaScript("location.hash = '" + JavaScriptUtils.escapeQuotes(hash) + "';");
-							};
-						}.add(AttributeModifier.replace("href", hash)));
+								((MainPage)getPage()).updateContents(new UrlFragment(action, params), target);
+							}
+						});
 					}
 				}.setReuseItems(true));
 			}
 		}.setReuseItems(true));
-
-		add(new Behavior() {
-			private static final long serialVersionUID = 9067610794087880297L;
-
-			@Override
-			public void renderHead(Component component, IHeaderResponse response) {
-				String area = WebSession.get().getArea();
-				if (area != null) { //hash passed from signin
-					response.render(OnDomReadyHeaderItem.forScript("$(\"a[href='" + JavaScriptUtils.escapeQuotes(area) + "']\").click();"));
-					WebSession.get().setArea(null);
-				} else {
-					response.render(OnDomReadyHeaderItem.forScript("$(\"a[href='\" + location.hash + \"']\").click();"));
-				}
-				super.renderHead(component, response);
-			}
-		});
-	}
-	
-	private String getHash(MenuActions action, MenuParams params) {
-		String hash = "#";
-		switch(action) {
-			case dashboardModuleStartScreen:
-				break;
-			case dashboardModuleCalendar:
-				hash = "#calendar";
-				break;
-			case recordModule:
-				break;
-			case conferenceModuleRoomList:
-				String zone = "public";
-				switch (params) {
-					case myTabButton:
-						zone = "my";
-						break;
-					case privateTabButton:
-						zone = "group";
-						break;
-					case publicTabButton:
-					default:
-						break;
-				}
-				hash = "#rooms/" + zone;
-				break;
-			case eventModuleRoomList:
-				break;
-			case moderatorModuleUser:
-				break;
-			case moderatorModuleRoom:
-				break;
-			case adminModuleUser:
-				hash = "#admin/users";
-				break;
-			case adminModuleConnections:
-				break;
-			case adminModuleOrg:
-				hash = "#admin/groups";
-				break;
-			case adminModuleRoom:
-				hash = "#admin/rooms";
-				break;
-			case adminModuleConfiguration:
-				hash = "#admin/configs";
-				break;
-			case adminModuleLanguages:
-				hash = "#admin/lang";
-				break;
-			case adminModuleLDAP:
-				hash = "#admin/ldaps";
-				break;
-			case adminModuleBackup:
-				hash = "#admin/backup";
-				break;
-			case adminModuleServers:
-				hash = "#admin/servers";
-				break;
-		}
-		return hash;
 	}
 }

Modified: openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/dashboard/StartWidgetView.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/dashboard/StartWidgetView.java?rev=1482302&r1=1482301&r2=1482302&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/dashboard/StartWidgetView.java (original)
+++ openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/dashboard/StartWidgetView.java Tue May 14 11:23:17 2013
@@ -18,9 +18,9 @@
  */
 package org.apache.openmeetings.web.components.user.dashboard;
 
-import org.apache.openmeetings.web.components.user.calendar.CalendarPanel;
+import static org.apache.openmeetings.web.util.UrlFragment.CALENDAR;
+
 import org.apache.openmeetings.web.pages.MainPage;
-import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.html.form.Button;
@@ -39,8 +39,7 @@ public class StartWidgetView extends Wid
 
 			@Override
 			protected void onEvent(AjaxRequestTarget target) {
-				MarkupContainer contents = ((MainPage)getPage()).getContents();
-				target.add(contents.replace(new CalendarPanel("child")));
+				((MainPage)getPage()).updateContents(CALENDAR, target);
 			}
 		}));
 	}

Modified: openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/dashboard/WelcomeWidgetView.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/dashboard/WelcomeWidgetView.java?rev=1482302&r1=1482301&r2=1482302&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/dashboard/WelcomeWidgetView.java (original)
+++ openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/dashboard/WelcomeWidgetView.java Tue May 14 11:23:17 2013
@@ -20,14 +20,13 @@ package org.apache.openmeetings.web.comp
 
 import static org.apache.openmeetings.web.app.Application.getBean;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
-import static org.apache.openmeetings.web.components.user.profile.SettingsPanel.EDIT_PROFILE_TAB_ID;
-import static org.apache.openmeetings.web.components.user.profile.SettingsPanel.MESSAGES_TAB_ID;
+import static org.apache.openmeetings.web.util.UrlFragment.PROFILE_EDIT;
+import static org.apache.openmeetings.web.util.UrlFragment.PROFILE_MESSAGES;
 
 import org.apache.openmeetings.data.user.dao.PrivateMessagesDao;
 import org.apache.openmeetings.data.user.dao.UsersDao;
 import org.apache.openmeetings.persistence.beans.user.User;
 import org.apache.openmeetings.web.components.UploadableProfileImagePanel;
-import org.apache.openmeetings.web.components.user.profile.SettingsPanel;
 import org.apache.openmeetings.web.pages.MainPage;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.AjaxLink;
@@ -54,7 +53,7 @@ public class WelcomeWidgetView extends W
 
 			@Override
 			public void onClick(AjaxRequestTarget target) {
-				target.add(((MainPage)getPage()).getContents().replace(new SettingsPanel("child", MESSAGES_TAB_ID)));
+				((MainPage)getPage()).updateContents(PROFILE_MESSAGES, target);
 			}
 		}.add(new Label("unread", Model.of("" + getBean(PrivateMessagesDao.class)
 				.getNumberMessages(getUserId(), 0L, false)))));
@@ -63,7 +62,7 @@ public class WelcomeWidgetView extends W
 
 			@Override
 			public void onClick(AjaxRequestTarget target) {
-				target.add(((MainPage)getPage()).getContents().replace(new SettingsPanel("child", EDIT_PROFILE_TAB_ID)));
+				((MainPage)getPage()).updateContents(PROFILE_EDIT, target);
 			}
 		});
 	}

Modified: openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/rooms/RoomsSelectorPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/rooms/RoomsSelectorPanel.java?rev=1482302&r1=1482301&r2=1482302&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/rooms/RoomsSelectorPanel.java (original)
+++ openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/user/rooms/RoomsSelectorPanel.java Tue May 14 11:23:17 2013
@@ -21,8 +21,8 @@ package org.apache.openmeetings.web.comp
 import org.apache.openmeetings.data.conference.dao.RoomDao;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.app.WebSession;
-import org.apache.openmeetings.web.components.MenuPanel.MenuParams;
 import org.apache.openmeetings.web.components.UserPanel;
+import org.apache.openmeetings.web.util.UrlFragment.MenuParams;
 import org.apache.wicket.markup.html.basic.Label;
 
 public class RoomsSelectorPanel extends UserPanel {

Modified: openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/BasePage.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/BasePage.java?rev=1482302&r1=1482301&r2=1482302&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/BasePage.java (original)
+++ openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/BasePage.java Tue May 14 11:23:17 2013
@@ -18,22 +18,33 @@
  */
 package org.apache.openmeetings.web.pages;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import org.apache.openmeetings.data.basic.dao.ConfigurationDao;
 import org.apache.openmeetings.persistence.beans.lang.FieldLanguage;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.components.HeaderPanel;
+import org.apache.openmeetings.web.util.UrlFragment;
+import org.apache.openmeetings.web.util.UrlFragment.AreaKeys;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.JavaScriptHeaderItem;
 import org.apache.wicket.markup.html.TransparentWebMarkupContainer;
-import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.request.IRequestParameters;
+import org.apache.wicket.util.string.StringValue;
+import org.wicketstuff.urlfragment.AsyncUrlFragmentAwarePage;
 
-public abstract class BasePage extends WebPage {
+public abstract class BasePage extends AsyncUrlFragmentAwarePage {
 	private static final long serialVersionUID = -6237917782433412496L;
+	private final Map<String, String> options;
 
 	public BasePage() {
+		options = new HashMap<String, String>();
+		options.put("fragmentIdentifierSuffix", "");
+		options.put("keyValueDelimiter", "/");
 		String appName = Application.getBean(ConfigurationDao.class).getAppName();
 
 		FieldLanguage lang = WebSession.getLanguageObj();
@@ -46,6 +57,21 @@ public abstract class BasePage extends W
 		add(new HeaderPanel("header", appName));
 	}
 	
+	protected UrlFragment getUrlFragment(IRequestParameters params) {
+		for (AreaKeys key : AreaKeys.values()) {
+			StringValue type = params.getParameterValue(key.name());
+			if (!type.isEmpty()) {
+				return new UrlFragment(key, type.toString());
+			}
+		}
+		return null;
+	}
+	
+	@Override
+	protected Map<String, String> getOptions() {
+		return options;
+	}
+	
 	@Override
 	public void renderHead(IHeaderResponse response) {
 		response.render(JavaScriptHeaderItem.forReference(Application.get()

Modified: openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/MainPage.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/MainPage.java?rev=1482302&r1=1482301&r2=1482302&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/MainPage.java (original)
+++ openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/MainPage.java Tue May 14 11:23:17 2013
@@ -19,17 +19,22 @@
 package org.apache.openmeetings.web.pages;
 
 import static org.apache.openmeetings.OpenmeetingsVariables.webAppRootKey;
-import static org.apache.openmeetings.web.components.user.profile.SettingsPanel.MESSAGES_TAB_ID;
-import static org.apache.openmeetings.web.components.user.profile.SettingsPanel.PROFILE_TAB_ID;
+import static org.apache.openmeetings.web.util.UrlFragment.CHILD_ID;
+import static org.apache.openmeetings.web.util.UrlFragment.DASHBOARD;
+import static org.apache.openmeetings.web.util.UrlFragment.PROFILE_EDIT;
+import static org.apache.openmeetings.web.util.UrlFragment.PROFILE_MESSAGES;
+import static org.apache.openmeetings.web.util.UrlFragment.getPanel;
 
 import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.app.WebSession;
+import org.apache.openmeetings.web.components.BasePanel;
 import org.apache.openmeetings.web.components.ConfirmableAjaxLink;
 import org.apache.openmeetings.web.components.MenuPanel;
 import org.apache.openmeetings.web.components.user.AboutDialog;
 import org.apache.openmeetings.web.components.user.ChatPanel;
-import org.apache.openmeetings.web.components.user.dashboard.OmDashboardPanel;
-import org.apache.openmeetings.web.components.user.profile.SettingsPanel;
+import org.apache.openmeetings.web.util.UrlFragment;
 import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.ajax.AbstractAjaxTimerBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.AjaxLink;
 import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
@@ -38,8 +43,11 @@ import org.apache.wicket.markup.html.lin
 import org.apache.wicket.protocol.ws.api.WebSocketBehavior;
 import org.apache.wicket.protocol.ws.api.message.ClosedMessage;
 import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
+import org.apache.wicket.request.IRequestParameters;
+import org.apache.wicket.util.time.Duration;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
+import org.wicketstuff.urlfragment.UrlParametersReceivingBehavior;
 
 @AuthorizeInstantiation("USER")
 public class MainPage extends BasePage {
@@ -50,17 +58,15 @@ public class MainPage extends BasePage {
 	
 	public MainPage() {
 		contents = new WebMarkupContainer("contents");
-		//FIXME need to be generalized with MenuPanel
-		contents.add(new OmDashboardPanel("child")).setOutputMarkupId(true).setMarkupId("contents");
-		add(contents);
-		menu = new MenuPanel("menu", contents);
+		add(contents.add(new WebMarkupContainer(CHILD_ID)).setOutputMarkupId(true).setMarkupId("contents"));
+		menu = new MenuPanel("menu");
 		add(menu);
 		add(new AjaxLink<Void>("messages") {
 			private static final long serialVersionUID = 4065339709905366840L;
 
 			@Override
 			public void onClick(AjaxRequestTarget target) {
-				target.add(contents.replace(new SettingsPanel("child", MESSAGES_TAB_ID)));
+				updateContents(PROFILE_EDIT, target);
 			}
 		});
 		add(new ConfirmableAjaxLink("logout", 634L) {
@@ -77,7 +83,7 @@ public class MainPage extends BasePage {
 
 			@Override
 			public void onClick(AjaxRequestTarget target) {
-				target.add(contents.replace(new SettingsPanel("child", PROFILE_TAB_ID)));
+				updateContents(PROFILE_MESSAGES, target);
 			}
 		});
 		final AboutDialog about = new AboutDialog("aboutDialog");
@@ -108,9 +114,34 @@ public class MainPage extends BasePage {
 				log.debug("WebSocketBehavior::onClose");
 			}
 		});
+		//load preselected content
+		add(new AbstractAjaxTimerBehavior(Duration.ONE_SECOND) {
+			private static final long serialVersionUID = -1551197896975384329L;
+
+			@Override
+			protected void onTimer(AjaxRequestTarget target) {
+				UrlFragment area = WebSession.get().getArea();
+				updateContents(area == null ? DASHBOARD : area, target);
+				stop(target);
+			}
+		});
+	}
+	
+	public void updateContents(UrlFragment f, AjaxRequestTarget target) {
+		BasePanel panel = getPanel(f.getArea(), f.getType());
+		if (panel != null) {
+			target.add(contents.replace(panel));
+			//FIXME need to be uncommented later UrlParametersReceivingBehavior.setFragment(target, f.getArea().name(), f.getType());
+			UrlParametersReceivingBehavior.setFragmentParameter(target, f.getArea().name(), f.getType());
+			panel.onMenuPanelLoad(target);
+		}
 	}
 	
-	public MarkupContainer getContents() {
-		return contents;
+	@Override
+	protected void onParameterArrival(IRequestParameters params, AjaxRequestTarget target) {
+		UrlFragment uf = getUrlFragment(params);
+		if (uf != null) {
+			updateContents(uf, target);
+		}
 	}
 }

Modified: openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/SignInDialog.html
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/SignInDialog.html?rev=1482302&r1=1482301&r2=1482302&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/SignInDialog.html (original)
+++ openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/SignInDialog.html Tue May 14 11:23:17 2013
@@ -45,7 +45,6 @@
 			</tr>
 		</table>
 		<span wicket:id="feedback"></span>
-		<input wicket:id="area" type="hidden" value="" />
 		<input type="submit" wicket:id="submit" style="position: absolute; top: -9999px; width: 1px; height: 1px;"/>
 	</form>
 </wicket:panel>

Modified: openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/SignInDialog.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/SignInDialog.java?rev=1482302&r1=1482301&r2=1482302&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/SignInDialog.java (original)
+++ openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/SignInDialog.java Tue May 14 11:23:17 2013
@@ -40,7 +40,6 @@ import org.apache.wicket.markup.html.for
 import org.apache.wicket.markup.html.form.ChoiceRenderer;
 import org.apache.wicket.markup.html.form.DropDownChoice;
 import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.HiddenField;
 import org.apache.wicket.markup.html.form.PasswordTextField;
 import org.apache.wicket.markup.html.form.RequiredTextField;
 import org.apache.wicket.markup.html.form.StatelessForm;
@@ -59,7 +58,6 @@ public class SignInDialog extends Abstra
 	private DialogButton registerBtn = new DialogButton(WebSession.getString(123));
     private String password;
     private String login;
-    private String area = "";
     private boolean rememberMe = false;
     private RegisterDialog r;
     private ForgetPasswordDialog f;
@@ -149,7 +147,6 @@ public class SignInDialog extends Abstra
 		ldapConfigFileName = domain.getConfigFileName() == null ? "" : domain.getConfigFileName();
 		OmAuthenticationStrategy strategy = getAuthenticationStrategy();
 		if (WebSession.get().signIn(login, password, ldapConfigFileName)) {
-			WebSession.get().setArea(area);
  			setResponsePage(Application.get().getHomePage());
 			if (rememberMe) {
 				strategy.save(login, password, ldapConfigFileName);
@@ -198,9 +195,6 @@ public class SignInDialog extends Abstra
 				.add(new DropDownChoice<LdapConfig>("domain", new PropertyModel<LdapConfig>(SignInDialog.this, "domain")
 						, ldaps, new ChoiceRenderer<LdapConfig>("name", "ldapConfigId"))).setVisible(ldaps.size() > 1));
 			add(new CheckBox("rememberMe", new PropertyModel<Boolean>(SignInDialog.this, "rememberMe")).setOutputMarkupId(true));
-			add(new HiddenField<String>("area", new PropertyModel<String>(SignInDialog.this, "area"))
-					.setMarkupId("area")
-					.setOutputMarkupId(true));
 			add(new AjaxButton("submit") { //FAKE button so "submit-on-enter" works as expected
 				private static final long serialVersionUID = -3612671587183668912L;
 

Modified: openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/SignInPage.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/SignInPage.java?rev=1482302&r1=1482301&r2=1482302&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/SignInPage.java (original)
+++ openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/SignInPage.java Tue May 14 11:23:17 2013
@@ -22,9 +22,12 @@ import static org.apache.openmeetings.pe
 import static org.apache.openmeetings.web.app.Application.getBean;
 
 import org.apache.openmeetings.data.basic.dao.ConfigurationDao;
+import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.pages.BasePage;
+import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
+import org.apache.wicket.request.IRequestParameters;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 
 public class SignInPage extends BasePage {
@@ -56,4 +59,9 @@ public class SignInPage extends BasePage
 		//TODO need to be removed if autoOen will be enabled
 		response.render(OnDomReadyHeaderItem.forScript("$('#" + d.getMarkupId() + "').dialog('open');"));
 	}
+
+	@Override
+	protected void onParameterArrival(IRequestParameters params, AjaxRequestTarget arg1) {
+		WebSession.get().setArea(getUrlFragment(params));
+	}
 }

Added: openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/UrlFragment.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/UrlFragment.java?rev=1482302&view=auto
==============================================================================
--- openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/UrlFragment.java (added)
+++ openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/util/UrlFragment.java Tue May 14 11:23:17 2013
@@ -0,0 +1,249 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.web.util;
+
+import static org.apache.openmeetings.web.components.user.profile.SettingsPanel.EDIT_PROFILE_TAB_ID;
+import static org.apache.openmeetings.web.components.user.profile.SettingsPanel.MESSAGES_TAB_ID;
+
+import java.io.Serializable;
+
+import org.apache.openmeetings.web.components.BasePanel;
+import org.apache.openmeetings.web.components.admin.backup.BackupPanel;
+import org.apache.openmeetings.web.components.admin.configurations.ConfigsPanel;
+import org.apache.openmeetings.web.components.admin.groups.GroupsPanel;
+import org.apache.openmeetings.web.components.admin.labels.LangPanel;
+import org.apache.openmeetings.web.components.admin.ldaps.LdapsPanel;
+import org.apache.openmeetings.web.components.admin.rooms.RoomsPanel;
+import org.apache.openmeetings.web.components.admin.servers.ServersPanel;
+import org.apache.openmeetings.web.components.admin.users.UsersPanel;
+import org.apache.openmeetings.web.components.user.calendar.CalendarPanel;
+import org.apache.openmeetings.web.components.user.dashboard.OmDashboardPanel;
+import org.apache.openmeetings.web.components.user.profile.SettingsPanel;
+import org.apache.openmeetings.web.components.user.rooms.RoomsSelectorPanel;
+
+public class UrlFragment implements Serializable {
+	private static final long serialVersionUID = 7382435810352033914L;
+	private AreaKeys area = AreaKeys.user;
+	private String type = "";
+	public static final String CHILD_ID = "child";
+	public static final String TYPE_CALENDAR = "calendar";
+	public static final String TYPE_MESSAGES = "messages";
+	public static final String TYPE_EDIT = "edit";
+	public static final String TYPE_RECORDINGS = "record";
+	public static final String TYPE_MY = "my";
+	public static final String TYPE_GROUP = "group";
+	public static final String TYPE_PUBLIC = "public";
+	public static final String TYPE_USER = "user";
+	public static final String TYPE_CONNECTION = "connection";
+	public static final String TYPE_ROOM = "room";
+	public static final String TYPE_CONFIG = "config";
+	public static final String TYPE_LANG = "lang";
+	public static final String TYPE_LDAP = "ldap";
+	public static final String TYPE_BACKUP = "backup";
+	public static final String TYPE_SERVER = "server";
+	public static final UrlFragment DASHBOARD = new UrlFragment(AreaKeys.user, "");
+	public static final UrlFragment PROFILE_EDIT = new UrlFragment(AreaKeys.profile, TYPE_EDIT);
+	public static final UrlFragment PROFILE_MESSAGES = new UrlFragment(AreaKeys.profile, TYPE_MESSAGES);
+	public static final UrlFragment CALENDAR = new UrlFragment(AreaKeys.user, TYPE_CALENDAR);
+	
+	public enum AreaKeys {
+		user
+		, admin
+		, profile
+		, room
+		, rooms
+	}
+	
+	public enum MenuActions {
+		dashboardModuleStartScreen
+		, dashboardModuleCalendar
+		, recordModule
+		, conferenceModuleRoomList
+		, eventModuleRoomList
+		, moderatorModuleUser
+		, moderatorModuleRoom
+		, adminModuleUser
+		, adminModuleConnections
+		, adminModuleOrg
+		, adminModuleRoom
+		, adminModuleConfiguration
+		, adminModuleLanguages
+		, adminModuleLDAP
+		, adminModuleBackup
+		, adminModuleServers
+	}
+	
+	public enum MenuParams {
+		publicTabButton
+		, privateTabButton
+		, myTabButton
+	}
+	
+	public UrlFragment(AreaKeys area, String type) {
+		this.setArea(area);
+		this.setType(type);
+	}
+	
+	public UrlFragment(MenuActions action) {
+		this(action, MenuParams.myTabButton);
+	}
+	
+	public UrlFragment(MenuActions action, MenuParams params) {
+		switch(action) {
+			case dashboardModuleStartScreen:
+				break;
+			case dashboardModuleCalendar:
+				setArea(AreaKeys.user);
+				setType(TYPE_CALENDAR);
+				break;
+			case recordModule:
+				setArea(AreaKeys.user);
+				setType(TYPE_RECORDINGS);
+				break;
+			case conferenceModuleRoomList:
+				setArea(AreaKeys.rooms);
+				switch (params) {
+					case myTabButton:
+						setType(TYPE_MY);
+						break;
+					case privateTabButton:
+						setType(TYPE_GROUP);
+						break;
+					case publicTabButton:
+						setType(TYPE_PUBLIC);
+						break;
+				}
+				break;
+			case eventModuleRoomList:
+				break;
+			case moderatorModuleUser:
+				break;
+			case moderatorModuleRoom:
+				break;
+			case adminModuleUser:
+				setArea(AreaKeys.admin);
+				setType(TYPE_USER);
+				break;
+			case adminModuleConnections:
+				setArea(AreaKeys.admin);
+				setType(TYPE_CONNECTION);
+				break;
+			case adminModuleOrg:
+				setArea(AreaKeys.admin);
+				setType(TYPE_GROUP);
+				break;
+			case adminModuleRoom:
+				setArea(AreaKeys.admin);
+				setType(TYPE_ROOM);
+				break;
+			case adminModuleConfiguration:
+				setArea(AreaKeys.admin);
+				setType(TYPE_CONFIG);
+				break;
+			case adminModuleLanguages:
+				setArea(AreaKeys.admin);
+				setType(TYPE_LANG);
+				break;
+			case adminModuleLDAP:
+				setArea(AreaKeys.admin);
+				setType(TYPE_LDAP);
+				break;
+			case adminModuleBackup:
+				setArea(AreaKeys.admin);
+				setType(TYPE_BACKUP);
+				break;
+			case adminModuleServers:
+				setArea(AreaKeys.admin);
+				setType(TYPE_SERVER);
+				break;
+		}
+	}
+
+	public AreaKeys getArea() {
+		return area;
+	}
+
+	public void setArea(AreaKeys area) {
+		this.area = area;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+	
+	public static BasePanel getPanel(AreaKeys area, String type) {
+		BasePanel basePanel = null;
+		switch(area) {
+			case admin:
+				if (TYPE_USER.equals(type)) {
+					basePanel = new UsersPanel(CHILD_ID);
+				} else if (TYPE_CONNECTION.equals(type)) {
+				} else if (TYPE_GROUP.equals(type)) {
+					basePanel = new GroupsPanel(CHILD_ID);
+				} else if (TYPE_ROOM.equals(type)) {
+					basePanel = new RoomsPanel(CHILD_ID);
+				} else if (TYPE_CONFIG.equals(type)) {
+					basePanel = new ConfigsPanel(CHILD_ID);
+				} else if (TYPE_LANG.equals(type)) {
+					basePanel = new LangPanel(CHILD_ID);
+				} else if (TYPE_LDAP.equals(type)) {
+					basePanel = new LdapsPanel(CHILD_ID);
+				} else if (TYPE_BACKUP.equals(type)) {
+					basePanel = new BackupPanel(CHILD_ID);
+				} else if (TYPE_SERVER.equals(type)) {
+					basePanel = new ServersPanel(CHILD_ID);
+				}
+				break;
+			case profile:
+				if (TYPE_MESSAGES.equals(type)) {
+					basePanel = new SettingsPanel(CHILD_ID, MESSAGES_TAB_ID);
+				} else if (TYPE_EDIT.equals(type)) {
+					basePanel = new SettingsPanel(CHILD_ID, EDIT_PROFILE_TAB_ID);
+				}
+				break;
+			case room:
+				break;
+			case rooms:
+				MenuParams params = MenuParams.publicTabButton;
+				if (TYPE_GROUP.equals(type)) {
+					params = MenuParams.privateTabButton;
+				} else if (TYPE_MY.equals(type)) {
+					params = MenuParams.myTabButton;
+				}
+				basePanel = new RoomsSelectorPanel(CHILD_ID, params);
+				break;
+			case user:
+				if (TYPE_CALENDAR.equals(type)) {
+					basePanel = new CalendarPanel(CHILD_ID);
+				} else if (TYPE_RECORDINGS.equals(type)) {
+					//
+				} else {
+					basePanel = new OmDashboardPanel(CHILD_ID);
+				}
+				break;
+			default:
+				break;
+		}
+		return basePanel;
+	}
+}