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 06:16:36 UTC

svn commit: r1624190 - in /openmeetings/branches/3.0.x: ./ src/main/webapp/css/ src/web/java/org/apache/openmeetings/web/pages/install/ src/web/java/org/apache/openmeetings/web/user/record/

Author: solomax
Date: Thu Sep 11 04:16:36 2014
New Revision: 1624190

URL: http://svn.apache.org/r1624190
Log:
[OPENMEETINGS-1041] drag&drop in recordings is improved;

Modified:
    openmeetings/branches/3.0.x/ivy.xml
    openmeetings/branches/3.0.x/src/main/webapp/css/theme.css
    openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/pages/install/InstallWizard.java
    openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingItemPanel.java
    openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.html
    openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.java
    openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.html
    openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java

Modified: openmeetings/branches/3.0.x/ivy.xml
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/ivy.xml?rev=1624190&r1=1624189&r2=1624190&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/ivy.xml (original)
+++ openmeetings/branches/3.0.x/ivy.xml Thu Sep 11 04:16:36 2014
@@ -226,52 +226,52 @@
 		<dependency org="org.simpleframework" name="simple-xml" rev="2.7" conf="openmeetings->*" transitive="false">
 			<include type="jar" />
 		</dependency>
-		<dependency org="org.apache.wicket" name="wicket-request" rev="6.16.0" conf="openmeetings->*" transitive="false">
+		<dependency org="org.apache.wicket" name="wicket-request" rev="6.17.0" conf="openmeetings->*" transitive="false">
 			<include type="jar" />
 		</dependency>
-		<dependency org="org.apache.wicket" name="wicket-util" rev="6.16.0" conf="openmeetings->*" transitive="false">
+		<dependency org="org.apache.wicket" name="wicket-util" rev="6.17.0" conf="openmeetings->*" transitive="false">
 			<include type="jar" />
 		</dependency>
-		<dependency org="org.apache.wicket" name="wicket-core" rev="6.16.0" conf="openmeetings->*" transitive="false">
+		<dependency org="org.apache.wicket" name="wicket-core" rev="6.17.0" conf="openmeetings->*" transitive="false">
 			<include type="jar" />
 		</dependency>
-		<dependency org="org.apache.wicket" name="wicket-auth-roles" rev="6.16.0" conf="openmeetings->*" transitive="false">
+		<dependency org="org.apache.wicket" name="wicket-auth-roles" rev="6.17.0" conf="openmeetings->*" transitive="false">
 			<include type="jar" />
 		</dependency>
-		<dependency org="org.apache.wicket" name="wicket-ioc" rev="6.16.0" conf="openmeetings->*" transitive="false">
+		<dependency org="org.apache.wicket" name="wicket-ioc" rev="6.17.0" conf="openmeetings->*" transitive="false">
 			<include type="jar" />
 		</dependency>
-		<dependency org="org.apache.wicket" name="wicket-extensions" rev="6.16.0" conf="openmeetings->*" transitive="false">
+		<dependency org="org.apache.wicket" name="wicket-extensions" rev="6.17.0" conf="openmeetings->*" transitive="false">
 			<include type="jar" />
 		</dependency>
-		<dependency org="org.apache.wicket" name="wicket-datetime" rev="6.16.0" conf="openmeetings->*" transitive="false">
+		<dependency org="org.apache.wicket" name="wicket-datetime" rev="6.17.0" conf="openmeetings->*" transitive="false">
 			<include type="jar" />
 		</dependency>
 		<dependency org="joda-time" name="joda-time" rev="2.3" conf="openmeetings->*" transitive="false">
 			<include type="jar" />
 		</dependency>
-		<dependency org="org.apache.wicket" name="wicket-devutils" rev="6.16.0" conf="openmeetings->*" transitive="false">
+		<dependency org="org.apache.wicket" name="wicket-devutils" rev="6.17.0" conf="openmeetings->*" transitive="false">
 			<include type="jar" />
 		</dependency>
-		<dependency org="org.apache.wicket" name="wicket-native-websocket-core" rev="6.16.0" conf="openmeetings->*" transitive="false">
+		<dependency org="org.apache.wicket" name="wicket-native-websocket-core" rev="6.17.0" conf="openmeetings->*" transitive="false">
 			<include type="jar" />
 		</dependency>
-		<dependency org="org.apache.wicket" name="wicket-native-websocket-tomcat" rev="6.16.0" conf="openmeetings->*" transitive="false">
+		<dependency org="org.apache.wicket" name="wicket-native-websocket-tomcat" rev="6.17.0" conf="openmeetings->*" transitive="false">
 			<include type="jar" />
 		</dependency>
