Author: solomax
Date: Thu Mar 23 12:53:00 2017
New Revision: 1788234

URL: http://svn.apache.org/viewvc?rev=1788234&view=rev
Log:
[OPENMEETINGS-551] synchronized add/remove WB is added; code clean-up

Removed:
    
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardObjectSyncManager.java
    
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/WhiteboardService.java
    
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/WhiteboardSyncLockObject.java
Modified:
    
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardCache.java
    
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardManager.java
    
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
    
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboard.java
    
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboards.java
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
    
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
    
openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml
    openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/room.css

Modified: 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardCache.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardCache.java?rev=1788234&r1=1788233&r2=1788234&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardCache.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardCache.java
 Thu Mar 23 12:53:00 2017
@@ -19,11 +19,14 @@
 package org.apache.openmeetings.core.data.whiteboard;
 
 import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicLong;
 
+import org.apache.openmeetings.db.dao.label.LabelDao;
 import org.apache.openmeetings.db.dto.room.Whiteboard;
 import org.apache.openmeetings.db.dto.room.Whiteboards;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * Memory based cache, configured as singleton in spring configuration
@@ -34,53 +37,57 @@ import org.apache.openmeetings.db.dto.ro
 public class WhiteboardCache {
        private Map<Long, Whiteboards> cache = new ConcurrentHashMap<>();
 
-       private volatile AtomicLong whiteboardId = new AtomicLong(0);
+       @Autowired
+       private LabelDao labelDao;
 
-       public long getNewWhiteboardId(Long roomId, String name) {
-               long wbId = whiteboardId.getAndIncrement();
-               set(roomId, new Whiteboard(name), wbId);
-               return wbId;
+       private String getDefaultName(Long langId, int num) {
+               StringBuilder sb = new StringBuilder(labelDao.getString("615", 
langId));
+               if (num > 0) {
+                       sb.append(" ").append(num);
+               }
+               return sb.toString();
+       }
+
+       public Set<Entry<Long, Whiteboard>> list(Long roomId, Long langId) {
+               Whiteboards wbs = get(roomId);
+               if (wbs.getWhiteboards().isEmpty()) {
+                       add(wbs, langId);
+               }
+               return wbs.getWhiteboards().entrySet();
+       }
+
+       public Whiteboard add(Long roomId, Long langId) {
+               Whiteboards wbs = get(roomId);
+               return add(wbs, langId);
+       }
+
+       public Whiteboard add(Whiteboards wbs, Long langId) {
+               Whiteboard wb = new Whiteboard(getDefaultName(langId, 
wbs.count()));
+               wbs.add(wb);
+               return wb;
        }
 
-       /*
-        * Room items a Whiteboard
-        */
        public Whiteboards get(Long roomId) {
                if (roomId == null) {
                        return null;
                }
-               if (cache.containsKey(roomId)) {
-                       return cache.get(roomId);
-               } else {
-                       Whiteboards whiteboards = new Whiteboards();
-                       whiteboards.setRoomId(roomId);
-                       set(roomId, whiteboards);
-                       return whiteboards;
+               Whiteboards wbs = cache.get(roomId);
+               if (wbs == null) {
+                       wbs = new Whiteboards(roomId);
+                       cache.put(roomId, wbs);
                }
+               return wbs;
        }
 
-       public Whiteboard get(Long roomId, Long whiteBoardId) {
-               Whiteboards whiteboards = get(roomId);
-               Whiteboard wb = whiteboards.getWhiteboards().get(whiteBoardId);
-               if (wb == null) {
-                       wb = new Whiteboard();
-                       set(roomId, wb, whiteBoardId);
+       public void clear(Long roomId, Long wbId) {
+               Whiteboard wb = get(roomId).get(wbId);
+               if (wb != null) {
+                       wb.clear();
                }
-               return wb;
-       }
-
-       /*
-        * Whiteboard Object List
-        *
-        */
-       public void set(Long roomId, Whiteboards whiteboards) {
-               cache.put(roomId, whiteboards);
        }
 
-       public void set(Long roomId, Whiteboard wb, long whiteBoardId) {
-               Whiteboards whiteboards = get(roomId);
-               wb.setWhiteBoardId(whiteBoardId);
-               whiteboards.getWhiteboards().put(whiteBoardId, wb);
-               cache.put(roomId, whiteboards);
+       public Whiteboard remove(Long roomId, Long wbId) {
+               Whiteboards wbs = get(roomId);
+               return wbs.getWhiteboards().remove(wbId);
        }
 }

Modified: 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardManager.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardManager.java?rev=1788234&r1=1788233&r2=1788234&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardManager.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardManager.java
 Thu Mar 23 12:53:00 2017
@@ -20,11 +20,8 @@ package org.apache.openmeetings.core.dat
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 
-import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
 
-import org.apache.openmeetings.db.dto.room.Whiteboard;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -37,6 +34,7 @@ public class WhiteboardManager {
 
        @SuppressWarnings("unchecked")
        public void add(Long roomId, Map<Integer, Object> whiteboardObj, Long 
whiteBoardId) {
+               /* FIXME TODO check this
                try {
                        log.debug("add: ", whiteboardObj);
 
@@ -132,5 +130,6 @@ public class WhiteboardManager {
                } catch (Exception err) {
                        log.error("[add]", err);
                }
+               */
        }
 }

Modified: 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java?rev=1788234&r1=1788233&r2=1788234&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
 Thu Mar 23 12:53:00 2017
@@ -42,7 +42,6 @@ import org.apache.openmeetings.core.data
 import org.apache.openmeetings.core.data.whiteboard.WhiteboardCache;
 import org.apache.openmeetings.core.data.whiteboard.WhiteboardManager;
 import org.apache.openmeetings.core.remote.RecordingService;
-import org.apache.openmeetings.core.remote.WhiteboardService;
 import org.apache.openmeetings.core.remote.util.SessionVariablesUtil;
 import org.apache.openmeetings.core.util.WebSocketHelper;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
@@ -103,8 +102,6 @@ public class ScopeApplicationAdapter ext
        @Autowired
        private ISessionManager sessionManager;
        @Autowired
-       private WhiteboardService whiteBoardService;
-       @Autowired
        private WhiteboardManager whiteboardManager;
        @Autowired
        private WhiteboardCache whiteboardCache;
@@ -602,18 +599,11 @@ public class ScopeApplicationAdapter ext
        public void roomLeaveByScope(Client client, IScope scope) {
                try {
                        log.debug("[roomLeaveByScope] currentClient " + client);
-                       Long roomId = client.getRoomId();
-
                        if (client.isScreenClient() && 
client.isStartStreaming()) {
                                //TODO check others/find better way
                                WebSocketHelper.sendRoom(new 
TextRoomMessage(client.getRoomId(), client.getUserId(), 
RoomMessage.Type.sharingStoped, client.getStreamPublishName()));
                        }
 
-                       // Remove User from Sync List's
-                       if (roomId != null) {
-                               whiteBoardService.removeUserFromAllLists(scope, 
client);
-                       }
-
                        log.debug("removing Username " + client.getUsername() + 
" "
                                        + client.getConnectedSince() + " 
streamid: "
                                        + client.getStreamid());
@@ -1276,7 +1266,7 @@ public class ScopeApplicationAdapter ext
                        wbClear.put("id", wbId);
                        wbClear.put("param", Arrays.asList("whiteboard", new 
Date(), "clear", null));
 
-                       whiteboardCache.get(client.getRoomId(), wbId).clear();
+                       whiteboardCache.clear(client.getRoomId(), wbId);
                        sendToScope(client.getRoomId(), 
"sendVarsToWhiteboardById", Arrays.asList(null, wbClear));
                }
                sendToWhiteboard(client, Arrays.asList("whiteboard", new 
Date(), "draw", wbObject), wbId);

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=1788234&r1=1788233&r2=1788234&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
 Thu Mar 23 12:53:00 2017
@@ -32,7 +32,7 @@ import org.slf4j.Logger;
 
 public class Whiteboard {
        private static final Logger log = 
Red5LoggerFactory.getLogger(Whiteboard.class, webAppRootKey);
-       private long whiteBoardId;
+       private long id;
        private Integer x = 0;
        private Integer y = 0;
        private Integer zoom = 100;
@@ -48,12 +48,12 @@ public class Whiteboard {
                this.name = name;
        }
 
-       public long getWhiteBoardId() {
-               return whiteBoardId;
+       public long getId() {
+               return id;
        }
 
-       public void setWhiteBoardId(long whiteBoardId) {
-               this.whiteBoardId = whiteBoardId;
+       public void setId(long id) {
+               this.id = id;
        }
 
        public Integer getX() {

Modified: 
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboards.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboards.java?rev=1788234&r1=1788233&r2=1788234&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboards.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboards.java
 Thu Mar 23 12:53:00 2017
@@ -21,14 +21,20 @@ package org.apache.openmeetings.db.dto.r
 import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicLong;
 
 public class Whiteboards {
        private Long roomId;
        private final String uid = UUID.randomUUID().toString();
        private Map<Long, Whiteboard> whiteboards = new ConcurrentHashMap<>();
+       private volatile AtomicLong whiteboardId = new AtomicLong(0);
 
        public Whiteboards() {}
 
+       public Whiteboards(Long roomId) {
+               this.roomId = roomId;
+       }
+
        public Long getRoomId() {
                return roomId;
        }
@@ -37,6 +43,20 @@ public class Whiteboards {
                this.roomId = roomId;
        }
 
+       public Whiteboards add(Whiteboard wb) {
+               wb.setId(whiteboardId.getAndIncrement());
+               whiteboards.put(wb.getId(), wb);
+               return this;
+       }
+
+       public Whiteboard get(Long id) {
+               return whiteboards.get(id);
+       }
+
+       public int count() {
+               return whiteboards.size();
+       }
+
        public Map<Long, Whiteboard> getWhiteboards() {
                return whiteboards;
        }

Modified: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java?rev=1788234&r1=1788233&r2=1788234&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
 Thu Mar 23 12:53:00 2017
@@ -138,7 +138,7 @@ public class RoomPanel extends BasePanel
                                                                , "1429", 
"1430", "775", "452", "767", "764", "765", "918", "54", "761", "762"))
                                                .toString()
                                                ));
-                       } catch (MalformedURLException e) {
+                       } catch (NullPointerException|MalformedURLException e) {
                                log.error("Error while constructing room 
parameters", e);
                        }
                        WebSocketHelper.sendRoom(new RoomMessage(r.getId(), 
getUserId(), RoomMessage.Type.roomEnter));

Modified: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js?rev=1788234&r1=1788233&r2=1788234&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
 Thu Mar 23 12:53:00 2017
@@ -57,15 +57,16 @@ function initVideo(_options) {
 }
 
 function setRoomSizes() {
-       var w = $(window).width() - $(".room.sidebar.left").width() - 5;
-       var h = $(window).height() - $('#menu').height();
-       $(".room.sidebar.left").height(h);
-       var p = $(".room.sidebar.left .tabs");
+       var sb = $(".room.sidebar.left")
+               , w = $(window).width() - sb.width() - 5
+               , h = $(window).height() - $('#menu').height()
+               , p = sb.find('.tabs');
+       sb.height(h);
        var hh = h - 5;
        p.height(hh);
        $(".user.list", p).height(hh - $("ul", p).height() - $(".user.header", 
p).height() - 5);
        if (!!WbArea) {
-               WbArea.resize(w, h);
+               WbArea.resize(sb.width(), w, h);
        }
 }
 function roomReload(event, ui) {
@@ -100,7 +101,7 @@ function roomLoad() {
        $(".room.sidebar.left").resizable({
                handles: "e"
                , stop: function(event, ui) {
-                       alignBlocks();
+                       setRoomSizes();
                }
        });
        Wicket.Event.subscribe("/websocket/closed", roomClosed);

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=1788234&r1=1788233&r2=1788234&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
 Thu Mar 23 12:53:00 2017
@@ -19,31 +19,83 @@
 package org.apache.openmeetings.web.room.wb;
 
 import static org.apache.openmeetings.web.app.Application.getBean;
+import static 
org.apache.openmeetings.web.util.CallbackFunctionHelper.getNamedFunction;
 import static org.apache.wicket.AttributeModifier.append;
+import static org.apache.wicket.ajax.attributes.CallbackParameter.explicit;
 
 import java.util.Arrays;
+import java.util.Map.Entry;
 
 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.room.Room.Right;
 import org.apache.openmeetings.util.OmFileHelper;
 import org.apache.openmeetings.web.room.RoomPanel;
+import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
+import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.behavior.AttributeAppender;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.JavaScriptHeaderItem;
 import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
+import org.apache.wicket.markup.head.PriorityHeaderItem;
 import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.request.resource.JavaScriptResourceReference;
 import org.apache.wicket.request.resource.ResourceReference;
+import org.apache.wicket.util.string.StringValue;
+
+import com.github.openjson.JSONObject;
 
 public class WbPanel extends Panel {
        private static final long serialVersionUID = 1L;
+       public static final String FUNC_ACTION = "wbAction";
+       public static final String PARAM_ACTION = "action";
+       public static final String PARAM_OBJ = "obj";
        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 RoomPanel rp;
+       private enum Action {
+               createWb
+               , removeWb
+       }
+       private final AbstractDefaultAjaxBehavior wbAction = new 
AbstractDefaultAjaxBehavior() {
+               private static final long serialVersionUID = 1L;
+
+               @Override
+               protected void respond(AjaxRequestTarget target) {
+                       try {
+                               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());
+
+                               //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());
+                                               }
+                                                       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));
+                                               }
+                                                       break;
+                                       }
+                               }
+                       } catch (Exception e) {
+                               // no-op
+                       }
+               }
+       };
 
        public WbPanel(String id, RoomPanel rp) {
                super(id);
@@ -61,6 +113,7 @@ public class WbPanel extends Panel {
                                                , new 
AttributeAppender("data-image", item.getModelObject()).setSeparator(""));
                        }
                });
+               add(wbAction);
        }
 
        @Override
