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


Reply via email to