-		<dependency org="com.googlecode.wicket-jquery-ui" name="wicket-jquery-ui-core" rev="6.16.0" conf="openmeetings->*" transitive="false">
+		<dependency org="com.googlecode.wicket-jquery-ui" name="wicket-jquery-ui-core" rev="6.17.0" conf="openmeetings->*" transitive="false">
 			<include type="jar" />
 		</dependency>
-		<dependency org="com.googlecode.wicket-jquery-ui" name="wicket-jquery-ui" rev="6.16.0" conf="openmeetings->*" transitive="false">
+		<dependency org="com.googlecode.wicket-jquery-ui" name="wicket-jquery-ui" rev="6.17.0" conf="openmeetings->*" transitive="false">
             <include type="jar" />
         </dependency>
-		<dependency org="com.googlecode.wicket-jquery-ui" name="wicket-jquery-ui-calendar" rev="6.16.0" conf="openmeetings->*" transitive="false">
+		<dependency org="com.googlecode.wicket-jquery-ui" name="wicket-jquery-ui-calendar" rev="6.17.0" conf="openmeetings->*" transitive="false">
 			<include type="jar" />
 		</dependency>
-		<dependency org="com.googlecode.wicket-jquery-ui" name="wicket-jquery-ui-plugins" rev="6.16.0" conf="openmeetings->*" transitive="false">
+		<dependency org="com.googlecode.wicket-jquery-ui" name="wicket-jquery-ui-plugins" rev="6.17.0" conf="openmeetings->*" transitive="false">
 			<include type="jar" />
 		</dependency>
-		<dependency org="com.googlecode.wicket-jquery-ui" name="wicket-kendo-ui" rev="6.16.0" conf="openmeetings->*" transitive="false">
+		<dependency org="com.googlecode.wicket-jquery-ui" name="wicket-kendo-ui" rev="6.17.0" conf="openmeetings->*" transitive="false">
 			<include type="jar" />
 		</dependency>
 		<dependency org="ro.fortsoft.wicket.dashboard" name="wicket-dashboard-core" rev="0.10" conf="openmeetings->*" transitive="false">
@@ -280,13 +280,10 @@
 		<dependency org="com.google.code.gson" name="gson" rev="2.2.4" conf="openmeetings->*" transitive="false">
 			<include type="jar" />
 		</dependency>
-		<dependency org="com.github.svenmeier.wicket-dnd" name="wicket-dnd" rev="0.6.0" conf="openmeetings->*" transitive="false">
+		<dependency org="org.wicketstuff" name="wicketstuff-urlfragment" rev="6.17.0" conf="openmeetings->*" transitive="false">
 			<include type="jar" />
 		</dependency>
-		<dependency org="org.wicketstuff" name="wicketstuff-urlfragment" rev="6.16.0" conf="openmeetings->*" transitive="false">
-			<include type="jar" />
-		</dependency>
-		<dependency org="org.wicketstuff" name="wicketstuff-html5" rev="6.16.0" conf="openmeetings->*" transitive="false">
+		<dependency org="org.wicketstuff" name="wicketstuff-html5" rev="6.17.0" conf="openmeetings->*" transitive="false">
 			<include type="jar" />
 		</dependency>
 		<dependency org="com.vaynberg.wicket.select2" name="wicket-select2" rev="2.2.3" conf="openmeetings->*" transitive="false">

Modified: openmeetings/branches/3.0.x/src/main/webapp/css/theme.css
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/main/webapp/css/theme.css?rev=1624190&r1=1624189&r2=1624190&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/main/webapp/css/theme.css (original)
+++ openmeetings/branches/3.0.x/src/main/webapp/css/theme.css Thu Sep 11 04:16:36 2014
@@ -288,6 +288,14 @@ html, body {
 	width: 250px;
 	border: 1px solid #ccc;
 }
+.trash-toolbar {
+	font-weight: bold;
+	line-height: 20px;
+	color: transparent;
+}
+.trash-toolbar-hover {
+	color: inherit;
+}
 .recording .files .trees {
 	min-height: 400px;
 	max-height: 600px;

Modified: openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/pages/install/InstallWizard.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/pages/install/InstallWizard.java?rev=1624190&r1=1624189&r2=1624190&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/pages/install/InstallWizard.java (original)
+++ openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/pages/install/InstallWizard.java Thu Sep 11 04:16:36 2014
@@ -340,7 +340,7 @@ public class InstallWizard extends Wizar
 							);
 					} else {
 						progressBar.setModelObject(Application.get()._getBean(ImportInitvalues.class).getProgress());
-						progressBar.respond(target);
+						progressBar.refresh(target);
 						//TODO uncomment later target.add(value);
 						//TODO add current step result as info
 					}

