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 2017/01/18 18:16:45 UTC

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

Author: solomax
Date: Wed Jan 18 18:16:45 2017
New Revision: 1779367

URL: http://svn.apache.org/viewvc?rev=1779367&view=rev
Log:
[OPENMEETINGS-1527] more work on multiselect

Modified:
    openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/DownloadMenuItem.java
    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/OmTreeProvider.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/theme.css
    openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/DownloadMenuItem.java
    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/OmTreeProvider.java
    openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/theme.css

Modified: openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java?rev=1779367&r1=1779366&r2=1779367&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java Wed Jan 18 18:16:45 2017
@@ -22,6 +22,7 @@ import static org.apache.openmeetings.ut
 
 import java.util.Date;
 import java.util.Map;
+import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.openmeetings.core.converter.BaseConverter;
@@ -41,8 +42,8 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.room.Client;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.util.CalendarPatterns;
-import org.apache.openmeetings.util.message.TextRoomMessage;
 import org.apache.openmeetings.util.message.RoomMessage;
+import org.apache.openmeetings.util.message.TextRoomMessage;
 import org.red5.logging.Red5LoggerFactory;
 import org.red5.server.api.IConnection;
 import org.red5.server.api.Red5;
@@ -102,7 +103,7 @@ public class RecordingService implements
 
 			Recording recording = new Recording();
 
-			recording.setHash("");
+			recording.setHash(UUID.randomUUID().toString());
 			recording.setName(roomRecordingName);
 			Long ownerId = client.getUserId();
 			if (ownerId != null && ownerId < 0) {
@@ -201,7 +202,7 @@ public class RecordingService implements
 
 	/**
 	 * Start recording the published stream for the specified broadcast-Id
-	 * 
+	 *
 	 * @param conn
 	 * @param broadcastid
 	 * @param streamName
@@ -243,7 +244,7 @@ public class RecordingService implements
 
 	/**
 	 * Stops recording the publishing stream for the specified IConnection.
-	 * 
+	 *
 	 * @param conn
 	 */
 	public void stopRecordingShow(IConnection conn, String broadcastId, Long metaId) {

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/DownloadMenuItem.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/DownloadMenuItem.java?rev=1779367&r1=1779366&r2=1779367&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/DownloadMenuItem.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/DownloadMenuItem.java Wed Jan 18 18:16:45 2017
@@ -39,7 +39,10 @@ public class DownloadMenuItem extends Me
 
 	@Override
 	public boolean isEnabled() {
-		File f = tree.getLastSelected().getFile(ext);
+		File f = null;
+		if (tree.selectedCount() == 1) {
+			f = tree.getLastSelected().getFile(ext);
+		}
 		return f != null && f.exists();
 	}
 

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=1779367&r1=1779366&r2=1779367&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 Jan 18 18:16:45 2017
@@ -209,6 +209,7 @@ public abstract class FileTreePanel exte
 		boolean isRecording = p instanceof Recording;
 		FileItem f = isRecording ? new Recording() : new FileExplorerItem();
 		f.setName(name);
+		f.setHash(UUID.randomUUID().toString());
 		f.setInsertedBy(getUserId());
 		f.setInserted(new Date());
 		f.setType(Type.Folder);
@@ -232,6 +233,10 @@ public abstract class FileTreePanel exte
 		return selected.containsKey(f.getHash());
 	}
 
+	public int selectedCount() {
+		return selected.size();
+	}
+
 	public FileItem getLastSelected() {
 		return lastSelected;
 	}
@@ -241,6 +246,12 @@ public abstract class FileTreePanel exte
 		handler.add(sizes, trees);
 	}
 
