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 2014/09/11 05:14:09 UTC

svn commit: r1624188 - in /openmeetings/trunk/singlewebapp/openmeetings-web: ./ src/main/java/org/apache/openmeetings/web/app/ src/main/java/org/apache/openmeetings/web/common/menu/ src/main/java/org/apache/openmeetings/web/common/tree/ src/main/java/o...

Author: solomax
Date: Thu Sep 11 03:14:08 2014
New Revision: 1624188

URL: http://svn.apache.org/r1624188
Log:
[OPENMEETINGS-1030] Recordings/Files section is rewritten to use wicket-jqueryui, drag&drop works better

Modified:
    openmeetings/trunk/singlewebapp/openmeetings-web/pom.xml
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/menu/MenuPanel.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemPanel.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemTree.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.html
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.html
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/MyRecordingTreeProvider.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/PublicRecordingTreeProvider.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoInfo.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/theme.css

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/pom.xml
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/pom.xml?rev=1624188&r1=1624187&r2=1624188&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/pom.xml (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/pom.xml Thu Sep 11 03:14:08 2014
@@ -32,7 +32,6 @@
 	<properties>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 		<wicket-dashboard.version>0.11.0+wicket-7</wicket-dashboard.version>
-		<dnd.version>0.6.0</dnd.version>
 		<commons-io.version>2.4</commons-io.version>
 		<commons-fileupload.version>1.3</commons-fileupload.version>
 		<mysql.version>5.1.30</mysql.version>
@@ -392,11 +391,6 @@
 			<version>${wicket.version}</version>
 		</dependency>
 		<dependency>
-			<groupId>com.github.svenmeier.wicket-dnd</groupId>
-			<artifactId>wicket-dnd</artifactId>
-			<version>${dnd.version}</version>
-		</dependency>
-		<dependency>
 			<groupId>commons-io</groupId>
 			<artifactId>commons-io</artifactId>
 			<version>${commons-io.version}</version>

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java?rev=1624188&r1=1624187&r2=1624188&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java Thu Sep 11 03:14:08 2014
@@ -290,7 +290,7 @@ public class WebSession extends Abstract
 		String s = getBean(FieldLanguagesValuesDao.class).getString(id, getLanguage());
 		s = s == null ? "[Missing]" :
 			(STRINGS_WITH_APP.contains(id) ? s.replaceAll("\\$APP_NAME", getBean(ConfigurationDao.class).getAppName()) : s);
-		return s;// + (Application.get().getDebugSettings().isDevelopmentUtilitiesEnabled() ? " [" + id + "]" : "");
+		return s + (Application.get().getDebugSettings().isDevelopmentUtilitiesEnabled() ? " [" + id + "]" : "");
 	}
 	
 	public void setLanguage(long languageId) {

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/menu/MenuPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/menu/MenuPanel.java?rev=1624188&r1=1624187&r2=1624188&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/menu/MenuPanel.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/menu/MenuPanel.java Thu Sep 11 03:14:08 2014
@@ -69,26 +69,27 @@ public class MenuPanel extends BasePanel
 				if (!Strings.isEmpty(gl.getDesc())) {
 					link.add(AttributeAppender.append("title", gl.getDesc()));
 				}
-				item.add(new WebMarkupContainer("childItems")
-						.add(new ListView<MenuItem>("childItem", gl.getChildren()) {
-							private static final long serialVersionUID = 1L;
-		
-							@Override
-							protected void populateItem(ListItem<MenuItem> item) {
-								final MenuItem m = item.getModelObject();
-								item.add(new AjaxLink<Void>("link") {
-									private static final long serialVersionUID = 1L;
-									{
-										add(new Label("name", m.getName()));
-										add(new Label("description", m.getDesc()));
-									}
-									
-									public void onClick(AjaxRequestTarget target) {
-										m.onClick(getMainPage(), target);
-									}
-								});
-							}
-						}.setReuseItems(true)).setVisible(null != gl.getChildren()));
+				item.setVisible(gl.isActive());
+				item.add(new WebMarkupContainer("childItems").add(new ListView<MenuItem>("childItem", gl.getChildren()) {
+						private static final long serialVersionUID = 1L;
+	
+						@Override
+						protected void populateItem(ListItem<MenuItem> item) {
+							final MenuItem m = item.getModelObject();
+							item.setVisible(m.isActive());
+							item.add(new AjaxLink<Void>("link") {
+								private static final long serialVersionUID = 1L;
+								{
+									add(new Label("name", m.getName()));
+									add(new Label("description", m.getDesc()));
+								}
+								
+								public void onClick(AjaxRequestTarget target) {
+									m.onClick(getMainPage(), target);
+								}
+							});
+						}
+					}.setReuseItems(true)).setVisible(null != gl.getChildren()));
 			}
 		}.setReuseItems(true));
 		add(new MenuFunctionsBehavior(menuContainer.getMarkupId(), id));

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemPanel.java?rev=1624188&r1=1624187&r2=1624188&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemPanel.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemPanel.java Thu Sep 11 03:14:08 2014
@@ -35,8 +35,8 @@ public class FileItemPanel extends Folde
 	private static final long serialVersionUID = 1L;
 	private final WebMarkupContainer errors = new WebMarkupContainer("errors");
 