Modified: openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingItemPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingItemPanel.java?rev=1624190&r1=1624189&r2=1624190&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingItemPanel.java (original)
+++ openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingItemPanel.java Thu Sep 11 04:16:36 2014
@@ -33,18 +33,18 @@ import org.apache.wicket.model.IModel;
 public class RecordingItemPanel extends RecordingPanel {
 	private static final long serialVersionUID = 1L;
 
-	public RecordingItemPanel(String id, final IModel<FlvRecording> model, final RecordingErrorsDialog errorsDialog) {
-		super(id, model);
+	public RecordingItemPanel(String id, final IModel<FlvRecording> model, final RecordingsPanel treePanel) {
+		super(id, model, treePanel);
 		FlvRecording r = model.getObject();
 		long errorCount = getBean(FlvRecordingLogDao.class).countErrors(r.getFlvRecordingId());
 		boolean visible = errorCount != 0 || (Status.PROCESSING != r.getStatus() && !isRecordingExists(r.getFileHash() + MP4_EXTENSION));
-		item.add(new WebMarkupContainer("errors").add(new AjaxEventBehavior("click") {
+		drag.add(new WebMarkupContainer("errors").add(new AjaxEventBehavior("click") {
 			private static final long serialVersionUID = 1L;
 
 			@Override
 			protected void onEvent(AjaxRequestTarget target) {
-				errorsDialog.setDefaultModel(model);
-				errorsDialog.open(target);
+				treePanel.errorsDialog.setDefaultModel(model);
+				treePanel.errorsDialog.open(target);
 			}
 		}).setVisible(visible));
 	}

Modified: openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.html?rev=1624190&r1=1624189&r2=1624190&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.html (original)
+++ openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.html Thu Sep 11 04:16:36 2014
@@ -20,6 +20,6 @@
 -->
 <html xmlns:wicket="http://wicket.apache.org">
 <wicket:panel>
-	<div wicket:id="item" class="recording item"><span wicket:id="name" class="name"></span><wicket:child /></div>
+	<div wicket:id="drop" class="recording item"><div wicket:id="drag"><wicket:child /><span wicket:id="name" class="name"></span></div></div>
 </wicket:panel>
 </html>

Modified: openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.java?rev=1624190&r1=1624189&r2=1624190&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.java (original)
+++ openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.java Thu Sep 11 04:16:36 2014
@@ -22,7 +22,10 @@ import static org.apache.openmeetings.we
 
 import org.apache.openmeetings.db.dao.record.FlvRecordingDao;
 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;
@@ -30,17 +33,67 @@ 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 RecordingPanel extends Panel {
 	private static final long serialVersionUID = 1L;
-	protected final WebMarkupContainer item = new WebMarkupContainer("item");
+	protected final MarkupContainer drop;
+	protected final MarkupContainer drag;
 
-	public RecordingPanel(String id, final IModel<FlvRecording> model) {
+	public RecordingPanel(String id, final IModel<FlvRecording> model, final RecordingsPanel treePanel) {
 		super(id, model);
 		FlvRecording r = model.getObject();
-		add(new WindowsTheme());
-		item.add(r.isFolder() ? new AjaxEditableLabel<String>("name", Model.of(model.getObject().getFileName())) {
+		drop = r.isFolder() ? new Droppable<FlvRecording>("drop", model) {
+			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(".recorditem"));
+			}
+			
+			@Override
+			public void onDrop(AjaxRequestTarget target, Component component) {
+				Object o = component.getDefaultModelObject();
+				if (o instanceof FlvRecording) {
+					FlvRecording p = (FlvRecording)drop.getDefaultModelObject();
+					FlvRecording f = (FlvRecording)o;
+					long pid = p.getFlvRecordingId();
+					//FIXME parent should not be moved to child !!!!!!!
+					if (pid == f.getFlvRecordingId()) {
+						return;
+					}
+					f.setParentFileExplorerItemId(pid > 0 ? pid : null);
+					f.setOwnerId(p.getOwnerId());
+					f.setRoom_id(p.getRoom_id());
+					f.setOrganization_id((p).getOrganization_id());
+					getBean(FlvRecordingDao.class).update(f);
+				}
+				target.add(treePanel.trees); //FIXME add correct refresh
+			}
+		} : new WebMarkupContainer("drop");
+		if (r.getFlvRecordingId() < 1) {
+			drag = new WebMarkupContainer("drag");
+		} else {
+			Draggable<FlvRecording> d = new Draggable<FlvRecording>("drag", model) {
+				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");
+			d.add(AttributeAppender.append("class", "recorditem"));
+			drag = d;
+		}
+		drag.add(r.getFlvRecordingId() < 1 || !r.isFolder() ? new Label("name", r.getFileName()) : new AjaxEditableLabel<String>("name", Model.of(model.getObject().getFileName())) {
 			private static final long serialVersionUID = 1L;
 			
 			@Override
@@ -51,16 +104,16 @@ public class RecordingPanel extends Pane
 			@Override
 			protected void onSubmit(AjaxRequestTarget target) {
 				super.onSubmit(target);
-				FlvRecording r = model.getObject();
-				r.setFileName(getEditor().getModelObject());
-				getBean(FlvRecordingDao.class).update(r);
+				FlvRecording fi = model.getObject();
+				fi.setFileName(getEditor().getModelObject());
+				getBean(FlvRecordingDao.class).update(fi);
 			}
 			
 			@Override
 			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/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.html?rev=1624190&r1=1624189&r2=1624190&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.html (original)
+++ openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.html Thu Sep 11 04:16:36 2014
@@ -20,16 +20,25 @@
 -->
 <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>
 	<table class="recording">
 		<tr>
-			<td valign="top" class="files">
-				<div class="icons clear">
-					<span wicket:id="create" class="folder-create om-icon align-left clickable"></span>
-					<span wicket:id="refresh" class="refresh om-icon align-left clickable"></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>
+			<td valign="top" class="files file tree">
+				<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"></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/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java?rev=1624190&r1=1624189&r2=1624190&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java (original)
+++ openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java Thu Sep 11 04:16:36 2014
@@ -55,23 +55,20 @@ import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.util.time.Duration;
 
-import wicketdnd.DragSource;
-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 class RecordingsPanel extends UserPanel {
 	private static final long serialVersionUID = 1321258690447136958L;
-	private final WebMarkupContainer trees = new WebMarkupContainer("tree-container");
+	final WebMarkupContainer trees = new WebMarkupContainer("tree-container");
 	private final WebMarkupContainer sizes = new WebMarkupContainer("sizes");
 	private final VideoPlayer video = new VideoPlayer("video");
 	private final VideoInfo info = new VideoInfo("info");
 	private final IModel<FlvRecording> rm = new CompoundPropertyModel<FlvRecording>(new FlvRecording());
 	private final IModel<String> homeSize = Model.of((String)null);
 	private final IModel<String> publicSize = Model.of((String)null);
-	private final RecordingErrorsDialog errorsDialog = new RecordingErrorsDialog("errors", Model.of((FlvRecording)null));
+	final RecordingErrorsDialog errorsDialog = new RecordingErrorsDialog("errors", Model.of((FlvRecording)null));
 	private RecordingTree selected;
 	
 	public RecordingsPanel(String id) {
@@ -102,45 +99,49 @@ public class RecordingsPanel extends Use
 			}
 		};
 		add(addFolder);
-		add(new WebMarkupContainer("create").add(new AjaxEventBehavior("onclick") {
+		Droppable<FlvRecording> trashToolbar = new Droppable<FlvRecording>("trash-toolbar") {
 			private static final long serialVersionUID = 1L;
 
 			@Override
-			protected void onEvent(AjaxRequestTarget target) {
-				addFolder.open(target);
+			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"));
 			}
-		}));
-		add(new WebMarkupContainer("refresh").add(new AjaxEventBehavior("onclick") {
+			
+			@Override
+			public void onDrop(AjaxRequestTarget target, Component component) {
+				Object o = component.getDefaultModelObject();
+				if (o instanceof FlvRecording) {
+					delete((FlvRecording)o, target);
+				}
+			}
+		};
+		add(trashToolbar);
+		trashToolbar.add(new WebMarkupContainer("create").add(new AjaxEventBehavior("onclick") {
 			private static final long serialVersionUID = 1L;
 
 			@Override
 			protected void onEvent(AjaxRequestTarget target) {
-				target.add(trees); //FIXME add correct refresh
+				addFolder.open(target);
 			}
 		}));
-		ConfirmableAjaxLink trash = new ConfirmableAjaxLink("trash", 713) {
+		trashToolbar.add(new WebMarkupContainer("refresh").add(new AjaxEventBehavior("onclick") {
 			private static final long serialVersionUID = 1L;
 
 			@Override
-			public void onClick(AjaxRequestTarget target) {
-				long id = rm.getObject().getFlvRecordingId();
-				if (id > 0) {
-					getBean(FlvRecordingDao.class).delete(rm.getObject());
-				}
+			protected void onEvent(AjaxRequestTarget target) {
 				target.add(trees); //FIXME add correct refresh
 			}
-		};
-		trash.add(new WebMarkupContainer("drop-center").setOutputMarkupId(true)).add(new DropTarget(Operation.MOVE) {
+		}));
+		trashToolbar.add(new ConfirmableAjaxLink("trash", 713) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
-			public void onDrop(AjaxRequestTarget target, Transfer transfer, Location location) throws Reject {
-				FlvRecording r = transfer.getData();
-				getBean(FlvRecordingDao.class).delete(r);
-				target.add(trees); //FIXME add correct refresh
+			public void onClick(AjaxRequestTarget target) {
+				delete(rm.getObject(), target);
 			}
-		}.dropCenter("span"));
-		add(trash/*.add(new WindowsTheme())*/); //TODO check theme here
+		});
 		RepeatingView treesView = new RepeatingView("tree");
 		treesView.add(selected = new RecordingTree(treesView.newChildId(), new MyRecordingTreeProvider()));
 		treesView.add(new RecordingTree(treesView.newChildId(), new PublicRecordingTreeProvider(null, null)));
@@ -161,6 +162,14 @@ public class RecordingsPanel extends Use
 		add(video, info, errorsDialog);
 	}
 
+	void delete(FlvRecording f, AjaxRequestTarget target) {
+		long id = f.getFlvRecordingId();
+		if (id > 0) {
+			getBean(FlvRecordingDao.class).delete(f);
+		}
+		target.add(trees); //FIXME add correct refresh
+	}
+	
 	private void updateSizes() {
 		RecordingContainerData sizeData = getBean(FlvRecordingDao.class).getRecordingContainerData(getUserId());
 		if (sizeData != null) {
@@ -186,40 +195,7 @@ public class RecordingsPanel extends Use
 				@Override
 				protected Component newLabelComponent(String id, final IModel<FlvRecording> lm) {
 					FlvRecording r = lm.getObject();
-					Component result = r.isFolder() || r.getFlvRecordingId() < 1 ? new RecordingPanel(id, lm) : new RecordingItemPanel(id, lm, errorsDialog);
-					if (r.getFlvRecordingId() > 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.getFlvRecordingId() < 0 || r.isFolder()) {
-						result.add(new DropTarget(Operation.MOVE) {
-							private static final long serialVersionUID = 1L;
-
-							@Override
-							public void onDrop(AjaxRequestTarget target, Transfer transfer, Location location) throws Reject {
-								FlvRecording p = lm.getObject();
-								long pid = p.getFlvRecordingId();
-								FlvRecording r = transfer.getData();
-								r.setParentFileExplorerItemId(pid > 0 ? pid : null);
-								r.setOrganization_id(p.getOrganization_id());
-								r.setOwnerId(p.getOwnerId());
-								getBean(FlvRecordingDao.class).update(r);
-								target.add(trees); //FIXME add correct refresh
-							}
-						}.dropCenter("div"));
-					}
-					return result;
+					return r.isFolder() || r.getFlvRecordingId() < 1 ? new RecordingPanel(id, lm, RecordingsPanel.this) : new RecordingItemPanel(id, lm, RecordingsPanel.this);
 				}
 				
 				@Override
@@ -309,6 +285,7 @@ public class RecordingsPanel extends Use
 			FlvRecording r = new FlvRecording();
 			r.setFlvRecordingId(0);
 			r.setFileName(WebSession.getString(860));
+			r.setFolder(true);
 			r.setOwnerId(getUserId());
 			return Arrays.asList(r).iterator();
 		}
@@ -337,6 +314,7 @@ public class RecordingsPanel extends Use
 			r.setFlvRecordingId(orgId == null ? -1 : -orgId);
 			r.setOrganization_id(orgId);
 			r.setOwnerId(null);
+			r.setFolder(true);
 			String pub = WebSession.getString(861);
 			r.setFileName(orgId == null ? pub : String.format("%s (%s)", pub, name));
 			return Arrays.asList(r).iterator();