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/04/05 03:56:54 UTC

svn commit: r1790175 [1/2] - in /openmeetings/application: branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/ branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/ branches/3.2.x/openmeetings-w...

Author: solomax
Date: Wed Apr  5 03:56:54 2017
New Revision: 1790175

URL: http://svn.apache.org/viewvc?rev=1790175&view=rev
Log:
[OPENMEETINGS-551] basic save is added, code clean-up

Added:
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.html
      - copied, changed from r1790174, openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.html
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.java
      - copied, changed from r1790174, openmeetings/application/branches/3.2.x/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/NameDialog.html
      - copied, changed from r1790174, openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.html
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.java
      - copied, changed from r1790174, openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.java
Removed:
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.html
    openmeetings/application/branches/3.2.x/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/AddFolderDialog.html
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.java
Modified:
    openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileExplorerItemDTO.java
    openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomOptionsDTO.java
    openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboard.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/RoomFilePanel.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessagesContactsPanel.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/WEB-INF/web.xml
    openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileExplorerItemDTO.java
    openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboard.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/RoomFilePanel.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/fabric.js
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/fabric.min.js
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessagesContactsPanel.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java
    openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/web.xml

Modified: openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileExplorerItemDTO.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileExplorerItemDTO.java?rev=1790175&r1=1790174&r2=1790175&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileExplorerItemDTO.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileExplorerItemDTO.java Wed Apr  5 03:56:54 2017
@@ -31,7 +31,7 @@ import org.apache.openmeetings.db.entity
 
 /**
  * This Object will represent a File on the File-System
- * 
+ *
  * @author sebastianwagner
  *
  */
@@ -44,6 +44,7 @@ public class FileExplorerItemDTO impleme
 	private String hash;
 	private Long parentId;
 	private Long roomId;
+	private Long groupId;
 	private Long ownerId;
 	private Long size;
 	private String externalId;
@@ -60,6 +61,7 @@ public class FileExplorerItemDTO impleme
 		hash = f.getHash();
 		parentId = f.getParentId();
 		roomId = f.getRoomId();
+		groupId = f.getGroupId();
 		ownerId = f.getOwnerId();
 		size = f.getSize();
 		externalId = f.getExternalId();
@@ -68,7 +70,7 @@ public class FileExplorerItemDTO impleme
 		width = f.getWidth();
 		height = f.getHeight();
 	}
-	
+
 	public FileExplorerItem get() {
 		FileExplorerItem f = new FileExplorerItem();
 		f.setId(id);
@@ -76,6 +78,7 @@ public class FileExplorerItemDTO impleme
 		f.setHash(hash);
 		f.setParentId(parentId != null && parentId > 0 ? parentId : null);
 		f.setRoomId(roomId != null && roomId > 0 ? roomId : null);
+		f.setRoomId(groupId != null && groupId > 0 ? groupId : null);
 		f.setOwnerId(ownerId != null && ownerId > 0 ? ownerId : null);
 		f.setSize(size);
 		f.setExternalId(externalId);
@@ -85,11 +88,11 @@ public class FileExplorerItemDTO impleme
 		f.setHeight(height);
 		return f;
 	}
-	
+
 	public Long getId() {
 		return id;
 	}
-	
+
 	public void setId(Long id) {
 		this.id = id;
 	}
@@ -126,6 +129,14 @@ public class FileExplorerItemDTO impleme
 		this.roomId = roomId;
 	}
 
+	public Long getGroupId() {
+		return groupId;
+	}
+
+	public void setGroupId(Long groupId) {
+		this.groupId = groupId;
+	}
+
 	public Long getOwnerId() {
 		return ownerId;
 	}

Modified: openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomOptionsDTO.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomOptionsDTO.java?rev=1790175&r1=1790174&r2=1790175&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomOptionsDTO.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomOptionsDTO.java Wed Apr  5 03:56:54 2017
@@ -28,7 +28,6 @@ import javax.xml.bind.annotation.XmlRoot
 
 import com.github.openjson.JSONObject;
 
