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 12:05:52 UTC

svn commit: r1779316 - in /openmeetings/application: branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/ branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/ trunk/openmeetings-web/s...

Author: solomax
Date: Wed Jan 18 12:05:51 2017
New Revision: 1779316

URL: http://svn.apache.org/viewvc?rev=1779316&view=rev
Log:
[OPENMEETINGS-1527] initial work on code clean-up

Added:
    openmeetings/application/branches/3.2.x/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/DownloadMenuItem.java
Modified:
    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.java
    openmeetings/application/branches/3.2.x/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/common/tree/FileItemTree.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/room/sidebar/UploadDialog.java

Added: 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=1779316&view=auto
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/DownloadMenuItem.java (added)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/DownloadMenuItem.java Wed Jan 18 12:05:51 2017
@@ -0,0 +1,53 @@
+/*
+ * 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 java.io.File;
+
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.util.resource.FileResourceStream;
+
+import com.googlecode.wicket.jquery.ui.JQueryIcon;
+import com.googlecode.wicket.jquery.ui.widget.menu.MenuItem;
+
+public class DownloadMenuItem extends MenuItem {
+	private static final long serialVersionUID = 1L;
+	private final String ext;
+	private final FileTreePanel tree;
+
+	public DownloadMenuItem(String title, FileTreePanel tree, String ext) {
+		super(title, JQueryIcon.ARROWTHICKSTOP_1_S);
+		this.ext = ext;
+		this.tree = tree;
+	}
+
+	@Override
+	public boolean isEnabled() {
+		File f = tree.getLastSelected().getFile(ext);
+		return f != null && f.exists();
+	}
+
+	@Override
+	public void onClick(AjaxRequestTarget target) {
+		File f = tree.getLastSelected().getFile(ext);
+		tree.downloader.setFileName(f.getName());
+		tree.downloader.setResourceStream(new FileResourceStream(f));
+		tree.downloader.initiate(target);
+	}
+}

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=1779316&r1=1779315&r2=1779316&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 Jan 18 12:05:51 2017
@@ -58,7 +58,7 @@ public class FileItemTree extends Defaul
 			shift = o.optBoolean(PARAM_SHIFT);
 			ctrl = o.optBoolean(PARAM_CTRL);
 		}
-		treePanel.setSelected(f, target, shift, ctrl);
+		treePanel.select(f, target, shift, ctrl);
 		if (Type.Folder == f.getType() && getState(f) == State.COLLAPSED) {
 			this.expand(f);
 		} else {
@@ -78,13 +78,14 @@ public class FileItemTree extends Defaul
 			@Override
 			protected Component newLabelComponent(String id, final IModel<FileItem> lm) {
 				FileItem r = lm.getObject();
-				return Type.Folder == r.getType() || r.getId() == null ? 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() {
-				FileItem f = getModelObject(), s = treePanel.getSelected();
-				return s.getHash().equals(f.getHash());
+				return treePanel.isSelected(getModelObject());
 			}
 
 			@Override

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=1779316&r1=1779315&r2=1779316&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 12:05:51 2017
@@ -24,10 +24,12 @@ 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.io.File;
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 import java.util.UUID;
 
 import org.apache.openmeetings.db.dao.file.FileExplorerItemDao;
@@ -48,28 +50,25 @@ import org.apache.wicket.markup.html.Web
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.panel.Panel;
-import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
-import org.apache.wicket.util.resource.FileResourceStream;
 
 import com.googlecode.wicket.jquery.core.JQueryBehavior;
 import com.googlecode.wicket.jquery.core.Options;
 import com.googlecode.wicket.jquery.core.ajax.IJQueryAjaxAware;
 import com.googlecode.wicket.jquery.core.ajax.JQueryAjaxBehavior;
-import com.googlecode.wicket.jquery.ui.JQueryIcon;
 import com.googlecode.wicket.jquery.ui.form.button.AjaxSplitButton;
 import com.googlecode.wicket.jquery.ui.interaction.droppable.Droppable;
 import com.googlecode.wicket.jquery.ui.interaction.droppable.DroppableBehavior;
 import com.googlecode.wicket.jquery.ui.widget.menu.IMenuItem;
-import com.googlecode.wicket.jquery.ui.widget.menu.MenuItem;
 
 public abstract class FileTreePanel extends Panel {
 	private static final long serialVersionUID = 1L;
 	final WebMarkupContainer trees = new WebMarkupContainer("tree-container");
 	private final WebMarkupContainer sizes = new WebMarkupContainer("sizes");
-	private final IModel<FileItem> selected = new CompoundPropertyModel<FileItem>((FileItem)null);
-	private final AjaxDownload downloader = new AjaxDownload();
+	private FileItem lastSelected = null;
+	private Map<String, FileItem> selected = new HashMap<>();
+	final AjaxDownload downloader = new AjaxDownload();
 	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));
@@ -82,7 +81,7 @@ public abstract class FileTreePanel exte
 		super(id);
 		this.addFolder = addFolder;
 		OmTreeProvider tp = new OmTreeProvider(roomId);
-		setSelected(tp.getRoot(), null, false, false);
+		select(tp.getRoot(), null, false, false);
 		form.add(tree = new FileItemTree("tree", this, tp));
 		form.add(download.setVisible(false).setOutputMarkupPlaceholderTag(true));
 		add(form.add(downloader));
@@ -164,15 +163,16 @@ public abstract class FileTreePanel exte
 
 			@Override
 			protected void onEvent(AjaxRequestTarget target) {
-				FileItem f = selected.getObject();
-				if (f != null && f.getId() != null) {
+				if (!selected.isEmpty()) {
 					super.onEvent(target);
 				}
 			}
 
 			@Override
 			protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
-				delete(selected.getObject(), target);
+				for (Entry<String, FileItem> e : selected.entrySet()) {
+					delete(e.getValue(), target);
+				}
 			}
 		});
 
@@ -191,8 +191,8 @@ public abstract class FileTreePanel exte
 	}
 
 	void delete(FileItem f, IPartialPageRequestHandler handler) {
-		long id = f.getId();
-		if (id > 0) {
+		Long id = f.getId();
+		if (id != null) {
 			if (f instanceof Recording) {
 				getBean(RecordingDao.class).delete((Recording)f);
 			} else {
@@ -205,7 +205,7 @@ public abstract class FileTreePanel exte
 	protected abstract void update(AjaxRequestTarget target, FileItem f);
 
 	public void createFolder(AjaxRequestTarget target, String name) {
-		FileItem p = selected.getObject();
+		FileItem p = lastSelected;
 		boolean isRecording = p instanceof Recording;
 		FileItem f = isRecording ? new Recording() : new FileExplorerItem();
 		f.setName(name);
@@ -213,6 +213,7 @@ public abstract class FileTreePanel exte
 		f.setInserted(new Date());
 		f.setType(Type.Folder);
 		f.setOwnerId(p.getOwnerId());
+		//TODO lastSelected.parent??
 		f.setParentId(Type.Folder == p.getType() ? p.getId() : null);
 		if (isRecording) {
 			Recording r = (Recording)f;
@@ -227,8 +228,12 @@ public abstract class FileTreePanel exte
 
 	public abstract void updateSizes();
 
-	public FileItem getSelected() {
-		return selected.getObject();
+	public boolean isSelected(FileItem f) {
+		return selected.containsKey(f.getHash());
+	}
+
+	public FileItem getLastSelected() {
+		return lastSelected;
 	}
 
 	public void update(IPartialPageRequestHandler handler) {
@@ -246,19 +251,29 @@ public abstract class FileTreePanel exte
 		}
 	}
 
-	public void setSelected(FileItem fi, AjaxRequestTarget target, boolean shift, boolean ctrl) {
-		FileItem _prev = selected.getObject();
-		updateNode(target, _prev);
+	public void select(FileItem fi, AjaxRequestTarget target, boolean shift, boolean ctrl) {
+		updateNode(target, lastSelected);
+		if (ctrl) {
+			if (isSelected(fi)) {
+				selected.remove(fi.getId());
+			} else {
+				selected.put(fi.getHash(), fi);
+			}
+		} else if (shift) {
+			//search
+		} else {
+			selected.clear();
+			selected.put(fi.getHash(), fi);
+		}
+		lastSelected = fi;
+		updateNode(target, lastSelected);
 		if (target != null) {
-			target.add(download.setVisible(fi.getType() == Type.Presentation || fi.getType() == Type.Image));
+			target.add(download.setVisible(lastSelected.getType() == Type.Presentation || lastSelected.getType() == Type.Image));
 		}
-		selected.setObject(fi);
-		updateNode(target, fi);
 	}
 
 	@Override
 	protected void onDetach() {
-		selected.detach();
 		homeSize.detach();
 		publicSize.detach();
 		super.onDetach();
@@ -268,59 +283,11 @@ public abstract class FileTreePanel exte
 		List<IMenuItem> list = new ArrayList<>();
 
 		//original
-		list.add(new MenuItem(getString("files.download.original"), JQueryIcon.ARROWTHICKSTOP_1_S) {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public boolean isEnabled() {
-				File f = selected.getObject().getFile();
-				return f != null && f.exists();
-			}
-
-			@Override
-			public void onClick(AjaxRequestTarget target) {
-				File f = selected.getObject().getFile();
-				downloader.setFileName(f.getName());
-				downloader.setResourceStream(new FileResourceStream(f));
-				downloader.initiate(target);
-			}
-		});
+		list.add(new DownloadMenuItem(getString("files.download.original"), this, null));
 		//pdf
-		list.add(new MenuItem(getString("files.download.pdf"), JQueryIcon.ARROWTHICKSTOP_1_S) {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public boolean isEnabled() {
-				File f = selected.getObject().getFile(EXTENSION_PDF);
-				return f != null && f.exists();
-			}
-
-			@Override
-			public void onClick(AjaxRequestTarget target) {
-				File f = selected.getObject().getFile(EXTENSION_PDF);
-				downloader.setFileName(f.getName());
-				downloader.setResourceStream(new FileResourceStream(f));
-				downloader.initiate(target);
-			}
-		});
+		list.add(new DownloadMenuItem(getString("files.download.pdf"), this, EXTENSION_PDF));
 		//jpg
-		list.add(new MenuItem(getString("files.download.jpg"), JQueryIcon.ARROWTHICKSTOP_1_S) {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public boolean isEnabled() {
-				File f = selected.getObject().getFile(EXTENSION_JPG);
-				return f != null && f.exists();
-			}
-
-			@Override
-			public void onClick(AjaxRequestTarget target) {
-				File f = selected.getObject().getFile(EXTENSION_JPG);
-				downloader.setFileName(f.getName());
-				downloader.setResourceStream(new FileResourceStream(f));
-				downloader.initiate(target);
-			}
-		});
+		list.add(new DownloadMenuItem(getString("files.download.jpg"), this, EXTENSION_JPG));
 		return list;
 	}
 }

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=1779316&r1=1779315&r2=1779316&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 Jan 18 12:05:51 2017
@@ -102,7 +102,7 @@ public class UploadDialog extends Abstra
 		form.add(feedback.setOutputMarkupId(true), toWb.setOutputMarkupId(true)
 				, cleanBlock.add(cleanWb.setOutputMarkupId(true)).setVisible(false).setOutputMarkupPlaceholderTag(true))
 			.setOutputMarkupId(true);
-	
+
 		form.setMultiPart(true);
 		form.setMaxSize(Bytes.bytes(getBean(ConfigurationDao.class).getMaxUploadSize()));
 		// Model is necessary here to avoid writing image to the User object
@@ -113,11 +113,11 @@ public class UploadDialog extends Abstra
 			@Override
 			public void detach() {
 			}
-			
+
 			@Override
 			public void setObject(List<FileUpload> object) {
 			}
-			
+
 			@Override
 			public List<FileUpload> getObject() {
 				return null;
@@ -147,12 +147,12 @@ public class UploadDialog extends Abstra
 			super.onClick(target, button);
 		}
 	}
-	
+
 	@Override
 	protected List<DialogButton> getButtons() {
 		return Arrays.asList(upload, cancel);
 	}
-	
+
 	@Override
 	public DialogButton getSubmitButton() {
 		return upload;
@@ -171,7 +171,7 @@ public class UploadDialog extends Abstra
 		handler.add(form, fileName);
 		handler.appendJavaScript(String.format("bindUpload('%s', '%s');", form.getMarkupId(), fileName.getMarkupId()));
 	}
-	
+
 	@Override
 	protected void onError(AjaxRequestTarget target) {
 		target.add(feedback);
@@ -184,7 +184,7 @@ public class UploadDialog extends Abstra
 			FileExplorerItem f = new FileExplorerItem();
 			f.setSize(fu.getSize());
 			f.setName(fu.getClientFileName());
-			FileItem parent = roomFiles.getSelected();
+			FileItem parent = roomFiles.getLastSelected();
 			if (parent == null || !(parent instanceof FileExplorerItem)) {
 				f.setOwnerId(getUserId());
 			} else {
@@ -195,7 +195,7 @@ public class UploadDialog extends Abstra
 				}
 			}
 			f.setInsertedBy(getUserId());
-			
+
 			try {
 				ConverterProcessResultList logs = getBean(FileProcessor.class).processFile(getUserId(), f, fu.getInputStream());
 				for (Entry<String, ConverterProcessResult> entry : logs.getJobs().entrySet()) {

Added: 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=1779316&view=auto
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/DownloadMenuItem.java (added)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/DownloadMenuItem.java Wed Jan 18 12:05:51 2017
@@ -0,0 +1,53 @@
+/*
+ * 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 java.io.File;
+
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.util.resource.FileResourceStream;
+
+import com.googlecode.wicket.jquery.ui.JQueryIcon;
+import com.googlecode.wicket.jquery.ui.widget.menu.MenuItem;
+
+public class DownloadMenuItem extends MenuItem {
+	private static final long serialVersionUID = 1L;
+	private final String ext;
+	private final FileTreePanel tree;
+
+	public DownloadMenuItem(String title, FileTreePanel tree, String ext) {
+		super(title, JQueryIcon.ARROWTHICKSTOP_1_S);
+		this.ext = ext;
+		this.tree = tree;
+	}
+
+	@Override
+	public boolean isEnabled() {
+		File f = tree.getLastSelected().getFile(ext);
+		return f != null && f.exists();
+	}
+
+	@Override
+	public void onClick(AjaxRequestTarget target) {
+		File f = tree.getLastSelected().getFile(ext);
+		tree.downloader.setFileName(f.getName());
+		tree.downloader.setResourceStream(new FileResourceStream(f));
+		tree.downloader.initiate(target);
+	}
+}

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=1779316&r1=1779315&r2=1779316&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 Jan 18 12:05:51 2017
@@ -58,7 +58,7 @@ public class FileItemTree extends Defaul
 			shift = o.optBoolean(PARAM_SHIFT);
 			ctrl = o.optBoolean(PARAM_CTRL);
 		}
-		treePanel.setSelected(f, target, shift, ctrl);
+		treePanel.select(f, target, shift, ctrl);
 		if (Type.Folder == f.getType() && getState(f) == State.COLLAPSED) {
 			this.expand(f);
 		} else {
@@ -78,13 +78,14 @@ public class FileItemTree extends Defaul
 			@Override
 			protected Component newLabelComponent(String id, final IModel<FileItem> lm) {
 				FileItem r = lm.getObject();
-				return Type.Folder == r.getType() || r.getId() == null ? 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() {
-				FileItem f = getModelObject(), s = treePanel.getSelected();
-				return s.getHash().equals(f.getHash());
+				return treePanel.isSelected(getModelObject());
 			}
 
 			@Override

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=1779316&r1=1779315&r2=1779316&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 12:05:51 2017
@@ -24,10 +24,12 @@ 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.io.File;
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 import java.util.UUID;
 
 import org.apache.openmeetings.db.dao.file.FileExplorerItemDao;
@@ -48,28 +50,25 @@ import org.apache.wicket.markup.html.Web
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.panel.Panel;
-import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
-import org.apache.wicket.util.resource.FileResourceStream;
 
 import com.googlecode.wicket.jquery.core.JQueryBehavior;
 import com.googlecode.wicket.jquery.core.Options;
 import com.googlecode.wicket.jquery.core.ajax.IJQueryAjaxAware;
 import com.googlecode.wicket.jquery.core.ajax.JQueryAjaxBehavior;
-import com.googlecode.wicket.jquery.ui.JQueryIcon;
 import com.googlecode.wicket.jquery.ui.form.button.AjaxSplitButton;
 import com.googlecode.wicket.jquery.ui.interaction.droppable.Droppable;
 import com.googlecode.wicket.jquery.ui.interaction.droppable.DroppableBehavior;
 import com.googlecode.wicket.jquery.ui.widget.menu.IMenuItem;
-import com.googlecode.wicket.jquery.ui.widget.menu.MenuItem;
 
 public abstract class FileTreePanel extends Panel {
 	private static final long serialVersionUID = 1L;
 	final WebMarkupContainer trees = new WebMarkupContainer("tree-container");
 	private final WebMarkupContainer sizes = new WebMarkupContainer("sizes");
-	private final IModel<FileItem> selected = new CompoundPropertyModel<FileItem>((FileItem)null);
-	private final AjaxDownload downloader = new AjaxDownload();
+	private FileItem lastSelected = null;
+	private Map<String, FileItem> selected = new HashMap<>();
+	final AjaxDownload downloader = new AjaxDownload();
 	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));
@@ -82,7 +81,7 @@ public abstract class FileTreePanel exte
 		super(id);
 		this.addFolder = addFolder;
 		OmTreeProvider tp = new OmTreeProvider(roomId);
-		setSelected(tp.getRoot(), null, false, false);
+		select(tp.getRoot(), null, false, false);
 		form.add(tree = new FileItemTree("tree", this, tp));
 		form.add(download.setVisible(false).setOutputMarkupPlaceholderTag(true));
 		add(form.add(downloader));
@@ -164,15 +163,16 @@ public abstract class FileTreePanel exte
 
 			@Override
 			protected void onEvent(AjaxRequestTarget target) {
-				FileItem f = selected.getObject();
-				if (f != null && f.getId() != null) {
+				if (!selected.isEmpty()) {
 					super.onEvent(target);
 				}
 			}
 
 			@Override
 			protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
-				delete(selected.getObject(), target);
+				for (Entry<String, FileItem> e : selected.entrySet()) {
+					delete(e.getValue(), target);
+				}
 			}
 		});
 
@@ -191,8 +191,8 @@ public abstract class FileTreePanel exte
 	}
 
 	void delete(FileItem f, IPartialPageRequestHandler handler) {
-		long id = f.getId();
-		if (id > 0) {
+		Long id = f.getId();
+		if (id != null) {
 			if (f instanceof Recording) {
 				getBean(RecordingDao.class).delete((Recording)f);
 			} else {
@@ -205,7 +205,7 @@ public abstract class FileTreePanel exte
 	protected abstract void update(AjaxRequestTarget target, FileItem f);
 
 	public void createFolder(AjaxRequestTarget target, String name) {
-		FileItem p = selected.getObject();
+		FileItem p = lastSelected;
 		boolean isRecording = p instanceof Recording;
 		FileItem f = isRecording ? new Recording() : new FileExplorerItem();
 		f.setName(name);
@@ -213,6 +213,7 @@ public abstract class FileTreePanel exte
 		f.setInserted(new Date());
 		f.setType(Type.Folder);
 		f.setOwnerId(p.getOwnerId());
+		//TODO lastSelected.parent??
 		f.setParentId(Type.Folder == p.getType() ? p.getId() : null);
 		if (isRecording) {
 			Recording r = (Recording)f;
@@ -227,8 +228,12 @@ public abstract class FileTreePanel exte
 
 	public abstract void updateSizes();
 
-	public FileItem getSelected() {
-		return selected.getObject();
+	public boolean isSelected(FileItem f) {
+		return selected.containsKey(f.getHash());
+	}
+
+	public FileItem getLastSelected() {
+		return lastSelected;
 	}
 
 	public void update(IPartialPageRequestHandler handler) {
@@ -246,19 +251,29 @@ public abstract class FileTreePanel exte
 		}
 	}
 
-	public void setSelected(FileItem fi, AjaxRequestTarget target, boolean shift, boolean ctrl) {
-		FileItem _prev = selected.getObject();
-		updateNode(target, _prev);
+	public void select(FileItem fi, AjaxRequestTarget target, boolean shift, boolean ctrl) {
+		updateNode(target, lastSelected);
+		if (ctrl) {
+			if (isSelected(fi)) {
+				selected.remove(fi.getId());
+			} else {
+				selected.put(fi.getHash(), fi);
+			}
+		} else if (shift) {
+			//search
+		} else {
+			selected.clear();
+			selected.put(fi.getHash(), fi);
+		}
+		lastSelected = fi;
+		updateNode(target, lastSelected);
 		if (target != null) {
-			target.add(download.setVisible(fi.getType() == Type.Presentation || fi.getType() == Type.Image));
+			target.add(download.setVisible(lastSelected.getType() == Type.Presentation || lastSelected.getType() == Type.Image));
 		}
-		selected.setObject(fi);
-		updateNode(target, fi);
 	}
 
 	@Override
 	protected void onDetach() {
-		selected.detach();
 		homeSize.detach();
 		publicSize.detach();
 		super.onDetach();
@@ -268,59 +283,11 @@ public abstract class FileTreePanel exte
 		List<IMenuItem> list = new ArrayList<>();
 
 		//original
-		list.add(new MenuItem(getString("files.download.original"), JQueryIcon.ARROWTHICKSTOP_1_S) {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public boolean isEnabled() {
-				File f = selected.getObject().getFile();
-				return f != null && f.exists();
-			}
-
-			@Override
-			public void onClick(AjaxRequestTarget target) {
-				File f = selected.getObject().getFile();
-				downloader.setFileName(f.getName());
-				downloader.setResourceStream(new FileResourceStream(f));
-				downloader.initiate(target);
-			}
-		});
+		list.add(new DownloadMenuItem(getString("files.download.original"), this, null));
 		//pdf
-		list.add(new MenuItem(getString("files.download.pdf"), JQueryIcon.ARROWTHICKSTOP_1_S) {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public boolean isEnabled() {
-				File f = selected.getObject().getFile(EXTENSION_PDF);
-				return f != null && f.exists();
-			}
-
-			@Override
-			public void onClick(AjaxRequestTarget target) {
-				File f = selected.getObject().getFile(EXTENSION_PDF);
-				downloader.setFileName(f.getName());
-				downloader.setResourceStream(new FileResourceStream(f));
-				downloader.initiate(target);
-			}
-		});
+		list.add(new DownloadMenuItem(getString("files.download.pdf"), this, EXTENSION_PDF));
 		//jpg
-		list.add(new MenuItem(getString("files.download.jpg"), JQueryIcon.ARROWTHICKSTOP_1_S) {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public boolean isEnabled() {
-				File f = selected.getObject().getFile(EXTENSION_JPG);
-				return f != null && f.exists();
-			}
-
-			@Override
-			public void onClick(AjaxRequestTarget target) {
-				File f = selected.getObject().getFile(EXTENSION_JPG);
-				downloader.setFileName(f.getName());
-				downloader.setResourceStream(new FileResourceStream(f));
-				downloader.initiate(target);
-			}
-		});
+		list.add(new DownloadMenuItem(getString("files.download.jpg"), this, EXTENSION_JPG));
 		return list;
 	}
 }

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=1779316&r1=1779315&r2=1779316&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 Jan 18 12:05:51 2017
@@ -102,7 +102,7 @@ public class UploadDialog extends Abstra
 		form.add(feedback.setOutputMarkupId(true), toWb.setOutputMarkupId(true)
 				, cleanBlock.add(cleanWb.setOutputMarkupId(true)).setVisible(false).setOutputMarkupPlaceholderTag(true))
 			.setOutputMarkupId(true);
-	
+
 		form.setMultiPart(true);
 		form.setMaxSize(Bytes.bytes(getBean(ConfigurationDao.class).getMaxUploadSize()));
 		// Model is necessary here to avoid writing image to the User object
@@ -113,11 +113,11 @@ public class UploadDialog extends Abstra
 			@Override
 			public void detach() {
 			}
-			
+
 			@Override
 			public void setObject(List<FileUpload> object) {
 			}
-			
+
 			@Override
 			public List<FileUpload> getObject() {
 				return null;
@@ -147,12 +147,12 @@ public class UploadDialog extends Abstra
 			super.onClick(target, button);
 		}
 	}
-	
+
 	@Override
 	protected List<DialogButton> getButtons() {
 		return Arrays.asList(upload, cancel);
 	}
-	
+
 	@Override
 	public DialogButton getSubmitButton() {
 		return upload;
@@ -171,7 +171,7 @@ public class UploadDialog extends Abstra
 		handler.add(form, fileName);
 		handler.appendJavaScript(String.format("bindUpload('%s', '%s');", form.getMarkupId(), fileName.getMarkupId()));
 	}
-	
+
 	@Override
 	protected void onError(AjaxRequestTarget target) {
 		target.add(feedback);
@@ -184,7 +184,7 @@ public class UploadDialog extends Abstra
 			FileExplorerItem f = new FileExplorerItem();
 			f.setSize(fu.getSize());
 			f.setName(fu.getClientFileName());
-			FileItem parent = roomFiles.getSelected();
+			FileItem parent = roomFiles.getLastSelected();
 			if (parent == null || !(parent instanceof FileExplorerItem)) {
 				f.setOwnerId(getUserId());
 			} else {
@@ -195,7 +195,7 @@ public class UploadDialog extends Abstra
 				}
 			}
 			f.setInsertedBy(getUserId());
-			
+
 			try {
 				ConverterProcessResultList logs = getBean(FileProcessor.class).processFile(getUserId(), f, fu.getInputStream());
 				for (Entry<String, ConverterProcessResult> entry : logs.getJobs().entrySet()) {