@@ -68,7 +121,32 @@ public class WbPanel extends Panel {
                super.renderHead(response);
                
response.render(JavaScriptHeaderItem.forReference(FABRIC_JS_REFERENCE));
                
response.render(JavaScriptHeaderItem.forReference(WB_JS_REFERENCE));
-               response.render(OnDomReadyHeaderItem.forScript("WbArea.init(); 
WbArea.add(1, 'Whiteboard 1');"));
+               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())) {
+                       sb.append(getAddWbScript(entry.getKey(), 
entry.getValue().getName()));
+               }
+               response.render(OnDomReadyHeaderItem.forScript(sb));
+       }
+
+       private void sendWb(CharSequence func) {
+               WebSocketHelper.sendRoom(
+                               rp.getRoom().getId()
+                               , new JSONObject()
+                                               .put("type", "wb")
+                                               .put("func", func)
+                                               .toString()
+                       );
+       }
+
+       private static CharSequence getAddWbScript(Long id, String name) {
+               return new StringBuilder("WbArea.add(")
+                               .append(new JSONObject()
+                                               .put("id", id)
+                                               .put("name", name)
+                                               .toString()
+                                               )
+                               .append(");");
        }
 
        public boolean isReadOnly() {

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=1788234&r1=1788233&r2=1788234&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
 Thu Mar 23 12:53:00 2017
@@ -594,7 +594,10 @@ var Wb = function() {
 };
 var WbArea = (function() {
        var container, area, tabs, self = {};
-       
+
+       function getWbTabId(id) {
+               return "wb-tab-" + id;
+       }
        function refreshTabs() {
                
tabs.tabs("refresh").find('ul').removeClass('ui-corner-all').removeClass('ui-widget-header');
        }
@@ -630,12 +633,15 @@ var WbArea = (function() {
        }
        self.init = function() {
                tabs = $('.room.wb.area .tabs').tabs();
-               tabs.find( ".ui-tabs-nav" ).sortable({
+               tabs.find(".ui-tabs-nav").sortable({
                        axis: "x"
                        , stop: function() {
                                refreshTabs();
                        }
                });
+               tabs.find('.add.om-icon').click(function() {
+                       wbAction('createWb');
+               });
                container = $(".room.wb.area");
                area = container.find(".wb-area");
                $(window).keyup(deleteHandler);
@@ -643,28 +649,37 @@ var WbArea = (function() {
        self.destroy = function() {
                $(window).off('keyup', deleteHandler);
        };
-       self.add = function(id, name) {
-               var tid = "wb-tab-" + id
-                       , li = $('#wb-area-tab').clone().attr('id', 
'').data('wb-id', id)
+       self.add = function(obj) {
+               var tid = getWbTabId(obj.id)
+                       , li = $('#wb-area-tab').clone().attr('id', 
'').data('wb-id', obj.id)
                        , wb = $('#wb-area').clone().attr('id', tid);
-               li.find('a').text(name).attr('href', "#" + tid);
+               li.find('a').text(obj.name).attr('title', 
obj.name).attr('href', "#" + tid);
+               li.find('button').click(function() {
+                       wbAction('removeWb', JSON.stringify({id: obj.id}));
+               });
 
                tabs.find(".ui-tabs-nav").append(li);
                tabs.append(wb);
                refreshTabs();
 
                $('.room.wb.area .wb-tabbar li').each(function(idx) {
-                       if (id == 1 * $(this).data('wb-id')) {
+                       if (obj.id == 1 * $(this).data('wb-id')) {
                                tabs.tabs("option", "active", idx);
                                return false;
                        }
                });
-               wb.data(Wb()).data('init')(id, tid);
-       }
-       self.resize = function(w, h) {
+               wb.data(Wb()).data('init')(obj.id, tid);
+       };
+       self.remove = function(id) {
+               var tabId = getWbTabId(id);
+               tabs.find('li[aria-controls="' + tabId + '"]').remove();
+               $("#" + tabId).remove();
+               refreshTabs();
+       };
+       self.resize = function(posX, w, h) {
                if (!container) return;
                var hh = h - 5;
-               container.width(w);
+               container.width(w).css('left', posX      + "px");
                area.width(w);
 
                container.height(h);
@@ -680,3 +695,19 @@ var WbArea = (function() {
        }
        return self;
 })();
+$(function() {
+       Wicket.Event.subscribe("/websocket/message", function(jqEvent, msg) {
+               try {
+                       var m = jQuery.parseJSON(msg);
+                       if (m) {
+                               switch(m.type) {
+                                       case "wb":
+                                               eval(m.func);
+                                               break;
+                               }
+                       }
+               } catch (err) {
+                       //no-op
+               }
+       });
+});

Modified: 
openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml?rev=1788234&r1=1788233&r2=1788234&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml
 Thu Mar 23 12:53:00 2017
@@ -65,8 +65,6 @@
        <bean id="openmeetings.DatabaseStore" 
class="org.apache.openmeetings.core.session.store.DatabaseStore" />
        
        <bean id="whiteboardCache" scope="singleton" 
class="org.apache.openmeetings.core.data.whiteboard.WhiteboardCache" />
-       <!-- WhiteboardObjectSyncManager can stay in the memory, even on 
cluster! -->
-       <bean id="whiteboardObjectSyncManager" scope="singleton" 
class="org.apache.openmeetings.core.data.whiteboard.WhiteboardObjectSyncManager"
 />
 
        <!-- Cluster related config start -->
        <bean id="openmeetings.ServerUtil" scope="singleton" 
class="org.apache.openmeetings.core.session.ServerUtil">
@@ -77,7 +75,6 @@
 
        <!-- Start of Services -->
        <bean id="xmlcrm.service" 
class="org.apache.openmeetings.core.remote.MainService" />
-       <bean id="whiteboardservice.service" 
class="org.apache.openmeetings.core.remote.WhiteboardService" />
        <bean id="userservice.service" 
class="org.apache.openmeetings.core.remote.UserService" />
        <bean id="fileservice.service" 
class="org.apache.openmeetings.core.remote.ConferenceLibrary" />
        <bean id="openmeetings.FileProcessor" 
class="org.apache.openmeetings.core.data.file.FileProcessor" />

Modified: 
openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/room.css
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/room.css?rev=1788234&r1=1788233&r2=1788234&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/room.css 
(original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/room.css 
Thu Mar 23 12:53:00 2017
@@ -88,10 +88,10 @@
 .room.sidebar.left {
        min-width: 200px;
        width: 315px;
-       float: left;
+       position: absolute;
 }
 .room.wb.area {
-       float: left;
+       position: absolute;
 }
 .room.wb.area.ui-state-hover {
        border: 0;


Reply via email to