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();