-	public FileItemPanel(String id, final IModel<? extends FileItem> model, final ConvertingErrorsDialog errorsDialog) {
-		super(id, model);
+	public FileItemPanel(String id, final IModel<? extends FileItem> model, final FileTreePanel fileTreePanel) {
+		super(id, model, fileTreePanel);
 		if (model.getObject() instanceof FlvRecording) {
 			FlvRecording r = (FlvRecording)model.getObject();
 			long errorCount = getBean(FlvRecordingLogDao.class).countErrors(r.getId());
@@ -46,13 +46,13 @@ public class FileItemPanel extends Folde
 	
 				@Override
 				protected void onEvent(AjaxRequestTarget target) {
-					errorsDialog.setDefaultModel(model);
-					errorsDialog.open(target);
+					fileTreePanel.errorsDialog.setDefaultModel(model);
+					fileTreePanel.errorsDialog.open(target);
 				}
 			}).setVisible(visible);
 		} else {
 			errors.setVisible(false);
 		}
-		item.add(errors);
+		drag.add(errors);
 	}
 }

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemTree.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemTree.java?rev=1624188&r1=1624187&r2=1624188&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemTree.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemTree.java Thu Sep 11 03:14:08 2014
@@ -20,11 +20,7 @@ package org.apache.openmeetings.web.comm
 
 import static org.apache.openmeetings.util.OmFileHelper.MP4_EXTENSION;
 import static org.apache.openmeetings.util.OmFileHelper.isRecordingExists;
-import static org.apache.openmeetings.web.app.Application.getBean;
 
-import org.apache.openmeetings.db.dao.file.FileExplorerItemDao;
-import org.apache.openmeetings.db.dao.record.FlvRecordingDao;
-import org.apache.openmeetings.db.entity.file.FileExplorerItem;
 import org.apache.openmeetings.db.entity.file.FileItem;
 import org.apache.openmeetings.db.entity.file.FileItem.Type;
 import org.apache.openmeetings.db.entity.record.FlvRecording;