+	private void updateSelected(AjaxRequestTarget target) {
+		for (Entry<String, FileItem> e : selected.entrySet()) {
+			updateNode(target, e.getValue());
+		}
+	}
+
 	void updateNode(AjaxRequestTarget target, FileItem fi) {
 		if (fi != null && target != null) {
 			if (Type.Folder == fi.getType()) {
@@ -251,22 +262,61 @@ public abstract class FileTreePanel exte
 		}
 	}
 
+	private boolean sameParent(FileItem f1, FileItem f2) {
+		if (f1 instanceof Recording && f2 instanceof FileExplorerItem) {
+			return false;
+		}
+		if (f1.getParentId() != null && f1.getParentId().equals(f2.getParentId())) {
+			return true;
+		}
+		if (f1.getParentId() == null && f2.getParentId() == null) {
+			if (f1.getOwnerId() != null && f1.getOwnerId().equals(f2.getOwnerId())) {
+				return true;
+			}
+			if (f1.getRoomId() != null && f1.getRoomId().equals(f2.getRoomId())) {
+				return true;
+			}
+			if (f1.getRoomId() == null && f2.getRoomId() == null && f1.getOwnerId() == null && f2.getOwnerId() == null) {
+				return true;
+			}
+		}
+		return false;
+	}
+
 	public void select(FileItem fi, AjaxRequestTarget target, boolean shift, boolean ctrl) {
-		updateNode(target, lastSelected);
+		updateSelected(target);
 		if (ctrl) {
 			if (isSelected(fi)) {
-				selected.remove(fi.getId());
+				selected.remove(fi.getHash());
 			} else {
 				selected.put(fi.getHash(), fi);
 			}
-		} else if (shift) {
-			//search
+			lastSelected = fi;
+		} else if (shift && lastSelected != null && !lastSelected.getHash().equals(fi.getHash()) && sameParent(fi, lastSelected)) {
+			selected.clear();
+			String lastHash = null;
+			for (FileItem f : ((OmTreeProvider)tree.getProvider()).getByParent(fi, fi.getParentId())) {
+				if (lastHash == null) {
+					if (f.getHash().equals(lastSelected.getHash())) {
+						lastHash = fi.getHash();
+					}
+					if (f.getHash().equals(fi.getHash())) {
+						lastHash = lastSelected.getHash();
+					}
+				}
+				if (lastHash != null) {
+					selected.put(f.getHash(), f);
+					if (f.getHash().equals(lastHash)) {
+						break;
+					}
+				}
+			}
 		} else {
 			selected.clear();
 			selected.put(fi.getHash(), fi);
+			lastSelected = fi;
 		}
-		lastSelected = fi;
-		updateNode(target, lastSelected);
+		updateSelected(target);
 		if (target != null) {
 			target.add(download.setVisible(lastSelected.getType() == Type.Presentation || lastSelected.getType() == Type.Image));
 		}

Modified: 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=1779367&r1=1779366&r2=1779367&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java Wed Jan 18 18:16:45 2017
@@ -67,13 +67,13 @@ public class OmTreeProvider implements I
 		}
 		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);
@@ -81,7 +81,7 @@ public class OmTreeProvider implements I
 		r.setHash(hash);
 		return r;
 	}
-	
+
 	static FileExplorerItem createFileRoot(Long roomId) {
 		FileExplorerItem f = new FileExplorerItem();
 		f.setRoomId(roomId);
@@ -96,52 +96,52 @@ public class OmTreeProvider implements I
 		}
 		return f;
 	}
-	
+
 	public FileItem getRoot() {
 		return roots.get(0);
 	}
-	
+
 	@Override
 	public Iterator<FileItem> getRoots() {
 		return roots.iterator();
 	}
 
-	@Override
-	public Iterator<FileItem> getChildren(FileItem node) {
+	public List<FileItem> getByParent(FileItem node, Long id) {
 		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 (id == 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);
+				_list = dao.getByParent(id);
 			}
+			list.addAll(_list);
 		} else {
 			FileExplorerItemDao dao = getBean(FileExplorerItemDao.class);
 			List<FileExplorerItem> _list;
-			if (node.getId() == null) {
+			if (id == 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);
+				_list = dao.getByParent(id);
 			}
+			list.addAll(_list);
 		}
