[OPENMEETINGS-551] clear all/slide is implemented, couple of issues are fixed
Project: http://git-wip-us.apache.org/repos/asf/openmeetings/repo Commit: http://git-wip-us.apache.org/repos/asf/openmeetings/commit/8a900e52 Tree: http://git-wip-us.apache.org/repos/asf/openmeetings/tree/8a900e52 Diff: http://git-wip-us.apache.org/repos/asf/openmeetings/diff/8a900e52 Branch: refs/heads/master Commit: 8a900e5226ad1bfaac3fae0260a05d9655ea6d0c Parents: 821bc0a Author: Maxim Solodovnik <[email protected]> Authored: Mon Apr 3 16:38:44 2017 +0000 Committer: Maxim Solodovnik <[email protected]> Committed: Mon Apr 3 16:38:44 2017 +0000 ---------------------------------------------------------------------- .../openmeetings/db/dto/room/Whiteboard.java | 5 +- .../openmeetings/web/room/wb/WbPanel.html | 8 +- .../openmeetings/web/room/wb/WbPanel.java | 16 +++ .../org/apache/openmeetings/web/room/wb/wb.js | 113 +++++++++++++++---- 4 files changed, 117 insertions(+), 25 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/openmeetings/blob/8a900e52/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboard.java ---------------------------------------------------------------------- diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboard.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboard.java index 3f16125..c4a3df8 100644 --- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboard.java +++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboard.java @@ -20,11 +20,12 @@ package org.apache.openmeetings.db.dto.room; 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; http://git-wip-us.apache.org/repos/asf/openmeetings/blob/8a900e52/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html index 92963b6..f464953 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html @@ -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> http://git-wip-us.apache.org/repos/asf/openmeetings/blob/8a900e52/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java index c446ead..ad438ff 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java @@ -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) { http://git-wip-us.apache.org/repos/asf/openmeetings/blob/8a900e52/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js index 64ee00d..ec7ad9a 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js @@ -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();
