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/02/17 20:09:19 UTC

svn commit: r1569088 - in /openmeetings: branches/3.0.x/ branches/3.0.x/src/db/java/org/apache/openmeetings/db/dao/record/ branches/3.0.x/src/db/java/org/apache/openmeetings/db/dto/file/ branches/3.0.x/src/db/java/org/apache/openmeetings/db/entity/reco...

Author: solomax
Date: Mon Feb 17 19:09:19 2014
New Revision: 1569088

URL: http://svn.apache.org/r1569088
Log:
[OPENMEETINGS-923] drag-n-drop functionality is added to the recordings

Added:
    openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingItemPanel.html
    openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingItemPanel.java
    openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingItemPanel.html
    openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingItemPanel.java
Modified:
    openmeetings/branches/3.0.x/ivy.xml
    openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingDao.java
    openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/dto/file/RecordingObject.java
    openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/entity/record/FlvRecording.java
    openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/converter/FlvInterviewConverter.java
    openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/converter/FlvRecorderConverter.java
    openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/remote/FLVRecorderService.java
    openmeetings/branches/3.0.x/src/main/webapp/css/theme.css
    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
    openmeetings/trunk/singlewebapp/ivy.xml
    openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingDao.java
    openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/dto/file/RecordingObject.java
    openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/entity/record/FlvRecording.java
    openmeetings/trunk/singlewebapp/src/main/java/org/apache/openmeetings/converter/FlvInterviewConverter.java
    openmeetings/trunk/singlewebapp/src/main/java/org/apache/openmeetings/converter/FlvRecorderConverter.java
    openmeetings/trunk/singlewebapp/src/main/java/org/apache/openmeetings/remote/FLVRecorderService.java
    openmeetings/trunk/singlewebapp/src/main/webapp/css/theme.css
    openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.html
    openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.java
    openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.html
    openmeetings/trunk/singlewebapp/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=1569088&r1=1569087&r2=1569088&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/ivy.xml (original)
+++ openmeetings/branches/3.0.x/ivy.xml Mon Feb 17 19:09:19 2014
@@ -280,11 +280,9 @@
 		<dependency org="com.google.code.gson" name="gson" rev="2.2.4" conf="openmeetings->*" transitive="false">
 			<include type="jar" />
 		</dependency>
-		<!-- TODO need to be uncommented to implement file drad-n-drop to whiteboard
 		<dependency org="com.github.svenmeier.wicket-dnd" name="wicket-dnd" rev="0.6.0" conf="openmeetings->*" transitive="false">
 			<include type="jar" />
 		</dependency>
-		-->
 		<dependency org="org.wicketstuff" name="wicketstuff-urlfragment" rev="6.13.0" conf="openmeetings->*" transitive="false">
 			<include type="jar" />
 		</dependency>