-		return list.iterator();
+		return list;
+	}
+
+	@Override
+	public Iterator<FileItem> getChildren(FileItem node) {
+		return getByParent(node, node.getId()).iterator();
 	}
 
 	@Override

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/theme.css
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/theme.css?rev=1779367&r1=1779366&r2=1779367&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/theme.css (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/theme.css Wed Jan 18 18:16:45 2017
@@ -63,6 +63,13 @@ html, body {
 }
 #busy_indicator span {
 	vertical-align: sub;
+	padding-left: 25px;
+	line-height: 22px;
+	background-image: url(../images/ajax-loader.gif);
+	background-repeat: no-repeat;
+	background-size: 20px 20px;
+	height: 20px;
+	display: inline-block;
 }
 .clickable {
 	cursor: pointer;

Modified: openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java?rev=1779367&r1=1779366&r2=1779367&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java (original)
+++ openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java Wed Jan 18 18:16:45 2017
@@ -22,6 +22,7 @@ import static org.apache.openmeetings.ut
 
 import java.util.Date;
 import java.util.Map;
+import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.openmeetings.core.converter.BaseConverter;
@@ -41,8 +42,8 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.room.Client;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.util.CalendarPatterns;
-import org.apache.openmeetings.util.message.TextRoomMessage;
 import org.apache.openmeetings.util.message.RoomMessage;
+import org.apache.openmeetings.util.message.TextRoomMessage;
 import org.red5.logging.Red5LoggerFactory;
 import org.red5.server.api.IConnection;
 import org.red5.server.api.Red5;
@@ -102,7 +103,7 @@ public class RecordingService implements
 
 			Recording recording = new Recording();
 
-			recording.setHash("");
+			recording.setHash(UUID.randomUUID().toString());
 			recording.setName(roomRecordingName);
 			Long ownerId = client.getUserId();
 			if (ownerId != null && ownerId < 0) {
@@ -201,7 +202,7 @@ public class RecordingService implements
 
 	/**
 	 * Start recording the published stream for the specified broadcast-Id
-	 * 
+	 *
 	 * @param conn
 	 * @param broadcastid
 	 * @param streamName
@@ -243,7 +244,7 @@ public class RecordingService implements
 
 	/**
 	 * Stops recording the publishing stream for the specified IConnection.
-	 * 
+	 *
 	 * @param conn
 	 */
 	public void stopRecordingShow(IConnection conn, String broadcastId, Long metaId) {

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/DownloadMenuItem.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/DownloadMenuItem.java?rev=1779367&r1=1779366&r2=1779367&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/DownloadMenuItem.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/DownloadMenuItem.java Wed Jan 18 18:16:45 2017
@@ -39,7 +39,10 @@ public class DownloadMenuItem extends Me
 
 	@Override
 	public boolean isEnabled() {
-		File f = tree.getLastSelected().getFile(ext);
+		File f = null;
+		if (tree.selectedCount() == 1) {
+			f = tree.getLastSelected().getFile(ext);
+		}
 		return f != null && f.exists();
 	}
 

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=1779367&r1=1779366&r2=1779367&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 Jan 18 18:16:45 2017
@@ -209,6 +209,7 @@ public abstract class FileTreePanel exte
 		boolean isRecording = p instanceof Recording;
 		FileItem f = isRecording ? new Recording() : new FileExplorerItem();
 		f.setName(name);
+		f.setHash(UUID.randomUUID().toString());
 		f.setInsertedBy(getUserId());
 		f.setInserted(new Date());
 		f.setType(Type.Folder);
@@ -232,6 +233,10 @@ public abstract class FileTreePanel exte
 		return selected.containsKey(f.getHash());
 	}
 
+	public int selectedCount() {
+		return selected.size();
+	}
+
 	public FileItem getLastSelected() {
 		return lastSelected;
 	}
@@ -241,6 +246,12 @@ public abstract class FileTreePanel exte
 		handler.add(sizes, trees);
 	}
 
+	private void updateSelected(AjaxRequestTarget target) {
+		for (Entry<String, FileItem> e : selected.entrySet()) {
+			updateNode(target, e.getValue());
+		}
+	}
+
 	void updateNode(AjaxRequestTarget target, FileItem fi) {
 		if (fi != null && target != null) {
 			if (Type.Folder == fi.getType()) {
@@ -251,22 +262,61 @@ public abstract class FileTreePanel exte
 		}
 	}
 
+	private boolean sameParent(FileItem f1, FileItem f2) {
+		if (f1 instanceof Recording && f2 instanceof FileExplorerItem) {
+			return false;
+		}
+		if (f1.getParentId() != null && f1.getParentId().equals(f2.getParentId())) {
+			return true;
+		}
+		if (f1.getParentId() == null && f2.getParentId() == null) {
+			if (f1.getOwnerId() != null && f1.getOwnerId().equals(f2.getOwnerId())) {
+				return true;
+			}
+			if (f1.getRoomId() != null && f1.getRoomId().equals(f2.getRoomId())) {
+				return true;
+			}
+			if (f1.getRoomId() == null && f2.getRoomId() == null && f1.getOwnerId() == null && f2.getOwnerId() == null) {
+				return true;
+			}
+		}
+		return false;
+	}
+
 	public void select(FileItem fi, AjaxRequestTarget target, boolean shift, boolean ctrl) {
-		updateNode(target, lastSelected);
+		updateSelected(target);
 		if (ctrl) {
 			if (isSelected(fi)) {
-				selected.remove(fi.getId());
+				selected.remove(fi.getHash());
 			} else {
 				selected.put(fi.getHash(), fi);
 			}
-		} else if (shift) {
-			//search
+			lastSelected = fi;
+		} else if (shift && lastSelected != null && !lastSelected.getHash().equals(fi.getHash()) && sameParent(fi, lastSelected)) {
+			selected.clear();
+			String lastHash = null;
+			for (FileItem f : ((OmTreeProvider)tree.getProvider()).getByParent(fi, fi.getParentId())) {
+				if (lastHash == null) {
+					if (f.getHash().equals(lastSelected.getHash())) {
+						lastHash = fi.getHash();
+					}
+					if (f.getHash().equals(fi.getHash())) {
+						lastHash = lastSelected.getHash();
+					}
+				}
+				if (lastHash != null) {
+					selected.put(f.getHash(), f);
+					if (f.getHash().equals(lastHash)) {
+						break;
+					}
+				}
+			}
 		} else {
 			selected.clear();
 			selected.put(fi.getHash(), fi);
+			lastSelected = fi;
 		}
-		lastSelected = fi;
-		updateNode(target, lastSelected);
+		updateSelected(target);
 		if (target != null) {
 			target.add(download.setVisible(lastSelected.getType() == Type.Presentation || lastSelected.getType() == Type.Image));
 		}

Modified: 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=1779367&r1=1779366&r2=1779367&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java Wed Jan 18 18:16:45 2017
@@ -67,13 +67,13 @@ public class OmTreeProvider implements I
 		}
 		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);
@@ -81,7 +81,7 @@ public class OmTreeProvider implements I
 		r.setHash(hash);
 		return r;
 	}
