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/03 16:38:44 UTC

svn commit: r1790021 - in /openmeetings/application/trunk: openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/ openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/

Author: solomax
Date: Mon Apr  3 16:38:44 2017
New Revision: 1790021

URL: http://svn.apache.org/viewvc?rev=1790021&view=rev
Log:
[OPENMEETINGS-551] clear all/slide is implemented, couple of issues are fixed

Modified:
    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/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/wb.js

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=1790021&r1=1790020&r2=1790021&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 Mon Apr  3 16:38:44 2017
@@ -20,11 +20,12 @@ 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.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
 
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
@@ -38,7 +39,7 @@ public class Whiteboard {
 	private Integer y = 0;
 	private Integer zoom = 100;
 	private Boolean fullFit = true;
-	private Map<String, JSONObject> roomItems = new ConcurrentHashMap<>();
+	private Map<String, JSONObject> roomItems = Collections.synchronizedMap(new LinkedHashMap<>());
 	private Date created = new Date();
 	private int slide = 0;
 	private int zIndex = 1;

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=1790021&r1=1790020&r2=1790021&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 Mon Apr  3 16:38:44 2017
@@ -59,9 +59,7 @@
 		<div id="wb-tools" class="tools ui-state-active vertical clear" style="position: absolute; top: 20px; right: 0px;">
 			<div class="bumper"></div>
 			<div wicket:message="title:62" class="ui-widget-header clickable om-icon big clear-all"></div>
-<!-- clear-all confirnmation: 1340 -->
 			<div wicket:message="title:1005" class="ui-widget-header clickable om-icon big clear-slide"></div>
-<!-- clear-slide confirmation 1359 -->
 			<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>
@@ -113,6 +111,12 @@
 				</div>
 			</div>
 		</div>
+		<div id="clear-all-confirm" wicket:message="title:1339, data-btn-ok:54, data-btn-cancel:55">
+			<wicket:message key="1340"/>
+		</div>
+		<div id="clear-slide-confirm" wicket:message="title:1339, data-btn-ok:54, data-btn-cancel:55">
+			<wicket:message key="1359"/>
+		</div>
 	</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=1790021&r1=1790020&r2=1790021&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 Mon Apr  3 16:38:44 2017
@@ -87,6 +87,8 @@ public class WbPanel extends Panel {
 		, createObj
 		, modifyObj
 		, deleteObj
+		, clearAll
+		, clearSlide
 	}
 	private final AbstractDefaultAjaxBehavior wbAction = new AbstractDefaultAjaxBehavior() {
 		private static final long serialVersionUID = 1L;
@@ -176,6 +178,20 @@ public class WbPanel extends Panel {
 							sendWbAll("WbArea.removeObj", obj);
 						}
 							break;
+						case clearAll:
+						{
+							Whiteboard wb = getBean(WhiteboardCache.class).get(roomId).get(obj.getLong("wbId"));
+							wb.clear();
+							sendWbAll("WbArea.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);
+						}
+							break;
 					}
 				}
 			} catch (Exception e) {

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js?rev=1790021&r1=1790020&r2=1790021&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js Mon Apr  3 16:38:44 2017
@@ -507,12 +507,12 @@ var Wb = function() {
 		}).click(function() {
 			var b = getBtn();
 			if (b.length && b.hasClass(ACTIVE)) {
-				b.data('deactivate')();
+				b.data().deactivate();
 			}
-			btn.data('activate')();
+			btn.data().activate();
 		});
 		if (def) {
-			btn.data('activate')();
+			btn.data().activate();
 		}
 	}
 	function initCliparts() {
@@ -530,6 +530,27 @@ var Wb = function() {
 			initToolBtn(cur.data('mode'), false, Clipart(wb, cur));
 		});
 	}