Modified: openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingDao.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingDao.java?rev=1569088&r1=1569087&r2=1569088&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingDao.java (original)
+++ openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingDao.java Mon Feb 17 19:09:19 2014
@@ -187,7 +187,7 @@ public class FlvRecordingDao {
 			String hql = "SELECT c FROM FlvRecording c " + "WHERE c.deleted = false "
 					+ "AND (c.ownerId IS NULL OR c.ownerId = 0)  "
 					+ "AND (c.parentFileExplorerItemId IS NULL OR c.parentFileExplorerItemId = 0) "
-					+ "ORDER BY c.isFolder DESC, c.fileName ";
+					+ "ORDER BY c.folder DESC, c.fileName ";
 
 			TypedQuery<FlvRecording> query = em.createQuery(hql, FlvRecording.class);
 
@@ -200,24 +200,7 @@ public class FlvRecordingDao {
 	}
 
 	public List<FlvRecording> getFlvRecordingRootByPublic(Long organization_id) {
-		try {
-
-			String hql = "SELECT c FROM FlvRecording c " + "WHERE c.deleted <> :deleted " + "AND c.ownerId IS NULL "
-					+ "AND c.organization_id = :organization_id "
-					+ "AND (c.parentFileExplorerItemId IS NULL OR c.parentFileExplorerItemId = 0) "
-					+ "ORDER BY c.isFolder DESC, c.fileName ";
-
-			TypedQuery<FlvRecording> query = em.createQuery(hql, FlvRecording.class);
-			query.setParameter("organization_id", organization_id);
-			query.setParameter("deleted", true);
-
-			List<FlvRecording> flvRecordingList = query.getResultList();
-
-			return flvRecordingList;
-		} catch (Exception ex2) {
-			log.error("[getFlvRecordingRootByPublic]: ", ex2);
-		}
-		return null;
+		return em.createNamedQuery("getRecordingsByOrganization", FlvRecording.class).setParameter("organization_id", organization_id).getResultList();
 	}
 
 	public List<FlvRecording> getFlvRecordingRootByOwner(Long ownerId) {
@@ -225,7 +208,7 @@ public class FlvRecordingDao {
 
 			String hql = "SELECT c FROM FlvRecording c " + "WHERE c.deleted <> :deleted " + "AND c.ownerId = :ownerId "
 					+ "AND (c.parentFileExplorerItemId IS NULL OR c.parentFileExplorerItemId = 0) "
-					+ "ORDER BY c.isFolder DESC, c.fileName ";
+					+ "ORDER BY c.folder DESC, c.fileName ";
 
 			TypedQuery<FlvRecording> query = em.createQuery(hql, FlvRecording.class);
 			query.setParameter("deleted", true);
@@ -247,7 +230,7 @@ public class FlvRecordingDao {
 					+ "WHERE c.deleted <> :deleted "
 					+ "AND c.ownerId = :ownerId "
 					+ "AND (c.parentFileExplorerItemId IS NULL OR c.parentFileExplorerItemId = :parentFileExplorerItemId)"
-					+ "ORDER BY c.isFolder DESC, c.fileName ";
+					+ "ORDER BY c.folder DESC, c.fileName ";
 
 			TypedQuery<FlvRecording> query = em.createQuery(hql, FlvRecording.class);
 			query.setParameter("deleted", true);
@@ -267,7 +250,7 @@ public class FlvRecordingDao {
 		try {
 
 			String hql = "SELECT c FROM FlvRecording c " + "WHERE c.deleted <> :deleted " + "AND c.room_id = :room_id "
-					+ "ORDER BY c.isFolder DESC, c.fileName ";
+					+ "ORDER BY c.folder DESC, c.fileName ";
 
 			TypedQuery<FlvRecording> query = em.createQuery(hql, FlvRecording.class);
 			query.setParameter("deleted", true);
@@ -287,7 +270,7 @@ public class FlvRecordingDao {
 
 			String hql = "SELECT c FROM FlvRecording c " + "WHERE c.deleted <> :deleted "
 					+ "AND c.parentFileExplorerItemId = :parentFileExplorerItemId "
-					+ "ORDER BY c.isFolder DESC, c.fileName ";
+					+ "ORDER BY c.folder DESC, c.fileName ";
 
 			TypedQuery<FlvRecording> query = em.createQuery(hql, FlvRecording.class);
 			query.setParameter("deleted", true);
@@ -317,7 +300,7 @@ public class FlvRecordingDao {
 			flvRecording.setFileSize(fileSize);
 			flvRecording.setInserted(new Date());
 			flvRecording.setInsertedBy(user_id);
-			flvRecording.setIsFolder(true);
+			flvRecording.setFolder(true);
 			flvRecording.setIsImage(false);
 			flvRecording.setIsPresentation(false);
 			flvRecording.setIsRecording(true);
@@ -353,7 +336,7 @@ public class FlvRecordingDao {
 			flvRecording.setFileSize(fileSize);
 			flvRecording.setInserted(new Date());
 			flvRecording.setInsertedBy(user_id);
-			flvRecording.setIsFolder(false);
+			flvRecording.setFolder(false);
 			flvRecording.setIsImage(false);
 			flvRecording.setIsPresentation(false);
 			flvRecording.setIsRecording(true);
@@ -511,7 +494,7 @@ public class FlvRecordingDao {
 		}
 	}
 
-	public void updateFlvRecording(FlvRecording fId) {
+	public void update(FlvRecording fId) {
 		try {
 
 			if (fId.getFlvRecordingId() == 0) {

Modified: openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/dto/file/RecordingObject.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/dto/file/RecordingObject.java?rev=1569088&r1=1569087&r2=1569088&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/dto/file/RecordingObject.java (original)
+++ openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/dto/file/RecordingObject.java Mon Feb 17 19:09:19 2014
@@ -80,7 +80,7 @@ public class RecordingObject {
 		this.ownerId = customObject.getOwnerId();//OwnerID => only set if its directly root in Owner Directory, other Folders and Files
 		//maybe are also in a Home directory but just because their parent is
 		
-		this.isFolder = customObject.getIsFolder();
+		this.isFolder = customObject.isFolder();
 		this.isImage = customObject.getIsImage();
 		this.isPresentation = customObject.getIsPresentation();
 		this.isRecording = customObject.getIsRecording();

Modified: openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/entity/record/FlvRecording.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/entity/record/FlvRecording.java?rev=1569088&r1=1569087&r2=1569088&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/entity/record/FlvRecording.java (original)
+++ openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/entity/record/FlvRecording.java Mon Feb 17 19:09:19 2014
@@ -65,6 +65,9 @@ import org.simpleframework.xml.Root;
 			+ "FROM FlvRecording c, User u "
 			+ "WHERE c.insertedBy = u.user_id AND u.externalUserId = :externalUserId  AND u.externalUserType = :externalUserType "
 			+ "AND c.deleted = false") 
+	, @NamedQuery(name = "getRecordingsByOrganization", query = "SELECT f FROM FlvRecording f WHERE f.deleted = false AND f.ownerId IS NULL "
+			+ "AND f.organization_id = :organization_id AND (f.parentFileExplorerItemId IS NULL OR f.parentFileExplorerItemId = 0) "
+			+ "ORDER BY f.folder DESC, f.fileName") 
 })
 @Table(name = "flvrecording")
 @Root(name = "flvrecording")
@@ -110,7 +113,7 @@ public class FlvRecording implements Ser
 
 	@Column(name = "is_folder")
 	@Element(data = true, required = false)
-	private Boolean isFolder;
+	private boolean folder;
 
 	@Column(name = "is_image")
 	@Element(data = true, required = false)
@@ -258,12 +261,12 @@ public class FlvRecording implements Ser
 		this.ownerId = ownerId;
 	}
 
-	public Boolean getIsFolder() {
-		return isFolder;
+	public boolean isFolder() {
+		return folder;
 	}
 
-	public void setIsFolder(Boolean isFolder) {
-		this.isFolder = isFolder;
+	public void setFolder(boolean folder) {
+		this.folder = folder;
 	}
 
 	public Boolean getIsImage() {

Modified: openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/converter/FlvInterviewConverter.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/converter/FlvInterviewConverter.java?rev=1569088&r1=1569087&r2=1569088&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/converter/FlvInterviewConverter.java (original)
+++ openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/converter/FlvInterviewConverter.java Mon Feb 17 19:09:19 2014
@@ -279,7 +279,7 @@ public class FlvInterviewConverter exten
 
 			flvRecording.setAlternateDownload(alternateDownloadName);
 
-			recordingDao.updateFlvRecording(flvRecording);
+			recordingDao.update(flvRecording);
 			convertToMp4(flvRecording, returnLog);
 
 			logDao.deleteByRecordingId(flvRecording.getFlvRecordingId());

Modified: openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/converter/FlvRecorderConverter.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/converter/FlvRecorderConverter.java?rev=1569088&r1=1569087&r2=1569088&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/converter/FlvRecorderConverter.java (original)
+++ openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/converter/FlvRecorderConverter.java Mon Feb 17 19:09:19 2014
@@ -202,7 +202,7 @@ public class FlvRecorderConverter extend
 
 			flvRecording.setAlternateDownload(alternateDownloadName);
 
-			recordingDao.updateFlvRecording(flvRecording);
+			recordingDao.update(flvRecording);
 			convertToMp4(flvRecording, returnLog);
 
 			for (ConverterProcessResult returnMap : returnLog) {

Modified: openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/remote/FLVRecorderService.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/remote/FLVRecorderService.java?rev=1569088&r1=1569087&r2=1569088&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/remote/FLVRecorderService.java (original)
+++ openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/remote/FLVRecorderService.java Mon Feb 17 19:09:19 2014
@@ -532,7 +532,7 @@ public class FLVRecorderService implemen
 
 				flvRecording.setProgressPostProcessing(0);
 
-				flvRecordingDaoImpl.updateFlvRecording(flvRecording);
+				flvRecordingDaoImpl.update(flvRecording);
 
 				if (flvRecording.getIsInterview() == null || !flvRecording.getIsInterview()) {
 					flvRecorderConverterTask.startConversionThread(flvRecordingId);

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=1569088&r1=1569087&r2=1569088&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 Mon Feb 17 19:09:19 2014
@@ -352,6 +352,7 @@ div.tableWrapperSmall {
 }
 .recording {
 	width: 100%;
+	display: inline-block;
 }
 .recording .files {
 	width: 250px;
@@ -446,6 +447,9 @@ div.tableWrapperSmall {
 	background-image: url(images/world_link.png);
 	background-repeat: no-repeat;
 }
+.selected .recording.item {
+	background-color: #0099FF;
+}
 .recording.item {
 	position: relative;
 }

Added: openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingItemPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingItemPanel.html?rev=1569088&view=auto
==============================================================================
--- openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingItemPanel.html (added)
+++ openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingItemPanel.html Mon Feb 17 19:09:19 2014
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+  
+-->
+<html xmlns:wicket="http://wicket.apache.org">
+<wicket:extend><span wicket:id="errors" class="errors"></span></wicket:extend>
+</html>

Added: 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=1569088&view=auto
==============================================================================
--- openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingItemPanel.java (added)
+++ openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingItemPanel.java Mon Feb 17 19:09:19 2014
@@ -0,0 +1,49 @@
+/*
+ * 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.user.record;
+
+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.record.FlvRecordingLogDao;
+import org.apache.openmeetings.db.entity.record.FlvRecording;
+import org.apache.wicket.ajax.AjaxEventBehavior;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+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);
+		long errorCount = getBean(FlvRecordingLogDao.class).countErrors(model.getObject().getFlvRecordingId());
+		boolean visible = errorCount != 0 || !isRecordingExists(model.getObject().getFileHash() + MP4_EXTENSION);
+		item.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);
+			}
+		}).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=1569088&r1=1569087&r2=1569088&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 Mon Feb 17 19:09:19 2014
@@ -20,6 +20,6 @@
 -->
 <html xmlns:wicket="http://wicket.apache.org">
 <wicket:panel>
-	<div class="recording item"><span wicket:id="name" class="name"></span><span wicket:id="errors" class="errors"></span></div>
+	<div wicket:id="item" class="recording item"><span wicket:id="name" class="name"></span><wicket:child /></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=1569088&r1=1569087&r2=1569088&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 Mon Feb 17 19:09:19 2014
@@ -18,35 +18,49 @@
  */
 package org.apache.openmeetings.web.user.record;
 
-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.record.FlvRecordingLogDao;
+import org.apache.openmeetings.db.dao.record.FlvRecordingDao;
 import org.apache.openmeetings.db.entity.record.FlvRecording;
-import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.extensions.ajax.markup.html.AjaxEditableLabel;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+
+import wicketdnd.theme.WindowsTheme;
 
 public class RecordingPanel extends Panel {
 	private static final long serialVersionUID = 1L;
+	protected final WebMarkupContainer item = new WebMarkupContainer("item");
 
-	public RecordingPanel(String id, final IModel<FlvRecording> model, final RecordingErrorsDialog errorsDialog) {
+	public RecordingPanel(String id, final IModel<FlvRecording> model) {
 		super(id, model);
-		add(new Label("name", model.getObject().getFileName()));
-		long errorCount = getBean(FlvRecordingLogDao.class).countErrors(model.getObject().getFlvRecordingId());
-		boolean visible = errorCount != 0 || !isRecordingExists(model.getObject().getFileHash() + MP4_EXTENSION);
-		add(new WebMarkupContainer("errors").add(new AjaxEventBehavior("click") {
+		FlvRecording r = model.getObject();
+		add(new WindowsTheme());
+		item.add(r.isFolder() ? new AjaxEditableLabel<String>("name", Model.of(model.getObject().getFileName())) {
 			private static final long serialVersionUID = 1L;
-
+			
+			@Override
+			protected String getLabelAjaxEvent() {
+				return "dblClick";
+			}
+			
+			@Override
+			protected void onSubmit(AjaxRequestTarget target) {
+				super.onSubmit(target);
+				FlvRecording r = model.getObject();
+				r.setFileName(getEditor().getModelObject());
+				getBean(FlvRecordingDao.class).update(r);
+			}
+			
 			@Override
-			protected void onEvent(AjaxRequestTarget target) {
-				errorsDialog.setDefaultModel(model);
-				errorsDialog.open(target);
+			public void onEdit(AjaxRequestTarget target) {
+				super.onEdit(target);
 			}
-		}).setVisible(visible));
+		} : new Label("name", r.getFileName()));
+		add(item.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=1569088&r1=1569087&r2=1569088&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 Mon Feb 17 19:09:19 2014
@@ -29,11 +29,10 @@
 					<span wicket:id="trash" class="trash om-icon align-right clickable" wicket:ommessage="title:705"></span>
 					<div class="clear"></div>
 				</div>
-				<div wicket:id="trees" class="trees">
-					<div wicket:id="myrecordings"></div>
-					<div wicket:id="publicrecordings"></div>
+				<div wicket:id="tree-container" class="trees">
+					<div wicket:id="tree"></div>
 				</div>
-				<div class="sizes">
+				<div class="sizes" wicket:id="sizes">
 					<table>
 						<tr>
 							<td><wicket:ommessage key="923"/></td>

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=1569088&r1=1569087&r2=1569088&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 Mon Feb 17 19:09:19 2014
@@ -24,16 +24,15 @@ import static org.apache.openmeetings.ut
 import static org.apache.openmeetings.web.app.Application.getBean;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.Iterator;
-import java.util.List;
 
 import org.apache.openmeetings.db.dao.record.FlvRecordingDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.dto.file.RecordingContainerData;
 import org.apache.openmeetings.db.entity.record.FlvRecording;
+import org.apache.openmeetings.db.entity.user.Organisation;
 import org.apache.openmeetings.db.entity.user.Organisation_Users;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.common.AddFolderDialog;
@@ -43,24 +42,31 @@ import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.AjaxSelfUpdatingTimerBehavior;
-import org.apache.wicket.extensions.ajax.markup.html.AjaxEditableLabel;
 import org.apache.wicket.extensions.markup.html.repeater.tree.DefaultNestedTree;
 import org.apache.wicket.extensions.markup.html.repeater.tree.ITreeProvider;
 import org.apache.wicket.extensions.markup.html.repeater.tree.content.Folder;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.repeater.RepeatingView;
 import org.apache.wicket.markup.repeater.ReuseIfModelsEqualStrategy;
 import org.apache.wicket.model.CompoundPropertyModel;
 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;
+
 public class RecordingsPanel extends UserPanel {
 	private static final long serialVersionUID = 1321258690447136958L;
-	private final WebMarkupContainer trees = new WebMarkupContainer("trees");
+	private 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 RecordingTree myTree;
 	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);
@@ -69,8 +75,7 @@ public class RecordingsPanel extends Use
 	
 	public RecordingsPanel(String id) {
 		super(id);
-		rm.getObject().setFlvRecordingId(-3);
-		rm.getObject().setOwnerId(getUserId());
+		rm.getObject().setFlvRecordingId(Long.MIN_VALUE);
 		final AddFolderDialog addFolder = new AddFolderDialog("addFolder", WebSession.getString(712)) {
 			private static final long serialVersionUID = 1L;
 
@@ -80,15 +85,18 @@ public class RecordingsPanel extends Use
 				f.setFileName(getModelObject());
 				f.setInsertedBy(getUserId());
 				f.setInserted(new Date());
-				f.setIsFolder(true);
+				f.setFolder(true);
 				f.setIsImage(false);
 				f.setIsPresentation(false);
 				f.setIsRecording(true);
 				long parentId = rm.getObject().getFlvRecordingId();
 				f.setParentFileExplorerItemId(parentId > 0 ? parentId : 0);
 				f.setOwnerId(rm.getObject().getOwnerId());
-				getBean(FlvRecordingDao.class).updateFlvRecording(f);
-				target.add(trees);
+				if (parentId < 0) {
+					f.setOrganization_id(-parentId);
+				}
+				getBean(FlvRecordingDao.class).update(f);
+				target.add(trees); //FIXME add correct refresh
 			}
 		};
 		add(addFolder);
@@ -105,14 +113,11 @@ public class RecordingsPanel extends Use
 
 			@Override
 			protected void onEvent(AjaxRequestTarget target) {
-				target.add(trees);
-				for (FlvRecording r : myTree.getModelObject()) {
-					myTree.expand(r);
-				}
+				target.add(trees); //FIXME add correct refresh
 			}
 		}));
 		add(new ConfirmableAjaxLink("trash", 713) {
-			private static final long serialVersionUID = 4145757350556878550L;
+			private static final long serialVersionUID = 1L;
 
 			@Override
 			public void onClick(AjaxRequestTarget target) {
@@ -120,24 +125,23 @@ public class RecordingsPanel extends Use
 				if (id > 0) {
 					getBean(FlvRecordingDao.class).deleteFlvRecording(id);
 				}
-				target.add(trees);
+				target.add(trees); //FIXME add correct refresh
 			}
 		});
-		add(trees
-			.add(myTree = new RecordingTree("myrecordings", new MyRecordingTreeProvider()))
-			.add(new RecordingTree("publicrecordings", new PublicRecordingTreeProvider()))
-			.setOutputMarkupId(true)
-			);
+		RepeatingView treesView = new RepeatingView("tree");
+		treesView.add(selected = new RecordingTree(treesView.newChildId(), new MyRecordingTreeProvider()));
+		for (Organisation_Users ou : getBean(UserDao.class).get(getUserId()).getOrganisation_users()) {
+			Organisation o = ou.getOrganisation();
+			treesView.add(new RecordingTree(treesView.newChildId(), new PublicRecordingTreeProvider(o.getOrganisation_id(), o.getName())));
+		}
+		add(trees.add(treesView).setOutputMarkupId(true));
 		updateSizes();
-		final Label homeSizeLbl = new Label("homeSize", homeSize);
-		final Label publicSizeLbl = new Label("publicSize", publicSize);
-		add(homeSizeLbl.setOutputMarkupId(true), publicSizeLbl.setOutputMarkupId(true));
-		add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(30)) {
+		add(sizes.add(new Label("homeSize", homeSize), new Label("publicSize", publicSize)).setOutputMarkupId(true));
+		sizes.add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(30)) {
 			private static final long serialVersionUID = 1L;
 
 			protected void onPostProcessTarget(AjaxRequestTarget target) {
 				updateSizes();
-				target.add(homeSizeLbl, publicSizeLbl);
 			}
 		});
 		add(video, info, errorsDialog);
@@ -150,6 +154,7 @@ public class RecordingsPanel extends Use
 			publicSize.setObject(getHumanSize(sizeData.getPublicFileSize()));
 		}
 	}
+	
 	//FIXME need to be generalized to use as Room files explorer
 	class RecordingTree extends DefaultNestedTree<FlvRecording> {
 		private static final long serialVersionUID = 2527395034256868022L;
@@ -167,32 +172,46 @@ public class RecordingsPanel extends Use
 				@Override
 				protected Component newLabelComponent(String id, final IModel<FlvRecording> lm) {
 					FlvRecording r = lm.getObject();
-					if (r.getIsFolder() != null && r.getIsFolder()) {
-						return new AjaxEditableLabel<String>(id, newLabelModel(lm)) {
-							private static final long serialVersionUID = -6631089550858911148L;
+					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
-							protected void onSubmit(AjaxRequestTarget target) {
-								super.onSubmit(target);
-								FlvRecording r = getModelObject();
-								r.setFileName(getEditor().getModelObject());
-								getBean(FlvRecordingDao.class).updateFlvRecording(r);
+							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 onEdit(AjaxRequestTarget target) {
-								if (isSelected()) {
-									super.onEdit(target);
+							public void onDrop(AjaxRequestTarget target, Transfer transfer, Location location) throws Reject {
+								FlvRecording p = lm.getObject();
+								long pid = p.getFlvRecordingId();
+								FlvRecording r = transfer.getData();
+								if (pid == 0) {
+									r.setParentFileExplorerItemId(null);
+								} else if (pid < 0) {
+									r.setOrganization_id(-pid);
+									r.setParentFileExplorerItemId(null);
+								} else {
+									r.setParentFileExplorerItemId(pid);
 								}
+								r.setOwnerId(p.getOwnerId());
+								getBean(FlvRecordingDao.class).update(r);
+								target.add(trees); //FIXME add correct refresh
 							}
-						};
-					} else {
-						if (r.getFlvRecordingId() > 0) {
-							return new RecordingPanel(id, lm, errorsDialog);
-						} else {
-							return super.newLabelComponent(id, lm);
-						}
+						}.dropCenter("div"));
 					}
+					return result;
 				}
 				
 				@Override
@@ -209,15 +228,16 @@ public class RecordingsPanel extends Use
 				protected void onClick(AjaxRequestTarget target) {
 					FlvRecording r = getModelObject();
 					FlvRecording _prev = rm.getObject();
-					if (r.getFlvRecordingId() > 0) {
-						rm.setObject(r);
-					}
-					if (selected != null && _prev != null) {
-						selected.updateBranch(_prev, target);
-						selected.updateNode(_prev, target);
+					rm.setObject(r);
+					if (_prev != null) {
+						if (_prev.isFolder()) {
+							selected.updateBranch(_prev, target);
+						} else {
+							selected.updateNode(_prev, target);
+						}
 					}
  					selected = RecordingTree.this;
-					if (r.getIsFolder() == null || r.getIsFolder()) {
+					if (r.isFolder()) {
 						if (getState(r) == State.COLLAPSED) {
 							super.onClick(target);
 						}
@@ -232,12 +252,12 @@ public class RecordingsPanel extends Use
 				@Override
 				protected String getOtherStyleClass(FlvRecording t) {
 					String style;
-					if (t.getFlvRecordingId() == -2) {
+					if (t.getFlvRecordingId() == 0) {
 						style = "my-recordings om-icon";
-					} else if (t.getFlvRecordingId() == -1) {
+					} else if (t.getFlvRecordingId() < 0) {
 						style = "public-recordings om-icon";
 					} else {
-						style = t.getIsFolder() ? super.getOtherStyleClass(t)
+						style = t.isFolder() ? super.getOtherStyleClass(t)
 								: (isRecordingExists(t.getFileHash() + MP4_EXTENSION) ? "recording om-icon" : "broken-recording om-icon");
 					}
 					if (isSelected()) {
@@ -250,9 +270,9 @@ public class RecordingsPanel extends Use
 				protected String getOpenStyleClass() {
 					String style;
 					FlvRecording r = getModelObject();
-					if (r.getFlvRecordingId() == -2) {
+					if (r.getFlvRecordingId() == 0) {
 						style = "my-recordings om-icon";
-					} else if (r.getFlvRecordingId() == -1) {
+					} else if (r.getFlvRecordingId() < 0) {
 						style = "public-recordings om-icon";
 					} else {
 						style = super.getOpenStyleClass();
@@ -264,9 +284,9 @@ public class RecordingsPanel extends Use
 				protected String getClosedStyleClass() {
 					String style;
 					FlvRecording r = getModelObject();
-					if (r.getFlvRecordingId() == -2) {
+					if (r.getFlvRecordingId() == 0) {
 						style = "my-recordings om-icon";
-					} else if (r.getFlvRecordingId() == -1) {
+					} else if (r.getFlvRecordingId() < 0) {
 						style = "public-recordings om-icon";
 					} else {
 						style = super.getClosedStyleClass();
@@ -287,14 +307,14 @@ public class RecordingsPanel extends Use
 
 		public Iterator<? extends FlvRecording> getRoots() {
 			FlvRecording r = new FlvRecording();
-			r.setFlvRecordingId(-2);
+			r.setFlvRecordingId(0);
 			r.setFileName(WebSession.getString(860));
 			r.setOwnerId(getUserId());
 			return Arrays.asList(r).iterator();
 		}
 		
 		public Iterator<? extends FlvRecording> getChildren(FlvRecording node) {
-			if (node.getFlvRecordingId() < 0) {
+			if (node.getFlvRecordingId() == 0) {
 				return getBean(FlvRecordingDao.class).getFlvRecordingRootByOwner(getUserId()).iterator();
 			} else {
 				return super.getChildren(node);
@@ -304,21 +324,24 @@ public class RecordingsPanel extends Use
 	
 	class PublicRecordingTreeProvider extends RecordingTreeProvider {
 		private static final long serialVersionUID = 5502610991599632079L;
+		private final long orgId;
+		private final String name;
 
+		public PublicRecordingTreeProvider(long orgId, String name) {
+			this.orgId = orgId;
+			this.name = name;
+		}
+		
 		public Iterator<? extends FlvRecording> getRoots() {
 			FlvRecording r = new FlvRecording();
-			r.setFlvRecordingId(-1);
-			r.setFileName(WebSession.getString(861));
+			r.setFlvRecordingId(-orgId);
+			r.setFileName(String.format("%s (%s)", WebSession.getString(861), name));
 			return Arrays.asList(r).iterator();
 		}
 		
 		public Iterator<? extends FlvRecording> getChildren(FlvRecording node) {
 			if (node.getFlvRecordingId() < 0) {
-				List<FlvRecording> roots = new ArrayList<FlvRecording>();
-				for (Organisation_Users ou : getBean(UserDao.class).get(getUserId()).getOrganisation_users()) {
-					roots.addAll(getBean(FlvRecordingDao.class).getFlvRecordingRootByPublic(ou.getOrganisation().getOrganisation_id()));
-				}
-				return roots.iterator();
+				return getBean(FlvRecordingDao.class).getFlvRecordingRootByPublic(orgId).iterator();
 			} else {
 				return super.getChildren(node);
 			}
@@ -333,7 +356,7 @@ public class RecordingsPanel extends Use
 		}
 
 		public boolean hasChildren(FlvRecording node) {
-			return node.getFlvRecordingId() < 0 || node.getIsFolder();
+			return node.getFlvRecordingId() <= 0 || node.isFolder();
 		}
 
 		public Iterator<? extends FlvRecording> getChildren(FlvRecording node) {

Modified: openmeetings/trunk/singlewebapp/ivy.xml
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/ivy.xml?rev=1569088&r1=1569087&r2=1569088&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/ivy.xml (original)
+++ openmeetings/trunk/singlewebapp/ivy.xml Mon Feb 17 19:09:19 2014
@@ -276,11 +276,9 @@
 		<dependency org="com.google.code.gson" name="gson" rev="2.2.4" conf="openmeetings->*" transitive="false">
 			<include type="jar" />
 		</dependency>
-		<!-- TODO need to be uncommented to implement file drad-n-drop to whiteboard
 		<dependency org="com.github.svenmeier.wicket-dnd" name="wicket-dnd" rev="0.6.0" conf="openmeetings->*" transitive="false">
 			<include type="jar" />
 		</dependency>
-		-->
 		<dependency org="org.wicketstuff" name="wicketstuff-urlfragment" rev="6.13.0" conf="openmeetings->*" transitive="false">
 			<include type="jar" />
 		</dependency>

Modified: openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingDao.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingDao.java?rev=1569088&r1=1569087&r2=1569088&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingDao.java (original)
+++ openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingDao.java Mon Feb 17 19:09:19 2014
@@ -187,7 +187,7 @@ public class FlvRecordingDao {
 			String hql = "SELECT c FROM FlvRecording c " + "WHERE c.deleted = false "
 					+ "AND (c.ownerId IS NULL OR c.ownerId = 0)  "
 					+ "AND (c.parentFileExplorerItemId IS NULL OR c.parentFileExplorerItemId = 0) "
-					+ "ORDER BY c.isFolder DESC, c.fileName ";
+					+ "ORDER BY c.folder DESC, c.fileName ";
 
 			TypedQuery<FlvRecording> query = em.createQuery(hql, FlvRecording.class);
 
@@ -200,24 +200,7 @@ public class FlvRecordingDao {
 	}
 
 	public List<FlvRecording> getFlvRecordingRootByPublic(Long organization_id) {
-		try {
-
-			String hql = "SELECT c FROM FlvRecording c " + "WHERE c.deleted <> :deleted " + "AND c.ownerId IS NULL "
-					+ "AND c.organization_id = :organization_id "
-					+ "AND (c.parentFileExplorerItemId IS NULL OR c.parentFileExplorerItemId = 0) "
-					+ "ORDER BY c.isFolder DESC, c.fileName ";
-
-			TypedQuery<FlvRecording> query = em.createQuery(hql, FlvRecording.class);
-			query.setParameter("organization_id", organization_id);
-			query.setParameter("deleted", true);
-
-			List<FlvRecording> flvRecordingList = query.getResultList();
-
-			return flvRecordingList;
-		} catch (Exception ex2) {
-			log.error("[getFlvRecordingRootByPublic]: ", ex2);
-		}
-		return null;
+		return em.createNamedQuery("getRecordingsByOrganization", FlvRecording.class).setParameter("organization_id", organization_id).getResultList();
 	}
 
 	public List<FlvRecording> getFlvRecordingRootByOwner(Long ownerId) {
@@ -225,7 +208,7 @@ public class FlvRecordingDao {
 
 			String hql = "SELECT c FROM FlvRecording c " + "WHERE c.deleted <> :deleted " + "AND c.ownerId = :ownerId "
 					+ "AND (c.parentFileExplorerItemId IS NULL OR c.parentFileExplorerItemId = 0) "
-					+ "ORDER BY c.isFolder DESC, c.fileName ";
+					+ "ORDER BY c.folder DESC, c.fileName ";
 
 			TypedQuery<FlvRecording> query = em.createQuery(hql, FlvRecording.class);
 			query.setParameter("deleted", true);
@@ -247,7 +230,7 @@ public class FlvRecordingDao {
 					+ "WHERE c.deleted <> :deleted "
 					+ "AND c.ownerId = :ownerId "
 					+ "AND (c.parentFileExplorerItemId IS NULL OR c.parentFileExplorerItemId = :parentFileExplorerItemId)"
-					+ "ORDER BY c.isFolder DESC, c.fileName ";
+					+ "ORDER BY c.folder DESC, c.fileName ";
 
 			TypedQuery<FlvRecording> query = em.createQuery(hql, FlvRecording.class);
 			query.setParameter("deleted", true);
@@ -267,7 +250,7 @@ public class FlvRecordingDao {
 		try {
 
 			String hql = "SELECT c FROM FlvRecording c " + "WHERE c.deleted <> :deleted " + "AND c.room_id = :room_id "
-					+ "ORDER BY c.isFolder DESC, c.fileName ";
+					+ "ORDER BY c.folder DESC, c.fileName ";
 
 			TypedQuery<FlvRecording> query = em.createQuery(hql, FlvRecording.class);
 			query.setParameter("deleted", true);
@@ -287,7 +270,7 @@ public class FlvRecordingDao {
 
 			String hql = "SELECT c FROM FlvRecording c " + "WHERE c.deleted <> :deleted "
 					+ "AND c.parentFileExplorerItemId = :parentFileExplorerItemId "
-					+ "ORDER BY c.isFolder DESC, c.fileName ";
+					+ "ORDER BY c.folder DESC, c.fileName ";
 
 			TypedQuery<FlvRecording> query = em.createQuery(hql, FlvRecording.class);
 			query.setParameter("deleted", true);
@@ -317,7 +300,7 @@ public class FlvRecordingDao {
 			flvRecording.setFileSize(fileSize);
 			flvRecording.setInserted(new Date());
 			flvRecording.setInsertedBy(user_id);
-			flvRecording.setIsFolder(true);
+			flvRecording.setFolder(true);
 			flvRecording.setIsImage(false);
 			flvRecording.setIsPresentation(false);
 			flvRecording.setIsRecording(true);
@@ -353,7 +336,7 @@ public class FlvRecordingDao {
 			flvRecording.setFileSize(fileSize);
 			flvRecording.setInserted(new Date());
 			flvRecording.setInsertedBy(user_id);
-			flvRecording.setIsFolder(false);
+			flvRecording.setFolder(false);
 			flvRecording.setIsImage(false);
 			flvRecording.setIsPresentation(false);
 			flvRecording.setIsRecording(true);
@@ -511,7 +494,7 @@ public class FlvRecordingDao {
 		}
 	}
 
-	public void updateFlvRecording(FlvRecording fId) {
+	public void update(FlvRecording fId) {
 		try {
 
 			if (fId.getFlvRecordingId() == 0) {

Modified: openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/dto/file/RecordingObject.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/dto/file/RecordingObject.java?rev=1569088&r1=1569087&r2=1569088&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/dto/file/RecordingObject.java (original)
+++ openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/dto/file/RecordingObject.java Mon Feb 17 19:09:19 2014
@@ -80,7 +80,7 @@ public class RecordingObject {
 		this.ownerId = customObject.getOwnerId();//OwnerID => only set if its directly root in Owner Directory, other Folders and Files
 		//maybe are also in a Home directory but just because their parent is
 		
-		this.isFolder = customObject.getIsFolder();
+		this.isFolder = customObject.isFolder();
 		this.isImage = customObject.getIsImage();
 		this.isPresentation = customObject.getIsPresentation();
 		this.isRecording = customObject.getIsRecording();

Modified: openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/entity/record/FlvRecording.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/entity/record/FlvRecording.java?rev=1569088&r1=1569087&r2=1569088&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/entity/record/FlvRecording.java (original)
+++ openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/entity/record/FlvRecording.java Mon Feb 17 19:09:19 2014
@@ -65,6 +65,9 @@ import org.simpleframework.xml.Root;
 			+ "FROM FlvRecording c, User u "
 			+ "WHERE c.insertedBy = u.user_id AND u.externalUserId = :externalUserId  AND u.externalUserType = :externalUserType "
 			+ "AND c.deleted = false") 
+	, @NamedQuery(name = "getRecordingsByOrganization", query = "SELECT f FROM FlvRecording f WHERE f.deleted = false AND f.ownerId IS NULL "
+			+ "AND f.organization_id = :organization_id AND (f.parentFileExplorerItemId IS NULL OR f.parentFileExplorerItemId = 0) "
+			+ "ORDER BY f.folder DESC, f.fileName") 
 })
 @Table(name = "flvrecording")
 @Root(name = "flvrecording")
@@ -110,7 +113,7 @@ public class FlvRecording implements Ser
 
 	@Column(name = "is_folder")
 	@Element(data = true, required = false)
-	private Boolean isFolder;
+	private boolean folder;
 
 	@Column(name = "is_image")
 	@Element(data = true, required = false)
@@ -258,12 +261,12 @@ public class FlvRecording implements Ser
 		this.ownerId = ownerId;
 	}
 
-	public Boolean getIsFolder() {
-		return isFolder;
+	public boolean isFolder() {
+		return folder;
 	}
 
-	public void setIsFolder(Boolean isFolder) {
-		this.isFolder = isFolder;
+	public void setFolder(boolean folder) {
+		this.folder = folder;
 	}
 
 	public Boolean getIsImage() {

Modified: openmeetings/trunk/singlewebapp/src/main/java/org/apache/openmeetings/converter/FlvInterviewConverter.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/main/java/org/apache/openmeetings/converter/FlvInterviewConverter.java?rev=1569088&r1=1569087&r2=1569088&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/main/java/org/apache/openmeetings/converter/FlvInterviewConverter.java (original)
+++ openmeetings/trunk/singlewebapp/src/main/java/org/apache/openmeetings/converter/FlvInterviewConverter.java Mon Feb 17 19:09:19 2014
@@ -279,7 +279,7 @@ public class FlvInterviewConverter exten
 
 			flvRecording.setAlternateDownload(alternateDownloadName);
 
-			recordingDao.updateFlvRecording(flvRecording);
+			recordingDao.update(flvRecording);
 			convertToMp4(flvRecording, returnLog);
 
 			logDao.deleteByRecordingId(flvRecording.getFlvRecordingId());

Modified: openmeetings/trunk/singlewebapp/src/main/java/org/apache/openmeetings/converter/FlvRecorderConverter.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/main/java/org/apache/openmeetings/converter/FlvRecorderConverter.java?rev=1569088&r1=1569087&r2=1569088&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/main/java/org/apache/openmeetings/converter/FlvRecorderConverter.java (original)
+++ openmeetings/trunk/singlewebapp/src/main/java/org/apache/openmeetings/converter/FlvRecorderConverter.java Mon Feb 17 19:09:19 2014
@@ -202,7 +202,7 @@ public class FlvRecorderConverter extend
 
 			flvRecording.setAlternateDownload(alternateDownloadName);
 
-			recordingDao.updateFlvRecording(flvRecording);
+			recordingDao.update(flvRecording);
 			convertToMp4(flvRecording, returnLog);
 
 			for (ConverterProcessResult returnMap : returnLog) {

Modified: openmeetings/trunk/singlewebapp/src/main/java/org/apache/openmeetings/remote/FLVRecorderService.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/main/java/org/apache/openmeetings/remote/FLVRecorderService.java?rev=1569088&r1=1569087&r2=1569088&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/main/java/org/apache/openmeetings/remote/FLVRecorderService.java (original)
+++ openmeetings/trunk/singlewebapp/src/main/java/org/apache/openmeetings/remote/FLVRecorderService.java Mon Feb 17 19:09:19 2014
@@ -532,7 +532,7 @@ public class FLVRecorderService implemen
 
 				flvRecording.setProgressPostProcessing(0);
 
-				flvRecordingDaoImpl.updateFlvRecording(flvRecording);
+				flvRecordingDaoImpl.update(flvRecording);
 
 				if (flvRecording.getIsInterview() == null || !flvRecording.getIsInterview()) {
 					flvRecorderConverterTask.startConversionThread(flvRecordingId);

Modified: openmeetings/trunk/singlewebapp/src/main/webapp/css/theme.css
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/main/webapp/css/theme.css?rev=1569088&r1=1569087&r2=1569088&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/main/webapp/css/theme.css (original)
+++ openmeetings/trunk/singlewebapp/src/main/webapp/css/theme.css Mon Feb 17 19:09:19 2014
@@ -352,6 +352,7 @@ div.tableWrapperSmall {
 }
 .recording {
 	width: 100%;
+	display: inline-block;
 }
 .recording .files {
 	width: 250px;
@@ -446,6 +447,9 @@ div.tableWrapperSmall {
 	background-image: url(images/world_link.png);
 	background-repeat: no-repeat;
 }
+.selected .recording.item {
+	background-color: #0099FF;
+}
 .recording.item {
 	position: relative;
 }

Added: openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingItemPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingItemPanel.html?rev=1569088&view=auto
==============================================================================
--- openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingItemPanel.html (added)
+++ openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingItemPanel.html Mon Feb 17 19:09:19 2014
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+  
+-->
+<html xmlns:wicket="http://wicket.apache.org">
+<wicket:extend><span wicket:id="errors" class="errors"></span></wicket:extend>
+</html>

Added: openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingItemPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingItemPanel.java?rev=1569088&view=auto
==============================================================================
--- openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingItemPanel.java (added)
+++ openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingItemPanel.java Mon Feb 17 19:09:19 2014
@@ -0,0 +1,49 @@
+/*
+ * 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.user.record;
+
+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.record.FlvRecordingLogDao;
+import org.apache.openmeetings.db.entity.record.FlvRecording;
+import org.apache.wicket.ajax.AjaxEventBehavior;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+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);
+		long errorCount = getBean(FlvRecordingLogDao.class).countErrors(model.getObject().getFlvRecordingId());
+		boolean visible = errorCount != 0 || !isRecordingExists(model.getObject().getFileHash() + MP4_EXTENSION);
+		item.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);
+			}
+		}).setVisible(visible));
+	}
+}

Modified: openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.html?rev=1569088&r1=1569087&r2=1569088&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.html (original)
+++ openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.html Mon Feb 17 19:09:19 2014
@@ -20,6 +20,6 @@
 -->
 <html xmlns:wicket="http://wicket.apache.org">
 <wicket:panel>
-	<div class="recording item"><span wicket:id="name" class="name"></span><span wicket:id="errors" class="errors"></span></div>
+	<div wicket:id="item" class="recording item"><span wicket:id="name" class="name"></span><wicket:child /></div>
 </wicket:panel>
 </html>

Modified: openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.java?rev=1569088&r1=1569087&r2=1569088&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.java (original)
+++ openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.java Mon Feb 17 19:09:19 2014
@@ -18,35 +18,49 @@
  */
 package org.apache.openmeetings.web.user.record;
 
-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.record.FlvRecordingLogDao;
+import org.apache.openmeetings.db.dao.record.FlvRecordingDao;
 import org.apache.openmeetings.db.entity.record.FlvRecording;
-import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.extensions.ajax.markup.html.AjaxEditableLabel;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+
+import wicketdnd.theme.WindowsTheme;
 
 public class RecordingPanel extends Panel {
 	private static final long serialVersionUID = 1L;
+	protected final WebMarkupContainer item = new WebMarkupContainer("item");
 
-	public RecordingPanel(String id, final IModel<FlvRecording> model, final RecordingErrorsDialog errorsDialog) {
+	public RecordingPanel(String id, final IModel<FlvRecording> model) {
 		super(id, model);
-		add(new Label("name", model.getObject().getFileName()));
-		long errorCount = getBean(FlvRecordingLogDao.class).countErrors(model.getObject().getFlvRecordingId());
-		boolean visible = errorCount != 0 || !isRecordingExists(model.getObject().getFileHash() + MP4_EXTENSION);
-		add(new WebMarkupContainer("errors").add(new AjaxEventBehavior("click") {
+		FlvRecording r = model.getObject();
+		add(new WindowsTheme());
+		item.add(r.isFolder() ? new AjaxEditableLabel<String>("name", Model.of(model.getObject().getFileName())) {
 			private static final long serialVersionUID = 1L;
-
+			
+			@Override
+			protected String getLabelAjaxEvent() {
+				return "dblClick";
+			}
+			
+			@Override
+			protected void onSubmit(AjaxRequestTarget target) {
+				super.onSubmit(target);
+				FlvRecording r = model.getObject();
+				r.setFileName(getEditor().getModelObject());
+				getBean(FlvRecordingDao.class).update(r);
+			}
+			
 			@Override
-			protected void onEvent(AjaxRequestTarget target) {
-				errorsDialog.setDefaultModel(model);
-				errorsDialog.open(target);
+			public void onEdit(AjaxRequestTarget target) {
+				super.onEdit(target);
 			}
-		}).setVisible(visible));
+		} : new Label("name", r.getFileName()));
+		add(item.setOutputMarkupId(true));
 	}
 }

Modified: openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.html?rev=1569088&r1=1569087&r2=1569088&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.html (original)
+++ openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.html Mon Feb 17 19:09:19 2014
@@ -29,11 +29,10 @@
 					<span wicket:id="trash" class="trash om-icon align-right clickable" wicket:ommessage="title:705"></span>
 					<div class="clear"></div>
 				</div>
-				<div wicket:id="trees" class="trees">
-					<div wicket:id="myrecordings"></div>
-					<div wicket:id="publicrecordings"></div>
+				<div wicket:id="tree-container" class="trees">
+					<div wicket:id="tree"></div>
 				</div>
-				<div class="sizes">
+				<div class="sizes" wicket:id="sizes">
 					<table>
 						<tr>
 							<td><wicket:ommessage key="923"/></td>

Modified: openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java?rev=1569088&r1=1569087&r2=1569088&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java (original)
+++ openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java Mon Feb 17 19:09:19 2014
@@ -24,16 +24,15 @@ import static org.apache.openmeetings.ut
 import static org.apache.openmeetings.web.app.Application.getBean;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.Iterator;
-import java.util.List;
 
 import org.apache.openmeetings.db.dao.record.FlvRecordingDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.dto.file.RecordingContainerData;
 import org.apache.openmeetings.db.entity.record.FlvRecording;
+import org.apache.openmeetings.db.entity.user.Organisation;
 import org.apache.openmeetings.db.entity.user.Organisation_Users;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.common.AddFolderDialog;
@@ -43,24 +42,31 @@ import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.AjaxSelfUpdatingTimerBehavior;
-import org.apache.wicket.extensions.ajax.markup.html.AjaxEditableLabel;
 import org.apache.wicket.extensions.markup.html.repeater.tree.DefaultNestedTree;
 import org.apache.wicket.extensions.markup.html.repeater.tree.ITreeProvider;
 import org.apache.wicket.extensions.markup.html.repeater.tree.content.Folder;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.repeater.RepeatingView;
 import org.apache.wicket.markup.repeater.ReuseIfModelsEqualStrategy;
 import org.apache.wicket.model.CompoundPropertyModel;
 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;
+
 public class RecordingsPanel extends UserPanel {
 	private static final long serialVersionUID = 1321258690447136958L;
-	private final WebMarkupContainer trees = new WebMarkupContainer("trees");
+	private 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 RecordingTree myTree;
 	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);
@@ -69,8 +75,7 @@ public class RecordingsPanel extends Use
 	
 	public RecordingsPanel(String id) {
 		super(id);
-		rm.getObject().setFlvRecordingId(-3);
-		rm.getObject().setOwnerId(getUserId());
+		rm.getObject().setFlvRecordingId(Long.MIN_VALUE);
 		final AddFolderDialog addFolder = new AddFolderDialog("addFolder", WebSession.getString(712)) {
 			private static final long serialVersionUID = 1L;
 
@@ -80,15 +85,18 @@ public class RecordingsPanel extends Use
 				f.setFileName(getModelObject());
 				f.setInsertedBy(getUserId());
 				f.setInserted(new Date());
-				f.setIsFolder(true);
+				f.setFolder(true);
 				f.setIsImage(false);
 				f.setIsPresentation(false);
 				f.setIsRecording(true);
 				long parentId = rm.getObject().getFlvRecordingId();
 				f.setParentFileExplorerItemId(parentId > 0 ? parentId : 0);
 				f.setOwnerId(rm.getObject().getOwnerId());
-				getBean(FlvRecordingDao.class).updateFlvRecording(f);
-				target.add(trees);
+				if (parentId < 0) {
+					f.setOrganization_id(-parentId);
+				}
+				getBean(FlvRecordingDao.class).update(f);
+				target.add(trees); //FIXME add correct refresh
 			}
 		};
 		add(addFolder);
@@ -105,14 +113,11 @@ public class RecordingsPanel extends Use
 
 			@Override
 			protected void onEvent(AjaxRequestTarget target) {
-				target.add(trees);
-				for (FlvRecording r : myTree.getModelObject()) {
-					myTree.expand(r);
-				}
+				target.add(trees); //FIXME add correct refresh
 			}
 		}));
 		add(new ConfirmableAjaxLink("trash", 713) {
-			private static final long serialVersionUID = 4145757350556878550L;
+			private static final long serialVersionUID = 1L;
 
 			@Override
 			public void onClick(AjaxRequestTarget target) {
@@ -120,24 +125,23 @@ public class RecordingsPanel extends Use
 				if (id > 0) {
 					getBean(FlvRecordingDao.class).deleteFlvRecording(id);
 				}
-				target.add(trees);
+				target.add(trees); //FIXME add correct refresh
 			}
 		});
-		add(trees
-			.add(myTree = new RecordingTree("myrecordings", new MyRecordingTreeProvider()))
-			.add(new RecordingTree("publicrecordings", new PublicRecordingTreeProvider()))
-			.setOutputMarkupId(true)
-			);
+		RepeatingView treesView = new RepeatingView("tree");
+		treesView.add(selected = new RecordingTree(treesView.newChildId(), new MyRecordingTreeProvider()));
+		for (Organisation_Users ou : getBean(UserDao.class).get(getUserId()).getOrganisation_users()) {
+			Organisation o = ou.getOrganisation();
+			treesView.add(new RecordingTree(treesView.newChildId(), new PublicRecordingTreeProvider(o.getOrganisation_id(), o.getName())));
+		}
+		add(trees.add(treesView).setOutputMarkupId(true));
 		updateSizes();
-		final Label homeSizeLbl = new Label("homeSize", homeSize);
-		final Label publicSizeLbl = new Label("publicSize", publicSize);
-		add(homeSizeLbl.setOutputMarkupId(true), publicSizeLbl.setOutputMarkupId(true));
-		add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(30)) {
+		add(sizes.add(new Label("homeSize", homeSize), new Label("publicSize", publicSize)).setOutputMarkupId(true));
+		sizes.add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(30)) {
 			private static final long serialVersionUID = 1L;
 
 			protected void onPostProcessTarget(AjaxRequestTarget target) {
 				updateSizes();
-				target.add(homeSizeLbl, publicSizeLbl);
 			}
 		});
 		add(video, info, errorsDialog);
@@ -150,6 +154,7 @@ public class RecordingsPanel extends Use
 			publicSize.setObject(getHumanSize(sizeData.getPublicFileSize()));
 		}
 	}
+	
 	//FIXME need to be generalized to use as Room files explorer
 	class RecordingTree extends DefaultNestedTree<FlvRecording> {
 		private static final long serialVersionUID = 2527395034256868022L;
@@ -167,32 +172,46 @@ public class RecordingsPanel extends Use
 				@Override
 				protected Component newLabelComponent(String id, final IModel<FlvRecording> lm) {
 					FlvRecording r = lm.getObject();
-					if (r.getIsFolder() != null && r.getIsFolder()) {
-						return new AjaxEditableLabel<String>(id, newLabelModel(lm)) {
-							private static final long serialVersionUID = -6631089550858911148L;
+					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
-							protected void onSubmit(AjaxRequestTarget target) {
-								super.onSubmit(target);
-								FlvRecording r = getModelObject();
-								r.setFileName(getEditor().getModelObject());
-								getBean(FlvRecordingDao.class).updateFlvRecording(r);
+							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 onEdit(AjaxRequestTarget target) {
-								if (isSelected()) {
-									super.onEdit(target);
+							public void onDrop(AjaxRequestTarget target, Transfer transfer, Location location) throws Reject {
+								FlvRecording p = lm.getObject();
+								long pid = p.getFlvRecordingId();
+								FlvRecording r = transfer.getData();
+								if (pid == 0) {
+									r.setParentFileExplorerItemId(null);
+								} else if (pid < 0) {
+									r.setOrganization_id(-pid);
+									r.setParentFileExplorerItemId(null);
+								} else {
+									r.setParentFileExplorerItemId(pid);
 								}
+								r.setOwnerId(p.getOwnerId());
+								getBean(FlvRecordingDao.class).update(r);
+								target.add(trees); //FIXME add correct refresh
 							}
-						};
-					} else {
-						if (r.getFlvRecordingId() > 0) {
-							return new RecordingPanel(id, lm, errorsDialog);
-						} else {
-							return super.newLabelComponent(id, lm);
-						}
+						}.dropCenter("div"));
 					}
+					return result;
 				}
 				
 				@Override
@@ -209,15 +228,16 @@ public class RecordingsPanel extends Use
 				protected void onClick(AjaxRequestTarget target) {
 					FlvRecording r = getModelObject();
 					FlvRecording _prev = rm.getObject();
-					if (r.getFlvRecordingId() > 0) {
-						rm.setObject(r);
-					}
-					if (selected != null && _prev != null) {
-						selected.updateBranch(_prev, target);
-						selected.updateNode(_prev, target);
+					rm.setObject(r);
+					if (_prev != null) {
+						if (_prev.isFolder()) {
+							selected.updateBranch(_prev, target);
+						} else {
+							selected.updateNode(_prev, target);
+						}
 					}
  					selected = RecordingTree.this;
-					if (r.getIsFolder() == null || r.getIsFolder()) {
+					if (r.isFolder()) {
 						if (getState(r) == State.COLLAPSED) {
 							super.onClick(target);
 						}
@@ -232,12 +252,12 @@ public class RecordingsPanel extends Use
 				@Override
 				protected String getOtherStyleClass(FlvRecording t) {
 					String style;
-					if (t.getFlvRecordingId() == -2) {
+					if (t.getFlvRecordingId() == 0) {
 						style = "my-recordings om-icon";
-					} else if (t.getFlvRecordingId() == -1) {
+					} else if (t.getFlvRecordingId() < 0) {
 						style = "public-recordings om-icon";
 					} else {
-						style = t.getIsFolder() ? super.getOtherStyleClass(t)
+						style = t.isFolder() ? super.getOtherStyleClass(t)
 								: (isRecordingExists(t.getFileHash() + MP4_EXTENSION) ? "recording om-icon" : "broken-recording om-icon");
 					}
 					if (isSelected()) {
@@ -250,9 +270,9 @@ public class RecordingsPanel extends Use
 				protected String getOpenStyleClass() {
 					String style;
 					FlvRecording r = getModelObject();
-					if (r.getFlvRecordingId() == -2) {
+					if (r.getFlvRecordingId() == 0) {
 						style = "my-recordings om-icon";
-					} else if (r.getFlvRecordingId() == -1) {
+					} else if (r.getFlvRecordingId() < 0) {
 						style = "public-recordings om-icon";
 					} else {
 						style = super.getOpenStyleClass();
@@ -264,9 +284,9 @@ public class RecordingsPanel extends Use
 				protected String getClosedStyleClass() {
 					String style;
 					FlvRecording r = getModelObject();
-					if (r.getFlvRecordingId() == -2) {
+					if (r.getFlvRecordingId() == 0) {
 						style = "my-recordings om-icon";
-					} else if (r.getFlvRecordingId() == -1) {
+					} else if (r.getFlvRecordingId() < 0) {
 						style = "public-recordings om-icon";
 					} else {
 						style = super.getClosedStyleClass();
@@ -287,14 +307,14 @@ public class RecordingsPanel extends Use
 
 		public Iterator<? extends FlvRecording> getRoots() {
 			FlvRecording r = new FlvRecording();
-			r.setFlvRecordingId(-2);
+			r.setFlvRecordingId(0);
 			r.setFileName(WebSession.getString(860));
 			r.setOwnerId(getUserId());
 			return Arrays.asList(r).iterator();
 		}
 		
 		public Iterator<? extends FlvRecording> getChildren(FlvRecording node) {
-			if (node.getFlvRecordingId() < 0) {
+			if (node.getFlvRecordingId() == 0) {
 				return getBean(FlvRecordingDao.class).getFlvRecordingRootByOwner(getUserId()).iterator();
 			} else {
 				return super.getChildren(node);
@@ -304,21 +324,24 @@ public class RecordingsPanel extends Use
 	
 	class PublicRecordingTreeProvider extends RecordingTreeProvider {
 		private static final long serialVersionUID = 5502610991599632079L;
+		private final long orgId;
+		private final String name;
 
+		public PublicRecordingTreeProvider(long orgId, String name) {
+			this.orgId = orgId;
+			this.name = name;
+		}
+		
 		public Iterator<? extends FlvRecording> getRoots() {
 			FlvRecording r = new FlvRecording();
-			r.setFlvRecordingId(-1);
-			r.setFileName(WebSession.getString(861));
+			r.setFlvRecordingId(-orgId);
+			r.setFileName(String.format("%s (%s)", WebSession.getString(861), name));
 			return Arrays.asList(r).iterator();
 		}
 		
 		public Iterator<? extends FlvRecording> getChildren(FlvRecording node) {
 			if (node.getFlvRecordingId() < 0) {
-				List<FlvRecording> roots = new ArrayList<FlvRecording>();
-				for (Organisation_Users ou : getBean(UserDao.class).get(getUserId()).getOrganisation_users()) {
-					roots.addAll(getBean(FlvRecordingDao.class).getFlvRecordingRootByPublic(ou.getOrganisation().getOrganisation_id()));
-				}
-				return roots.iterator();
+				return getBean(FlvRecordingDao.class).getFlvRecordingRootByPublic(orgId).iterator();
 			} else {
 				return super.getChildren(node);
 			}
@@ -333,7 +356,7 @@ public class RecordingsPanel extends Use
 		}
 
 		public boolean hasChildren(FlvRecording node) {
-			return node.getFlvRecordingId() < 0 || node.getIsFolder();
+			return node.getFlvRecordingId() <= 0 || node.isFolder();
 		}
 
 		public Iterator<? extends FlvRecording> getChildren(FlvRecording node) {