-	
+
 	static FileExplorerItem createFileRoot(Long roomId) {
 		FileExplorerItem f = new FileExplorerItem();
 		f.setRoomId(roomId);
@@ -96,52 +96,52 @@ public class OmTreeProvider implements I
 		}
 		return f;
 	}
-	
+
 	public FileItem getRoot() {
 		return roots.get(0);
 	}
-	
+
 	@Override
 	public Iterator<FileItem> getRoots() {
 		return roots.iterator();
 	}
 
-	@Override
-	public Iterator<FileItem> getChildren(FileItem node) {
+	public List<FileItem> getByParent(FileItem node, Long id) {
 		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 (id == 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);
+				_list = dao.getByParent(id);
 			}
+			list.addAll(_list);
 		} else {
 			FileExplorerItemDao dao = getBean(FileExplorerItemDao.class);
 			List<FileExplorerItem> _list;
-			if (node.getId() == null) {
+			if (id == 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);
+				_list = dao.getByParent(id);
 			}
+			list.addAll(_list);
 		}
-		return list.iterator();
+		return list;
+	}
+
+	@Override
+	public Iterator<FileItem> getChildren(FileItem node) {
+		return getByParent(node, node.getId()).iterator();
 	}
 
 	@Override

Modified: openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/theme.css
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/theme.css?rev=1779367&r1=1779366&r2=1779367&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/theme.css (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/theme.css Wed Jan 18 18:16:45 2017
@@ -63,6 +63,13 @@ html, body {
 }
 #busy_indicator span {
 	vertical-align: sub;
+	padding-left: 25px;
+	line-height: 22px;
+	background-image: url(../images/ajax-loader.gif);
+	background-repeat: no-repeat;
+	background-size: 20px 20px;
+	height: 20px;
+	display: inline-block;
 }
 .clickable {
 	cursor: pointer;