-
 @XmlRootElement
 @XmlAccessorType(XmlAccessType.FIELD)
 public class RoomOptionsDTO implements Serializable {

Modified: openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboard.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboard.java?rev=1790175&r1=1790174&r2=1790175&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboard.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboard.java Wed Apr  5 03:56:54 2017
@@ -20,12 +20,13 @@ package org.apache.openmeetings.db.dto.r
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 
+import java.util.Collections;
 import java.util.Date;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
 
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
@@ -37,7 +38,7 @@ public class Whiteboard {
 	private Integer y = 0;
 	private Integer zoom = 100;
 	private Boolean fullFit = true;
-	private Map<String, List<Object>> roomItems = new ConcurrentHashMap<>();
+	private Map<String, List<Object>> roomItems = Collections.synchronizedMap(new LinkedHashMap<>());
 	private Date created = new Date();
 	private int zIndex = 1;
 	private String name;

Copied: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.html (from r1790174, openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.html)
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.html?p2=openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.html&p1=openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.html&r1=1790174&r2=1790175&rev=1790175&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.html (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.html Wed Apr  5 03:56:54 2017
@@ -7,21 +7,21 @@
   to you under the Apache License, Version 2.0 (the
   "License"); you may not use this file except in compliance
   with the License.  You may obtain a copy of the License at
-  
+
       http://www.apache.org/licenses/LICENSE-2.0
-    	  
+
   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   KIND, either express or implied.  See the License for the
   specific language governing permissions and limitations
   under the License.
-  
+
 -->
 <html xmlns:wicket="http://wicket.apache.org">
 <wicket:panel>
 	<form wicket:id="form">
-		<span style="padding-left: 20px; padding-right: 20px;"><wicket:message key="572"/></span><input type="text" wicket:id="title"/>
+		<label style="padding-left: 20px; padding-right: 20px;" wicket:id="label"></label><input type="text" wicket:id="title"/>
 		<div wicket:id="feedback"></div>
 		<input type="submit" wicket:id="submit" class="invisible-form-component"/>
 	</form>

Copied: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.java (from r1790174, 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/NameDialog.java?p2=openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.java&p1=openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.java&r1=1790174&r2=1790175&rev=1790175&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/NameDialog.java Wed Apr  5 03:56:54 2017
@@ -25,51 +25,57 @@ import org.apache.openmeetings.web.app.A
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
+import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.RequiredTextField;
-import org.apache.wicket.markup.html.panel.FeedbackPanel;
 import org.apache.wicket.model.Model;
 
+import com.googlecode.wicket.jquery.core.Options;
 import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
+import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
 
-public abstract class AddFolderDialog extends AbstractFormDialog<String> {
+public abstract class NameDialog extends AbstractFormDialog<String> {
 	private static final long serialVersionUID = 1L;
-	private final DialogButton add = new DialogButton("add", Application.getString(1261));
+	private final DialogButton add;
 	private final DialogButton cancel = new DialogButton("cancel", Application.getString(219));
 	private final Form<String> form;
-	private final FeedbackPanel feedback = new FeedbackPanel("feedback");
+	private final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
 	private final String name;
 	private RequiredTextField<String> title;
 
-	public AddFolderDialog(String id) {
+	public NameDialog(String id) {
 		this(id, null);
 	}
 
-	public AddFolderDialog(String id, String name) {
-		super(id, Application.getString(1260), Model.of(name));
+	public NameDialog(String id, String name) {
+		super(id, "", Model.of(name));
 		this.name = name;
-		form = new Form<String>("form", getModel()) {
-			private static final long serialVersionUID = 1L;
-			{
-				add(title = new RequiredTextField<>("title", getModel()));
-				title.setLabel(Model.of(Application.getString(572)));
-				add(feedback.setOutputMarkupId(true));
-				add(new AjaxButton("submit") { //FAKE button so "submit-on-enter" works as expected
+		add = new DialogButton("add", getAddStr());
+		form = new Form<>("form", getModel());
+	}
+
+	@Override
+	protected void onInitialize() {
+		super.onInitialize();
+		setTitle(Model.of(getTitleStr()));
+		form.add(new Label("label", getLabelStr())
+				, title = new RequiredTextField<>("title", getModel())
+				, feedback.setOutputMarkupId(true)
+				, new AjaxButton("submit") { //FAKE button so "submit-on-enter" works as expected
 					private static final long serialVersionUID = 1L;
 
 					@Override
 					protected void onSubmit(AjaxRequestTarget target) {
-						AddFolderDialog.this.onSubmit(target);
+						NameDialog.this.onSubmit(target);
 					}
 
 					@Override
 					protected void onError(AjaxRequestTarget target) {
-						AddFolderDialog.this.onError(target);
+						NameDialog.this.onError(target);
 					}
 				});
-			}
-		};
+		title.setLabel(Model.of(getLabelStr()));
 		add(form.setOutputMarkupId(true));
 	}
 
@@ -104,4 +110,16 @@ public abstract class AddFolderDialog ex
 	protected void onError(AjaxRequestTarget target) {
 		target.add(feedback);
 	}
+
+	protected String getTitleStr() {
+		return getString("1260");
+	}
+
+	protected String getLabelStr() {
+		return getString("572");
+	}
+
+	protected String getAddStr() {
+		return Application.getString("1261");
+	}
 }

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=1790175&r1=1790174&r2=1790175&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 Apr  5 03:56:54 2017
@@ -38,7 +38,7 @@ import org.apache.openmeetings.db.entity
 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.web.common.AddFolderDialog;
+import org.apache.openmeetings.web.common.NameDialog;
 import org.apache.openmeetings.web.common.ConfirmableAjaxBorder;
 import org.apache.openmeetings.web.common.ConfirmableAjaxBorder.ConfirmableBorderDialog;
 import org.apache.openmeetings.web.util.AjaxDownload;
@@ -91,7 +91,7 @@ public abstract class FileTreePanel exte
 		}
 	};
 	private final Form<Void> form = new Form<>("form");
-	private final AddFolderDialog addFolder;
+	private final NameDialog addFolder;
 	private final ConfirmableBorderDialog trashConfirm;
 	private ConfirmableAjaxBorder trashBorder;
 	private final Long roomId;
@@ -106,7 +106,7 @@ public abstract class FileTreePanel exte
 	});
 	private final Component upload = new WebMarkupContainer("upload");
 
-	public FileTreePanel(String id, Long roomId, AddFolderDialog addFolder, ConfirmableBorderDialog trashConfirm) {
+	public FileTreePanel(String id, Long roomId, NameDialog addFolder, ConfirmableBorderDialog trashConfirm) {
 		super(id);
 		this.roomId = roomId;
 		this.addFolder = addFolder;

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=1790175&r1=1790174&r2=1790175&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 Apr  5 03:56:54 2017
@@ -26,7 +26,7 @@ import org.apache.openmeetings.db.dao.fi
 import org.apache.openmeetings.db.dao.record.RecordingDao;
 import org.apache.openmeetings.db.dto.record.RecordingContainerData;
 import org.apache.openmeetings.db.entity.file.FileItem;
-import org.apache.openmeetings.web.common.AddFolderDialog;
+import org.apache.openmeetings.web.common.NameDialog;
 import org.apache.openmeetings.web.common.ConfirmableAjaxBorder.ConfirmableBorderDialog;
 import org.apache.openmeetings.web.common.tree.FileTreePanel;
 import org.apache.openmeetings.web.room.RoomPanel;
@@ -38,7 +38,7 @@ public class RoomFilePanel extends FileT
 	private static final long serialVersionUID = 1L;
 	private final RoomPanel room;
 
-	public RoomFilePanel(String id, RoomPanel room, AddFolderDialog addFolder, ConfirmableBorderDialog trashConfirm) {
+	public RoomFilePanel(String id, RoomPanel room, NameDialog addFolder, ConfirmableBorderDialog trashConfirm) {
 		super(id, room.getRoom().getId(), addFolder, trashConfirm);
 		this.room = room;
 	}

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java?rev=1790175&r1=1790174&r2=1790175&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java Wed Apr  5 03:56:54 2017
@@ -34,7 +34,7 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.room.Room.Right;
 import org.apache.openmeetings.db.entity.room.Room.RoomElement;
 import org.apache.openmeetings.web.app.Application;
-import org.apache.openmeetings.web.common.AddFolderDialog;
+import org.apache.openmeetings.web.common.NameDialog;
 import org.apache.openmeetings.web.common.ConfirmableAjaxBorder;
 import org.apache.openmeetings.web.common.ConfirmableAjaxBorder.ConfirmableBorderDialog;
 import org.apache.openmeetings.web.room.RoomBroadcaster;
@@ -97,7 +97,7 @@ public class RoomSidebar extends Panel {
 			item.add(new RoomClientPanel("user", item, room));
 		}
 	};
-	private final AddFolderDialog addFolder = new AddFolderDialog("addFolder", Application.getString(712)) {
+	private final NameDialog addFolder = new NameDialog("addFolder", Application.getString(712)) {
 		private static final long serialVersionUID = 1L;
 
 		@Override

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessagesContactsPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessagesContactsPanel.java?rev=1790175&r1=1790174&r2=1790175&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessagesContactsPanel.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessagesContactsPanel.java Wed Apr  5 03:56:54 2017
@@ -44,7 +44,7 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.user.UserContact;
 import org.apache.openmeetings.web.admin.SearchableDataView;
 import org.apache.openmeetings.web.app.Application;
-import org.apache.openmeetings.web.common.AddFolderDialog;
+import org.apache.openmeetings.web.common.NameDialog;
 import org.apache.openmeetings.web.common.ConfirmableAjaxBorder;
 import org.apache.openmeetings.web.common.PagedEntityListPanel;
 import org.apache.openmeetings.web.common.UserPanel;
@@ -265,7 +265,7 @@ public class MessagesContactsPanel exten
 		foldersModel.setObject(getBean(PrivateMessageFolderDao.class).get(0, Integer.MAX_VALUE));
 		updateMoveModel();
 
-		final AddFolderDialog addFolder = new AddFolderDialog("addFolder") {
+		final NameDialog addFolder = new NameDialog("addFolder") {
 			private static final long serialVersionUID = 1L;
 
 			@Override

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=1790175&r1=1790174&r2=1790175&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 Apr  5 03:56:54 2017
@@ -26,7 +26,7 @@ import org.apache.openmeetings.db.dao.re
 import org.apache.openmeetings.db.dto.record.RecordingContainerData;
 import org.apache.openmeetings.db.entity.file.FileItem;
 import org.apache.openmeetings.web.app.Application;
-import org.apache.openmeetings.web.common.AddFolderDialog;
+import org.apache.openmeetings.web.common.NameDialog;
 import org.apache.openmeetings.web.common.UserPanel;
 import org.apache.openmeetings.web.common.tree.FileTreePanel;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -35,7 +35,7 @@ public class RecordingsPanel extends Use
 	private static final long serialVersionUID = 1L;
 	private final VideoPlayer video = new VideoPlayer("video");
 	private final VideoInfo info = new VideoInfo("info");
-	private final AddFolderDialog addFolder = new AddFolderDialog("addFolder", Application.getString(712)) {
+	private final NameDialog addFolder = new NameDialog("addFolder", Application.getString(712)) {
 		private static final long serialVersionUID = 1L;
 
 		@Override

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/WEB-INF/web.xml?rev=1790175&r1=1790174&r2=1790175&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/WEB-INF/web.xml (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/WEB-INF/web.xml Wed Apr  5 03:56:54 2017
@@ -7,20 +7,20 @@
   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.
-  
+
 -->
-<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
+<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
 	<context-param>
 		<param-name>globalScope</param-name>
 		<param-value>default</param-value>

Modified: openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileExplorerItemDTO.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileExplorerItemDTO.java?rev=1790175&r1=1790174&r2=1790175&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileExplorerItemDTO.java (original)
+++ openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileExplorerItemDTO.java Wed Apr  5 03:56:54 2017
@@ -31,7 +31,7 @@ import org.apache.openmeetings.db.entity
 
 /**
  * This Object will represent a File on the File-System
- * 
+ *
  * @author sebastianwagner
  *
  */
@@ -44,6 +44,7 @@ public class FileExplorerItemDTO impleme
 	private String hash;
 	private Long parentId;
 	private Long roomId;
+	private Long groupId;
 	private Long ownerId;
 	private Long size;
 	private String externalId;
@@ -60,6 +61,7 @@ public class FileExplorerItemDTO impleme
 		hash = f.getHash();
 		parentId = f.getParentId();
 		roomId = f.getRoomId();
+		groupId = f.getGroupId();
 		ownerId = f.getOwnerId();
 		size = f.getSize();
 		externalId = f.getExternalId();
@@ -68,7 +70,7 @@ public class FileExplorerItemDTO impleme
 		width = f.getWidth();
 		height = f.getHeight();
 	}
-	
+
 	public FileExplorerItem get() {
 		FileExplorerItem f = new FileExplorerItem();
 		f.setId(id);
@@ -76,6 +78,7 @@ public class FileExplorerItemDTO impleme
 		f.setHash(hash);
 		f.setParentId(parentId != null && parentId > 0 ? parentId : null);
 		f.setRoomId(roomId != null && roomId > 0 ? roomId : null);
+		f.setRoomId(groupId != null && groupId > 0 ? groupId : null);
 		f.setOwnerId(ownerId != null && ownerId > 0 ? ownerId : null);
 		f.setSize(size);
 		f.setExternalId(externalId);
@@ -85,11 +88,11 @@ public class FileExplorerItemDTO impleme
 		f.setHeight(height);
 		return f;
 	}
-	
+
 	public Long getId() {
 		return id;
 	}
-	
+
 	public void setId(Long id) {
 		this.id = id;
 	}
@@ -126,6 +129,14 @@ public class FileExplorerItemDTO impleme
 		this.roomId = roomId;
 	}
 
+	public Long getGroupId() {
+		return groupId;
+	}
+
+	public void setGroupId(Long groupId) {
+		this.groupId = groupId;
+	}
+
 	public Long getOwnerId() {
 		return ownerId;
 	}

Modified: openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboard.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboard.java?rev=1790175&r1=1790174&r2=1790175&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboard.java (original)
+++ openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboard.java Wed Apr  5 03:56:54 2017
@@ -140,4 +140,15 @@ public class Whiteboard {
 	public void setSlide(int slide) {
 		this.slide = slide;
 	}
+
+	public JSONObject toJson() {
+		//deep-copy
+		JSONObject json = new JSONObject(new JSONObject(this).toString());
+		json.remove("id"); //filtering
+		JSONObject items = json.getJSONObject("roomItems");
+		for (String uid : items.keySet()) {
+			items.getJSONObject(uid).remove("_src"); //filtering
+		}
+		return json;
+	}
 }

Copied: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.html (from r1790174, openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.html)
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.html?p2=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.html&p1=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.html&r1=1790174&r2=1790175&rev=1790175&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.html (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.html Wed Apr  5 03:56:54 2017
@@ -7,21 +7,21 @@
   to you under the Apache License, Version 2.0 (the
   "License"); you may not use this file except in compliance
   with the License.  You may obtain a copy of the License at
-  
+
       http://www.apache.org/licenses/LICENSE-2.0
-    	  
+
   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   KIND, either express or implied.  See the License for the
   specific language governing permissions and limitations
   under the License.
-  
+
 -->
 <html xmlns:wicket="http://wicket.apache.org">
 <wicket:panel>
 	<form wicket:id="form">
-		<span style="padding-left: 20px; padding-right: 20px;"><wicket:message key="572"/></span><input type="text" wicket:id="title"/>
+		<label style="padding-left: 20px; padding-right: 20px;" wicket:id="label"></label><input type="text" wicket:id="title"/>
 		<div wicket:id="feedback"></div>
 		<input type="submit" wicket:id="submit" class="invisible-form-component"/>
 	</form>

Copied: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.java (from r1790174, 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/NameDialog.java?p2=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.java&p1=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.java&r1=1790174&r2=1790175&rev=1790175&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/NameDialog.java Wed Apr  5 03:56:54 2017
@@ -25,51 +25,57 @@ import org.apache.openmeetings.web.app.A
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
+import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.RequiredTextField;
-import org.apache.wicket.markup.html.panel.FeedbackPanel;
 import org.apache.wicket.model.Model;
 
+import com.googlecode.wicket.jquery.core.Options;
 import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
+import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
 
-public abstract class AddFolderDialog extends AbstractFormDialog<String> {
+public abstract class NameDialog extends AbstractFormDialog<String> {
 	private static final long serialVersionUID = 1L;
-	private final DialogButton add = new DialogButton("add", Application.getString(1261));
+	private final DialogButton add;
 	private final DialogButton cancel = new DialogButton("cancel", Application.getString(219));
 	private final Form<String> form;
-	private final FeedbackPanel feedback = new FeedbackPanel("feedback");
+	private final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
 	private final String name;
 	private RequiredTextField<String> title;
 
-	public AddFolderDialog(String id) {
+	public NameDialog(String id) {
 		this(id, null);
 	}
 
-	public AddFolderDialog(String id, String name) {
-		super(id, Application.getString(1260), Model.of(name));
+	public NameDialog(String id, String name) {
+		super(id, "", Model.of(name));
 		this.name = name;
-		form = new Form<String>("form", getModel()) {
-			private static final long serialVersionUID = 1L;
-			{
-				add(title = new RequiredTextField<>("title", getModel()));
-				title.setLabel(Model.of(Application.getString(572)));
-				add(feedback.setOutputMarkupId(true));
-				add(new AjaxButton("submit") { //FAKE button so "submit-on-enter" works as expected
+		add = new DialogButton("add", getAddStr());
+		form = new Form<>("form", getModel());
+	}
+
+	@Override
+	protected void onInitialize() {
+		super.onInitialize();
+		setTitle(Model.of(getTitleStr()));
+		form.add(new Label("label", getLabelStr())
+				, title = new RequiredTextField<>("title", getModel())
+				, feedback.setOutputMarkupId(true)
+				, new AjaxButton("submit") { //FAKE button so "submit-on-enter" works as expected
 					private static final long serialVersionUID = 1L;
 
 					@Override
 					protected void onSubmit(AjaxRequestTarget target) {
-						AddFolderDialog.this.onSubmit(target);
+						NameDialog.this.onSubmit(target);
 					}
 
 					@Override
 					protected void onError(AjaxRequestTarget target) {
-						AddFolderDialog.this.onError(target);
+						NameDialog.this.onError(target);
 					}
 				});
-			}
-		};
+		title.setLabel(Model.of(getLabelStr()));
 		add(form.setOutputMarkupId(true));
 	}
 
@@ -104,4 +110,16 @@ public abstract class AddFolderDialog ex
 	protected void onError(AjaxRequestTarget target) {
 		target.add(feedback);
 	}
+
+	protected String getTitleStr() {
+		return getString("1260");
+	}
+
+	protected String getLabelStr() {
+		return getString("572");
+	}
+
+	protected String getAddStr() {
+		return Application.getString("1261");
+	}
 }

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=1790175&r1=1790174&r2=1790175&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 Apr  5 03:56:54 2017
@@ -38,7 +38,7 @@ import org.apache.openmeetings.db.entity
 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.web.common.AddFolderDialog;
+import org.apache.openmeetings.web.common.NameDialog;
 import org.apache.openmeetings.web.common.ConfirmableAjaxBorder;
 import org.apache.openmeetings.web.common.ConfirmableAjaxBorder.ConfirmableBorderDialog;
 import org.apache.openmeetings.web.util.AjaxDownload;
@@ -91,7 +91,7 @@ public abstract class FileTreePanel exte
 		}
 	};
 	private final Form<Void> form = new Form<>("form");
-	private final AddFolderDialog addFolder;
+	private final NameDialog addFolder;
 	private final ConfirmableBorderDialog trashConfirm;
 	private ConfirmableAjaxBorder trashBorder;
 	private final Long roomId;
@@ -106,7 +106,7 @@ public abstract class FileTreePanel exte
 	});
 	private final Component upload = new WebMarkupContainer("upload");
 
-	public FileTreePanel(String id, Long roomId, AddFolderDialog addFolder, ConfirmableBorderDialog trashConfirm) {
+	public FileTreePanel(String id, Long roomId, NameDialog addFolder, ConfirmableBorderDialog trashConfirm) {
 		super(id);
 		this.roomId = roomId;
 		this.addFolder = addFolder;

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=1790175&r1=1790174&r2=1790175&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 Apr  5 03:56:54 2017
@@ -26,7 +26,7 @@ import org.apache.openmeetings.db.dao.fi
 import org.apache.openmeetings.db.dao.record.RecordingDao;
 import org.apache.openmeetings.db.dto.record.RecordingContainerData;
 import org.apache.openmeetings.db.entity.file.FileItem;
-import org.apache.openmeetings.web.common.AddFolderDialog;
+import org.apache.openmeetings.web.common.NameDialog;
 import org.apache.openmeetings.web.common.ConfirmableAjaxBorder.ConfirmableBorderDialog;
 import org.apache.openmeetings.web.common.tree.FileTreePanel;
 import org.apache.openmeetings.web.room.RoomPanel;
@@ -38,7 +38,7 @@ public class RoomFilePanel extends FileT
 	private static final long serialVersionUID = 1L;
 	private final RoomPanel room;
 
-	public RoomFilePanel(String id, RoomPanel room, AddFolderDialog addFolder, ConfirmableBorderDialog trashConfirm) {
+	public RoomFilePanel(String id, RoomPanel room, NameDialog addFolder, ConfirmableBorderDialog trashConfirm) {
 		super(id, room.getRoom().getId(), addFolder, trashConfirm);
 		this.room = room;
 	}

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java?rev=1790175&r1=1790174&r2=1790175&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java Wed Apr  5 03:56:54 2017
@@ -34,7 +34,7 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.room.Room.Right;
 import org.apache.openmeetings.db.entity.room.Room.RoomElement;
 import org.apache.openmeetings.web.app.Application;
-import org.apache.openmeetings.web.common.AddFolderDialog;
+import org.apache.openmeetings.web.common.NameDialog;
 import org.apache.openmeetings.web.common.ConfirmableAjaxBorder;
 import org.apache.openmeetings.web.common.ConfirmableAjaxBorder.ConfirmableBorderDialog;
 import org.apache.openmeetings.web.room.RoomBroadcaster;
@@ -97,7 +97,7 @@ public class RoomSidebar extends Panel {
 			item.add(new RoomClientPanel("user", item, room));
 		}
 	};
-	private final AddFolderDialog addFolder = new AddFolderDialog("addFolder", Application.getString(712)) {
+	private final NameDialog addFolder = new NameDialog("addFolder", Application.getString(712)) {
 		private static final long serialVersionUID = 1L;
 
 		@Override

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html?rev=1790175&r1=1790174&r2=1790175&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html Wed Apr  5 03:56:54 2017
@@ -61,7 +61,6 @@
 			<div wicket:message="title:62" class="ui-widget-header clickable om-icon big clear-all"></div>
 			<div wicket:message="title:1005" class="ui-widget-header clickable om-icon big clear-slide"></div>
 			<div wicket:message="title:197" class="ui-widget-header clickable om-icon big save"></div>
-<!-- save-as filename -->
 			<div wicket:message="title:70" class="ui-widget-header clickable om-icon big undo"></div>
 
 			<div wicket:message="title:72" class="ui-widget-header clickable om-icon big pointer"></div>
@@ -118,5 +117,6 @@
 			<wicket:message key="1359"/>
 		</div>
 	</div>
+	<div wicket:id="filename"></div>
 </wicket:panel>
 </html>

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java?rev=1790175&r1=1790174&r2=1790175&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java Wed Apr  5 03:56:54 2017
@@ -39,6 +39,8 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.room.Room.Right;
 import org.apache.openmeetings.db.entity.room.Room.RoomElement;
 import org.apache.openmeetings.util.OmFileHelper;
+import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.common.NameDialog;
 import org.apache.openmeetings.web.room.RoomPanel;
 import org.apache.openmeetings.web.room.RoomResourceReference;
 import org.apache.openmeetings.web.user.record.JpgRecordingResourceReference;
@@ -79,16 +81,18 @@ public class WbPanel extends Panel {
 	private boolean readOnly = true;
 	private final Long roomId;
 	private final RoomPanel rp;
+	private long wb2save = -1;
 	private enum Action {
 		createWb
 		, removeWb
-		, activeWb
+		, activateWb
 		, setSlide
 		, createObj
 		, modifyObj
 		, deleteObj
 		, clearAll
 		, clearSlide
+		, save
 	}
 	private final AbstractDefaultAjaxBehavior wbAction = new AbstractDefaultAjaxBehavior() {
 		private static final long serialVersionUID = 1L;
@@ -106,7 +110,7 @@ public class WbPanel extends Panel {
 				JSONObject obj = sv.isEmpty() ? new JSONObject() : new JSONObject(sv.toString());
 				if (Action.createObj == a || Action.modifyObj == a) {
 					if ("pointer".equals(obj.getJSONObject("obj").getString("type"))) {
-						sendWbOthers(String.format("WbArea.%s", a.name()), obj);
+						sendWbOthers(a, obj);
 						return;
 					}
 				}
@@ -117,7 +121,7 @@ public class WbPanel extends Panel {
 						case createWb:
 						{
 							Whiteboard wb = getBean(WhiteboardCache.class).add(roomId, rp.getClient().getUser().getLanguageId());
-							sendWbAll("WbArea.add", getAddWbJson(wb.getId(), wb.getName()));
+							sendWbAll(Action.createWb, getAddWbJson(wb.getId(), wb.getName()));
 						}
 							break;
 						case removeWb:
@@ -125,16 +129,16 @@ public class WbPanel extends Panel {
 							long _id = obj.optLong("id", -1);
 							Long id = _id < 0 ? null : _id;
 							getBean(WhiteboardCache.class).remove(roomId, id);
-							sendWbAll("WbArea.remove", new JSONObject().put("id", id));
+							sendWbAll(Action.removeWb, new JSONObject().put("id", id));
 						}
 							break;
-						case activeWb:
+						case activateWb:
 						{
 							long _id = obj.optLong("id", -1);
 							if (_id > -1) {
 								Whiteboards wbs = getBean(WhiteboardCache.class).get(roomId);
 								wbs.setActiveWb(_id);
-								sendWbAll("WbArea.activate", new JSONObject().put("id", _id));
+								sendWbAll(Action.activateWb, new JSONObject().put("id", _id));
 							}
 						}
 							break;
@@ -142,7 +146,7 @@ public class WbPanel extends Panel {
 						{
 							Whiteboard wb = getBean(WhiteboardCache.class).get(roomId).get(obj.getLong("wbId"));
 							wb.setSlide(obj.optInt("slide", 0));
-							sendWbOthers(String.format("WbArea.%s", a.name()), obj);
+							sendWbOthers(Action.setSlide, obj);
 						}
 							break;
 						case createObj:
@@ -150,7 +154,7 @@ public class WbPanel extends Panel {
 							Whiteboard wb = getBean(WhiteboardCache.class).get(roomId).get(obj.getLong("wbId"));
 							JSONObject o = obj.getJSONObject("obj");
 							wb.put(o.getString("uid"), o);
-							sendWbOthers(String.format("WbArea.%s", a.name()), obj);
+							sendWbOthers(Action.createObj, obj);
 						}
 							break;
 						case modifyObj:
@@ -166,7 +170,7 @@ public class WbPanel extends Panel {
 									wb.put(_o.getString("uid"), _o);
 								}
 							}
-							sendWbOthers(String.format("WbArea.%s", a.name()), obj);
+							sendWbOthers(Action.modifyObj, obj);
 						}
 						case deleteObj:
 						{
@@ -175,23 +179,27 @@ public class WbPanel extends Panel {
 							for (int i = 0; i < arr.length(); ++i) {
 								wb.remove(arr.getString(i));
 							}
-							sendWbAll("WbArea.removeObj", obj);
+							sendWbAll(Action.deleteObj, obj);
 						}
 							break;
 						case clearAll:
 						{
 							Whiteboard wb = getBean(WhiteboardCache.class).get(roomId).get(obj.getLong("wbId"));
 							wb.clear();
-							sendWbAll("WbArea.clearAll", obj);
+							sendWbAll(Action.clearAll, obj);
 						}
 							break;
 						case clearSlide:
 						{
 							Whiteboard wb = getBean(WhiteboardCache.class).get(roomId).get(obj.getLong("wbId"));
 							wb.entrySet().removeIf(e -> e.getValue().optInt("slide", -1) == obj.getInt("slide"));
-							sendWbAll("WbArea.clearSlide", obj);
+							sendWbAll(Action.clearSlide, obj);
 						}
 							break;
+						case save:
+							wb2save = obj.getLong("wbId");
+							fileName.open(target);
+							break;
 					}
 				}
 			} catch (Exception e) {
@@ -199,6 +207,30 @@ public class WbPanel extends Panel {
 			}
 		}
 	};
+	private final NameDialog fileName = new NameDialog("filename") {
+		private static final long serialVersionUID = 1L;
+
+		@Override
+		protected void onSubmit(AjaxRequestTarget target) {
+			Whiteboard wb = getBean(WhiteboardCache.class).get(roomId).get(wb2save);
+			wb.toJson();
+		}
+
+		@Override
+		protected String getTitleStr() {
+			return getString("199");
+		}
+
+		@Override
+		protected String getLabelStr() {
+			return getString("200");
+		}
+
+		@Override
+		protected String getAddStr() {
+			return Application.getString("203");
+		}
+	};
 
 	public WbPanel(String id, RoomPanel rp) {
 		super(id);
@@ -217,7 +249,7 @@ public class WbPanel extends Panel {
 					item.add(append("class", cls), append("data-mode", cls)
 							, new AttributeAppender("data-image", item.getModelObject()).setSeparator(""));
 				}
-			});
+			}, fileName);
 			add(wbAction);
 		}
 	}
@@ -242,25 +274,25 @@ public class WbPanel extends Panel {
 			}
 			sb.append("WbArea.load(").append(getObjWbJson(entry.getKey(), arr).toString()).append(");");
 		}
-		sb.append("WbArea.activate({id: ").append(wbs.getActiveWb()).append("});");
+		sb.append("WbArea.activateWb({id: ").append(wbs.getActiveWb()).append("});");
 		response.render(OnDomReadyHeaderItem.forScript(sb));
 	}
 
-	private void sendWbAll(CharSequence meth, JSONObject obj) {
+	private void sendWbAll(Action meth, JSONObject obj) {
 		sendWb(meth, obj, null);
 	}
 
-	private void sendWbOthers(CharSequence meth, JSONObject obj) {
+	private void sendWbOthers(Action meth, JSONObject obj) {
 		sendWb(meth, obj, c -> !rp.getClient().getUid().equals(c.getUid()));
 	}
 
-	private void sendWb(CharSequence meth, JSONObject obj, Predicate<Client> check) {
+	private void sendWb(Action meth, JSONObject obj, Predicate<Client> check) {
 		WebSocketHelper.sendRoom(
 				roomId
 				, new JSONObject()
 						.put("type", "wb")
 				, check
-				, (o, c) -> o.put("func", String.format("%s(%s);", meth, obj.toString())).toString()
+				, (o, c) -> o.put("func", String.format("WbArea.%s(%s);", meth.name(), obj.toString())).toString()
 			);
 	}
 
@@ -391,6 +423,9 @@ public class WbPanel extends Panel {
 					;
 			wb.put(wuid, file);
 			final String ruid = wbs.getUid();
+			if (clean) {
+				sendWbAll(Action.clearAll, new JSONObject().put("wbId", wb.getId()));
+			}
 			WebSocketHelper.sendRoom(
 					roomId
 					, new JSONObject().put("type", "wb")

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/fabric.js
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/fabric.js?rev=1790175&r1=1790174&r2=1790175&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/fabric.js (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/fabric.js Wed Apr  5 03:56:54 2017
@@ -1,8 +1,8 @@
 /* build: `node build.js modules=ALL exclude=json,gestures minifier=uglifyjs` */
  /*! Fabric.js Copyright 2008-2015, Printio (Juriy Zaytsev, Maxim Chernyak) */
-/* version 1.7.8 */
+
 /* Licensed MIT https://github.com/kangax/fabric.js/blob/master/LICENSE */
-var fabric = fabric || { version: "1.7.8" };
+var fabric = fabric || { version: "1.7.9" };
 if (typeof exports !== 'undefined') {
   exports.fabric = fabric;
 }
@@ -3804,8 +3804,10 @@ if (typeof console !== 'undefined') {
    * @param {Function} callback Callback to call when parsing is finished;
    * It's being passed an array of elements (parsed from a document).
    * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.
+   * @param {Object} [parsingOptions] options for parsing document
+   * @param {String} [parsingOptions.crossOrigin] crossOrigin settings
    */
-  fabric.parseSVGDocument = function(doc, callback, reviver) {
+  fabric.parseSVGDocument = function(doc, callback, reviver, parsingOptions) {
     if (!doc) {
       return;
     }
@@ -3815,7 +3817,7 @@ if (typeof console !== 'undefined') {
     var svgUid =  fabric.Object.__uid++,
         options = applyViewboxTransform(doc),
         descendants = fabric.util.toArray(doc.getElementsByTagName('*'));
-
+    options.crossOrigin = parsingOptions && parsingOptions.crossOrigin;
     options.svgUid = svgUid;
 
     if (descendants.length === 0 && fabric.isLikelyNode) {
@@ -3847,7 +3849,7 @@ if (typeof console !== 'undefined') {
       if (callback) {
         callback(instances, options);
       }
-    }, clone(options), reviver);
+    }, clone(options), reviver, parsingOptions);
   };
 
   var reFontDeclaration = new RegExp(
@@ -3999,8 +4001,8 @@ if (typeof console !== 'undefined') {
      * @param {Object} [options] Options object
      * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.
      */
-    parseElements: function(elements, callback, options, reviver) {
-      new fabric.ElementsParser(elements, callback, options, reviver).parse();
+    parseElements: function(elements, callback, options, reviver, parsingOptions) {
+      new fabric.ElementsParser(elements, callback, options, reviver, parsingOptions).parse();
     },
 
     /**
@@ -4126,8 +4128,10 @@ if (typeof console !== 'undefined') {
      * @param {String} url
      * @param {Function} callback
      * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.
+     * @param {Object} [options] Object containing options for parsing
+     * @param {String} [options.crossOrigin] crossOrigin crossOrigin setting to use for external resources
      */
-    loadSVGFromURL: function(url, callback, reviver) {
+    loadSVGFromURL: function(url, callback, reviver, options) {
 
       url = url.replace(/^\n\s*/, '').trim();
       new fabric.util.request(url, {
@@ -4148,9 +4152,9 @@ if (typeof console !== 'undefined') {
           callback && callback(null);
         }
 
-        fabric.parseSVGDocument(xml.documentElement, function (results, options) {
-          callback && callback(results, options);
-        }, reviver);
+        fabric.parseSVGDocument(xml.documentElement, function (results, _options) {
+          callback && callback(results, _options);
+        }, reviver, options);
       }
     },
 
@@ -4160,8 +4164,10 @@ if (typeof console !== 'undefined') {
      * @param {String} string
      * @param {Function} callback
      * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.
+     * @param {Object} [options] Object containing options for parsing
+     * @param {String} [options.crossOrigin] crossOrigin crossOrigin setting to use for external resources
      */
-    loadSVGFromString: function(string, callback, reviver) {
+    loadSVGFromString: function(string, callback, reviver, options) {
       string = string.trim();
       var doc;
       if (typeof DOMParser !== 'undefined') {
@@ -4177,21 +4183,22 @@ if (typeof console !== 'undefined') {
         doc.loadXML(string.replace(/<!DOCTYPE[\s\S]*?(\[[\s\S]*\])*?>/i, ''));
       }
 
-      fabric.parseSVGDocument(doc.documentElement, function (results, options) {
-        callback(results, options);
-      }, reviver);
+      fabric.parseSVGDocument(doc.documentElement, function (results, _options) {
+        callback(results, _options);
+      }, reviver, options);
     }
   });
 
 })(typeof exports !== 'undefined' ? exports : this);
 
 
-fabric.ElementsParser = function(elements, callback, options, reviver) {
+fabric.ElementsParser = function(elements, callback, options, reviver, parsingOptions) {
   this.elements = elements;
   this.callback = callback;
   this.options = options;
   this.reviver = reviver;
   this.svgUid = (options && options.svgUid) || 0;
+  this.parsingOptions = parsingOptions;
 };
 
 fabric.ElementsParser.prototype.parse = function() {
@@ -19223,7 +19230,7 @@ fabric.util.object.extend(fabric.Object.
    * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement}
    */
   fabric.Image.ATTRIBUTE_NAMES =
-    fabric.SHARED_ATTRIBUTES.concat('x y width height preserveAspectRatio xlink:href'.split(' '));
+    fabric.SHARED_ATTRIBUTES.concat('x y width height preserveAspectRatio xlink:href crossOrigin'.split(' '));
 
   /**
    * Returns {@link fabric.Image} instance from an SVG element
@@ -24210,7 +24217,7 @@ fabric.Image.filters.BaseFilter.fromObje
       }
 
       this.isEditing = true;
-
+      this.selected = true;
       this.initHiddenTextarea(e);
       this.hiddenTextarea.focus();
       this._updateTextarea();
@@ -24595,7 +24602,7 @@ fabric.Image.filters.BaseFilter.fromObje
           }
         }
       }
-      var newStyle = style || currentLineStyles[charIndex - 1];
+      var newStyle = style || clone(currentLineStyles[charIndex - 1]);
       newStyle && (this.styles[lineIndex][charIndex] = newStyle);
       this._forceClearCache = true;
     },
@@ -24631,8 +24638,14 @@ fabric.Image.filters.BaseFilter.fromObje
      * @param {Number} offset Can be -1 or +1
      */
     shiftLineStyles: function(lineIndex, offset) {
-      // shift all line styles by 1 upward
+      // shift all line styles by 1 upward or downward
       var clonedStyles = clone(this.styles);
+      for (var line in clonedStyles) {
+        var numericLine = parseInt(line, 10);
+        if (numericLine <= lineIndex) {
+          delete clonedStyles[numericLine];
+        }
+      }
       for (var line in this.styles) {
         var numericLine = parseInt(line, 10);
         if (numericLine > lineIndex) {
@@ -24847,7 +24860,6 @@ fabric.util.object.extend(fabric.IText.p
         return;
       }
       var pointer = this.canvas.getPointer(options.e);
-
       this.__mousedownX = pointer.x;
       this.__mousedownY = pointer.y;
       this.__isMousedown = true;
@@ -25004,8 +25016,8 @@ fabric.util.object.extend(fabric.IText.p
     this.hiddenTextarea = fabric.document.createElement('textarea');
     this.hiddenTextarea.setAttribute('autocapitalize', 'off');
     var style = this._calcTextareaPosition();
-    this.hiddenTextarea.style.cssText = 'position: absolute; top: ' + style.top + '; left: ' + style.left + ';'
-                                        + ' opacity: 0; width: 0px; height: 0px; z-index: -999;';
+    this.hiddenTextarea.style.cssText = 'white-space: nowrap; position: absolute; top: ' + style.top +
+      '; left: ' + style.left + '; opacity: 0; width: 1px; height: 1px; z-index: -999;';
     fabric.document.body.appendChild(this.hiddenTextarea);
 
     fabric.util.addListener(this.hiddenTextarea, 'keydown', this.onKeyDown.bind(this));