Author: solomax
Date: Sat Mar 25 11:11:55 2017
New Revision: 1788661

URL: http://svn.apache.org/viewvc?rev=1788661&view=rev
Log:
[OPENMEETINGS-551] sync object create is implemented

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.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=1788661&r1=1788660&r2=1788661&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
 Sat Mar 25 11:11:55 2017
@@ -30,6 +30,8 @@ import java.util.concurrent.ConcurrentHa
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
 
+import com.github.openjson.JSONObject;
+
 public class Whiteboard {
        private static final Logger log = 
Red5LoggerFactory.getLogger(Whiteboard.class, webAppRootKey);
        private long id;
@@ -37,7 +39,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, JSONObject> roomItems = new ConcurrentHashMap<>();
        private Date created = new Date();
        private int zIndex = 1;
        private String name;
@@ -102,26 +104,19 @@ public class Whiteboard {
        }
 
        //getter is required, otherwise roomItems are not available in red5
-       public Map<String, List<Object>> getRoomItems() {
+       public Map<String, JSONObject> getRoomItems() {
                return roomItems;
        }
 
-       public void add(String oid, List<Object> actionObject) {
-               Object type = actionObject.size() > 0 ? actionObject.get(0) : 
"";
-               if (actionObject.size() > 8 && ("swf".equals(type) || 
"image".equals(type) || "flv".equals(type))) {
-                       Integer zInd = 
(Integer)actionObject.get(actionObject.size() - 8);
-                       if (zInd == null || zInd == 0 || zInd < zIndex) {
-                               actionObject.set(actionObject.size() - 8, 
zIndex++);
-                       }
-               }
-               roomItems.put(oid, actionObject);
+       public void add(String uid, JSONObject obj) {
+               roomItems.put(uid, obj);
        }
 
-       public List<Object> get(String oid) {
-               return roomItems.get(oid);
+       public JSONObject get(String uid) {
+               return roomItems.get(uid);
        }
 
-       public Set<Entry<String, List<Object>>> entrySet() {
+       public Set<Entry<String, JSONObject>> entrySet() {
                return roomItems.entrySet();
        }
 

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=1788661&r1=1788660&r2=1788661&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
 Sat Mar 25 11:11:55 2017
@@ -25,10 +25,12 @@ import static org.apache.wicket.ajax.att
 
 import java.util.Arrays;
 import java.util.Map.Entry;
+import java.util.function.Predicate;
 
 import org.apache.openmeetings.core.data.whiteboard.WhiteboardCache;
 import org.apache.openmeetings.core.util.WebSocketHelper;
 import org.apache.openmeetings.db.dto.room.Whiteboard;
+import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.room.Room.Right;
 import org.apache.openmeetings.util.OmFileHelper;
 import org.apache.openmeetings.web.room.RoomPanel;
@@ -57,10 +59,12 @@ public class WbPanel extends Panel {
        private final static ResourceReference WB_JS_REFERENCE = new 
JavaScriptResourceReference(WbPanel.class, "wb.js");
        private final static ResourceReference FABRIC_JS_REFERENCE = new 
JavaScriptResourceReference(WbPanel.class, "fabric.js");
        private boolean readOnly = true;
+       private final Long roomId;
        private final RoomPanel rp;
        private enum Action {
                createWb
                , removeWb
+               , createObj
        }
        private final AbstractDefaultAjaxBehavior wbAction = new 
AbstractDefaultAjaxBehavior() {
                private static final long serialVersionUID = 1L;
@@ -71,22 +75,36 @@ public class WbPanel extends Panel {
                                Action a = 
Action.valueOf(getRequest().getRequestParameters().getParameterValue(PARAM_ACTION).toString());
                                StringValue sv = 
getRequest().getRequestParameters().getParameterValue(PARAM_OBJ);
                                JSONObject obj = sv.isEmpty() ? new 
JSONObject() : new JSONObject(sv.toString());
+                               if (Action.createObj == a) {
+                                       if 
("pointer".equals(obj.getJSONObject("obj").getString("type"))) {
+                                               
sendWbOthers(String.format("WbArea.createObj(%s);", obj.toString()));
+                                               return;
+                                       }
+                               }
 
                                //wb-right
                                if (rp.getClient().hasRight(Right.whiteBoard)) {
                                        switch (a) {
                                                case createWb:
                                                {
-                                                       Whiteboard wb = 
getBean(WhiteboardCache.class).add(rp.getRoom().getId(), 
rp.getClient().getUser().getLanguageId());
-                                                       
sendWb(getAddWbScript(wb.getId(), wb.getName()).toString());
+                                                       Whiteboard wb = 
getBean(WhiteboardCache.class).add(roomId, 
rp.getClient().getUser().getLanguageId());
+                                                       
sendWbAll(getAddWbScript(wb.getId(), wb.getName()).toString());
                                                }
                                                        break;
                                                case removeWb:
                                                {
                                                        long _id = 
obj.optLong("id", -1);
                                                        Long id = _id < 0 ? 
null : _id;
-                                                       
getBean(WhiteboardCache.class).remove(rp.getRoom().getId(), id);
-                                                       
sendWb(String.format("WbArea.remove(%s);", id));
+                                                       
getBean(WhiteboardCache.class).remove(roomId, id);
+                                                       
sendWbAll(String.format("WbArea.remove(%s);", id));
+                                               }
+                                                       break;
+                                               case createObj:
+                                               {
+                                                       Whiteboard wb = 
getBean(WhiteboardCache.class).get(roomId).get(obj.getLong("wbId"));
+                                                       JSONObject o = 
obj.getJSONObject("obj");
+                                                       
wb.add(o.getString("uid"), o);
+                                                       
sendWbOthers(String.format("WbArea.createObj(%s);", obj.toString()));
                                                }
                                                        break;
                                        }
@@ -100,9 +118,10 @@ public class WbPanel extends Panel {
        public WbPanel(String id, RoomPanel rp) {
                super(id);
                this.rp = rp;
+               this.roomId = rp.getRoom().getId();
                setOutputMarkupId(true);
 
-               
getBean(WhiteboardCache.class).get(rp.getRoom().getId()).getWhiteboards();//TODO
+               
getBean(WhiteboardCache.class).get(roomId).getWhiteboards();//TODO
                add(new ListView<String>("clipart", 
Arrays.asList(OmFileHelper.getPublicClipartsDir().list())) {
                        private static final long serialVersionUID = 1L;
 
@@ -123,19 +142,28 @@ public class WbPanel extends Panel {
                
response.render(JavaScriptHeaderItem.forReference(WB_JS_REFERENCE));
                response.render(new 
PriorityHeaderItem(getNamedFunction(FUNC_ACTION, wbAction, 
explicit(PARAM_ACTION), explicit(PARAM_OBJ))));
                StringBuilder sb = new StringBuilder("WbArea.init();");
-               for (Entry<Long, Whiteboard> entry : 
getBean(WhiteboardCache.class).list(rp.getRoom().getId(), 
rp.getClient().getUser().getLanguageId())) {
+               for (Entry<Long, Whiteboard> entry : 
getBean(WhiteboardCache.class).list(roomId, 
rp.getClient().getUser().getLanguageId())) {
                        sb.append(getAddWbScript(entry.getKey(), 
entry.getValue().getName()));
                }
                response.render(OnDomReadyHeaderItem.forScript(sb));
        }
 
-       private void sendWb(CharSequence func) {
+       private void sendWbAll(CharSequence func) {
+               sendWb(func, null);
+       }
+
+       private void sendWbOthers(CharSequence func) {
+               sendWb(func, c -> !rp.getClient().getUid().equals(c.getUid()));
+       }
+
+       private void sendWb(CharSequence func, Predicate<Client> check) {
                WebSocketHelper.sendRoom(
-                               rp.getRoom().getId()
+                               roomId
                                , new JSONObject()
                                                .put("type", "wb")
                                                .put("func", func)
                                                .toString()
+                               , check
                        );
        }
 

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=1788661&r1=1788660&r2=1788661&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
 Sat Mar 25 11:11:55 2017
@@ -60,11 +60,20 @@ var Pointer = function(canvas, s) {
                }
        };
 }
-var APointer = function(canvas, user) {
-       var pointer = {};
-       pointer.mouseUp = function(o) {
-               var ptr = canvas.getPointer(o.e);
-               fabric.Image.fromURL('./css/images/menupointer.png', 
function(img) {
+var Base = function(canvas) {
+       var base = {};
+       base.objectCreated = function(o) {
+               o.uid = UUID.generate();
+               canvas.trigger("wb:object:created", o);
+               return o.uid;
+       }
+       return base;
+}
+var APointer = function(canvas) {
+       var pointer = Base(canvas);
+       pointer.user = '';
+       pointer.create = function(_cnvs, o) {
+               fabric.Image.fromURL('./css/images/pointer.png', function(img) {
                        img.set({
                                left:15
                                , originX: 'right'
@@ -86,56 +95,70 @@ var APointer = function(canvas, user) {
                                , originX: 'center'
                                , originY: 'center'
                        });
-                       var text = new fabric.Text(user, {
+                       var text = new fabric.Text(o.user, {
                                fontSize: 12
                                , left: 10
                                , originX: 'left'
                                , originY: 'bottom'
                        });
                        var group = new fabric.Group([circle1, circle2, img, 
text], {
-                               left: ptr.x - 20
-                               , top: ptr.y - 20
+                               left: o.x - 20
+                               , top: o.y - 20
                        });
-                       canvas.add(group);
+                       
+                       _cnvs.add(group);
+                       group.uid = o.uid;
+                       group.loaded = !!o.loaded;
 
                        var count = 3;
                        function go(_cnt) {
                                if (_cnt < 0) {
-                                       canvas.remove(group);
+                                       _cnvs.remove(group);
                                }
                                circle1.set({radius: 3});
                                circle2.set({radius: 6});
                                circle1.animate(
                                        'radius', '20'
                                        , {
-                                               onChange: 
canvas.renderAll.bind(canvas)
+                                               onChange: 
_cnvs.renderAll.bind(_cnvs)
                                                , duration: 1000
                                                , onComplete: function() 
{go(_cnt - 1);}
                                        });
                                circle2.animate(
                                        'radius', '20'
                                        , {
-                                               onChange: 
canvas.renderAll.bind(canvas)
+                                               onChange: 
_cnvs.renderAll.bind(_cnvs)
                                                , duration: 1000
                                        });
                        }
                        go(count);
                });
        }
+       pointer.mouseUp = function(o) {
+               var ptr = canvas.getPointer(o.e);
+               var obj = {
+                       type: 'pointer'
+                       , x: ptr.x
+                       , y: ptr.y
+                       , user: pointer.user
+               };
+               obj.uid = uid = pointer.objectCreated(obj);
+               pointer.create(canvas, obj);
+       }
        pointer.activate = function() {
                canvas.on('mouse:up', pointer.mouseUp);
+               pointer.user = $('.room.sidebar.left .user.list .current 
.name').text();
        }
        pointer.deactivate = function() {
                canvas.off('mouse:up', pointer.mouseUp);
        };
        return pointer;
 }
-var Base = function() {
-       var base = {
-               fill: {enabled: true, color: '#FFFF33'}
-               , stroke: {enabled: true, color: '#FF6600', width: 5}
-               , opacity: 1
-       };
+var ShapeBase = function(canvas) {
+       var base = Base(canvas);
+       base.fill = {enabled: true, color: '#FFFF33'};
+       base.stroke = {enabled: true, color: '#FF6600', width: 5};
+       base.opacity = 1;
        base.enableLineProps = function(s) {
                var c = s.find('.wb-prop-color'), w = s.find('.wb-prop-width'), 
o = s.find('.wb-prop-opacity');
                s.find('.wb-prop-fill').prop('disabled', true);
@@ -160,7 +183,7 @@ var Base = function() {
        return base;
 }
 var Text = function(canvas, s) {
-       var text = Base();
+       var text = ShapeBase(canvas);
        text.obj = null;
 
        text.mouseDown = function(o) {
@@ -203,7 +226,7 @@ var Text = function(canvas, s) {
        return text;
 }
 var Paint = function(canvas, s) {
-       var paint = Base();
+       var paint = ShapeBase(canvas);
        paint.activate = function() {
                canvas.isDrawingMode = true;
                canvas.freeDrawingBrush.width = paint.stroke.width;
@@ -218,7 +241,7 @@ var Paint = function(canvas, s) {
        return paint;
 }
 var Shape = function(canvas) {
-       var shape = Base();
+       var shape = ShapeBase(canvas);
        shape.obj = null;
        shape.isDown = false;
        shape.orig = {x: 0, y: 0};
@@ -239,22 +262,31 @@ var Shape = function(canvas) {
                shape.updateShape(pointer);
                canvas.renderAll();
        };
+       shape.updateCreated = function(o) {
+               return o;
+       };
        shape.mouseUp = function(o) {
                shape.isDown = false;
                shape.obj.setCoords();
                shape.obj.selectable = false;
+               canvas.renderAll();
+               shape.objectCreated(shape.obj);
        };
        shape.internalActivate = function() {};
        shape.activate = function() {
-               canvas.on('mouse:down', shape.mouseDown);
-               canvas.on('mouse:move', shape.mouseMove);
-               canvas.on('mouse:up', shape.mouseUp);
+               canvas.on({
+                       'mouse:down': shape.mouseDown
+                       , 'mouse:move': shape.mouseMove
+                       , 'mouse:up': shape.mouseUp
+               });
                shape.internalActivate();
        };
        shape.deactivate = function() {
-               canvas.off('mouse:down', shape.mouseDown);
-               canvas.off('mouse:move', shape.mouseMove);
-               canvas.off('mouse:up', shape.mouseUup);
+               canvas.off({
+                       'mouse:down': shape.mouseDown
+                       , 'mouse:move': shape.mouseMove
+                       , 'mouse:up': shape.mouseUp
+               });
        };
        return shape;
 };
@@ -487,7 +519,7 @@ var Wb = function() {
                        }
                });
                initToolBtn('pointer', true, Pointer(canvas, s));
-               initToolBtn('apointer', false, APointer(canvas, 'TEST USER')); 
//FIXME TODO
+               initToolBtn('apointer', false, APointer(canvas));
                initToolBtn('text', false, Text(canvas, s));
                initToolBtn('paint', false, Paint(canvas, s));
                initToolBtn('line', false, Line(canvas, s));
@@ -566,22 +598,42 @@ var Wb = function() {
        }
 
        //events
+       var wbObjCreatedHandler = function (o) {
+               var json = {};
+               switch(o.type) {
+                       case 'pointer':
+                               json = o;
+                               break;
+                       default:
+                               o.includeDefaultValues = false;
+                               json = o.toJSON(['uid'])
+                               break;
+               }
+               wbAction('createObj', JSON.stringify({
+                       wbId: wbId
+                       , obj: json
+               }));
+               //console.log('Wb Object Created', json, o);
+       };
        var objAddedHandler = function (e) {
-               var obj = e.target;
-               console.log('Object Added', obj);
+               var o = e.target;
+               if (!!o.loaded) return;
+               switch(o.type) {
+                       case 'i-text':
+                               o.uid = UUID.generate();
+                               wbObjCreatedHandler(o);
+                               break;
+               }
        };
        var objModifiedHandler = function (e) {
                var obj = e.target;
                console.log('Object Modified', obj);
        };
-       var objRemovedHandler = function (e) {
-               var obj = e.target;
-               console.log('Object Removed', obj);
-       };
-       var pathCreatedHandler = function (e) {
-               var obj = e.target;
-               console.log('Path Created', obj);
+       var pathCreatedHandler = function (o) {
+               o.path.uid = UUID.generate();
+               wbObjCreatedHandler(o.path);
        };
+       /*TODO interactive text chage
        var textEditedHandler = function (e) {
                var obj = e.target;
                console.log('Text Edit Exit', obj);
@@ -589,7 +641,7 @@ var Wb = function() {
        var textChangedHandler = function (e) {
                var obj = e.target;
                console.log('Text Changed', obj);
-       };
+       };*/
        return {
                init: function(_wbId, tid) {
                        wbId = _wbId;
@@ -598,12 +650,14 @@ var Wb = function() {
                        c.attr('id', 'can-' + tid);
                        canvas = new fabric.Canvas(c.attr('id'));
                        //TODO create via WS canvas:cleared
-                       canvas.on('object:added', objAddedHandler);
-                       canvas.on('object:modified', objModifiedHandler);
-                       canvas.on('object:removed', objRemovedHandler);
-                       canvas.on('path:created', pathCreatedHandler);
-                       canvas.on('text:editing:exited', textEditedHandler);
-                       canvas.on('text:changed', textChangedHandler);
+                       canvas.on({
+                               'object:added': objAddedHandler
+                               , 'object:modified': objModifiedHandler
+                               , 'path:created': pathCreatedHandler
+                               //, 'text:editing:exited': textEditedHandler
+                               //, 'text:changed': textChangedHandler
+                               , 'wb:object:created': wbObjCreatedHandler
+                       });
                        internalInit(t);
                        setRoomSizes();
                }
@@ -702,6 +756,30 @@ var WbArea = (function() {
                });
                wb.data(Wb()).data('init')(obj.id, tid);
        };
+       self.createObj = function(json) {
+               var canvas = $('#' + getWbTabId(json.wbId)).data('getCanvas')();
+               var o = json.obj;
+               o.loaded = true;
+               switch(o.type) {
+                       case 'pointer':
+                               APointer().create(canvas, o);
+                               break;
+                       default:
+                               //TODO will be reused on Load WB
+                               fabric.util.enlivenObjects([o], 
function(objects) {
+                                       var origRenderOnAddRemove = 
canvas.renderOnAddRemove;
+                                       canvas.renderOnAddRemove = false;
+
+                                       objects.forEach(function(_o) {
+                                               canvas.add(_o);
+                                       });
+
+                                       canvas.renderOnAddRemove = 
origRenderOnAddRemove;
+                                       canvas.renderAll();
+                               });
+                               break;
+               }
+       };
        self.remove = function(id) {
                var tabId = getWbTabId(id);
                tabs.find('li[aria-controls="' + tabId + '"]').remove();


Reply via email to