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 2016/08/10 05:34:01 UTC

svn commit: r1755671 - in /openmeetings/application: branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/ branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/ branches/3.2.x/openmeetings-we...

Author: solomax
Date: Wed Aug 10 05:34:01 2016
New Revision: 1755671

URL: http://svn.apache.org/viewvc?rev=1755671&view=rev
Log:
[OPENMEETINGS-1030] file tree now works better (no visual glitches)

Added:
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java
Removed:
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/MyRecordingTreeProvider.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/PublicRecordingTreeProvider.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/RecordingTreeProvider.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/MyRecordingTreeProvider.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/PublicRecordingTreeProvider.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/RecordingTreeProvider.java
Modified:
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemTree.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.html
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemTree.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.html
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.java?rev=1755671&r1=1755670&r2=1755671&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.java Wed Aug 10 05:34:01 2016
@@ -70,13 +70,13 @@ public abstract class AddFolderDialog ex
 				});
 			}
 		};
-		add(form);
+		add(form.setOutputMarkupId(true));
 	}
 
 	@Override
 	protected void onOpen(IPartialPageRequestHandler handler) {
 		super.onOpen(handler);
-		
+		handler.add(form);
 		setModelObject(name);
 		getFeedbackMessages().clear();
 	}

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemTree.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemTree.java?rev=1755671&r1=1755670&r2=1755671&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemTree.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemTree.java Wed Aug 10 05:34:01 2016
@@ -34,31 +34,32 @@ import org.apache.wicket.markup.repeater
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 
-public class FileItemTree<T extends FileItem> extends DefaultNestedTree<T> {
+public class FileItemTree extends DefaultNestedTree<FileItem> {
 	private static final long serialVersionUID = 1L;
 	private final FileTreePanel treePanel;
-	private final IModel<T> selectedItem = Model.of((T)null);
 
-	public FileItemTree(String id, FileTreePanel treePanel, ITreeProvider<T> tp) {
+	public FileItemTree(String id, FileTreePanel treePanel, ITreeProvider<FileItem> tp) {
 		super(id, tp);
 		this.treePanel = treePanel;
 		setItemReuseStrategy(new ReuseIfModelsEqualStrategy());
 	}
 	
 	@Override
-	protected Component newContentComponent(String id, IModel<T> node) {
-		return new Folder<T>(id, this, node) {
+	protected Component newContentComponent(String id, IModel<FileItem> node) {
+		return new Folder<FileItem>(id, this, node) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
-			protected Component newLabelComponent(String id, final IModel<T> lm) {
+			protected Component newLabelComponent(String id, final IModel<FileItem> lm) {
 				FileItem r = lm.getObject();
-				return Type.Folder == r.getType() || r.getId() < 1 ? new FolderPanel(id, lm, treePanel) : new FileItemPanel(id, lm, treePanel);
+				return Type.Folder == r.getType() || r.getId() == null ? new FolderPanel(id, lm, treePanel) : new FileItemPanel(id, lm, treePanel);
 			}
 			
 			@Override
 			protected boolean isSelected() {
-				return getModelObject().getId().equals(treePanel.selectedFile.getObject().getId());
+				FileItem f = getModelObject(), s = treePanel.getSelected();
+				return (s.getId() == null && s.getId() == f.getId() && s.getHash().equals(f.getHash()))
+						|| (s.getId() != null && s.getId().equals(f.getId()));
 			}
 			
 			@Override
@@ -68,28 +69,21 @@ public class FileItemTree<T extends File
 			
 			@Override
 			protected void onClick(AjaxRequestTarget target) {
-				T r = getModelObject();
-				treePanel.selected.resetSelected(target);
-				selectedItem.setObject(r);
-				treePanel.selectedFile.setObject(r);
-				treePanel.selected = FileItemTree.this;
+				FileItem r = getModelObject();
+				treePanel.setSelected(r, target);
 				if (Type.Folder == r.getType()) {
 					if (getState(r) == State.COLLAPSED) {
 						super.onClick(target);
 					}
-					updateBranch(r, target);
 				} else {
 					treePanel.update(target, r);
-					updateNode(r, target);
 				}
 			}
 			
-			private String getItemStyle(T f, String def) {
+			private String getItemStyle(FileItem f, String def) {
 				String style;
-				if (f.getId() == 0) {
-					style = "my file om-icon";
-				} else if (f.getId() < 0) {
-					style = "public file om-icon";
+				if (f.getId() == null) {
+					style = f.getHash().indexOf("my") > -1 ? "my file om-icon" : "public file om-icon";
 				} else {
 					switch(f.getType()) {
 						case Folder:
@@ -129,7 +123,7 @@ public class FileItemTree<T extends File
 			}
 			
 			@Override
-			protected String getOtherStyleClass(T r) {
+			protected String getOtherStyleClass(FileItem r) {
 				return getItemStyle(r, super.getOtherStyleClass(r));
 			}
 			
@@ -149,27 +143,9 @@ public class FileItemTree<T extends File
 			}
 			
 			@Override
-			protected IModel<String> newLabelModel(IModel<T> model) {
+			protected IModel<String> newLabelModel(IModel<FileItem> model) {
 				return Model.of(model.getObject().getName());
 			}
 		};
 	}
-
-	private void resetSelected(AjaxRequestTarget target) {
-		T _prev = selectedItem.getObject();
-		if (_prev != null) {
-			if (Type.Folder == _prev.getType()) {
-				updateBranch(_prev, target);
-			} else {
-				updateNode(_prev, target);
-			}
-			selectedItem.setObject(null);
-		}
-	}
-	
-	@Override
-	protected void onDetach() {
-		selectedItem.detach();
-		super.onDetach();
-	}
 }

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.html
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.html?rev=1755671&r1=1755670&r2=1755671&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.html (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.html Wed Aug 10 05:34:01 2016
@@ -37,9 +37,7 @@
 		</div>
 		<div wicket:id="tree-container" class="trees">
 			<div id="tree-anchor" style="height: 2px; width: 2px;"></div>
-			<div wicket:id="tree">
-				<div wicket:id="item"></div>
-			</div>
+			<div wicket:id="tree"></div>
 		</div>
 		<div class="sizes" wicket:id="sizes">
 			<table>

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java?rev=1755671&r1=1755670&r2=1755671&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java Wed Aug 10 05:34:01 2016
@@ -21,7 +21,6 @@ package org.apache.openmeetings.web.comm
 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.Date;
 import java.util.UUID;
 
@@ -39,12 +38,9 @@ import org.apache.wicket.ajax.AjaxEventB
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.attributes.CallbackParameter;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
-import org.apache.wicket.extensions.markup.html.repeater.tree.ITreeProvider;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.list.ListItem;
-import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
@@ -61,41 +57,28 @@ public abstract class FileTreePanel exte
 	private static final long serialVersionUID = 1L;
 	final WebMarkupContainer trees = new WebMarkupContainer("tree-container");
 	private final WebMarkupContainer sizes = new WebMarkupContainer("sizes");
-	protected final IModel<FileItem> selectedFile = new CompoundPropertyModel<FileItem>((FileItem)null);
+	private final IModel<FileItem> selected = new CompoundPropertyModel<FileItem>((FileItem)null);
 	protected final IModel<String> homeSize = Model.of((String)null);
 	protected final IModel<String> publicSize = Model.of((String)null);
 	final ConvertingErrorsDialog errorsDialog = new ConvertingErrorsDialog("errors", Model.of((Recording)null));
-	protected FileItemTree<? extends FileItem> selected;
-	protected ListView<ITreeProvider<? extends FileItem>> treesView = new ListView<ITreeProvider<? extends FileItem>>("tree", new ArrayList<ITreeProvider<? extends FileItem>>()) {
-		private static final long serialVersionUID = 1L;
-
-		@Override
-		protected void populateItem(ListItem<ITreeProvider<? extends FileItem>> item) {
-			@SuppressWarnings({ "unchecked", "rawtypes" }) //TODO investigate this
-			FileItemTree<? extends FileItem> fit = new FileItemTree("item", FileTreePanel.this, item.getModelObject());
-			if (selected == null) {
-				selected = fit;
-			}
-			item.add(fit);
-		}
-	};
+	final FileItemTree tree;
 
-	public FileTreePanel(String id) {
+	public FileTreePanel(String id, Long roomId) {
 		super(id);
+		OmTreeProvider tp = new OmTreeProvider(roomId);
+		setSelected(tp.getRoot(), null);
+		add(tree = new FileItemTree("tree", this, tp));
 	}
 	
 	@Override
 	protected void onInitialize() {
 		super.onInitialize();
-		defineTrees();
-		selectedFile.getObject().setId(Long.MIN_VALUE);
 		final AddFolderDialog addFolder = new AddFolderDialog("addFolder", Application.getString(712)) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
 			protected void onSubmit(AjaxRequestTarget target) {
-				createFolder(getModelObject());
-				target.add(trees); //FIXME add correct refresh
+				createFolder(target, getModelObject());
 			}
 		};
 		add(addFolder);
@@ -163,7 +146,7 @@ public abstract class FileTreePanel exte
 
 			@Override
 			protected void onEvent(AjaxRequestTarget target) {
-				target.add(trees); //FIXME add correct refresh
+				target.add(trees);
 			}
 		}));
 		trashToolbar.add(new ConfirmableAjaxBorder("trash", getString("80"), getString("713")) {
@@ -171,7 +154,7 @@ public abstract class FileTreePanel exte
 
 			@Override
 			protected void onEvent(AjaxRequestTarget target) {
-				FileItem f = selectedFile.getObject();
+				FileItem f = selected.getObject();
 				if (f != null && f.getId() > 0) {
 					super.onEvent(target);
 				}
@@ -179,11 +162,11 @@ public abstract class FileTreePanel exte
 			
 			@Override
 			protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
-				delete(selectedFile.getObject(), target);
+				delete(selected.getObject(), target);
 			}
 		});
 		
-		add(trees.add(treesView).setOutputMarkupId(true));
+		add(trees.add(tree).setOutputMarkupId(true));
 		updateSizes();
 		add(sizes.add(new Label("homeSize", homeSize), new Label("publicSize", publicSize)).setOutputMarkupId(true));
 		add(errorsDialog);
@@ -206,40 +189,61 @@ public abstract class FileTreePanel exte
 				getBean(FileExplorerItemDao.class).delete((FileExplorerItem)f);
 			}
 		}
-		handler.add(trees); //FIXME add correct refresh
+		handler.add(trees);
 	}
 	
-	public void createRecordingFolder(String name) {
-		Recording f = new Recording();
+	protected abstract void update(AjaxRequestTarget target, FileItem f);
+
+	protected void createFolder(AjaxRequestTarget target, String name) {
+		FileItem p = selected.getObject();
+		boolean isRecording = p instanceof Recording;
+		if (Type.Folder != p.getType()) {
+			
+		}
+		FileItem f = isRecording ? new Recording() : new FileExplorerItem();
 		f.setName(name);
 		f.setInsertedBy(getUserId());
 		f.setInserted(new Date());
-		f.setType(Type.Folder);;
-		Recording p = (Recording)selectedFile.getObject();
-		long parentId = p.getId();
-		if (Type.Folder == p.getType()) {
-			f.setParentId(parentId);
-		}
+		f.setType(Type.Folder);
 		f.setOwnerId(p.getOwnerId());
-		f.setGroupId(p.getGroupId());
-		getBean(RecordingDao.class).update(f);
+		f.setParentId(Type.Folder == p.getType() ? p.getId() : null);
+		if (isRecording) {
+			Recording r = (Recording)f;
+			r.setGroupId(((Recording)p).getGroupId());
+			getBean(RecordingDao.class).update(r);
+		} else {
+			f.setRoomId(p.getRoomId());
+			getBean(FileExplorerItemDao.class).update((FileExplorerItem)f);
+		}
+		target.add(trees);
 	}
-	
-	public abstract void defineTrees();
-	
-	public abstract void update(AjaxRequestTarget target, FileItem f);
-
-	public abstract void createFolder(String name);
 
 	public abstract void updateSizes();
 	
-	public FileItem getSelectedFile() {
-		return selectedFile.getObject();
+	public FileItem getSelected() {
+		return selected.getObject();
+	}
+	
+	void updateNode(AjaxRequestTarget target, FileItem fi) {
+		if (fi != null && target != null) {
+			if (Type.Folder == fi.getType()) {
+				tree.updateBranch(fi, target);
+			} else {
+				tree.updateNode(fi, target);
+			}
+		}
+	}
+	
+	public void setSelected(FileItem fi, AjaxRequestTarget target) {
+		FileItem _prev = selected.getObject();
+		updateNode(target, _prev);
+		selected.setObject(fi);
+		updateNode(target, fi);
 	}
 	
 	@Override
 	protected void onDetach() {
-		selectedFile.detach();
+		selected.detach();
 		homeSize.detach();
 		publicSize.detach();
 		super.onDetach();

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java?rev=1755671&r1=1755670&r2=1755671&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java Wed Aug 10 05:34:01 2016
@@ -66,12 +66,12 @@ public class FolderPanel extends Panel {
 				if (o instanceof FileItem) {
 					FileItem p = (FileItem)drop.getDefaultModelObject();
 					FileItem f = (FileItem)o;
-					long pid = p.getId();
+					Long pid = p.getId();
 					//FIXME parent should not be moved to child !!!!!!!
-					if (pid == f.getId()) {
+					if (pid != null && pid.equals(f.getId())) {
 						return;
 					}
-					f.setParentId(pid > 0 ? pid : null);
+					f.setParentId(pid);
 					f.setOwnerId(p.getOwnerId());
 					f.setRoomId(p.getRoomId());
 					if (f instanceof Recording) {
@@ -81,11 +81,13 @@ public class FolderPanel extends Panel {
 					} else {
 						getBean(FileExplorerItemDao.class).update((FileExplorerItem)f);
 					}
+					treePanel.updateNode(target, p);
+					treePanel.updateNode(target, f);
 				}
-				target.add(treePanel.trees); //FIXME add correct refresh
+				target.add(treePanel.trees);
 			}
 		} : new WebMarkupContainer("drop");
-		if (r.getId() < 1) {
+		if (r.getId() == null) {
 			drag = new WebMarkupContainer("drag");
 		} else {
 			drag = new Draggable<FileItem>("drag", Model.of(r)) {
@@ -101,7 +103,7 @@ public class FolderPanel extends Panel {
 			}.setContainment(treePanel.getContainment());
 			drag.add(AttributeAppender.append("class", r instanceof Recording ? "recorditem" : "fileitem"));
 		}
-		drag.add(r.getId() < 1 ? new Label("name", r.getName()) : new AjaxEditableLabel<String>("name", Model.of(model.getObject().getName())) {
+		drag.add(r.getId() == null ? new Label("name", r.getName()) : new AjaxEditableLabel<String>("name", Model.of(model.getObject().getName())) {
 			private static final long serialVersionUID = 1L;
 			
 			@Override

Added: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java?rev=1755671&view=auto
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java (added)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java Wed Aug 10 05:34:01 2016
@@ -0,0 +1,162 @@
+/*
+ * 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.common.tree;
+
+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.Iterator;
+import java.util.List;
+
+import org.apache.openmeetings.db.dao.file.FileExplorerItemDao;
+import org.apache.openmeetings.db.dao.record.RecordingDao;
+import org.apache.openmeetings.db.dao.user.UserDao;
+import org.apache.openmeetings.db.entity.file.FileExplorerItem;
+import org.apache.openmeetings.db.entity.file.FileItem;
+import org.apache.openmeetings.db.entity.file.FileItem.Type;
+import org.apache.openmeetings.db.entity.record.Recording;
+import org.apache.openmeetings.db.entity.user.Group;
+import org.apache.openmeetings.db.entity.user.GroupUser;
+import org.apache.openmeetings.web.app.Application;
+import org.apache.wicket.extensions.markup.html.repeater.tree.ITreeProvider;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+
+public class OmTreeProvider implements ITreeProvider<FileItem> {
+	private static final long serialVersionUID = 1L;
+	public static String RECORDINGS_MY = "recordings-my";
+	public static String RECORDINGS_PUBLIC = "recordings-public";
+	public static String RECORDINGS_GROUP = "recordings-group-%s";
+	public static String FILES_MY = "files-my";
+	public static String FILES_ROOM = "files-room";
+	private Long roomId = null;
+	private final List<FileItem> roots = new ArrayList<>();
+
+	public OmTreeProvider(Long roomId) {
+		this.roomId = roomId;
+		if (roomId != null) {
+			roots.add(createFileRoot(null));
+			roots.add(createFileRoot(roomId));
+		}
+		final String PUBLIC = Application.getString(861);
+		{
+			Recording r = createRecRoot(Application.getString(860), RECORDINGS_MY);
+			r.setOwnerId(getUserId());
+			roots.add(r);
+		}
+		{
+			Recording r = createRecRoot(PUBLIC, RECORDINGS_PUBLIC);
+			roots.add(r);
+		}
+		for (GroupUser gu : getBean(UserDao.class).get(getUserId()).getGroupUsers()) {
+			Group g = gu.getGroup();
+			
+			Recording r = createRecRoot(String.format("%s (%s)", PUBLIC, g.getName()), String.format(RECORDINGS_GROUP, g.getId()));
+			r.setGroupId(g.getId());
+			roots.add(r);
+		}
+	}
+	
+	static Recording createRecRoot(String name, String hash) {
+		Recording r = new Recording();
+		r.setType(Type.Folder);
+		r.setName(name);
+		r.setHash(hash);
+		return r;
+	}
+	
+	static FileExplorerItem createFileRoot(Long roomId) {
+		FileExplorerItem f = new FileExplorerItem();
+		f.setRoomId(roomId);
+		f.setType(Type.Folder);
+		if (roomId == null) {
+			f.setOwnerId(getUserId());
+			f.setName(Application.getString(706));
+			f.setHash(FILES_MY);
+		} else {
+			f.setName(Application.getString(707));
+			f.setHash(FILES_ROOM);
+		}
+		return f;
+	}
+	
+	public FileItem getRoot() {
+		return roots.get(0);
+	}
+	
+	@Override
+	public Iterator<FileItem> getRoots() {
+		return roots.iterator();
+	}
+
+	@Override
+	public Iterator<FileItem> getChildren(FileItem node) {
+		List<FileItem> list = new ArrayList<>();
+		if (node instanceof Recording) {
+			Recording rec = (Recording)node;
+			RecordingDao dao = getBean(RecordingDao.class);
+			List<Recording> _list;
+			if (node.getId() == null) {
+				if (node.getOwnerId() == null) {
+					_list = dao.getRootByPublic(rec.getGroupId());
+				} else {
+					_list = dao.getRootByOwner(node.getOwnerId());
+				}
+			} else {
+				_list = dao.getByParent(node.getId());
+			}
+			for (Recording r : _list) {
+				list.add(r);
+			}
+		} else {
+			FileExplorerItemDao dao = getBean(FileExplorerItemDao.class);
+			List<FileExplorerItem> _list;
+			if (node.getId() == null) {
+				if (roomId == null) {
+					_list = dao.getByRoom(roomId);
+				} else {
+					_list = dao.getByOwner(node.getOwnerId());
+				}
+			} else {
+				_list = dao.getByParent(node.getId());
+			}
+			for (FileExplorerItem r : _list) {
+				list.add(r);
+			}
+		}
+		return list.iterator();
+	}
+
+	@Override
+	public boolean hasChildren(FileItem node) {
+		return node.getId() == null || Type.Folder == node.getType();
+	}
+
+	@Override
+	public IModel<FileItem> model(FileItem object) {
+		// TODO LDM should be used
+		return Model.of(object);
+	}
+
+	@Override
+	public void detach() {
+		// TODO LDM should be used
+	}
+}

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java?rev=1755671&r1=1755670&r2=1755671&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java Wed Aug 10 05:34:01 2016
@@ -18,40 +18,19 @@
  */
 package org.apache.openmeetings.web.room.sidebar;
 
-import static org.apache.openmeetings.web.app.Application.getBean;
-import static org.apache.openmeetings.web.app.WebSession.getUserId;
-
-import java.util.Arrays;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.openmeetings.db.dao.file.FileExplorerItemDao;
-import org.apache.openmeetings.db.dao.user.UserDao;
-import org.apache.openmeetings.db.entity.file.FileExplorerItem;
 import org.apache.openmeetings.db.entity.file.FileItem;
-import org.apache.openmeetings.db.entity.file.FileItem.Type;
-import org.apache.openmeetings.db.entity.record.Recording;
-import org.apache.openmeetings.db.entity.user.Group;
-import org.apache.openmeetings.db.entity.user.GroupUser;
-import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.common.tree.FileTreePanel;
-import org.apache.openmeetings.web.common.tree.MyRecordingTreeProvider;
-import org.apache.openmeetings.web.common.tree.PublicRecordingTreeProvider;
 import org.apache.openmeetings.web.room.RoomPanel;
 import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.extensions.markup.html.repeater.tree.ITreeProvider;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
 
 public class RoomFilePanel extends FileTreePanel {
 	private static final long serialVersionUID = 1L;
 	private final RoomPanel room;
 
 	public RoomFilePanel(String id, RoomPanel room) {
-		super(id);
+		super(id, room.getRoom().getId());
 		this.room = room;
 	}
 	
@@ -62,7 +41,7 @@ public class RoomFilePanel extends FileT
 	}
 	
 	@Override
-	public void update(AjaxRequestTarget target, FileItem f) {
+	protected void update(AjaxRequestTarget target, FileItem f) {
 		// TODO Auto-generated method stub
 		
 	}
@@ -86,93 +65,4 @@ public class RoomFilePanel extends FileT
 		});
 		return u;
 	}
-	
-	@Override
-	public void defineTrees() {
-		FileExplorerItem f = new FileExplorerItem();
-		f.setOwnerId(getUserId());
-		selectedFile.setObject(f);
-		treesView.getList().add(new FilesTreeProvider(null));
-		treesView.getList().add(new FilesTreeProvider(room.getRoom().getId()));
-		treesView.getList().add(new MyRecordingTreeProvider());
-		treesView.getList().add(new PublicRecordingTreeProvider(null, null));
-		for (GroupUser ou : getBean(UserDao.class).get(getUserId()).getGroupUsers()) {
-			Group o = ou.getGroup();
-			treesView.getList().add(new PublicRecordingTreeProvider(o.getId(), o.getName()));
-		}
-	}
-	
-	@Override
-	public void createFolder(String name) {
-		if (selectedFile.getObject() instanceof Recording) {
-			createRecordingFolder(name);
-		} else {
-			FileExplorerItem f = new FileExplorerItem();
-			f.setName(name);
-			f.setInsertedBy(getUserId());
-			f.setInserted(new Date());
-			f.setType(Type.Folder);;
-			FileItem p = selectedFile.getObject();
-			long parentId = p.getId();
-			f.setParentId(Type.Folder == p.getType() && parentId > 0 ? parentId : null);
-			f.setOwnerId(p.getOwnerId());
-			f.setRoomId(p.getRoomId());
-			getBean(FileExplorerItemDao.class).update(f);
-		}
-	}
-
-	static class FilesTreeProvider implements ITreeProvider<FileExplorerItem> {
-		private static final long serialVersionUID = 1L;
-		Long roomId = null;
-
-		FilesTreeProvider(Long roomId) {
-			this.roomId = roomId;
-		}
-		
-		@Override
-		public void detach() {
-			// TODO LDM should be used
-		}
-
-		@Override
-		public boolean hasChildren(FileExplorerItem node) {
-			return node.getId() <= 0 || Type.Folder == node.getType();
-		}
-
-		@Override
-		public Iterator<? extends FileExplorerItem> getChildren(FileExplorerItem node) {
-			FileExplorerItemDao dao = getBean(FileExplorerItemDao.class);
-			List<FileExplorerItem> list = null;
-			if (node.getId() == 0) {
-				list = dao.getByOwner(node.getOwnerId());
-			} else if (node.getId() < 0) {
-				list = dao.getByRoom(roomId);
-			} else {
-				list = dao.getByParent(node.getId());
-			}
-			return list.iterator();
-		}
-
-		@Override
-		public IModel<FileExplorerItem> model(FileExplorerItem object) {
-			// TODO LDM should be used
-			return Model.of(object);
-		}
-
-		@Override
-		public Iterator<? extends FileExplorerItem> getRoots() {
-			FileExplorerItem f = new FileExplorerItem();
-			f.setRoomId(roomId);
-			f.setType(Type.Folder);
-			if (roomId == null) {
-				f.setId(0L);
-				f.setOwnerId(getUserId());
-				f.setName(Application.getString(706));
-			} else {
-				f.setId(-roomId);
-				f.setName(Application.getString(707));
-			}
-			return Arrays.asList(f).iterator();
-		}
-	}
 }

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java?rev=1755671&r1=1755670&r2=1755671&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java Wed Aug 10 05:34:01 2016
@@ -161,7 +161,7 @@ public class UploadDialog extends Abstra
 			FileExplorerItem f = new FileExplorerItem();
 			f.setSize(fu.getSize());
 			f.setName(fu.getClientFileName());
-			FileItem parent = roomFiles.getSelectedFile();
+			FileItem parent = roomFiles.getSelected();
 			if (parent == null || !(parent instanceof FileExplorerItem)) {
 				f.setOwnerId(getUserId());
 			} else {

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java?rev=1755671&r1=1755670&r2=1755671&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java Wed Aug 10 05:34:01 2016
@@ -23,16 +23,11 @@ import static org.apache.openmeetings.we
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 
 import org.apache.openmeetings.db.dao.record.RecordingDao;
-import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.dto.record.RecordingContainerData;
 import org.apache.openmeetings.db.entity.file.FileItem;
 import org.apache.openmeetings.db.entity.record.Recording;
-import org.apache.openmeetings.db.entity.user.Group;
-import org.apache.openmeetings.db.entity.user.GroupUser;
 import org.apache.openmeetings.web.common.UserPanel;
 import org.apache.openmeetings.web.common.tree.FileTreePanel;
-import org.apache.openmeetings.web.common.tree.MyRecordingTreeProvider;
-import org.apache.openmeetings.web.common.tree.PublicRecordingTreeProvider;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 
 public class RecordingsPanel extends UserPanel {
@@ -42,21 +37,10 @@ public class RecordingsPanel extends Use
 	
 	public RecordingsPanel(String id) {
 		super(id);
-		add(new FileTreePanel("tree") {
+		add(new FileTreePanel("tree", null) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
-			public void defineTrees() {
-				selectedFile.setObject(new Recording());
-				treesView.getList().add(new MyRecordingTreeProvider());
-				treesView.getList().add(new PublicRecordingTreeProvider(null, null));
-				for (GroupUser ou : getBean(UserDao.class).get(getUserId()).getGroupUsers()) {
-					Group o = ou.getGroup();
-					treesView.getList().add(new PublicRecordingTreeProvider(o.getId(), o.getName()));
-				}
-			}
-			
-			@Override
 			public void updateSizes() {
 				RecordingContainerData sizeData = getBean(RecordingDao.class).getContainerData(getUserId());
 				if (sizeData != null) {
@@ -66,15 +50,10 @@ public class RecordingsPanel extends Use
 			}
 			
 			@Override
-			public void update(AjaxRequestTarget target, FileItem f) {
+			protected void update(AjaxRequestTarget target, FileItem f) {
 				video.update(target, (Recording)f);
 				info.update(target, (Recording)f);
 			}
-			
-			@Override
-			public void createFolder(String name) {
-				createRecordingFolder(name);
-			}
 		});
 		add(video, info);
 	}

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.java?rev=1755671&r1=1755670&r2=1755671&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.java Wed Aug 10 05:34:01 2016
@@ -70,13 +70,13 @@ public abstract class AddFolderDialog ex
 				});
 			}
 		};
-		add(form);
+		add(form.setOutputMarkupId(true));
 	}
 
 	@Override
 	protected void onOpen(IPartialPageRequestHandler handler) {
 		super.onOpen(handler);
-		
+		handler.add(form);
 		setModelObject(name);
 		getFeedbackMessages().clear();
 	}

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemTree.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemTree.java?rev=1755671&r1=1755670&r2=1755671&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemTree.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemTree.java Wed Aug 10 05:34:01 2016
@@ -34,31 +34,32 @@ import org.apache.wicket.markup.repeater
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 
-public class FileItemTree<T extends FileItem> extends DefaultNestedTree<T> {
+public class FileItemTree extends DefaultNestedTree<FileItem> {
 	private static final long serialVersionUID = 1L;
 	private final FileTreePanel treePanel;
-	private final IModel<T> selectedItem = Model.of((T)null);
 
-	public FileItemTree(String id, FileTreePanel treePanel, ITreeProvider<T> tp) {
+	public FileItemTree(String id, FileTreePanel treePanel, ITreeProvider<FileItem> tp) {
 		super(id, tp);
 		this.treePanel = treePanel;
 		setItemReuseStrategy(new ReuseIfModelsEqualStrategy());
 	}
 	
 	@Override
-	protected Component newContentComponent(String id, IModel<T> node) {
-		return new Folder<T>(id, this, node) {
+	protected Component newContentComponent(String id, IModel<FileItem> node) {
+		return new Folder<FileItem>(id, this, node) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
-			protected Component newLabelComponent(String id, final IModel<T> lm) {
+			protected Component newLabelComponent(String id, final IModel<FileItem> lm) {
 				FileItem r = lm.getObject();
-				return Type.Folder == r.getType() || r.getId() < 1 ? new FolderPanel(id, lm, treePanel) : new FileItemPanel(id, lm, treePanel);
+				return Type.Folder == r.getType() || r.getId() == null ? new FolderPanel(id, lm, treePanel) : new FileItemPanel(id, lm, treePanel);
 			}
 			
 			@Override
 			protected boolean isSelected() {
-				return getModelObject().getId().equals(treePanel.selectedFile.getObject().getId());
+				FileItem f = getModelObject(), s = treePanel.getSelected();
+				return (s.getId() == null && s.getId() == f.getId() && s.getHash().equals(f.getHash()))
+						|| (s.getId() != null && s.getId().equals(f.getId()));
 			}
 			
 			@Override
@@ -68,28 +69,21 @@ public class FileItemTree<T extends File
 			
 			@Override
 			protected void onClick(AjaxRequestTarget target) {
-				T r = getModelObject();
-				treePanel.selected.resetSelected(target);
-				selectedItem.setObject(r);
-				treePanel.selectedFile.setObject(r);
-				treePanel.selected = FileItemTree.this;
+				FileItem r = getModelObject();
+				treePanel.setSelected(r, target);
 				if (Type.Folder == r.getType()) {
 					if (getState(r) == State.COLLAPSED) {
 						super.onClick(target);
 					}
-					updateBranch(r, target);
 				} else {
 					treePanel.update(target, r);
-					updateNode(r, target);
 				}
 			}
 			
-			private String getItemStyle(T f, String def) {
+			private String getItemStyle(FileItem f, String def) {
 				String style;
-				if (f.getId() == 0) {
-					style = "my file om-icon";
-				} else if (f.getId() < 0) {
-					style = "public file om-icon";
+				if (f.getId() == null) {
+					style = f.getHash().indexOf("my") > -1 ? "my file om-icon" : "public file om-icon";
 				} else {
 					switch(f.getType()) {
 						case Folder:
@@ -129,7 +123,7 @@ public class FileItemTree<T extends File
 			}
 			
 			@Override
-			protected String getOtherStyleClass(T r) {
+			protected String getOtherStyleClass(FileItem r) {
 				return getItemStyle(r, super.getOtherStyleClass(r));
 			}
 			
@@ -149,27 +143,9 @@ public class FileItemTree<T extends File
 			}
 			
 			@Override
-			protected IModel<String> newLabelModel(IModel<T> model) {
+			protected IModel<String> newLabelModel(IModel<FileItem> model) {
 				return Model.of(model.getObject().getName());
 			}
 		};
 	}
-
-	private void resetSelected(AjaxRequestTarget target) {
-		T _prev = selectedItem.getObject();
-		if (_prev != null) {
-			if (Type.Folder == _prev.getType()) {
-				updateBranch(_prev, target);
-			} else {
-				updateNode(_prev, target);
-			}
-			selectedItem.setObject(null);
-		}
-	}
-	
-	@Override
-	protected void onDetach() {
-		selectedItem.detach();
-		super.onDetach();
-	}
 }

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.html
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.html?rev=1755671&r1=1755670&r2=1755671&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.html (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.html Wed Aug 10 05:34:01 2016
@@ -37,9 +37,7 @@
 		</div>
 		<div wicket:id="tree-container" class="trees">
 			<div id="tree-anchor" style="height: 2px; width: 2px;"></div>
-			<div wicket:id="tree">
-				<div wicket:id="item"></div>
-			</div>
+			<div wicket:id="tree"></div>
 		</div>
 		<div class="sizes" wicket:id="sizes">
 			<table>

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java?rev=1755671&r1=1755670&r2=1755671&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java Wed Aug 10 05:34:01 2016
@@ -21,7 +21,6 @@ package org.apache.openmeetings.web.comm
 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.Date;
 import java.util.UUID;
 
@@ -39,12 +38,9 @@ import org.apache.wicket.ajax.AjaxEventB
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.attributes.CallbackParameter;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
-import org.apache.wicket.extensions.markup.html.repeater.tree.ITreeProvider;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.list.ListItem;
-import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
@@ -61,41 +57,28 @@ public abstract class FileTreePanel exte
 	private static final long serialVersionUID = 1L;
 	final WebMarkupContainer trees = new WebMarkupContainer("tree-container");
 	private final WebMarkupContainer sizes = new WebMarkupContainer("sizes");
-	protected final IModel<FileItem> selectedFile = new CompoundPropertyModel<FileItem>((FileItem)null);
+	private final IModel<FileItem> selected = new CompoundPropertyModel<FileItem>((FileItem)null);
 	protected final IModel<String> homeSize = Model.of((String)null);
 	protected final IModel<String> publicSize = Model.of((String)null);
 	final ConvertingErrorsDialog errorsDialog = new ConvertingErrorsDialog("errors", Model.of((Recording)null));
-	protected FileItemTree<? extends FileItem> selected;
-	protected ListView<ITreeProvider<? extends FileItem>> treesView = new ListView<ITreeProvider<? extends FileItem>>("tree", new ArrayList<ITreeProvider<? extends FileItem>>()) {
-		private static final long serialVersionUID = 1L;
-
-		@Override
-		protected void populateItem(ListItem<ITreeProvider<? extends FileItem>> item) {
-			@SuppressWarnings({ "unchecked", "rawtypes" }) //TODO investigate this
-			FileItemTree<? extends FileItem> fit = new FileItemTree("item", FileTreePanel.this, item.getModelObject());
-			if (selected == null) {
-				selected = fit;
-			}
-			item.add(fit);
-		}
-	};
+	final FileItemTree tree;
 
-	public FileTreePanel(String id) {
+	public FileTreePanel(String id, Long roomId) {
 		super(id);
+		OmTreeProvider tp = new OmTreeProvider(roomId);
+		setSelected(tp.getRoot(), null);
+		add(tree = new FileItemTree("tree", this, tp));
 	}
 	
 	@Override
 	protected void onInitialize() {
 		super.onInitialize();
-		defineTrees();
-		selectedFile.getObject().setId(Long.MIN_VALUE);
 		final AddFolderDialog addFolder = new AddFolderDialog("addFolder", Application.getString(712)) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
 			protected void onSubmit(AjaxRequestTarget target) {
-				createFolder(getModelObject());
-				target.add(trees); //FIXME add correct refresh
+				createFolder(target, getModelObject());
 			}
 		};
 		add(addFolder);
@@ -163,7 +146,7 @@ public abstract class FileTreePanel exte
 
 			@Override
 			protected void onEvent(AjaxRequestTarget target) {
-				target.add(trees); //FIXME add correct refresh
+				target.add(trees);
 			}
 		}));
 		trashToolbar.add(new ConfirmableAjaxBorder("trash", getString("80"), getString("713")) {
@@ -171,7 +154,7 @@ public abstract class FileTreePanel exte
 
 			@Override
 			protected void onEvent(AjaxRequestTarget target) {
-				FileItem f = selectedFile.getObject();
+				FileItem f = selected.getObject();
 				if (f != null && f.getId() > 0) {
 					super.onEvent(target);
 				}
@@ -179,11 +162,11 @@ public abstract class FileTreePanel exte
 			
 			@Override
 			protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
-				delete(selectedFile.getObject(), target);
+				delete(selected.getObject(), target);
 			}
 		});
 		
-		add(trees.add(treesView).setOutputMarkupId(true));
+		add(trees.add(tree).setOutputMarkupId(true));
 		updateSizes();
 		add(sizes.add(new Label("homeSize", homeSize), new Label("publicSize", publicSize)).setOutputMarkupId(true));
 		add(errorsDialog);
@@ -206,40 +189,61 @@ public abstract class FileTreePanel exte
 				getBean(FileExplorerItemDao.class).delete((FileExplorerItem)f);
 			}
 		}
-		handler.add(trees); //FIXME add correct refresh
+		handler.add(trees);
 	}
 	
-	public void createRecordingFolder(String name) {
-		Recording f = new Recording();
+	protected abstract void update(AjaxRequestTarget target, FileItem f);
+
+	protected void createFolder(AjaxRequestTarget target, String name) {
+		FileItem p = selected.getObject();
+		boolean isRecording = p instanceof Recording;
+		if (Type.Folder != p.getType()) {
+			
+		}
+		FileItem f = isRecording ? new Recording() : new FileExplorerItem();
 		f.setName(name);
 		f.setInsertedBy(getUserId());
 		f.setInserted(new Date());
-		f.setType(Type.Folder);;
-		Recording p = (Recording)selectedFile.getObject();
-		long parentId = p.getId();
-		if (Type.Folder == p.getType()) {
-			f.setParentId(parentId);
-		}
+		f.setType(Type.Folder);
 		f.setOwnerId(p.getOwnerId());
-		f.setGroupId(p.getGroupId());
-		getBean(RecordingDao.class).update(f);
+		f.setParentId(Type.Folder == p.getType() ? p.getId() : null);
+		if (isRecording) {
+			Recording r = (Recording)f;
+			r.setGroupId(((Recording)p).getGroupId());
+			getBean(RecordingDao.class).update(r);
+		} else {
+			f.setRoomId(p.getRoomId());
+			getBean(FileExplorerItemDao.class).update((FileExplorerItem)f);
+		}
+		target.add(trees);
 	}
-	
-	public abstract void defineTrees();
-	
-	public abstract void update(AjaxRequestTarget target, FileItem f);
-
-	public abstract void createFolder(String name);
 
 	public abstract void updateSizes();
 	
-	public FileItem getSelectedFile() {
-		return selectedFile.getObject();
+	public FileItem getSelected() {
+		return selected.getObject();
+	}
+	
+	void updateNode(AjaxRequestTarget target, FileItem fi) {
+		if (fi != null && target != null) {
+			if (Type.Folder == fi.getType()) {
+				tree.updateBranch(fi, target);
+			} else {
+				tree.updateNode(fi, target);
+			}
+		}
+	}
+	
+	public void setSelected(FileItem fi, AjaxRequestTarget target) {
+		FileItem _prev = selected.getObject();
+		updateNode(target, _prev);
+		selected.setObject(fi);
+		updateNode(target, fi);
 	}
 	
 	@Override
 	protected void onDetach() {
-		selectedFile.detach();
+		selected.detach();
 		homeSize.detach();
 		publicSize.detach();
 		super.onDetach();

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java?rev=1755671&r1=1755670&r2=1755671&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java Wed Aug 10 05:34:01 2016
@@ -66,12 +66,12 @@ public class FolderPanel extends Panel {
 				if (o instanceof FileItem) {
 					FileItem p = (FileItem)drop.getDefaultModelObject();
 					FileItem f = (FileItem)o;
-					long pid = p.getId();
+					Long pid = p.getId();
 					//FIXME parent should not be moved to child !!!!!!!
-					if (pid == f.getId()) {
+					if (pid != null && pid.equals(f.getId())) {
 						return;
 					}
-					f.setParentId(pid > 0 ? pid : null);
+					f.setParentId(pid);
 					f.setOwnerId(p.getOwnerId());
 					f.setRoomId(p.getRoomId());
 					if (f instanceof Recording) {
@@ -81,11 +81,13 @@ public class FolderPanel extends Panel {
 					} else {
 						getBean(FileExplorerItemDao.class).update((FileExplorerItem)f);
 					}
+					treePanel.updateNode(target, p);
+					treePanel.updateNode(target, f);
 				}
-				target.add(treePanel.trees); //FIXME add correct refresh
+				target.add(treePanel.trees);
 			}
 		} : new WebMarkupContainer("drop");
-		if (r.getId() < 1) {
+		if (r.getId() == null) {
 			drag = new WebMarkupContainer("drag");
 		} else {
 			drag = new Draggable<FileItem>("drag", Model.of(r)) {
@@ -101,7 +103,7 @@ public class FolderPanel extends Panel {
 			}.setContainment(treePanel.getContainment());
 			drag.add(AttributeAppender.append("class", r instanceof Recording ? "recorditem" : "fileitem"));
 		}
-		drag.add(r.getId() < 1 ? new Label("name", r.getName()) : new AjaxEditableLabel<String>("name", Model.of(model.getObject().getName())) {
+		drag.add(r.getId() == null ? new Label("name", r.getName()) : new AjaxEditableLabel<String>("name", Model.of(model.getObject().getName())) {
 			private static final long serialVersionUID = 1L;
 			
 			@Override

Added: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java?rev=1755671&view=auto
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java (added)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java Wed Aug 10 05:34:01 2016
@@ -0,0 +1,162 @@
+/*
+ * 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.common.tree;
+
+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.Iterator;
+import java.util.List;
+
+import org.apache.openmeetings.db.dao.file.FileExplorerItemDao;
+import org.apache.openmeetings.db.dao.record.RecordingDao;
+import org.apache.openmeetings.db.dao.user.UserDao;
+import org.apache.openmeetings.db.entity.file.FileExplorerItem;
+import org.apache.openmeetings.db.entity.file.FileItem;
+import org.apache.openmeetings.db.entity.file.FileItem.Type;
+import org.apache.openmeetings.db.entity.record.Recording;
+import org.apache.openmeetings.db.entity.user.Group;
+import org.apache.openmeetings.db.entity.user.GroupUser;
+import org.apache.openmeetings.web.app.Application;
+import org.apache.wicket.extensions.markup.html.repeater.tree.ITreeProvider;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+
+public class OmTreeProvider implements ITreeProvider<FileItem> {
+	private static final long serialVersionUID = 1L;
+	public static String RECORDINGS_MY = "recordings-my";
+	public static String RECORDINGS_PUBLIC = "recordings-public";
+	public static String RECORDINGS_GROUP = "recordings-group-%s";
+	public static String FILES_MY = "files-my";
+	public static String FILES_ROOM = "files-room";
+	private Long roomId = null;
+	private final List<FileItem> roots = new ArrayList<>();
+
+	public OmTreeProvider(Long roomId) {
+		this.roomId = roomId;
+		if (roomId != null) {
+			roots.add(createFileRoot(null));
+			roots.add(createFileRoot(roomId));
+		}
+		final String PUBLIC = Application.getString(861);
+		{
+			Recording r = createRecRoot(Application.getString(860), RECORDINGS_MY);
+			r.setOwnerId(getUserId());
+			roots.add(r);
+		}
+		{
+			Recording r = createRecRoot(PUBLIC, RECORDINGS_PUBLIC);
+			roots.add(r);
+		}
+		for (GroupUser gu : getBean(UserDao.class).get(getUserId()).getGroupUsers()) {
+			Group g = gu.getGroup();
+			
+			Recording r = createRecRoot(String.format("%s (%s)", PUBLIC, g.getName()), String.format(RECORDINGS_GROUP, g.getId()));
+			r.setGroupId(g.getId());
+			roots.add(r);
+		}
+	}
+	
+	static Recording createRecRoot(String name, String hash) {
+		Recording r = new Recording();
+		r.setType(Type.Folder);
+		r.setName(name);
+		r.setHash(hash);
+		return r;
+	}
+	
+	static FileExplorerItem createFileRoot(Long roomId) {
+		FileExplorerItem f = new FileExplorerItem();
+		f.setRoomId(roomId);
+		f.setType(Type.Folder);
+		if (roomId == null) {
+			f.setOwnerId(getUserId());
+			f.setName(Application.getString(706));
+			f.setHash(FILES_MY);
+		} else {
+			f.setName(Application.getString(707));
+			f.setHash(FILES_ROOM);
+		}
+		return f;
+	}
+	
+	public FileItem getRoot() {
+		return roots.get(0);
+	}
+	
+	@Override
+	public Iterator<FileItem> getRoots() {
+		return roots.iterator();
+	}
+
+	@Override
+	public Iterator<FileItem> getChildren(FileItem node) {
+		List<FileItem> list = new ArrayList<>();
+		if (node instanceof Recording) {
+			Recording rec = (Recording)node;
+			RecordingDao dao = getBean(RecordingDao.class);
+			List<Recording> _list;
+			if (node.getId() == null) {
+				if (node.getOwnerId() == null) {
+					_list = dao.getRootByPublic(rec.getGroupId());
+				} else {
+					_list = dao.getRootByOwner(node.getOwnerId());
+				}
+			} else {
+				_list = dao.getByParent(node.getId());
+			}
+			for (Recording r : _list) {
+				list.add(r);
+			}
+		} else {
+			FileExplorerItemDao dao = getBean(FileExplorerItemDao.class);
+			List<FileExplorerItem> _list;
+			if (node.getId() == null) {
+				if (roomId == null) {
+					_list = dao.getByRoom(roomId);
+				} else {
+					_list = dao.getByOwner(node.getOwnerId());
+				}
+			} else {
+				_list = dao.getByParent(node.getId());
+			}
+			for (FileExplorerItem r : _list) {
+				list.add(r);
+			}
+		}
+		return list.iterator();
+	}
+
+	@Override
+	public boolean hasChildren(FileItem node) {
+		return node.getId() == null || Type.Folder == node.getType();
+	}
+
+	@Override
+	public IModel<FileItem> model(FileItem object) {
+		// TODO LDM should be used
+		return Model.of(object);
+	}
+
+	@Override
+	public void detach() {
+		// TODO LDM should be used
+	}
+}

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java?rev=1755671&r1=1755670&r2=1755671&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java Wed Aug 10 05:34:01 2016
@@ -18,40 +18,19 @@
  */
 package org.apache.openmeetings.web.room.sidebar;
 
-import static org.apache.openmeetings.web.app.Application.getBean;
-import static org.apache.openmeetings.web.app.WebSession.getUserId;
-
-import java.util.Arrays;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.openmeetings.db.dao.file.FileExplorerItemDao;
-import org.apache.openmeetings.db.dao.user.UserDao;
-import org.apache.openmeetings.db.entity.file.FileExplorerItem;
 import org.apache.openmeetings.db.entity.file.FileItem;
-import org.apache.openmeetings.db.entity.file.FileItem.Type;
-import org.apache.openmeetings.db.entity.record.Recording;
-import org.apache.openmeetings.db.entity.user.Group;
-import org.apache.openmeetings.db.entity.user.GroupUser;
-import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.common.tree.FileTreePanel;
-import org.apache.openmeetings.web.common.tree.MyRecordingTreeProvider;
-import org.apache.openmeetings.web.common.tree.PublicRecordingTreeProvider;
 import org.apache.openmeetings.web.room.RoomPanel;
 import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.extensions.markup.html.repeater.tree.ITreeProvider;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
 
 public class RoomFilePanel extends FileTreePanel {
 	private static final long serialVersionUID = 1L;
 	private final RoomPanel room;
 
 	public RoomFilePanel(String id, RoomPanel room) {
-		super(id);
+		super(id, room.getRoom().getId());
 		this.room = room;
 	}
 	
@@ -62,7 +41,7 @@ public class RoomFilePanel extends FileT
 	}
 	
 	@Override
-	public void update(AjaxRequestTarget target, FileItem f) {
+	protected void update(AjaxRequestTarget target, FileItem f) {
 		// TODO Auto-generated method stub
 		
 	}
@@ -86,93 +65,4 @@ public class RoomFilePanel extends FileT
 		});
 		return u;
 	}
-	
-	@Override
-	public void defineTrees() {
-		FileExplorerItem f = new FileExplorerItem();
-		f.setOwnerId(getUserId());
-		selectedFile.setObject(f);
-		treesView.getList().add(new FilesTreeProvider(null));
-		treesView.getList().add(new FilesTreeProvider(room.getRoom().getId()));
-		treesView.getList().add(new MyRecordingTreeProvider());
-		treesView.getList().add(new PublicRecordingTreeProvider(null, null));
-		for (GroupUser ou : getBean(UserDao.class).get(getUserId()).getGroupUsers()) {
-			Group o = ou.getGroup();
-			treesView.getList().add(new PublicRecordingTreeProvider(o.getId(), o.getName()));
-		}
-	}
-	
-	@Override
-	public void createFolder(String name) {
-		if (selectedFile.getObject() instanceof Recording) {
-			createRecordingFolder(name);
-		} else {
-			FileExplorerItem f = new FileExplorerItem();
-			f.setName(name);
-			f.setInsertedBy(getUserId());
-			f.setInserted(new Date());
-			f.setType(Type.Folder);;
-			FileItem p = selectedFile.getObject();
-			long parentId = p.getId();
-			f.setParentId(Type.Folder == p.getType() && parentId > 0 ? parentId : null);
-			f.setOwnerId(p.getOwnerId());
-			f.setRoomId(p.getRoomId());
-			getBean(FileExplorerItemDao.class).update(f);
-		}
-	}
-
-	static class FilesTreeProvider implements ITreeProvider<FileExplorerItem> {
-		private static final long serialVersionUID = 1L;
-		Long roomId = null;
-
-		FilesTreeProvider(Long roomId) {
-			this.roomId = roomId;
-		}
-		
-		@Override
-		public void detach() {
-			// TODO LDM should be used
-		}
-
-		@Override
-		public boolean hasChildren(FileExplorerItem node) {
-			return node.getId() <= 0 || Type.Folder == node.getType();
-		}
-
-		@Override
-		public Iterator<? extends FileExplorerItem> getChildren(FileExplorerItem node) {
-			FileExplorerItemDao dao = getBean(FileExplorerItemDao.class);
-			List<FileExplorerItem> list = null;
-			if (node.getId() == 0) {
-				list = dao.getByOwner(node.getOwnerId());
-			} else if (node.getId() < 0) {
-				list = dao.getByRoom(roomId);
-			} else {
-				list = dao.getByParent(node.getId());
-			}
-			return list.iterator();
-		}
-
-		@Override
-		public IModel<FileExplorerItem> model(FileExplorerItem object) {
-			// TODO LDM should be used
-			return Model.of(object);
-		}
-
-		@Override
-		public Iterator<? extends FileExplorerItem> getRoots() {
-			FileExplorerItem f = new FileExplorerItem();
-			f.setRoomId(roomId);
-			f.setType(Type.Folder);
-			if (roomId == null) {
-				f.setId(0L);
-				f.setOwnerId(getUserId());
-				f.setName(Application.getString(706));
-			} else {
-				f.setId(-roomId);
-				f.setName(Application.getString(707));
-			}
-			return Arrays.asList(f).iterator();
-		}
-	}
 }

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java?rev=1755671&r1=1755670&r2=1755671&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java Wed Aug 10 05:34:01 2016
@@ -161,7 +161,7 @@ public class UploadDialog extends Abstra
 			FileExplorerItem f = new FileExplorerItem();
 			f.setSize(fu.getSize());
 			f.setName(fu.getClientFileName());
-			FileItem parent = roomFiles.getSelectedFile();
+			FileItem parent = roomFiles.getSelected();
 			if (parent == null || !(parent instanceof FileExplorerItem)) {
 				f.setOwnerId(getUserId());
 			} else {

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java?rev=1755671&r1=1755670&r2=1755671&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java Wed Aug 10 05:34:01 2016
@@ -23,16 +23,11 @@ import static org.apache.openmeetings.we
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 
 import org.apache.openmeetings.db.dao.record.RecordingDao;
-import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.dto.record.RecordingContainerData;
 import org.apache.openmeetings.db.entity.file.FileItem;
 import org.apache.openmeetings.db.entity.record.Recording;
-import org.apache.openmeetings.db.entity.user.Group;
-import org.apache.openmeetings.db.entity.user.GroupUser;
 import org.apache.openmeetings.web.common.UserPanel;
 import org.apache.openmeetings.web.common.tree.FileTreePanel;
-import org.apache.openmeetings.web.common.tree.MyRecordingTreeProvider;
-import org.apache.openmeetings.web.common.tree.PublicRecordingTreeProvider;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 
 public class RecordingsPanel extends UserPanel {
@@ -42,21 +37,10 @@ public class RecordingsPanel extends Use
 	
 	public RecordingsPanel(String id) {
 		super(id);
-		add(new FileTreePanel("tree") {
+		add(new FileTreePanel("tree", null) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
-			public void defineTrees() {
-				selectedFile.setObject(new Recording());
-				treesView.getList().add(new MyRecordingTreeProvider());
-				treesView.getList().add(new PublicRecordingTreeProvider(null, null));
-				for (GroupUser ou : getBean(UserDao.class).get(getUserId()).getGroupUsers()) {
-					Group o = ou.getGroup();
-					treesView.getList().add(new PublicRecordingTreeProvider(o.getId(), o.getName()));
-				}
-			}
-			
-			@Override
 			public void updateSizes() {
 				RecordingContainerData sizeData = getBean(RecordingDao.class).getContainerData(getUserId());
 				if (sizeData != null) {
@@ -66,15 +50,10 @@ public class RecordingsPanel extends Use
 			}
 			
 			@Override
-			public void update(AjaxRequestTarget target, FileItem f) {
+			protected void update(AjaxRequestTarget target, FileItem f) {
 				video.update(target, (Recording)f);
 				info.update(target, (Recording)f);
 			}
-			
-			@Override
-			public void createFolder(String name) {
-				createRecordingFolder(name);
-			}
 		});
 		add(video, info);
 	}