@@ -38,13 +34,6 @@ import org.apache.wicket.markup.repeater
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 
-import wicketdnd.DragSource;
-import wicketdnd.DropTarget;
-import wicketdnd.Location;
-import wicketdnd.Operation;
-import wicketdnd.Reject;
-import wicketdnd.Transfer;
-
 public class FileItemTree<T extends FileItem> extends DefaultNestedTree<T> {
 	private static final long serialVersionUID = 1L;
 	private final FileTreePanel treePanel;
@@ -64,46 +53,7 @@ public class FileItemTree<T extends File
 			@Override
 			protected Component newLabelComponent(String id, final IModel<T> lm) {
 				FileItem r = lm.getObject();
-				Component result = Type.Folder == r.getType() || r.getId() < 1 ? new FolderPanel(id, lm) : new FileItemPanel(id, lm, treePanel.errorsDialog);
-				if (r.getId() > 0) {
-					result.add(new DragSource(Operation.MOVE) {
-						private static final long serialVersionUID = 1L;
-
-						@Override
-						public void onBeforeDrop(Component drag, Transfer transfer) throws Reject {
-							transfer.setData(lm.getObject());
-						};
-						
-						@Override
-						public void onAfterDrop(AjaxRequestTarget target, wicketdnd.Transfer transfer) {
-							transfer.setData(null);
-						}
-					}.drag("div"));
-				}
-				if (r.getId() < 0 || Type.Folder == r.getType()) {
-					result.add(new DropTarget(Operation.MOVE) {
-						private static final long serialVersionUID = 1L;
-
-						@Override
-						public void onDrop(AjaxRequestTarget target, Transfer transfer, Location location) throws Reject {
-							FileItem p = lm.getObject();
-							long pid = p.getId();
-							T f = transfer.getData();
-							f.setParentItemId(pid > 0 ? pid : null); //FIXME need to disable drop to self
-							f.setOwnerId(p.getOwnerId());
-							f.setRoomId(p.getRoomId());
-							if (f instanceof FlvRecording) {
-								FlvRecording r = (FlvRecording)f;
-								r.setOrganization_id(((FlvRecording)p).getOrganization_id());
-								getBean(FlvRecordingDao.class).update(r);
-							} else {
-								getBean(FileExplorerItemDao.class).update((FileExplorerItem)f);
-							}
-							target.add(treePanel.trees); //FIXME add correct refresh
-						}
-					}.dropCenter("div"));
-				}
-				return result;
+				return Type.Folder == r.getType() || r.getId() < 1 ? new FolderPanel(id, lm, treePanel) : new FileItemPanel(id, lm, treePanel);
 			}
 			
 			@Override

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.html
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.html?rev=1624188&r1=1624187&r2=1624188&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.html (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.html Thu Sep 11 03:14:08 2014
@@ -20,14 +20,23 @@
 -->
 <html xmlns:wicket="http://wicket.apache.org">
 <wicket:panel>
+	<script type="text/javascript">
+		function treeRevert(dropped) {
+			$('#tree-anchor').get(0).scrollIntoView();
+			this.parent().parent().get(0).scrollIntoView();
+			return !dropped;
+		}
+	</script>
 	<div class="file tree">
-		<div class="icons clear">
+		<div class="icons clear trash-toolbar" wicket:id="trash-toolbar">
 			<span wicket:id="create" class="folder-create om-icon align-left clickable" wicket:ommessage="title:703"></span>
 			<span wicket:id="refresh" class="refresh om-icon align-left clickable" wicket:ommessage="title:704"></span>
-			<span wicket:id="trash" class="trash om-icon align-right clickable" wicket:ommessage="title:705"><span style="display: block;" wicket:id="drop-center">&nbsp;</span></span>
+			<span wicket:id="trash" class="trash om-icon align-right clickable"></span>
+			<span style="padding-left: 20px;" wicket:ommessage="title:705"><wicket:ommessage key="1224"/></span>
 			<div class="clear"></div>
 		</div>
 		<div wicket:id="tree-container" class="trees">
+			<div id="tree-anchor" style="height: 2px; width: 2px;"></div>
 			<div wicket:id="tree"></div>
 		</div>
 		<div class="sizes" wicket:id="sizes">

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java?rev=1624188&r1=1624187&r2=1624188&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java Thu Sep 11 03:14:08 2014
@@ -32,6 +32,7 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.common.AddFolderDialog;
 import org.apache.openmeetings.web.common.ConfirmableAjaxLink;
+import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.AjaxSelfUpdatingTimerBehavior;
@@ -44,11 +45,9 @@ import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.util.time.Duration;
 
-import wicketdnd.DropTarget;
-import wicketdnd.Location;
-import wicketdnd.Operation;
-import wicketdnd.Reject;
-import wicketdnd.Transfer;
+import com.googlecode.wicket.jquery.core.JQueryBehavior;
+import com.googlecode.wicket.jquery.core.Options;
+import com.googlecode.wicket.jquery.ui.interaction.droppable.Droppable;
 
 public abstract class FileTreePanel extends Panel {
 	private static final long serialVersionUID = 1L;
@@ -75,7 +74,26 @@ public abstract class FileTreePanel exte
 			}
 		};
 		add(addFolder);
-		add(new WebMarkupContainer("create").add(new AjaxEventBehavior("onclick") {
+		Droppable<FileItem> trashToolbar = new Droppable<FileItem>("trash-toolbar") {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void onConfigure(JQueryBehavior behavior) {
+				super.onConfigure(behavior);
+				behavior.setOption("hoverClass", Options.asString("ui-state-hover trash-toolbar-hover"));
+				behavior.setOption("accept", Options.asString(".recorditem, .fileitem"));
+			}
+			
+			@Override
+			public void onDrop(AjaxRequestTarget target, Component component) {
+				Object o = component.getDefaultModelObject();
+				if (o instanceof FileItem) {
+					delete((FileItem)o, target);
+				}
+			}
+		};
+		add(trashToolbar);
+		trashToolbar.add(new WebMarkupContainer("create").add(new AjaxEventBehavior("onclick") {
 			private static final long serialVersionUID = 1L;
 
 			@Override
@@ -83,7 +101,7 @@ public abstract class FileTreePanel exte
 				addFolder.open(target);
 			}
 		}));
-		add(new WebMarkupContainer("refresh").add(new AjaxEventBehavior("onclick") {
+		trashToolbar.add(new WebMarkupContainer("refresh").add(new AjaxEventBehavior("onclick") {
 			private static final long serialVersionUID = 1L;
 
 			@Override
@@ -91,24 +109,14 @@ public abstract class FileTreePanel exte
 				target.add(trees); //FIXME add correct refresh
 			}
 		}));
-		ConfirmableAjaxLink trash = new ConfirmableAjaxLink("trash", 713) {
+		trashToolbar.add(new ConfirmableAjaxLink("trash", 713) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
 			public void onClick(AjaxRequestTarget target) {
 				delete(selectedFile.getObject(), target);
 			}
-		};
-		trash.add(new WebMarkupContainer("drop-center").setOutputMarkupId(true)).add(new DropTarget(Operation.MOVE) {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void onDrop(AjaxRequestTarget target, Transfer transfer, Location location) throws Reject {
-				FileItem f = transfer.getData();
-				delete(f, target);
-			}
-		}.dropCenter("span"));
-		add(trash/*.add(new WindowsTheme())*/); //TODO check theme here
+		});
 		
 		add(trees.add(treesView).setOutputMarkupId(true));
 		updateSizes();

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.html?rev=1624188&r1=1624187&r2=1624188&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.html (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.html Thu Sep 11 03:14:08 2014
@@ -20,6 +20,6 @@
 -->
 <html xmlns:wicket="http://wicket.apache.org">
 <wicket:panel>
-	<div wicket:id="item" class="file item"><wicket:child /><span wicket:id="name" class="name"></span></div>
+	<div wicket:id="drop" class="file item"><div wicket:id="drag"><wicket:child /><span wicket:id="name" class="name"></span></div></div>
 </wicket:panel>
 </html>

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java?rev=1624188&r1=1624187&r2=1624188&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java Thu Sep 11 03:14:08 2014
@@ -26,7 +26,10 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.file.FileItem;
 import org.apache.openmeetings.db.entity.file.FileItem.Type;
 import org.apache.openmeetings.db.entity.record.FlvRecording;
+import org.apache.wicket.Component;
+import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.behavior.AttributeAppender;
 import org.apache.wicket.extensions.ajax.markup.html.AjaxEditableLabel;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
@@ -34,17 +37,72 @@ import org.apache.wicket.markup.html.pan
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 
-import wicketdnd.theme.WindowsTheme;
+import com.googlecode.wicket.jquery.core.JQueryBehavior;
+import com.googlecode.wicket.jquery.core.Options;
+import com.googlecode.wicket.jquery.ui.interaction.draggable.Draggable;
+import com.googlecode.wicket.jquery.ui.interaction.droppable.Droppable;
 
 public class FolderPanel extends Panel {
 	private static final long serialVersionUID = 1L;
-	protected final WebMarkupContainer item = new WebMarkupContainer("item");
+	protected final MarkupContainer drop;
+	protected final MarkupContainer drag;
 
-	public FolderPanel(String id, final IModel<? extends FileItem> model) {
+	public FolderPanel(String id, final IModel<? extends FileItem> model, final FileTreePanel treePanel) {
 		super(id, model);
 		FileItem r = model.getObject();
-		add(new WindowsTheme());
-		item.add(Type.Folder == r.getType() ? new AjaxEditableLabel<String>("name", Model.of(model.getObject().getFileName())) {
+		drop = r.getType() == Type.Folder ? new Droppable<FileItem>("drop", Model.of(r)) {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void onConfigure(JQueryBehavior behavior) {
+				super.onConfigure(behavior);
+				behavior.setOption("hoverClass", Options.asString("ui-state-hover"));
+				behavior.setOption("accept", Options.asString(getDefaultModelObject() instanceof FlvRecording ? ".recorditem" : ".fileitem"));
+			}
+			
+			@Override
+			public void onDrop(AjaxRequestTarget target, Component component) {
+				Object o = component.getDefaultModelObject();
+				if (o instanceof FileItem) {
+					FileItem p = (FileItem)drop.getDefaultModelObject();
+					FileItem f = (FileItem)o;
+					long pid = p.getId();
+					//FIXME parent should not be moved to child !!!!!!!
+					if (pid == f.getId()) {
+						return;
+					}
+					f.setParentItemId(pid > 0 ? pid : null);
+					f.setOwnerId(p.getOwnerId());
+					f.setRoomId(p.getRoomId());
+					if (f instanceof FlvRecording) {
+						FlvRecording r = (FlvRecording)f;
+						r.setOrganization_id(((FlvRecording)p).getOrganization_id());
+						getBean(FlvRecordingDao.class).update(r);
+					} else {
+						getBean(FileExplorerItemDao.class).update((FileExplorerItem)f);
+					}
+				}
+				target.add(treePanel.trees); //FIXME add correct refresh
+			}
+		} : new WebMarkupContainer("drop");
+		if (r.getId() < 1) {
+			drag = new WebMarkupContainer("drag");
+		} else {
+			Draggable<? extends FileItem> d = new Draggable<FileItem>("drag", Model.of(r)) {
+				private static final long serialVersionUID = 1L;
+
+				@Override
+				public void onConfigure(JQueryBehavior behavior) {
+					super.onConfigure(behavior);
+					behavior.setOption("revert", "treeRevert");
+					behavior.setOption("cursor", Options.asString("move"));
+				}
+			};
+			d.setContainment(".file.tree, .icons");
+			d.add(AttributeAppender.append("class", r instanceof FlvRecording ? "recorditem" : "fileitem"));
+			drag = d;
+		}
+		drag.add(r.getId() < 1 || r.getType() != Type.Folder ? new Label("name", r.getFileName()) : new AjaxEditableLabel<String>("name", Model.of(model.getObject().getFileName())) {
 			private static final long serialVersionUID = 1L;
 			
 			@Override
@@ -68,7 +126,7 @@ public class FolderPanel extends Panel {
 			public void onEdit(AjaxRequestTarget target) {
 				super.onEdit(target);
 			}
-		} : new Label("name", r.getFileName()));
-		add(item.setOutputMarkupId(true));
+		});
+		add(drop.add(drag).setOutputMarkupId(true));
 	}
 }

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/MyRecordingTreeProvider.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/MyRecordingTreeProvider.java?rev=1624188&r1=1624187&r2=1624188&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/MyRecordingTreeProvider.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/MyRecordingTreeProvider.java Thu Sep 11 03:14:08 2014
@@ -25,6 +25,7 @@ import java.util.Arrays;
 import java.util.Iterator;
 
 import org.apache.openmeetings.db.dao.record.FlvRecordingDao;
+import org.apache.openmeetings.db.entity.file.FileItem.Type;
 import org.apache.openmeetings.db.entity.record.FlvRecording;
 import org.apache.openmeetings.web.app.WebSession;
 
@@ -34,6 +35,7 @@ public class MyRecordingTreeProvider ext
 	public Iterator<? extends FlvRecording> getRoots() {
 		FlvRecording r = new FlvRecording();
 		r.setId(0L);
+		r.setType(Type.Folder);
 		r.setFileName(WebSession.getString(860));
 		r.setOwnerId(getUserId());
 		return Arrays.asList(r).iterator();

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/PublicRecordingTreeProvider.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/PublicRecordingTreeProvider.java?rev=1624188&r1=1624187&r2=1624188&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/PublicRecordingTreeProvider.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/PublicRecordingTreeProvider.java Thu Sep 11 03:14:08 2014
@@ -24,6 +24,7 @@ import java.util.Arrays;
 import java.util.Iterator;
 
 import org.apache.openmeetings.db.dao.record.FlvRecordingDao;
+import org.apache.openmeetings.db.entity.file.FileItem.Type;
 import org.apache.openmeetings.db.entity.record.FlvRecording;
 import org.apache.openmeetings.web.app.WebSession;
 
@@ -42,6 +43,7 @@ public class PublicRecordingTreeProvider
 		r.setId(orgId == null ? -1 : -orgId);
 		r.setOrganization_id(orgId);
 		r.setOwnerId(null);
+		r.setType(Type.Folder);
 		String pub = WebSession.getString(861);
 		r.setFileName(orgId == null ? pub : String.format("%s (%s)", pub, name));
 		return Arrays.asList(r).iterator();

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java?rev=1624188&r1=1624187&r2=1624188&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java Thu Sep 11 03:14:08 2014
@@ -76,7 +76,7 @@ public class MainPage extends BaseInited
 	private final WebMarkupContainer topLinks = new WebMarkupContainer("topLinks");
 	private final MarkupContainer contents;
 	private final AbstractAjaxTimerBehavior areaBehavior;
-	private DebugBar dev = null;
+	private final Component dev;
 	
 	public MainPage(PageParameters pp) {
 		super();
@@ -121,10 +121,9 @@ public class MainPage extends BaseInited
 		});
 		add(about);
 		if (getApplication().getDebugSettings().isDevelopmentUtilitiesEnabled()) {
-		    add(dev = new DebugBar("dev"));
-		    dev.setOutputMarkupId(true);
+		    add((dev = new DebugBar("dev")).setOutputMarkupId(true));
 		} else {
-		    add(new EmptyPanel("dev").setVisible(false));
+		    add((dev = new EmptyPanel("dev")).setVisible(false));
 		}		
 		topLinks.add(new ExternalLink("bug", "https://issues.apache.org/jira/browse/OPENMEETINGS"));//FIXME hardcoded
 		

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html?rev=1624188&r1=1624187&r2=1624188&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html Thu Sep 11 03:14:08 2014
@@ -41,5 +41,6 @@
 		<div class="wb" wicket:id="whiteboard"></div>
 	</div>
 	<div wicket:id="invite"></div>
+	<div wicket:id="createPoll"></div>
 </wicket:panel>
 </html>

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java?rev=1624188&r1=1624187&r2=1624188&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java Thu Sep 11 03:14:08 2014
@@ -97,7 +97,7 @@ public class RoomPanel extends BasePanel
 	private long roomId;
 	private Client c;
 	private final StartSharingEventBehavior startSharing;
-	private AbstractDefaultAjaxBehavior aab = new AbstractDefaultAjaxBehavior() {
+	private final AbstractDefaultAjaxBehavior aab = new AbstractDefaultAjaxBehavior() {
 		private static final long serialVersionUID = 1L;
 
 		@Override
@@ -116,6 +116,15 @@ public class RoomPanel extends BasePanel
 		}
 	};
 	private final InvitationDialog invite;
+	private final CreatePollDialog createPoll;
+	private final MenuPanel menuPanel;
+	private final RoomMenuItem shareItem;
+	private final RoomMenuItem applyModer;
+	private final RoomMenuItem applyWB;
+	private final RoomMenuItem applyAV;
+	private final RoomMenuItem pollVote;
+	private final RoomMenuItem pollResult;
+	private final RoomMenuItem sipDialer;
 	
 	public RoomPanel(String id, long _roomId) {
 		this(id, getBean(RoomDao.class).get(_roomId));
@@ -124,8 +133,27 @@ public class RoomPanel extends BasePanel
 	public RoomPanel(String id, Room r) {
 		super(id);
 		this.roomId = r.getId();
-		invite = new InvitationDialog("invite", roomId);
-		add(new MenuPanel("roomMenu", getMenu()).setVisible(!r.getHideTopBar()));
+		shareItem = new RoomMenuItem(WebSession.getString(239), WebSession.getString(1480)) {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void onClick(MainPage page, AjaxRequestTarget target) {
+				startSharing.respond(target);
+			}
+		};
+		applyModer = new RoomMenuItem(WebSession.getString(784), WebSession.getString(1481));
+		applyModer.setActive(false);
+		applyWB = new RoomMenuItem(WebSession.getString(785), WebSession.getString(1492));
+		applyWB.setActive(false);
+		applyAV = new RoomMenuItem(WebSession.getString(786), WebSession.getString(1482));
+		applyAV.setActive(false);
+		pollVote = new RoomMenuItem(WebSession.getString(42), WebSession.getString(1485));
+		pollVote.setActive(false);
+		pollResult = new RoomMenuItem(WebSession.getString(37), WebSession.getString(1484));
+		pollResult.setActive(false);
+		sipDialer = new RoomMenuItem(WebSession.getString(1447), WebSession.getString(1488));
+		sipDialer.setActive(false);
+		add((menuPanel = new MenuPanel("roomMenu", getMenu())).setVisible(!r.getHideTopBar()));
 		WebMarkupContainer wb = new WebMarkupContainer("whiteboard");
 		add(wb.setOutputMarkupId(true));
 		add(new WhiteboardBehavior("1", wb.getMarkupId(), null, null, null));
@@ -201,7 +229,8 @@ public class RoomPanel extends BasePanel
 				startSharing.respond(target);
 			}
 		}).add(new AttributeAppender("title", WebSession.getString(1480)))); //FIXME add/remove
-		add(invite);
+		add(invite = new InvitationDialog("invite", roomId));
+		add(createPoll = new CreatePollDialog("createPoll", roomId));
 	}
 
 	private JSONArray getStringLabels(long... ids) {
@@ -287,9 +316,8 @@ public class RoomPanel extends BasePanel
 	}
 	
 	private List<MenuItem> getMenu() {
-		//TODO hide/show
 		List<MenuItem> menu = new ArrayList<MenuItem>();
-		menu.add(new RoomMenuItem(WebSession.getString(308), WebSession.getString(309), "room menu exit") {
+		RoomMenuItem exit = new RoomMenuItem(WebSession.getString(308), WebSession.getString(309), "room menu exit") {
 			private static final long serialVersionUID = 1L;
 
 			@Override
@@ -305,7 +333,10 @@ public class RoomPanel extends BasePanel
 					throw new RedirectToUrlException(url);
 				}
 			}
-		});
+		};
+		User u = getBean(UserDao.class).get(getUserId());
+		exit.setActive(u.getType() != User.Type.external && u.getType() != User.Type.contact);
+		menu.add(exit);//TODO check this
 		MenuItem files = new RoomMenuItem(WebSession.getString(245));
 		List<RoomMenuItem> fileItems = new ArrayList<RoomMenuItem>();
 		fileItems.add(new RoomMenuItem(WebSession.getString(15), WebSession.getString(1479)));
@@ -323,21 +354,21 @@ public class RoomPanel extends BasePanel
 				invite.open(target);
 			}
 		});