+	function confirmDlg(_id, okHandler) {
+		var confirm = $('#' + _id);
+		confirm.dialog({
+			modal: true
+			, buttons: [
+				{
+					text: confirm.data('btn-ok')
+					, click: function() {
+						okHandler();
+						$(this).dialog("close");
+					}
+				}
+				, {
+					text: confirm.data('btn-cancel')
+					, click: function() {
+						$(this).dialog("close");
+					}
+				}
+			]
+		});
+	}
 	function internalInit() {
 		t.draggable({
 			snap: "parent"
@@ -560,6 +581,12 @@ var Wb = function() {
 			t.find(".om-icon.settings").click(function() {
 				s.show();
 			});
+			t.find('.om-icon.clear-all').click(function() {
+				confirmDlg('clear-all-confirm', function() { wbAction('clearAll', JSON.stringify({wbId: wb.id})); });
+			});
+			t.find('.om-icon.clear-slide').click(function() {
+				confirmDlg('clear-slide-confirm', function() { wbAction('clearSlide', JSON.stringify({wbId: wb.id, slide: slide})); });
+			});
 			s.find('.wb-prop-b, .wb-prop-i')
 				.button()
 				.click(function() {
@@ -670,6 +697,7 @@ var Wb = function() {
 				break;
 			case 'Presentation':
 			{
+				var ccount = canvases.length;
 				minWidth = Math.max(minWidth, _o.width);
 				minHeight = Math.max(minHeight, _o.height);
 				width = Math.max(minWidth, width);
@@ -683,6 +711,13 @@ var Wb = function() {
 					canvas.setBackgroundImage(_o._src + "&slide=" + i, canvas.renderAll.bind(canvas), {})
 							.setWidth(width).setHeight(height);
 				}
+				if (ccount != canvases.length) {
+					var b = getBtn();
+					if (b.length && b.hasClass(ACTIVE)) {
+						b.data().deactivate();
+						b.data().activate();
+					}
+				}
 			}
 				break;
 			default:
@@ -797,16 +832,7 @@ var Wb = function() {
 		var obj = e.target;
 		console.log('Text Changed', obj);
 	};*/
-	function addCanvas() {
-		var sl = canvases.length;
-		var cid = 'can-' + a.attr('id') + '-slide-' + sl;
-		var c = $('<canvas></canvas>').attr('id', cid);
-		a.find('.canvases').append(c);
-		var canvas = new fabric.Canvas(c.attr('id'));
-		canvas.wbId = wb.id;
-		canvas.slide = sl;
-		canvases.push(canvas);
-		//TODO create via WS canvas:cleared
+	function setHandlers(canvas) {
 		if (readOnly) {
 			canvas.off({
 				'object:added': objAddedHandler
@@ -828,6 +854,16 @@ var Wb = function() {
 				, 'wb:object:created': wbObjCreatedHandler
 			});
 		}
+	}
+	function addCanvas() {
+		var sl = canvases.length;
+		var cid = 'can-' + a.attr('id') + '-slide-' + sl;
+		var c = $('<canvas></canvas>').attr('id', cid);
+		a.find('.canvases').append(c);
+		var canvas = new fabric.Canvas(c.attr('id'));
+		canvas.wbId = wb.id;
+		canvas.slide = sl;
+		canvases.push(canvas);
 		var cc = $('#' + cid).closest('.canvas-container');
 		if (readOnly) {
 			if (sl == slide) {
@@ -836,6 +872,7 @@ var Wb = function() {
 				cc.hide();
 			}
 		}
+		setHandlers(canvas);
 	}
 	wb.setReadOnly = function(ro) {
 		if (readOnly != ro) {
@@ -859,14 +896,17 @@ var Wb = function() {
 			}
 			showCurentSlide();
 			t = a.find('.tools'), s = a.find(".wb-settings");
+			wb.eachCanvas(function(canvas) {
+				setHandlers(canvas);
+			});
 			internalInit();
 		}
 	};
 	wb.init = function(_wbId, tid, ro) {
 		wb.id = _wbId;
 		a = $('#' + tid);
-		wb.setReadOnly(ro);
 		addCanvas();
+		wb.setReadOnly(ro);
 	};
 	wb.resize = function(w, h) {
 		if (t.position().left + t.width() > a.width()) {
@@ -937,6 +977,28 @@ var Wb = function() {
 			_removeHandler(arr[i]);
 		}
 	};
+	wb.clearAll = function() {
+		for (var i = 1; i < canvases.length; ++i) {
+			var cc = $('#can-wb-tab-0-slide-' + i).closest('.canvas-container');
+			cc.remove();
+			canvases[i].dispose();
+		}
+		canvases.splice(1);
+		canvases[0].clear();
+		minWidth = minHeight = 0;
+	};
+	wb.clearSlide = function(_sl) {
+		if (canvases.length > _sl) {
+			var canvas = canvases[_sl];
+			canvas.renderOnAddRemove = false;
+			var arr = canvas.getObjects();
+			while (arr.length > 0) {
+				arr[arr.length - 1].remove();
+			}
+			canvas.renderOnAddRemove = true;
+			canvas.renderAll();
+		}
+	};
 	wb.getCanvas = function() {
 		return canvases[slide];
 	};
@@ -1029,12 +1091,14 @@ var WbArea = (function() {
 	};
 	self.setReadOnly = function(ro) {
 		readOnly = ro;
-		tabs.find(".ui-tabs-nav").sortable(readOnly ? "disable" : "enable");
+		var tabsNav = tabs.find(".ui-tabs-nav");
+		tabsNav.sortable(readOnly ? "disable" : "enable");
 		var prev = tabs.find('.prev.om-icon'), next = tabs.find('.next.om-icon');
 		if (readOnly) {
 			if (prev.length > 0) {
 				prev.parent().remove();
 				next.parent().remove();
+				tabsNav.find('li button').remove();
 			}
 			$(window).off('keyup', deleteHandler);
 		} else {
@@ -1052,6 +1116,12 @@ var WbArea = (function() {
 				tabs.find('.next.om-icon').click(function() {
 					scroll.scrollLeft(scroll.scrollLeft() + 30);
 				});
+				tabsNav.find('li').each(function(idx) {
+					$(this).append($('#wb-tab-close').clone().attr('id', ''));
+					$(this).find('button').click(function() {
+						wbAction('removeWb', JSON.stringify({id: obj.id}));
+					});
+				});
 				$(window).keyup(deleteHandler);
 			}
 		}
@@ -1091,12 +1161,6 @@ var WbArea = (function() {
 			, li = $('#wb-area-tab').clone().attr('id', '').data('wb-id', obj.id)
 			, wb = $('#wb-area').clone().attr('id', tid);
 		li.find('a').text(obj.name).attr('title', obj.name).attr('href', "#" + tid);
-		if (!readOnly) {
-			li.append($('#wb-tab-close').clone().attr('id', ''));
-			li.find('button').click(function() {
-				wbAction('removeWb', JSON.stringify({id: obj.id}));
-			});
-		}
 	
 		tabs.find(".ui-tabs-nav").append(li);
 		tabs.append(wb);
@@ -1129,6 +1193,13 @@ var WbArea = (function() {
 	self.removeObj = function(json) {
 		self.getWb(json.wbId).removeObj(json.obj);
 	};
+	self.clearAll = function(json) {
+		self.getWb(json.wbId).clearAll();
+		setRoomSizes();
+	};
+	self.clearSlide = function(json) {
+		self.getWb(json.wbId).clearSlide(json.slide);
+	};
 	self.remove = function(obj) {
 		var tabId = self.getWbTabId(obj.id);
 		tabs.find('li[aria-controls="' + tabId + '"]').remove();