-		actionItems.add(new RoomMenuItem(WebSession.getString(239), WebSession.getString(1480)) {
+		actionItems.add(shareItem); //FIXME enable/disable
+		actionItems.add(applyModer); //FIXME enable/disable
+		actionItems.add(applyWB); //FIXME enable/disable
+		actionItems.add(applyAV); //FIXME enable/disable
+		actionItems.add(new RoomMenuItem(WebSession.getString(24), WebSession.getString(1483)) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
 			public void onClick(MainPage page, AjaxRequestTarget target) {
-				startSharing.respond(target);
+				createPoll.open(target);
 			}
 		});
-		actionItems.add(new RoomMenuItem(WebSession.getString(784), WebSession.getString(1481)));
-		actionItems.add(new RoomMenuItem(WebSession.getString(785), WebSession.getString(1492)));
-		actionItems.add(new RoomMenuItem(WebSession.getString(786), WebSession.getString(1482)));
-		actionItems.add(new RoomMenuItem(WebSession.getString(24), WebSession.getString(1483)));
-		actionItems.add(new RoomMenuItem(WebSession.getString(37), WebSession.getString(1484)));
-		actionItems.add(new RoomMenuItem(WebSession.getString(42), WebSession.getString(1485)));
-		actionItems.add(new RoomMenuItem(WebSession.getString(1447), WebSession.getString(1488)));
+		actionItems.add(pollResult); //FIXME enable/disable
+		actionItems.add(pollVote); //FIXME enable/disable
+		actionItems.add(sipDialer);
 		actionItems.add(new RoomMenuItem(WebSession.getString(1126), WebSession.getString(1490)));
 		actions.setChildren(actionItems);
 		menu.add(actions);
@@ -408,6 +439,7 @@ public class RoomPanel extends BasePanel
 		public Iterator<? extends FileExplorerItem> getRoots() {
 			FileExplorerItem f = new FileExplorerItem();
 			f.setRoomId(roomId);
+			f.setType(Type.Folder);
 			if (roomId == null) {
 				f.setId(0L);
 				f.setOwnerId(getUserId());

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoInfo.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoInfo.java?rev=1624188&r1=1624187&r2=1624188&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoInfo.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoInfo.java Thu Sep 11 03:14:08 2014
@@ -85,9 +85,11 @@ public class VideoInfo extends Panel {
 		FlvRecording r = _r == null ? new FlvRecording() : _r;
 		rm.setObject(r);
 		try {
-			Room room = getBean(RoomDao.class).get(r.getRoomId());
-			if (room != null) {
-				roomName.setObject(room.getName());
+			if (r.getRoomId() != null) {
+				Room room = getBean(RoomDao.class).get(r.getRoomId());
+				if (room != null) {
+					roomName.setObject(room.getName());
+				}
 			}
 		} catch (Exception e) {
 			//no-op

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/theme.css
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/theme.css?rev=1624188&r1=1624187&r2=1624188&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/theme.css (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/theme.css Thu Sep 11 03:14:08 2014
@@ -296,6 +296,14 @@ html, body {
 	overflow-x: hidden;
 	overflow-y: auto;
 }
+.trash-toolbar {
+	font-weight: bold;
+	line-height: 20px;
+	color: transparent;
+}
+.trash-toolbar-hover {
+	color: inherit;
+}
 .file.tree .files .sizes table, .file.tree .files .info table {
 	width: 100%;
 }
@@ -404,6 +412,7 @@ html, body {
 .file.item {
 	position: relative;
 	display: inline-block;
+	min-width: 150px;
 }
 .file.item .name {
 	color: black;