From 381b8dae29156ff5c370355c968756db8e365c29 Mon Sep 17 00:00:00 2001 From: Chad Pilkey <capilkey@gmail.com> Date: Fri, 19 May 2017 17:30:00 -0400 Subject: [PATCH] refactor of WhiteboardCanvas to be more isolated and easier to duplicate --- .../org/bigbluebutton/common/IBbbCanvas.as | 39 --- .../modules/present/api/PresentationAPI.as | 64 ---- .../present/events/AddOverlayCanvasEvent.as | 37 --- .../modules/present/maps/PresentEventMap.mxml | 22 +- .../present/ui/views/PresentationWindow.mxml | 106 ++++--- .../modules/present/ui/views/SlideView.mxml | 61 +--- .../components/ScreenshareViewWindow.mxml | 106 ++----- .../WhiteboardCanvasDisplayModel.as | 72 +---- .../whiteboard/WhiteboardCanvasModel.as | 16 +- .../business/shapes/DrawAnnotation.as | 2 +- .../business/shapes/EllipseAnnotation.as | 3 +- .../business/shapes/IDrawAnnotation.as | 2 +- .../business/shapes/LineAnnotation.as | 3 +- .../business/shapes/PencilDrawAnnotation.as | 3 +- .../business/shapes/RectangleAnnotation.as | 3 +- .../business/shapes/TextDrawAnnotation.as | 3 +- .../whiteboard/business/shapes/TextObject.as | 4 + .../business/shapes/TriangleAnnotation.as | 3 +- .../events/GetCurrentPresentationInfo.as | 14 - .../modules/whiteboard/events/PageEvent.as | 40 --- .../events/RequestNewCanvasEvent.as | 16 + ...enterEvent.as => WhiteboardAccessEvent.as} | 5 +- .../events/WhiteboardButtonEvent.as | 4 - .../whiteboard/events/WhiteboardDrawEvent.as | 3 +- .../events/WhiteboardShapesEvent.as | 18 -- ...dUpdate.as => WhiteboardUpdateReceived.as} | 20 +- .../whiteboard/managers/WhiteboardManager.as | 107 +------ .../whiteboard/maps/WhiteboardEventMap.mxml | 60 +--- .../modules/whiteboard/models/Whiteboard.as | 13 + .../whiteboard/models/WhiteboardModel.as | 138 ++++---- .../whiteboard/services/MessageSender.as | 4 +- .../whiteboard/services/WhiteboardService.as | 20 +- .../modules/whiteboard/views/IDrawListener.as | 2 +- ...dCanvasModel.as => IWhiteboardReceiver.as} | 12 +- .../whiteboard/views/PencilDrawListener.as | 18 +- .../whiteboard/views/ShapeDrawListener.as | 21 +- .../whiteboard/views/TextDrawListener.as | 20 +- .../whiteboard/views/TextUpdateListener.as | 18 +- .../whiteboard/views/WhiteboardCanvas.as | 300 ++++++++++++++++++ .../whiteboard/views/WhiteboardCanvas.mxml | 279 ---------------- .../views/WhiteboardTextToolbar.mxml | 24 +- .../whiteboard/views/WhiteboardToolbar.mxml | 76 ++--- 42 files changed, 630 insertions(+), 1151 deletions(-) delete mode 100755 bigbluebutton-client/src/org/bigbluebutton/common/IBbbCanvas.as delete mode 100755 bigbluebutton-client/src/org/bigbluebutton/modules/present/api/PresentationAPI.as delete mode 100755 bigbluebutton-client/src/org/bigbluebutton/modules/present/events/AddOverlayCanvasEvent.as delete mode 100755 bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/GetCurrentPresentationInfo.as delete mode 100755 bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/PageEvent.as create mode 100755 bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/RequestNewCanvasEvent.as rename bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/{WhiteboardPresenterEvent.as => WhiteboardAccessEvent.as} (87%) delete mode 100755 bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardShapesEvent.as rename bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/{WhiteboardUpdate.as => WhiteboardUpdateReceived.as} (61%) rename bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/{models/WhiteboardCanvasModel.as => IWhiteboardReceiver.as} (77%) create mode 100755 bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardCanvas.as delete mode 100755 bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardCanvas.mxml diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/IBbbCanvas.as b/bigbluebutton-client/src/org/bigbluebutton/common/IBbbCanvas.as deleted file mode 100755 index 003354f83e..0000000000 --- a/bigbluebutton-client/src/org/bigbluebutton/common/IBbbCanvas.as +++ /dev/null @@ -1,39 +0,0 @@ -/** -* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ -* -* Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). -* -* This program is free software; you can redistribute it and/or modify it under the -* terms of the GNU Lesser General Public License as published by the Free Software -* Foundation; either version 3.0 of the License, or (at your option) any later -* version. -* -* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License along -* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. -* -*/ -package org.bigbluebutton.common -{ - import flash.display.DisplayObject; - - import org.bigbluebutton.modules.whiteboard.business.shapes.GraphicObject; - - /** - * An interface currently used to interface the Whiteboard module with the Presentation module in a decoupled sort of way. - * - */ - public interface IBbbCanvas - { - function addRawChild(child:DisplayObject):void; - function removeRawChild(child:DisplayObject):void; - function doesContain(child:DisplayObject):Boolean; - function acceptOverlayCanvas(overlay:IBbbCanvas):void; - function moveCanvas(x:Number, y:Number):void; - function zoomCanvas(width:Number, height:Number):void; - function showCanvas(show:Boolean):void; - } -} \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/present/api/PresentationAPI.as b/bigbluebutton-client/src/org/bigbluebutton/modules/present/api/PresentationAPI.as deleted file mode 100755 index fee4a71ea2..0000000000 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/present/api/PresentationAPI.as +++ /dev/null @@ -1,64 +0,0 @@ -/** -* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ -* -* Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). -* -* This program is free software; you can redistribute it and/or modify it under the -* terms of the GNU Lesser General Public License as published by the Free Software -* Foundation; either version 3.0 of the License, or (at your option) any later -* version. -* -* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License along -* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. -* -*/ -package org.bigbluebutton.modules.present.api -{ - import com.asfusion.mate.events.Dispatcher; - - import mx.containers.Canvas; - import mx.controls.Button; - - import org.bigbluebutton.common.IBbbCanvas; - import org.bigbluebutton.modules.present.events.AddOverlayCanvasEvent; - - public class PresentationAPI - { - private static var instance:PresentationAPI; - - private var dispatcher:Dispatcher; - - public function PresentationAPI(enforcer:SingletonEnforcer) - { - if (enforcer == null){ - throw new Error("There can only be 1 UserManager instance"); - } - initialize(); - } - - private function initialize():void{ - dispatcher = new Dispatcher(); - } - - /** - * Return the single instance of the PresentationAPI class, which is a singleton - */ - public static function getInstance():PresentationAPI{ - if (instance == null){ - instance = new PresentationAPI(new SingletonEnforcer()); - } - return instance; - } - - public function addOverlayCanvas(canvas:IBbbCanvas):void{ - var overlayEvent:AddOverlayCanvasEvent = new AddOverlayCanvasEvent(AddOverlayCanvasEvent.ADD_OVERLAY_CANVAS); - overlayEvent.canvas = canvas; - dispatcher.dispatchEvent(overlayEvent); - } - } -} -class SingletonEnforcer{} \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/present/events/AddOverlayCanvasEvent.as b/bigbluebutton-client/src/org/bigbluebutton/modules/present/events/AddOverlayCanvasEvent.as deleted file mode 100755 index 1b9ac1bfd1..0000000000 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/present/events/AddOverlayCanvasEvent.as +++ /dev/null @@ -1,37 +0,0 @@ -/** - * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ - * - * Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). - * - * This program is free software; you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free Software - * Foundation; either version 3.0 of the License, or (at your option) any later - * version. - * - * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along - * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. - * - */ -package org.bigbluebutton.modules.present.events -{ - import flash.events.Event; - - import org.bigbluebutton.common.IBbbCanvas; - - public class AddOverlayCanvasEvent extends Event - { - public static const ADD_OVERLAY_CANVAS:String = "ADD_OVERLAY_CANVAS"; - - public var canvas:IBbbCanvas; - - public function AddOverlayCanvasEvent(type:String) - { - super(type, true, false); - } - - } -} \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/present/maps/PresentEventMap.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/present/maps/PresentEventMap.mxml index 39e7e39bee..ed9bd0a736 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/present/maps/PresentEventMap.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/present/maps/PresentEventMap.mxml @@ -25,8 +25,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. import mx.events.FlexEvent; import org.bigbluebutton.main.events.BBBEvent; - import org.bigbluebutton.main.model.users.events.RoleChangeEvent; - import org.bigbluebutton.modules.present.api.PresentationAPI; import org.bigbluebutton.modules.present.business.PresentProxy; import org.bigbluebutton.modules.present.commands.ChangePageCommand; import org.bigbluebutton.modules.present.commands.ChangePresentationCommand; @@ -34,34 +32,20 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. import org.bigbluebutton.modules.present.commands.GoToPageCommand; import org.bigbluebutton.modules.present.commands.GoToPrevPageCommand; import org.bigbluebutton.modules.present.commands.UploadFileCommand; - import org.bigbluebutton.modules.present.events.AddOverlayCanvasEvent; + import org.bigbluebutton.modules.present.events.DownloadEvent; import org.bigbluebutton.modules.present.events.GetListOfPresentationsRequest; import org.bigbluebutton.modules.present.events.PresentModuleEvent; - import org.bigbluebutton.modules.present.events.PresentationChangedEvent; - import org.bigbluebutton.modules.present.events.PresentationEvent; import org.bigbluebutton.modules.present.events.PresenterCommands; import org.bigbluebutton.modules.present.events.RemovePresentationEvent; - import org.bigbluebutton.modules.present.events.DownloadEvent; import org.bigbluebutton.modules.present.events.UploadEvent; import org.bigbluebutton.modules.present.managers.PresentManager; import org.bigbluebutton.modules.present.services.PageLoaderService; - import org.bigbluebutton.modules.present.services.PresentationService; - import org.bigbluebutton.modules.present.ui.views.PresentationWindow; - import org.bigbluebutton.modules.whiteboard.events.GetCurrentPresentationInfo; - - private var apiInstance:PresentationAPI; - - private function createAPI():void{ - apiInstance = PresentationAPI.getInstance(); - } ]]> </mx:Script> <EventHandlers type="{FlexEvent.PREINITIALIZE}"> <ObjectBuilder generator="{PresentManager}" cache="global" /> <ObjectBuilder generator="{PresentProxy}" cache="global" /> - - <InlineInvoker method="createAPI" /> </EventHandlers> <EventHandlers type="{PresentModuleEvent.START_MODULE}" > @@ -121,10 +105,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <MethodInvoker generator="{PresentProxy}" method="zoomSlide" arguments="{event}" /> </EventHandlers> - <EventHandlers type="{GetCurrentPresentationInfo.GET_CURRENT_PRESENTATION_INFO}" > - <MethodInvoker generator="{PresentProxy}" method="getCurrentPresentationInfo" /> - </EventHandlers> - <EventHandlers type="{GetListOfPresentationsRequest.GET_LIST_OF_PRESENTATIONS}" > <MethodInvoker generator="{PresentProxy}" method="handleGetListOfPresentationsRequest" /> </EventHandlers> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/PresentationWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/PresentationWindow.mxml index 4af2f02731..3aaf945041 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/PresentationWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/PresentationWindow.mxml @@ -27,20 +27,20 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. xmlns:code="http://code.google.com/p/flexlib/" xmlns:containers="flexlib.containers.*" xmlns:mate="http://mate.asfusion.com/" + xmlns:views="org.bigbluebutton.modules.present.ui.views.*" + xmlns:poll="org.bigbluebutton.modules.polling.views.*" showCloseButton="false" layout="absolute" verticalScrollPolicy="off" horizontalScrollPolicy="off" showControls="true" resize="resizeHandler()" styleNameFocus="presentationWindowStyleFocus" styleNameNoFocus="presentationWindowStyleNoFocus" - implements="org.bigbluebutton.common.IBbbModuleWindow" + implements="org.bigbluebutton.common.IBbbModuleWindow,org.bigbluebutton.modules.whiteboard.views.IWhiteboardReceiver" initialize="init()" creationComplete="onCreationComplete()" width="{DEFAULT_WINDOW_WIDTH}" height="{DEFAULT_WINDOW_HEIGHT}" x="{DEFAULT_X_POSITION}" y="{DEFAULT_Y_POSITION}" title="{ResourceUtil.getInstance().getString('bbb.presentation.title')}" - xmlns:views="org.bigbluebutton.modules.present.ui.views.*" - xmlns:poll="org.bigbluebutton.modules.polling.views.*" > <mate:Dispatcher id="globalDispatcher" /> @@ -50,7 +50,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <mate:Listener type="{PresentationChangedEvent.PRESENTATION_CHANGED_EVENT}" method="handlePresentationChangedEvent" /> <mate:Listener type="{UploadEvent.CLEAR_PRESENTATION}" method="clearPresentation" /> <mate:Listener type="{DisplaySlideEvent.DISPLAY_SLIDE_EVENT}" method="handleDisplaySlideEvent" /> - <mate:Listener type="{AddOverlayCanvasEvent.ADD_OVERLAY_CANVAS}" method="addOverlayCanvas" /> <mate:Listener type="{LocaleChangeEvent.LOCALE_CHANGED}" method="localeChanged" /> <mate:Listener type="{ShortcutEvent.UPLOAD_PRESENTATION}" method="remoteUpload" /> <mate:Listener type="{ShortcutEvent.PREVIOUS_SLIDE}" method="remotePrevious" /> @@ -75,31 +74,26 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <![CDATA[ import flash.geom.Point; + import flexlib.mdi.events.MDIWindowEvent; + import mx.collections.ArrayCollection; import mx.controls.Menu; import mx.events.MenuEvent; import mx.managers.PopUpManager; - import flexlib.mdi.events.MDIWindowEvent; - import org.as3commons.logging.api.ILogger; import org.as3commons.logging.api.getClassLogger; - import org.bigbluebutton.common.IBbbCanvas; import org.bigbluebutton.common.IBbbModuleWindow; + import org.bigbluebutton.common.events.AddUIComponentToMainCanvas; import org.bigbluebutton.common.events.LocaleChangeEvent; import org.bigbluebutton.core.BBB; import org.bigbluebutton.core.KeyboardUtil; import org.bigbluebutton.core.PopUpUtil; import org.bigbluebutton.core.UsersUtil; import org.bigbluebutton.main.events.MadePresenterEvent; - import org.bigbluebutton.main.events.ShortcutEvent; import org.bigbluebutton.main.events.PresenterStatusEvent; + import org.bigbluebutton.main.events.ShortcutEvent; import org.bigbluebutton.main.views.MainCanvas; - import org.bigbluebutton.modules.screenshare.events.ShareEvent; - import org.bigbluebutton.modules.screenshare.events.RequestToPauseSharing; - import org.bigbluebutton.modules.screenshare.events.RequestToRestartSharing; - import org.bigbluebutton.modules.screenshare.events.RequestToStartSharing; - import org.bigbluebutton.modules.screenshare.view.components.ScreenshareViewWindow; import org.bigbluebutton.modules.polling.events.PollShowResultEvent; import org.bigbluebutton.modules.polling.events.PollStartedEvent; import org.bigbluebutton.modules.polling.events.PollStoppedEvent; @@ -109,18 +103,26 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. import org.bigbluebutton.modules.polling.views.PollResultsModal; import org.bigbluebutton.modules.present.commands.GoToNextPageCommand; import org.bigbluebutton.modules.present.commands.GoToPrevPageCommand; - import org.bigbluebutton.modules.present.events.AddOverlayCanvasEvent; import org.bigbluebutton.modules.present.events.DisplaySlideEvent; import org.bigbluebutton.modules.present.events.DownloadEvent; + import org.bigbluebutton.modules.present.events.PageLoadedEvent; import org.bigbluebutton.modules.present.events.PresentationChangedEvent; import org.bigbluebutton.modules.present.events.PresenterCommands; import org.bigbluebutton.modules.present.events.RemovePresentationEvent; import org.bigbluebutton.modules.present.events.UploadEvent; import org.bigbluebutton.modules.present.model.Page; import org.bigbluebutton.modules.present.model.PresentationModel; + import org.bigbluebutton.modules.screenshare.events.RequestToPauseSharing; + import org.bigbluebutton.modules.screenshare.events.RequestToRestartSharing; + import org.bigbluebutton.modules.screenshare.events.RequestToStartSharing; + import org.bigbluebutton.modules.screenshare.events.ShareEvent; + import org.bigbluebutton.modules.screenshare.view.components.ScreenshareViewWindow; + import org.bigbluebutton.modules.whiteboard.events.RequestNewCanvasEvent; import org.bigbluebutton.modules.whiteboard.events.WhiteboardButtonEvent; - import org.bigbluebutton.modules.whiteboard.events.WhiteboardUpdate; - import org.bigbluebutton.modules.present.events.PageLoadedEvent; + import org.bigbluebutton.modules.whiteboard.events.WhiteboardUpdateReceived; + import org.bigbluebutton.modules.whiteboard.views.WhiteboardCanvas; + import org.bigbluebutton.modules.whiteboard.views.WhiteboardTextToolbar; + import org.bigbluebutton.modules.whiteboard.views.WhiteboardToolbar; import org.bigbluebutton.util.i18n.ResourceUtil; private static const LOGGER:ILogger = getClassLogger(PresentationWindow); @@ -174,9 +176,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. private var noticeSoundClass:Class; private var noticeSound:Sound = new noticeSoundClass() as Sound; - private var whiteboardOverlay:IBbbCanvas = null; + private var whiteboardOverlay:WhiteboardCanvas = null; private var screenshareView:ScreenshareViewWindow = null; - private var whiteboardAdded:Boolean = false; private function init():void{ presentOptions = new PresentOptions(); @@ -199,8 +200,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. hotkeyCapture(); //Necessary now because of module loading race conditions - var t:Timer = new Timer(2000, 1); - t.addEventListener(TimerEvent.TIMER, addWhiteboardToolbar); + var t:Timer = new Timer(5000, 1); + t.addEventListener(TimerEvent.TIMER, requestWhiteboardCanvas); t.start(); presenterTabs.addEventListener(Event.CHANGE, onSelectTabEvent, true); @@ -214,15 +215,14 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. setPollMenuData(); } - private function addWhiteboardToolbar(event:TimerEvent):void { - LOGGER.debug("Sending event to add whiteboard canvas."); - callLater(fitSlideToWindowMaintainingAspectRatio); - // Tell the WhiteboardManager to add the toolbar - var e:WhiteboardButtonEvent = new WhiteboardButtonEvent(WhiteboardButtonEvent.WHITEBOARD_ADDED_TO_PRESENTATION); - e.window = this; - dispatchEvent(e); - } - + private function requestWhiteboardCanvas(event:TimerEvent):void { + LOGGER.debug("Sending event to add whiteboard canvas."); + callLater(fitSlideToWindowMaintainingAspectRatio); + + var dispatcher:Dispatcher = new Dispatcher(); + dispatcher.dispatchEvent(new RequestNewCanvasEvent(this)); + } + private function hotkeyCapture():void{ LOGGER.debug("Entering hotkeyCapture"); this.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown); @@ -508,19 +508,15 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. private function showThumbnails():void{ slideView.thumbnailView.visible = !slideView.thumbnailView.visible; } - - private function addOverlayCanvas(e:AddOverlayCanvasEvent):void{ - LOGGER.debug("OVERLAYING WHITEBOARD CANVAS"); - whiteboardOverlay = e.canvas; - } - private function addWhiteboardCanvasToSlideView(e:PageLoadedEvent):void{ - if(!whiteboardAdded && whiteboardOverlay != null) { + private function addWhiteboardCanvasToSlideView(e:PageLoadedEvent = null):void{ + if(whiteboardOverlay != null) { LOGGER.debug("addWhiteboardCanvasToSlideView: Adding whiteboard canvas to SlideView"); changeWhiteboardPageOnly(PresentationModel.getInstance().getCurrentPage().id); - whiteboardOverlay.acceptOverlayCanvas(slideView); slideView.acceptOverlayCanvas(whiteboardOverlay); - whiteboardAdded = true; + if (screenshareView) { + screenshareView.removeOverlayCanvas(); + } } else LOGGER.debug("addWhiteboardCanvasToSlideView: NOT adding whiteboard canvas to Slide View."); } @@ -922,9 +918,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. } if (whiteboardOverlay != null) { - changeWhiteboardPageOnly(PresentationModel.getInstance().getCurrentPage().id); - slideView.acceptOverlayCanvas(whiteboardOverlay); - whiteboardOverlay.acceptOverlayCanvas(slideView); + this.addWhiteboardCanvasToSlideView(); } if(!presenterTabs.getTabAt(PRESENTATION_TAB_INDEX).visible) { @@ -970,12 +964,10 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. LOGGER.debug("Adding whiteboard layer to Deskshare View Canvas"); changeWhiteboardPageOnly("deskshare"); screenshareView.acceptOverlayCanvas(whiteboardOverlay); - whiteboardOverlay.acceptOverlayCanvas(screenshareView); + slideView.removeOverlayCanvas(); if(UsersUtil.amIPresenter()) { annotationsPermissionChanged(true); } - if(!whiteboardAdded) - whiteboardAdded = true; } else { LOGGER.debug("openScreenshareViewTab: whiteboard overlay or desktop view canvas is null!"); } @@ -991,10 +983,12 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. } private function changeWhiteboardPageOnly(whiteboardId:String):void { - LOGGER.debug("Dispatching whiteboard page changed event. Id: " + whiteboardId); - var e:WhiteboardUpdate = new WhiteboardUpdate(WhiteboardUpdate.CHANGE_PAGE); - e.pageID = whiteboardId; - dispatchEvent(e); + if (whiteboardOverlay) { + LOGGER.debug("Telling the WhiteboardCanvas to switch ids. Id: " + whiteboardId); + whiteboardOverlay.displayWhiteboardById(whiteboardId); + } else { + LOGGER.debug("No WhiteboardCanvas overlayed cannot switch ids. Id: " + whiteboardId); + } } private function stopSharing():void { @@ -1103,6 +1097,22 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. screenshareTab.label = ResourceUtil.getInstance().getString('bbb.screensharePublish.restart.label'); dispatchEvent(new RequestToPauseSharing()); } + + public function receiveToolbars(wt:WhiteboardToolbar, wtt:WhiteboardTextToolbar):void { + var addUIEvent:AddUIComponentToMainCanvas = new AddUIComponentToMainCanvas(AddUIComponentToMainCanvas.ADD_COMPONENT); + addUIEvent.component = wt; + globalDispatcher.dispatchEvent(addUIEvent); + wt.positionToolbar(this); + + var addTextToolbarEvent:AddUIComponentToMainCanvas = new AddUIComponentToMainCanvas(AddUIComponentToMainCanvas.ADD_COMPONENT); + addTextToolbarEvent.component = wtt; + globalDispatcher.dispatchEvent(addTextToolbarEvent); + wtt.positionToolbar(this); + } + + public function receiveCanvas(wc:WhiteboardCanvas):void { + whiteboardOverlay = wc; + } ]]> </mx:Script> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/SlideView.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/SlideView.mxml index 1d1457a0fa..0a2ffd2a13 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/SlideView.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/SlideView.mxml @@ -30,8 +30,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. verticalScrollPolicy="off" horizontalScrollPolicy="off" rollOut="hideCursor()" styleName="presentationSlideViewStyle" - xmlns:views="org.bigbluebutton.modules.present.views.*" - implements="org.bigbluebutton.common.IBbbCanvas"> + xmlns:views="org.bigbluebutton.modules.present.views.*"> <mate:Listener type="{PageChangedEvent.PRESENTATION_PAGE_CHANGED_EVENT}" method="handlePageChangedEvent" /> <mate:Listener type="{PageLoadedEvent.PAGE_LOADED_EVENT}" method="handlePageLoadedEvent" /> @@ -51,7 +50,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. import org.as3commons.logging.api.ILogger; import org.as3commons.logging.api.getClassLogger; - import org.bigbluebutton.common.IBbbCanvas; import org.bigbluebutton.core.UsersUtil; import org.bigbluebutton.core.managers.UserManager; import org.bigbluebutton.main.events.MadePresenterEvent; @@ -67,6 +65,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. import org.bigbluebutton.modules.present.model.PresentationModel; import org.bigbluebutton.modules.present.ui.views.models.SlideCalcUtil; import org.bigbluebutton.modules.present.ui.views.models.SlideViewModel; + import org.bigbluebutton.modules.whiteboard.views.WhiteboardCanvas; import org.bigbluebutton.util.i18n.ResourceUtil; private static const LOGGER:ILogger = getClassLogger(SlideView); @@ -76,8 +75,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. public static const THUMBNAILS_CLOSED:String = "ThumbnailsClosed"; private var cursor:Shape; - private var whiteboardCanvasHolder:Canvas = new Canvas(); - private var whiteboardCanvas:IBbbCanvas; + private var whiteboardCanvas:WhiteboardCanvas; private var dispatcher:Dispatcher = new Dispatcher(); @@ -101,12 +99,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. this.rawChildren.addChild(cursor); cursor.visible = false; - whiteboardCanvasHolder = new Canvas(); - this.addChild(whiteboardCanvasHolder); - whiteboardCanvasHolder.x = 0; - whiteboardCanvasHolder.y = 0; - whiteboardCanvasHolder.clipContent = true; - this.setChildIndex(thumbnailView, this.numChildren - 1); /* @@ -464,52 +456,33 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. private function hideCursor():void{ cursor.visible = false; - } - - /** Inherited from IBbbCanvas*/ - public function addRawChild(child:DisplayObject):void{ - this.whiteboardCanvasHolder.rawChildren.addChild(child); - } - - public function removeRawChild(child:DisplayObject):void{ - this.whiteboardCanvasHolder.rawChildren.removeChild(child); } - public function doesContain(child:DisplayObject):Boolean{ - return this.whiteboardCanvasHolder.rawChildren.contains(child); - } - - public function acceptOverlayCanvas(overlay:IBbbCanvas):void{ - cleanCanvasHolder(); + public function acceptOverlayCanvas(overlay:WhiteboardCanvas):void{ whiteboardCanvas = overlay; - var c:Canvas = overlay as Canvas; // add the canvas below the thumbnails - this.addChildAt(c, this.getChildIndex(thumbnailView)); - c.x = slideLoader.x * SlideCalcUtil.MYSTERY_NUM; - c.y = slideLoader.y * SlideCalcUtil.MYSTERY_NUM; - c.width = slideLoader.width; - c.height = slideLoader.height; + this.addChildAt(whiteboardCanvas, this.getChildIndex(thumbnailView)); + zoomCanvas(slideLoader.width, slideLoader.height); fitSlideToLoader(); - c.addEventListener(MouseEvent.MOUSE_DOWN, handleWhiteboardCanvasClick); + whiteboardCanvas.addEventListener(MouseEvent.MOUSE_DOWN, handleWhiteboardCanvasClick); slideLoader.addEventListener(MouseEvent.MOUSE_DOWN, handleWhiteboardCanvasClick); } + public function removeOverlayCanvas():void { + whiteboardCanvas = null; + } + private function handleWhiteboardCanvasClick(e:MouseEvent):void { if (thumbnailView.visible) thumbnailView.visible = false; } public function moveCanvas(x:Number, y:Number):void{ - whiteboardCanvasHolder.x = slideLoader.x * SlideCalcUtil.MYSTERY_NUM; - whiteboardCanvasHolder.y = slideLoader.y * SlideCalcUtil.MYSTERY_NUM; - if (whiteboardCanvas != null) { - whiteboardCanvas.moveCanvas(whiteboardCanvasHolder.x, whiteboardCanvasHolder.y); + whiteboardCanvas.moveCanvas(x * SlideCalcUtil.MYSTERY_NUM, y * SlideCalcUtil.MYSTERY_NUM); } } public function zoomCanvas(width:Number, height:Number):void{ - whiteboardCanvasHolder.width = width; - whiteboardCanvasHolder.height = height; moveCanvas(slideLoader.x, slideLoader.y); if (whiteboardCanvas != null) { //LogUtil.debug("Zooming Canvas " + width + " " + height); @@ -517,20 +490,10 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. } } - public function showCanvas(show:Boolean):void{ - - } - private function focusSlide(e:ShortcutEvent):void{ focusManager.setFocus(slideLoader); slideLoader.drawFocus(true); } - - private function cleanCanvasHolder():void{ - while (this.whiteboardCanvasHolder.rawChildren.numChildren > 0) { - this.whiteboardCanvasHolder.rawChildren.removeChildAt(0); - } - } ]]> </mx:Script> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/ScreenshareViewWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/ScreenshareViewWindow.mxml index 37950685fc..23c147e943 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/ScreenshareViewWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/ScreenshareViewWindow.mxml @@ -25,7 +25,6 @@ width="100%" height="100%" creationComplete="onCreationComplete()" - implements="org.bigbluebutton.common.IBbbCanvas" xmlns:mate="http://mate.asfusion.com/" backgroundColor="#C0C0C0"> @@ -35,27 +34,28 @@ <mx:Script> <![CDATA[ - import mx.core.UIComponent; - import mx.events.ResizeEvent; - - import flexlib.mdi.events.MDIWindowEvent; - - import org.as3commons.logging.api.ILogger; - import org.as3commons.logging.api.getClassLogger; - import org.bigbluebutton.common.Images; - import org.bigbluebutton.common.events.LocaleChangeEvent; - import org.bigbluebutton.core.UsersUtil; - import org.bigbluebutton.core.managers.ReconnectionManager; - import org.bigbluebutton.main.api.JSLog; - import org.bigbluebutton.main.events.BBBEvent; - import org.bigbluebutton.main.views.MainCanvas; - import org.bigbluebutton.modules.screenshare.events.ViewStreamEvent; - import org.bigbluebutton.modules.screenshare.events.ViewWindowEvent; - import org.bigbluebutton.modules.screenshare.managers.SmartWindowResizer; - import org.bigbluebutton.modules.screenshare.model.ScreenshareModel; - import org.bigbluebutton.modules.screenshare.model.ScreenshareOptions; - import org.bigbluebutton.modules.screenshare.services.red5.Connection; - import org.bigbluebutton.util.i18n.ResourceUtil; + import flexlib.mdi.events.MDIWindowEvent; + + import mx.core.UIComponent; + import mx.events.ResizeEvent; + + import org.as3commons.logging.api.ILogger; + import org.as3commons.logging.api.getClassLogger; + import org.bigbluebutton.common.Images; + import org.bigbluebutton.common.events.LocaleChangeEvent; + import org.bigbluebutton.core.UsersUtil; + import org.bigbluebutton.core.managers.ReconnectionManager; + import org.bigbluebutton.main.api.JSLog; + import org.bigbluebutton.main.events.BBBEvent; + import org.bigbluebutton.main.views.MainCanvas; + import org.bigbluebutton.modules.screenshare.events.ViewStreamEvent; + import org.bigbluebutton.modules.screenshare.events.ViewWindowEvent; + import org.bigbluebutton.modules.screenshare.managers.SmartWindowResizer; + import org.bigbluebutton.modules.screenshare.model.ScreenshareModel; + import org.bigbluebutton.modules.screenshare.model.ScreenshareOptions; + import org.bigbluebutton.modules.screenshare.services.red5.Connection; + import org.bigbluebutton.modules.whiteboard.views.WhiteboardCanvas; + import org.bigbluebutton.util.i18n.ResourceUtil; private static const LOG:String = "SC::ScreenshareViewWIndow - "; private static const LOGGER:ILogger = getClassLogger(ScreenshareViewWindow); @@ -84,8 +84,7 @@ private var resizer:SmartWindowResizer = new SmartWindowResizer(); - private var whiteboardCanvas:IBbbCanvas = null; - private var whiteboardCanvasHolder:Canvas = new Canvas(); + private var whiteboardCanvas:WhiteboardCanvas = null; // The following code block is to deal with a bug in FLexLib // with MDI windows not responding well to being maximized @@ -213,7 +212,6 @@ videoWithWarnings.height = video.height = internalHeight; // update the whiteboard canvas holder and overlay with new video dimensions - updateWhiteboardCanvasHolder(); updateWhiteboardCanvasOverlay(); } } @@ -221,34 +219,10 @@ private function setVideo():void { LOGGER.debug("Callback called. Adding video, its whiteboard canvas and resizing components..."); videoHolder.addChild(video); - addWhiteboardCanvasHolder(); addWhiteboardCanvasOverlay(); onResizeEvent(); } - private function addWhiteboardCanvasHolder():void{ - if(video != null) { - this.addChildAt(whiteboardCanvasHolder, 1); - LOGGER.debug("Whiteboard canvas holder added"); - } - } - - private function cleanCanvasHolder():void{ - while (this.whiteboardCanvasHolder.rawChildren.numChildren > 0) { - this.whiteboardCanvasHolder.rawChildren.removeChildAt(0); - } - } - - private function updateWhiteboardCanvasHolder():void{ - if (video != null && videoHolder != null) { - whiteboardCanvasHolder.x = videoWithWarnings.x; - whiteboardCanvasHolder.y = videoWithWarnings.y; - whiteboardCanvasHolder.width = videoWithWarnings.width; - whiteboardCanvasHolder.height = videoWithWarnings.height; - LOGGER.debug("Whiteboard canvas holder dimensions updated"); - } - } - public function addWhiteboardCanvasOverlay():void { updateWhiteboardCanvasOverlay(); if (video != null && whiteboardCanvas != null && videoHolder != null) { @@ -343,39 +317,13 @@ resourcesChanged(); } - /** Inherited from IBbbCanvas*/ - public function addRawChild(child:DisplayObject):void { - whiteboardCanvasHolder.rawChildren.addChild(child); - } - - public function removeRawChild(child:DisplayObject):void { - this.whiteboardCanvasHolder.rawChildren.removeChild(child); - } - - public function doesContain(child:DisplayObject):Boolean { - return this.whiteboardCanvasHolder.rawChildren.contains(child); - } - - public function acceptOverlayCanvas(overlay:IBbbCanvas):void { + public function acceptOverlayCanvas(overlay:WhiteboardCanvas):void { LOGGER.debug("ScreenshareViewWindow: acceptOverlayCanvas"); - cleanCanvasHolder(); whiteboardCanvas = overlay; } - - private function handleWhiteboardCanvasClick(e:MouseEvent):void { - LOGGER.debug("ScreenshareViewWindow: handleWhiteboardCanvasClick"); - } - - public function moveCanvas(x:Number, y:Number):void { - LOGGER.debug("ScreenshareViewWindow: moveCanvas"); - } - - public function zoomCanvas(width:Number, height:Number):void { - LOGGER.debug("ScreenshareViewWindow: zoomCanvas"); - } - - public function showCanvas(show:Boolean):void { - LOGGER.debug("ScreenshareViewWindow: showCanvas"); + + public function removeOverlayCanvas():void { + whiteboardCanvas = null; } public function handleDisconnectedEvent(event:BBBEvent):void { diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasDisplayModel.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasDisplayModel.as index f23345a19e..0f137f4bf6 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasDisplayModel.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasDisplayModel.as @@ -26,7 +26,6 @@ package org.bigbluebutton.modules.whiteboard import org.as3commons.logging.api.ILogger; import org.as3commons.logging.api.getClassLogger; - import org.bigbluebutton.common.IBbbCanvas; import org.bigbluebutton.core.managers.UserManager; import org.bigbluebutton.main.events.MadePresenterEvent; import org.bigbluebutton.modules.whiteboard.business.shapes.DrawObject; @@ -36,7 +35,7 @@ package org.bigbluebutton.modules.whiteboard import org.bigbluebutton.modules.whiteboard.business.shapes.TextObject; import org.bigbluebutton.modules.whiteboard.business.shapes.WhiteboardConstants; import org.bigbluebutton.modules.whiteboard.events.WhiteboardDrawEvent; - import org.bigbluebutton.modules.whiteboard.events.WhiteboardUpdate; + import org.bigbluebutton.modules.whiteboard.events.WhiteboardUpdateReceived; import org.bigbluebutton.modules.whiteboard.models.Annotation; import org.bigbluebutton.modules.whiteboard.models.AnnotationStatus; import org.bigbluebutton.modules.whiteboard.models.AnnotationType; @@ -56,7 +55,6 @@ package org.bigbluebutton.modules.whiteboard private var shapeFactory:ShapeFactory = new ShapeFactory(); private var textUpdateListener:TextUpdateListener = new TextUpdateListener(); - private var bbbCanvas:IBbbCanvas; private var width:Number; private var height:Number; @@ -64,7 +62,7 @@ package org.bigbluebutton.modules.whiteboard wbCanvas = whiteboardCanvas; this.whiteboardModel = whiteboardModel; - textUpdateListener.setDependencies(wbCanvas, whiteboardModel, shapeFactory); + textUpdateListener.setDependencies(wbCanvas, shapeFactory); } public function isEditingText():Boolean { @@ -75,8 +73,7 @@ package org.bigbluebutton.modules.whiteboard if (textUpdateListener) textUpdateListener.canvasMouseDown(); } - public function drawGraphic(event:WhiteboardUpdate):void { - var o:Annotation = event.annotation; + public function drawGraphic(o:Annotation):void { // LogUtil.debug("**** Drawing graphic [" + o.type + "] *****"); var gobj:GraphicObject; switch (o.status) { @@ -152,11 +149,11 @@ package org.bigbluebutton.modules.whiteboard wbCanvas.removeGraphic(gobj as DisplayObject); } - public function clearBoard(event:WhiteboardUpdate = null):void { - if (event && event.userId) { + public function clearBoard(userId:String=null):void { + if (userId) { for (var i:Number = _annotationsList.length-1; i >= 0; i--){ var gobj:GraphicObject = _annotationsList[i] as GraphicObject; - if (gobj.userId == event.userId) { + if (gobj.userId == userId) { removeGraphic(_annotationsList[i].id); } } @@ -192,29 +189,8 @@ package org.bigbluebutton.modules.whiteboard } } } - /********************************************************* - * HACK! HACK! HACK! HACK! HACK! HACK! HACK! HACK! HACK! - * To tell us that the Whiteboard Canvas has been overlayed into the Presentation Canvas. - * The problem was that latecomers query for annotations history before the Whiteboard Canvas has - * been overlayed on top of the presentation canvas. When we receive the history and try to - * display the TEXT annotation, the text will be very small because when we calculate the font size, - * the value for the canvas width and height is still zero. - * - * We need to setup the sequence of whiteboard startup properly to handle latecomers but this will - * do for now. - */ - private var wbCanvasInitialized:Boolean = false; - public function parentCanvasInitialized():void { - wbCanvasInitialized = true; - } - - public function get canvasInited():Boolean { - return wbCanvasInitialized; - } - /**********************************************************/ - - public function changePage(wbId:String):void{ + public function changeWhiteboard(wbId:String):void{ textUpdateListener.canvasMouseDown(); // LogUtil.debug("**** CanvasDisplay changePage. Clearing page *****"); @@ -222,29 +198,15 @@ package org.bigbluebutton.modules.whiteboard var annotations:Array = whiteboardModel.getAnnotations(wbId); // LogUtil.debug("**** CanvasDisplay changePage [" + annotations.length + "] *****"); - if (annotations.length == 0) { - /*** - * Check if the whiteboard canvas has already been overlayed into the presentation canvas. - * If not, don't query for history. The overlay canvas event will trigger the querying of - * the history. - */ - if (wbCanvasInitialized) wbCanvas.queryForAnnotationHistory(wbId); - } else { - for (var i:int = 0; i < annotations.length; i++) { - var an:Annotation = annotations[i] as Annotation; - // LogUtil.debug("**** Drawing graphic from changePage [" + an.type + "] *****"); - var gobj:GraphicObject = shapeFactory.makeGraphicObject(an, whiteboardModel); - if (gobj != null) { - gobj.draw(an, shapeFactory.parentWidth, shapeFactory.parentHeight); - wbCanvas.addGraphic(gobj as DisplayObject); - _annotationsList.push(gobj); - } - } - /* - for (var ij:int = 0; ij < this._annotationsList.length; ij++){ - redrawGraphic(this._annotationsList[ij] as GraphicObject, ij); + for (var i:int = 0; i < annotations.length; i++) { + var an:Annotation = annotations[i] as Annotation; + // LogUtil.debug("**** Drawing graphic from changePage [" + an.type + "] *****"); + var gobj:GraphicObject = shapeFactory.makeGraphicObject(an, whiteboardModel); + if (gobj != null) { + gobj.draw(an, shapeFactory.parentWidth, shapeFactory.parentHeight); + wbCanvas.addGraphic(gobj as DisplayObject); + _annotationsList.push(gobj); } - */ } } @@ -261,9 +223,5 @@ package org.bigbluebutton.modules.whiteboard private function redrawGraphic(gobj:GraphicObject, objIndex:int):void { gobj.redraw(shapeFactory.parentWidth, shapeFactory.parentHeight); } - - public function isPageEmpty():Boolean { - return _annotationsList.length == 0; - } } } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasModel.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasModel.as index a415afa9c2..93bb55d31a 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasModel.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasModel.as @@ -20,6 +20,8 @@ package org.bigbluebutton.modules.whiteboard { import flash.events.KeyboardEvent; + import mx.containers.Canvas; + import org.bigbluebutton.core.managers.UserManager; import org.bigbluebutton.modules.whiteboard.business.shapes.ShapeFactory; import org.bigbluebutton.modules.whiteboard.models.WhiteboardModel; @@ -35,7 +37,6 @@ package org.bigbluebutton.modules.whiteboard * Class responsible for handling actions from presenter and sending annotations to the server. */ public class WhiteboardCanvasModel { - public var whiteboardModel:WhiteboardModel; private var _wbCanvas:WhiteboardCanvas; private var drawListeners:Array = new Array(); private var wbTool:WhiteboardTool = new WhiteboardTool(); @@ -52,11 +53,12 @@ package org.bigbluebutton.modules.whiteboard private var width:Number; private var height:Number; - public function set wbCanvas(canvas:WhiteboardCanvas):void { + public function setDependencies(canvas:WhiteboardCanvas, displayModel:WhiteboardCanvasDisplayModel):void { _wbCanvas = canvas; - drawListeners.push(new PencilDrawListener(idGenerator, _wbCanvas, sendShapeFrequency, shapeFactory, whiteboardModel)); - drawListeners.push(new ShapeDrawListener(idGenerator, _wbCanvas, sendShapeFrequency, shapeFactory, whiteboardModel)); - drawListeners.push(new TextDrawListener(idGenerator, _wbCanvas, sendShapeFrequency, shapeFactory, whiteboardModel)); + + drawListeners.push(new PencilDrawListener(idGenerator, _wbCanvas, shapeFactory)); + drawListeners.push(new ShapeDrawListener(idGenerator, _wbCanvas, shapeFactory)); + drawListeners.push(new TextDrawListener(idGenerator, _wbCanvas, shapeFactory)); } public function zoomCanvas(width:Number, height:Number):void { @@ -80,10 +82,10 @@ package org.bigbluebutton.modules.whiteboard } } - public function doMouseDown(mouseX:Number, mouseY:Number):void { + public function doMouseDown(mouseX:Number, mouseY:Number, wbId:String):void { // LogUtil.debug("*** CanvasModel doMouseDown"); for (var ob:int = 0; ob < drawListeners.length; ob++) { - (drawListeners[ob] as IDrawListener).onMouseDown(mouseX, mouseY, wbTool); + (drawListeners[ob] as IDrawListener).onMouseDown(mouseX, mouseY, wbTool, wbId); } } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/DrawAnnotation.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/DrawAnnotation.as index d0f79668c5..b7cd9a8603 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/DrawAnnotation.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/DrawAnnotation.as @@ -34,6 +34,6 @@ package org.bigbluebutton.modules.whiteboard.business.shapes _status = s; } - public function createAnnotation(wbModel:WhiteboardModel):Annotation {return null} + public function createAnnotation(wbId:String):Annotation {return null} } } \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/EllipseAnnotation.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/EllipseAnnotation.as index 2bf1474146..6291efbc72 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/EllipseAnnotation.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/EllipseAnnotation.as @@ -55,7 +55,7 @@ package org.bigbluebutton.modules.whiteboard.business.shapes return shape; } - override public function createAnnotation(wbModel:WhiteboardModel):Annotation { + override public function createAnnotation(wbId:String):Annotation { var ao:Object = new Object(); ao["type"] = _type; ao["points"] = optimize(_shape); @@ -65,7 +65,6 @@ package org.bigbluebutton.modules.whiteboard.business.shapes ao["status"] = _status; ao["transparency"] = _transparent; - var wbId:String = wbModel.getCurrentWhiteboardId(); if (wbId != null) { ao["whiteboardId"] = wbId; } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/IDrawAnnotation.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/IDrawAnnotation.as index c02eba9316..0c9bf747e0 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/IDrawAnnotation.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/IDrawAnnotation.as @@ -23,6 +23,6 @@ package org.bigbluebutton.modules.whiteboard.business.shapes public interface IDrawAnnotation { - function createAnnotation(wbModel:WhiteboardModel):Annotation; + function createAnnotation(wbId:String):Annotation; } } \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/LineAnnotation.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/LineAnnotation.as index f771554baf..94abad2334 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/LineAnnotation.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/LineAnnotation.as @@ -56,7 +56,7 @@ package org.bigbluebutton.modules.whiteboard.business.shapes return shape; } - override public function createAnnotation(wbModel:WhiteboardModel):Annotation { + override public function createAnnotation(wbId:String):Annotation { var ao:Object = new Object(); ao["type"] = _type; ao["points"] = optimize(_shape); @@ -66,7 +66,6 @@ package org.bigbluebutton.modules.whiteboard.business.shapes ao["status"] = _status; ao["transparency"] = _transparent; - var wbId:String = wbModel.getCurrentWhiteboardId(); if (wbId != null) { ao["whiteboardId"] = wbId; } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/PencilDrawAnnotation.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/PencilDrawAnnotation.as index 1af1c88e1e..59a466d156 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/PencilDrawAnnotation.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/PencilDrawAnnotation.as @@ -41,7 +41,7 @@ package org.bigbluebutton.modules.whiteboard.business.shapes _transparent = trans; } - override public function createAnnotation(wbModel:WhiteboardModel):Annotation { + override public function createAnnotation(wbId:String):Annotation { var ao:Object = new Object(); ao["type"] = _type; ao["points"] = _shape; @@ -51,7 +51,6 @@ package org.bigbluebutton.modules.whiteboard.business.shapes ao["status"] = _status; ao["transparency"] = _transparent; - var wbId:String = wbModel.getCurrentWhiteboardId(); if (wbId != null) { ao["whiteboardId"] = wbId; } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/RectangleAnnotation.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/RectangleAnnotation.as index 055a79b879..5e0f34d82e 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/RectangleAnnotation.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/RectangleAnnotation.as @@ -55,7 +55,7 @@ package org.bigbluebutton.modules.whiteboard.business.shapes return shape; } - override public function createAnnotation(wbModel:WhiteboardModel):Annotation { + override public function createAnnotation(wbId:String):Annotation { var ao:Object = new Object(); ao["type"] = _type; ao["points"] = optimize(_shape); @@ -65,7 +65,6 @@ package org.bigbluebutton.modules.whiteboard.business.shapes ao["status"] = _status; ao["transparency"] = _transparent; - var wbId:String = wbModel.getCurrentWhiteboardId(); if (wbId != null) { ao["whiteboardId"] = wbId; } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/TextDrawAnnotation.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/TextDrawAnnotation.as index 471bacdbd4..2ec07adcb7 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/TextDrawAnnotation.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/TextDrawAnnotation.as @@ -48,7 +48,7 @@ package org.bigbluebutton.modules.whiteboard.business.shapes _calcedFontSize = calcedFontSize; } - override public function createAnnotation(wbModel:WhiteboardModel):Annotation { + override public function createAnnotation(wbId:String):Annotation { var ao:Object = new Object(); ao["type"] = AnnotationType.TEXT; ao["id"] = _id; @@ -63,7 +63,6 @@ package org.bigbluebutton.modules.whiteboard.business.shapes ao["textBoxWidth"] = _textBoxWidth; ao["textBoxHeight"] = _textBoxHeight; - var wbId:String = wbModel.getCurrentWhiteboardId(); if (wbId != null) { ao["whiteboardId"] = wbId; } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/TextObject.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/TextObject.as index 0cf0bb95bf..c31848357b 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/TextObject.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/TextObject.as @@ -78,6 +78,10 @@ package org.bigbluebutton.modules.whiteboard.business.shapes { return _fontSize; } + public function get whiteboardId():String { + return _ao.whiteboardId; + } + public function denormalize(val:Number, side:Number):Number { return (val*side)/100.0; } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/TriangleAnnotation.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/TriangleAnnotation.as index 56a7d91b1f..34bab71c89 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/TriangleAnnotation.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/TriangleAnnotation.as @@ -55,7 +55,7 @@ package org.bigbluebutton.modules.whiteboard.business.shapes return shape; } - override public function createAnnotation(wbModel:WhiteboardModel):Annotation { + override public function createAnnotation(wbId:String):Annotation { var ao:Object = new Object(); ao["type"] = _type; ao["points"] = optimize(_shape); @@ -65,7 +65,6 @@ package org.bigbluebutton.modules.whiteboard.business.shapes ao["status"] = _status; ao["transparency"] = _transparent; - var wbId:String = wbModel.getCurrentWhiteboardId(); if (wbId != null) { ao["whiteboardId"] = wbId; } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/GetCurrentPresentationInfo.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/GetCurrentPresentationInfo.as deleted file mode 100755 index 3e3feab701..0000000000 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/GetCurrentPresentationInfo.as +++ /dev/null @@ -1,14 +0,0 @@ -package org.bigbluebutton.modules.whiteboard.events -{ - import flash.events.Event; - - public class GetCurrentPresentationInfo extends Event - { - public static const GET_CURRENT_PRESENTATION_INFO:String = "Get Current Presentation Info Event"; - - public function GetCurrentPresentationInfo() - { - super(GET_CURRENT_PRESENTATION_INFO, true, false); - } - } -} \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/PageEvent.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/PageEvent.as deleted file mode 100755 index 4d6e1bce20..0000000000 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/PageEvent.as +++ /dev/null @@ -1,40 +0,0 @@ -/** -* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ -* -* Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). -* -* This program is free software; you can redistribute it and/or modify it under the -* terms of the GNU Lesser General Public License as published by the Free Software -* Foundation; either version 3.0 of the License, or (at your option) any later -* version. -* -* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License along -* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. -* -*/ -package org.bigbluebutton.modules.whiteboard.events -{ - import flash.events.Event; - - import mx.collections.ArrayCollection; - - public class PageEvent extends Event - { - public static const CHANGE_PAGE:String = "ChangePage"; - public static const LOAD_PAGE:String = "LoadPage"; - - public var pageNum:Number; - public var graphicObjs:ArrayCollection; - public var isGrid:Boolean; - - public function PageEvent(type:String) - { - super(type, true, false); - } - - } -} \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/RequestNewCanvasEvent.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/RequestNewCanvasEvent.as new file mode 100755 index 0000000000..748ac0e363 --- /dev/null +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/RequestNewCanvasEvent.as @@ -0,0 +1,16 @@ +package org.bigbluebutton.modules.whiteboard.events { + import flash.events.Event; + + import org.bigbluebutton.modules.whiteboard.views.IWhiteboardReceiver; + + public class RequestNewCanvasEvent extends Event { + public static const REQUEST_NEW_CANVAS:String = "request_new_whiteboard_canvas"; + + public var receivingObject:IWhiteboardReceiver; + + public function RequestNewCanvasEvent(ro:IWhiteboardReceiver) { + super(REQUEST_NEW_CANVAS, false, false); + receivingObject = ro; + } + } +} \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardPresenterEvent.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardAccessEvent.as similarity index 87% rename from bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardPresenterEvent.as rename to bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardAccessEvent.as index 415cd097d9..413f9e3098 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardPresenterEvent.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardAccessEvent.as @@ -20,14 +20,15 @@ package org.bigbluebutton.modules.whiteboard.events { import flash.events.Event; - public class WhiteboardPresenterEvent extends Event + public class WhiteboardAccessEvent extends Event { public static const MODIFY_WHITEBOARD_ACCESS:String = "MODIFY_WHITEBOARD_ACCESS_EVENT"; public static const MODIFIED_WHITEBOARD_ACCESS:String = "MODIFIED_WHITEBOARD_ACCESS_EVENT"; public var multiUser:Boolean; + public var whiteboardId:String; - public function WhiteboardPresenterEvent(type:String) + public function WhiteboardAccessEvent(type:String) { super(type, false, false); } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardButtonEvent.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardButtonEvent.as index e4469dd6cd..f81458caee 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardButtonEvent.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardButtonEvent.as @@ -26,16 +26,12 @@ package org.bigbluebutton.modules.whiteboard.events { public static const ENABLE_WHITEBOARD:String = "enable_whiteboard"; public static const DISABLE_WHITEBOARD:String = "disable_whiteboard"; - public static const WHITEBOARD_ADDED_TO_PRESENTATION:String = "whiteboard_added"; - public static const CHANGE_TO_PENCIL:String = "change-to-pencil"; public static const WHITEBOARD_BUTTON_PRESSED:String = "WhiteboardButtonPressedEvent"; public var toolType:String; public var graphicType:String; - public var window:PresentationWindow; - public function WhiteboardButtonEvent(type:String) { super(type, true, false); diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardDrawEvent.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardDrawEvent.as index 5361200038..1cd5987adc 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardDrawEvent.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardDrawEvent.as @@ -29,10 +29,9 @@ package org.bigbluebutton.modules.whiteboard.events public static const SEND_SHAPE:String = "sendShape"; public static const CLEAR:String = "WhiteboardClearCommand"; public static const UNDO:String = "WhiteboardUndoCommand"; - - public static const GET_ANNOTATION_HISTORY:String = "WhiteboardGetAnnotationHistory"; public var annotation:Annotation; + public var wbId:String; public function WhiteboardDrawEvent(type:String, bubbles:Boolean = true, cancelable:Boolean = false) { diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardShapesEvent.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardShapesEvent.as deleted file mode 100755 index 1b15a20971..0000000000 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardShapesEvent.as +++ /dev/null @@ -1,18 +0,0 @@ -package org.bigbluebutton.modules.whiteboard.events -{ - import flash.events.Event; - - public class WhiteboardShapesEvent extends Event - { - - public static const SHAPES_EVENT:String = "whiteboard shapes history event"; - - public var whiteboardId:String; - - public function WhiteboardShapesEvent(wbId:String) - { - super(SHAPES_EVENT, true, false); - whiteboardId = wbId; - } - } -} \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardUpdate.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardUpdateReceived.as similarity index 61% rename from bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardUpdate.as rename to bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardUpdateReceived.as index a10c2f1567..6281d1d7df 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardUpdate.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardUpdateReceived.as @@ -22,27 +22,19 @@ package org.bigbluebutton.modules.whiteboard.events import org.bigbluebutton.modules.whiteboard.models.Annotation; - public class WhiteboardUpdate extends Event + public class WhiteboardUpdateReceived extends Event { - public static const BOARD_UPDATED:String = "boardUpdated"; - public static const BOARD_CLEARED:String = "boardClear"; - public static const BOARD_ENABLED:String = "boardEnabled"; - public static const GRAPHIC_UNDONE:String = "graphicUndone"; - - - // Event to notify display of presenter's request. - public static const UNDO_ANNOTATION:String = "WhiteboardUndoAnnotationEvent"; - public static const CLEAR_ANNOTATIONS:String = "WhiteboardClearAnnotationEvent"; + public static const NEW_ANNOTATION:String = "boardUpdated"; + public static const UNDO_ANNOTATION:String = "WhiteboardUndoAnnotationEvent"; + public static const CLEAR_ANNOTATIONS:String = "WhiteboardClearAnnotationEvent"; public static const RECEIVED_ANNOTATION_HISTORY:String = "WhiteboardReceivedAnnotationHistoryEvent"; - public static const CHANGE_PAGE:String = "WhiteboardChangePageEvent"; public var annotation:Annotation; - public var boardEnabled:Boolean; public var annotationID:String; - public var pageID:String; + public var wbId:String; public var userId:String; - public function WhiteboardUpdate(type:String) + public function WhiteboardUpdateReceived(type:String) { super(type, true, false); } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/managers/WhiteboardManager.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/managers/WhiteboardManager.as index 659425b0dc..29e447454a 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/managers/WhiteboardManager.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/managers/WhiteboardManager.as @@ -26,13 +26,12 @@ package org.bigbluebutton.modules.whiteboard.managers import org.as3commons.logging.api.ILogger; import org.as3commons.logging.api.getClassLogger; import org.bigbluebutton.common.events.AddUIComponentToMainCanvas; - import org.bigbluebutton.modules.present.api.PresentationAPI; import org.bigbluebutton.modules.present.events.PageLoadedEvent; import org.bigbluebutton.modules.whiteboard.WhiteboardCanvasDisplayModel; import org.bigbluebutton.modules.whiteboard.WhiteboardCanvasModel; + import org.bigbluebutton.modules.whiteboard.events.RequestNewCanvasEvent; import org.bigbluebutton.modules.whiteboard.events.WhiteboardButtonEvent; - import org.bigbluebutton.modules.whiteboard.events.WhiteboardShapesEvent; - import org.bigbluebutton.modules.whiteboard.events.WhiteboardUpdate; + import org.bigbluebutton.modules.whiteboard.events.WhiteboardUpdateReceived; import org.bigbluebutton.modules.whiteboard.models.WhiteboardModel; import org.bigbluebutton.modules.whiteboard.views.WhiteboardCanvas; import org.bigbluebutton.modules.whiteboard.views.WhiteboardTextToolbar; @@ -44,107 +43,23 @@ package org.bigbluebutton.modules.whiteboard.managers /* Injected by Mate */ public var whiteboardModel:WhiteboardModel; - - private var globalDispatcher:Dispatcher; - private var highlighterCanvas:WhiteboardCanvas; - private var highlighterToolbar:WhiteboardToolbar; - private var textToolbar:WhiteboardTextToolbar; - - private var model:WhiteboardCanvasModel = new WhiteboardCanvasModel(); - private var displayModel:WhiteboardCanvasDisplayModel = new WhiteboardCanvasDisplayModel(); - - private var previousWhiteboardPageId:String; - + public function WhiteboardManager() { - globalDispatcher = new Dispatcher(); + } - public function handleStartModuleEvent():void { - if (highlighterCanvas != null) return; - - highlighterCanvas = new WhiteboardCanvas(); - highlighterCanvas.model = model; - highlighterCanvas.displayModel = displayModel; - model.whiteboardModel = whiteboardModel - - model.wbCanvas = highlighterCanvas; - displayModel.setDependencies(highlighterCanvas, whiteboardModel); - - if (highlighterToolbar != null) return; - - highlighterToolbar = new WhiteboardToolbar(); - highlighterToolbar.canvas = highlighterCanvas; - - if (textToolbar != null) return; - - textToolbar = new WhiteboardTextToolbar(); - textToolbar.canvas = highlighterCanvas; - textToolbar.init(); - highlighterCanvas.textToolbar = textToolbar; + public function handleStartModuleEvent():void { //Necessary now because of module loading race conditions - var t:Timer = new Timer(1000, 1); - t.addEventListener(TimerEvent.TIMER, addHighlighterCanvas); - t.start(); - } - - private function addHighlighterCanvas(e:TimerEvent):void { - LOGGER.debug("Adding Whiteboard Overlay Canvas"); - PresentationAPI.getInstance().addOverlayCanvas(highlighterCanvas); - } - - public function positionToolbar(e:WhiteboardButtonEvent):void { - // add text toolbar for allowing customization of text - var addUIEvent:AddUIComponentToMainCanvas = new AddUIComponentToMainCanvas(AddUIComponentToMainCanvas.ADD_COMPONENT); - addUIEvent.component = highlighterToolbar; - globalDispatcher.dispatchEvent(addUIEvent); - highlighterToolbar.positionToolbar(e.window); - highlighterToolbar.stage.focus = highlighterToolbar; - - var addTextToolbarEvent:AddUIComponentToMainCanvas = new AddUIComponentToMainCanvas(AddUIComponentToMainCanvas.ADD_COMPONENT); - addTextToolbarEvent.component = textToolbar; - globalDispatcher.dispatchEvent(addTextToolbarEvent); - textToolbar.positionToolbar(e.window); - } - - public function drawGraphic(event:WhiteboardUpdate):void { - if (event.annotation.whiteboardId == whiteboardModel.getCurrentWhiteboardId()) { - displayModel.drawGraphic(event); - } + //var t:Timer = new Timer(1000, 1); + //t.addEventListener(TimerEvent.TIMER, addHighlighterCanvas); + //t.start(); } - public function clearAnnotations(event:WhiteboardUpdate):void { - displayModel.clearBoard(event); - } - - public function receivedAnnotationsHistory(event:WhiteboardShapesEvent):void { - displayModel.receivedAnnotationsHistory(event.whiteboardId); - } - - public function undoAnnotation(event:WhiteboardUpdate):void { - displayModel.undoAnnotation(event.annotation); - } - - public function enableWhiteboard(e:WhiteboardButtonEvent):void { - highlighterCanvas.enableWhiteboard(e); + public function handleRequestNewCanvas(e:RequestNewCanvasEvent):void { + var whiteboardCanvas:WhiteboardCanvas = new WhiteboardCanvas(whiteboardModel); + whiteboardCanvas.attachToReceivingObject(e.receivingObject); } - - public function disableWhiteboard(e:WhiteboardButtonEvent):void { - highlighterCanvas.disableWhiteboard(e); - } - - public function handlePageChangedEvent(e:PageLoadedEvent):void { - if(!whiteboardModel.isOverlayingDeskshare()) { - whiteboardModel.setCurrentWhiteboardId(e.pageId); - displayModel.changePage(e.pageId); - } - else LOGGER.debug("Got new slide page loaded, but current whiteboard page is deskshare: doing nothing."); - } - - public function handleChangeWhiteboardPageEvent(e:WhiteboardUpdate):void { - whiteboardModel.setCurrentWhiteboardId(e.pageID); - displayModel.changePage(e.pageID); - } public function removeAnnotationsHistory():void { // it will dispatch the cleanAnnotations in the displayModel later diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/maps/WhiteboardEventMap.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/maps/WhiteboardEventMap.mxml index cc9305e738..75f5c2ff54 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/maps/WhiteboardEventMap.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/maps/WhiteboardEventMap.mxml @@ -24,33 +24,27 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <mx:Script> <![CDATA[ import org.bigbluebutton.main.events.BBBEvent; - import org.bigbluebutton.main.events.ModuleStartedEvent; - import org.bigbluebutton.modules.present.events.AddOverlayCanvasEvent; import org.bigbluebutton.modules.present.events.PageLoadedEvent; import org.bigbluebutton.modules.present.events.PresentationEvent; - import org.bigbluebutton.modules.present.events.UploadEvent; - import org.bigbluebutton.modules.present.events.WindowResizedEvent; import org.bigbluebutton.modules.whiteboard.commands.GetWhiteboardAccessCommand; import org.bigbluebutton.modules.whiteboard.commands.GetWhiteboardShapesCommand; - import org.bigbluebutton.modules.whiteboard.events.PageEvent; + import org.bigbluebutton.modules.whiteboard.events.RequestNewCanvasEvent; import org.bigbluebutton.modules.whiteboard.events.StartWhiteboardModuleEvent; + import org.bigbluebutton.modules.whiteboard.events.WhiteboardAccessEvent; import org.bigbluebutton.modules.whiteboard.events.WhiteboardButtonEvent; import org.bigbluebutton.modules.whiteboard.events.WhiteboardDrawEvent; - import org.bigbluebutton.modules.whiteboard.events.WhiteboardPresenterEvent; - import org.bigbluebutton.modules.whiteboard.events.WhiteboardShapesEvent; - import org.bigbluebutton.modules.whiteboard.events.WhiteboardUpdate; + import org.bigbluebutton.modules.whiteboard.events.WhiteboardUpdateReceived; import org.bigbluebutton.modules.whiteboard.managers.WhiteboardManager; import org.bigbluebutton.modules.whiteboard.models.WhiteboardModel; import org.bigbluebutton.modules.whiteboard.services.MessageReceiver; import org.bigbluebutton.modules.whiteboard.services.MessageSender; import org.bigbluebutton.modules.whiteboard.services.WhiteboardService; - import org.bigbluebutton.modules.whiteboard.views.WhiteboardCanvas; ]]> </mx:Script> - <EventHandlers type="{WhiteboardPresenterEvent.MODIFY_WHITEBOARD_ACCESS}" > + <EventHandlers type="{WhiteboardAccessEvent.MODIFY_WHITEBOARD_ACCESS}" > <MethodInvoker generator="{WhiteboardService}" method="modifyAccess" arguments="{event}" /> </EventHandlers> @@ -65,13 +59,17 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <EventHandlers type="{StartWhiteboardModuleEvent.START_HIGHLIGHTER_MODULE_EVENT}"> <MethodInvoker generator="{WhiteboardManager}" method="handleStartModuleEvent" /> </EventHandlers> - + + <EventHandlers type="{RequestNewCanvasEvent.REQUEST_NEW_CANVAS}"> + <MethodInvoker generator="{WhiteboardManager}" method="handleRequestNewCanvas" arguments="{event}"/> + </EventHandlers> + <EventHandlers type="{GetWhiteboardShapesCommand.GET_SHAPES}"> <MethodInvoker generator="{WhiteboardService}" method="getAnnotationHistory" arguments="{event}"/> </EventHandlers> <EventHandlers type="{WhiteboardDrawEvent.CLEAR}" > - <MethodInvoker generator="{WhiteboardService}" method="clearBoard" /> + <MethodInvoker generator="{WhiteboardService}" method="clearBoard" arguments="{event}" /> </EventHandlers> <EventHandlers type="{WhiteboardDrawEvent.SEND_SHAPE}"> @@ -79,45 +77,13 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. </EventHandlers> <EventHandlers type="{WhiteboardDrawEvent.UNDO}" > - <MethodInvoker generator="{WhiteboardService}" method="undoGraphic" /> - </EventHandlers> - - <EventHandlers type="{WhiteboardButtonEvent.WHITEBOARD_ADDED_TO_PRESENTATION}" > - <MethodInvoker generator="{WhiteboardManager}" method="positionToolbar" arguments="{event}" /> + <MethodInvoker generator="{WhiteboardService}" method="undoGraphic" arguments="{event}" /> </EventHandlers> - <EventHandlers type="{WhiteboardShapesEvent.SHAPES_EVENT}" > - <MethodInvoker generator="{WhiteboardManager}" method="receivedAnnotationsHistory" arguments="{event}"/> - </EventHandlers> - - <EventHandlers type="{WhiteboardUpdate.CLEAR_ANNOTATIONS}" > - <MethodInvoker generator="{WhiteboardManager}" method="clearAnnotations" arguments="{event}"/> - </EventHandlers> - - <EventHandlers type="{WhiteboardUpdate.BOARD_UPDATED}" > - <MethodInvoker generator="{WhiteboardManager}" method="drawGraphic" arguments="{event}"/> - </EventHandlers> - - <EventHandlers type="{WhiteboardUpdate.UNDO_ANNOTATION}" > - <MethodInvoker generator="{WhiteboardManager}" method="undoAnnotation" arguments="{event}" /> - </EventHandlers> - - <EventHandlers type="{WhiteboardButtonEvent.ENABLE_WHITEBOARD}" > - <MethodInvoker generator="{WhiteboardManager}" method="enableWhiteboard" arguments="{event}" /> - </EventHandlers> - - <EventHandlers type="{WhiteboardButtonEvent.DISABLE_WHITEBOARD}" > - <MethodInvoker generator="{WhiteboardManager}" method="disableWhiteboard" arguments="{event}" /> + <EventHandlers type="{GetWhiteboardShapesCommand.GET_SHAPES}" > + <MethodInvoker generator="{WhiteboardService}" method="getAnnotationHistory" arguments="{event}" /> </EventHandlers> - <EventHandlers type="{PageLoadedEvent.PAGE_LOADED_EVENT}" > - <MethodInvoker generator="{WhiteboardManager}" method="handlePageChangedEvent" arguments="{event}" /> - </EventHandlers> - - <EventHandlers type="{WhiteboardUpdate.CHANGE_PAGE}" > - <MethodInvoker generator="{WhiteboardManager}" method="handleChangeWhiteboardPageEvent" arguments="{event}" /> - </EventHandlers> - <EventHandlers type="{BBBEvent.RECONNECT_BIGBLUEBUTTON_SUCCEEDED_EVENT}" > <MethodInvoker generator="{WhiteboardManager}" method="removeAnnotationsHistory" /> </EventHandlers> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/Whiteboard.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/Whiteboard.as index 05c33f36bd..981d9b739c 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/Whiteboard.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/Whiteboard.as @@ -7,6 +7,7 @@ package org.bigbluebutton.modules.whiteboard.models public class Whiteboard { private var _id:String; + private var _historyLoaded:Boolean = false; private var _annotations:ArrayCollection = new ArrayCollection(); public function Whiteboard(id:String) { @@ -17,10 +18,22 @@ package org.bigbluebutton.modules.whiteboard.models return _id; } + public function get historyLoaded():Boolean { + return _historyLoaded; + } + + public function set historyLoaded(v:Boolean):void { + _historyLoaded = v; + } + public function addAnnotation(annotation:Annotation):void { _annotations.addItem(annotation); } + public function addAnnotationAt(annotation:Annotation, index:int):void { + _annotations.addItemAt(annotation, index); + } + public function updateAnnotation(annotation:Annotation):void { var a:Annotation = getAnnotation(annotation.id); if (a != null) { diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/WhiteboardModel.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/WhiteboardModel.as index 2bc50519e4..fa03f109d1 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/WhiteboardModel.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/WhiteboardModel.as @@ -18,6 +18,7 @@ */ package org.bigbluebutton.modules.whiteboard.models { + import flash.events.EventDispatcher; import flash.events.IEventDispatcher; import mx.collections.ArrayCollection; @@ -28,11 +29,12 @@ package org.bigbluebutton.modules.whiteboard.models import org.bigbluebutton.modules.present.model.Page; import org.bigbluebutton.modules.present.model.PresentationModel; import org.bigbluebutton.modules.whiteboard.business.shapes.DrawObject; - import org.bigbluebutton.modules.whiteboard.events.WhiteboardPresenterEvent; - import org.bigbluebutton.modules.whiteboard.events.WhiteboardShapesEvent; - import org.bigbluebutton.modules.whiteboard.events.WhiteboardUpdate; + import org.bigbluebutton.modules.whiteboard.commands.GetWhiteboardShapesCommand; + import org.bigbluebutton.modules.whiteboard.events.WhiteboardAccessEvent; + import org.bigbluebutton.modules.whiteboard.events.WhiteboardDrawEvent; + import org.bigbluebutton.modules.whiteboard.events.WhiteboardUpdateReceived; - public class WhiteboardModel + public class WhiteboardModel extends EventDispatcher { private static const LOGGER:ILogger = getClassLogger(WhiteboardModel); private var _whiteboards:ArrayCollection = new ArrayCollection(); @@ -40,69 +42,63 @@ package org.bigbluebutton.modules.whiteboard.models private var _multiUser:Boolean = false; private var _dispatcher:IEventDispatcher; - - private var currentWhiteboardId:String; public function WhiteboardModel(dispatcher:IEventDispatcher) { _dispatcher = dispatcher; } - private function getWhiteboard(id:String):Whiteboard { - for (var i:int = 0; i < _whiteboards.length; i++) { - var wb:Whiteboard = _whiteboards.getItemAt(i) as Whiteboard; - if (wb.id == id) return wb; - } - return null; + private function getWhiteboard(id:String, requestHistory:Boolean=true):Whiteboard { + var wb:Whiteboard; + + for (var i:int = 0; i < _whiteboards.length; i++) { + wb = _whiteboards.getItemAt(i) as Whiteboard; + if (wb.id == id) return wb; + } + + wb = new Whiteboard(id); + _whiteboards.addItem(wb); + + if (requestHistory) { + _dispatcher.dispatchEvent(new GetWhiteboardShapesCommand(id)); + } + + return wb; } - public function addAnnotation(annotation:Annotation):void { - // LOGGER.debug("*** Adding annotation [{0},{1},{2}] ****", [annotation.id, annotation.type, annotation.status]); - var wb:Whiteboard; + public function addAnnotation(annotation:Annotation):void { + // LOGGER.debug("*** Adding annotation [{0},{1},{2}] ****", [annotation.id, annotation.type, annotation.status]); + var wb:Whiteboard = getWhiteboard(annotation.whiteboardId);; if (annotation.status == AnnotationStatus.DRAW_START || annotation.type == AnnotationType.POLL) { - wb = getWhiteboard(annotation.whiteboardId); - if (wb != null) { - wb.addAnnotation(annotation); - } else { - wb = new Whiteboard(annotation.whiteboardId); - wb.addAnnotation(annotation); - _whiteboards.addItem(wb); - } - } else { - wb = getWhiteboard(annotation.whiteboardId); - if (wb != null) { - wb.updateAnnotation(annotation); - } - } - + wb.addAnnotation(annotation); + } else { + wb.updateAnnotation(annotation); + } // LOGGER.debug("*** Dispatching WhiteboardUpdate.BOARD_UPDATED Event ****"); - var event:WhiteboardUpdate = new WhiteboardUpdate(WhiteboardUpdate.BOARD_UPDATED); - event.annotation = annotation; - _dispatcher.dispatchEvent(event); -// trace(LOG + "*** Dispatched WhiteboardUpdate.BOARD_UPDATED Event ****"); - } + var event:WhiteboardUpdateReceived = new WhiteboardUpdateReceived(WhiteboardUpdateReceived.NEW_ANNOTATION); + event.annotation = annotation; + dispatchEvent(event); + } private function addShapes(wb:Whiteboard, shapes:Array):void { for (var i:int = 0; i < shapes.length; i++) { var an:Annotation = shapes[i] as Annotation; - wb.addAnnotation(an); + wb.addAnnotationAt(an, i); } } public function addAnnotationFromHistory(whiteboardId:String, annotation:Array):void { //LOGGER.debug("addAnnotationFromHistory: wb id=[{0}]", [whiteboardId]); - var wb:Whiteboard = getWhiteboard(whiteboardId); - if (wb != null) { - // LOGGER.debug("Whiteboard is already present. Adding shapes."); - addShapes(wb, annotation); - } else { - // LOGGER.debug("Whiteboard is NOT present. Creating WB and adding shapes."); - wb = new Whiteboard(whiteboardId); + var wb:Whiteboard = getWhiteboard(whiteboardId, false); + if (wb != null && !wb.historyLoaded) { + // LOGGER.debug("Whiteboard is already present. Adding shapes."); addShapes(wb, annotation); - _whiteboards.addItem(wb); - } - - _dispatcher.dispatchEvent(new WhiteboardShapesEvent(wb.id)); + wb.historyLoaded = true; + + var e:WhiteboardUpdateReceived = new WhiteboardUpdateReceived(WhiteboardUpdateReceived.RECEIVED_ANNOTATION_HISTORY); + e.wbId = wb.id; + dispatchEvent(e); + } } public function removeAnnotation(wbId:String, shapeId:String):void { @@ -111,23 +107,12 @@ package org.bigbluebutton.modules.whiteboard.models if (wb != null) { var removedAnnotation:Annotation = wb.undo(shapeId); if (removedAnnotation != null) { - var e:WhiteboardUpdate = new WhiteboardUpdate(WhiteboardUpdate.UNDO_ANNOTATION); + var e:WhiteboardUpdateReceived = new WhiteboardUpdateReceived(WhiteboardUpdateReceived.UNDO_ANNOTATION); e.annotation = removedAnnotation; - _dispatcher.dispatchEvent(e); + dispatchEvent(e); } } } - - public function getAnnotation(id:String):Annotation { - var wbId:String = getCurrentWhiteboardId(); - if (wbId != null) { - var wb:Whiteboard = getWhiteboard(wbId); - if (wb != null) { - return wb.getAnnotation(id); - } - } - return null; - } public function getAnnotations(wbId:String):Array { var wb:Whiteboard = getWhiteboard(wbId); @@ -142,48 +127,33 @@ package org.bigbluebutton.modules.whiteboard.models LOGGER.debug("Clearing whiteboard"); var wb:Whiteboard = getWhiteboard(wbId); if (wb != null) { + var event:WhiteboardUpdateReceived = new WhiteboardUpdateReceived(WhiteboardUpdateReceived.CLEAR_ANNOTATIONS); + event.wbId = wbId; if (fullClear) { wb.clearAll(); - _dispatcher.dispatchEvent(new WhiteboardUpdate(WhiteboardUpdate.CLEAR_ANNOTATIONS)); } else { wb.clear(userId); - var event:WhiteboardUpdate = new WhiteboardUpdate(WhiteboardUpdate.CLEAR_ANNOTATIONS); event.userId = userId; - _dispatcher.dispatchEvent(event); } + dispatchEvent(event); } } public function clearAll():void { _whiteboards.removeAll(); - _dispatcher.dispatchEvent(new WhiteboardUpdate(WhiteboardUpdate.CLEAR_ANNOTATIONS)); + + var event:WhiteboardUpdateReceived = new WhiteboardUpdateReceived(WhiteboardUpdateReceived.CLEAR_ANNOTATIONS); + event.wbId = "all"; + dispatchEvent(event); } public function accessModified(multiUser:Boolean):void { _multiUser = multiUser; - var event:WhiteboardPresenterEvent = new WhiteboardPresenterEvent(WhiteboardPresenterEvent.MODIFIED_WHITEBOARD_ACCESS); + var event:WhiteboardAccessEvent = new WhiteboardAccessEvent(WhiteboardAccessEvent.MODIFIED_WHITEBOARD_ACCESS); event.multiUser = multiUser; - _dispatcher.dispatchEvent(event); + dispatchEvent(event); } - - - public function getCurrentWhiteboardId():String { - if(currentWhiteboardId) - return currentWhiteboardId; - - return null; - } - - public function setCurrentWhiteboardId(whiteboardId:String):void { - currentWhiteboardId = whiteboardId; - LOGGER.debug("currentWhiteboardId set to: " + currentWhiteboardId); - LOGGER.debug("(current page id: " + PresentationModel.getInstance().getCurrentPage().id + ")"); - } - - public function isOverlayingDeskshare():Boolean { - return (currentWhiteboardId && currentWhiteboardId == "deskshare"); - } } } \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/services/MessageSender.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/services/MessageSender.as index e508fefef5..b187e2f6e9 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/services/MessageSender.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/services/MessageSender.as @@ -23,13 +23,13 @@ package org.bigbluebutton.modules.whiteboard.services import org.bigbluebutton.core.BBB; import org.bigbluebutton.core.managers.ConnectionManager; import org.bigbluebutton.modules.whiteboard.events.WhiteboardDrawEvent; - import org.bigbluebutton.modules.whiteboard.events.WhiteboardPresenterEvent; + import org.bigbluebutton.modules.whiteboard.events.WhiteboardAccessEvent; public class MessageSender { private static const LOGGER:ILogger = getClassLogger(MessageSender); - public function modifyAccess(e:WhiteboardPresenterEvent):void { + public function modifyAccess(e:WhiteboardAccessEvent):void { // LogUtil.debug("Sending [whiteboard.enableWhiteboard] to server."); var message:Object = new Object(); message["multiUser"] = e.multiUser; diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/services/WhiteboardService.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/services/WhiteboardService.as index 74a639f912..4e54ef4ae9 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/services/WhiteboardService.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/services/WhiteboardService.as @@ -22,7 +22,7 @@ package org.bigbluebutton.modules.whiteboard.services import org.as3commons.logging.api.getClassLogger; import org.bigbluebutton.modules.whiteboard.commands.GetWhiteboardShapesCommand; import org.bigbluebutton.modules.whiteboard.events.WhiteboardDrawEvent; - import org.bigbluebutton.modules.whiteboard.events.WhiteboardPresenterEvent; + import org.bigbluebutton.modules.whiteboard.events.WhiteboardAccessEvent; import org.bigbluebutton.modules.whiteboard.models.WhiteboardModel; public class WhiteboardService @@ -38,7 +38,7 @@ package org.bigbluebutton.modules.whiteboard.services sender.requestAnnotationHistory(cmd.whiteboardId); } - public function modifyAccess(e:WhiteboardPresenterEvent):void { + public function modifyAccess(e:WhiteboardAccessEvent):void { sender.modifyAccess(e); } @@ -50,19 +50,15 @@ package org.bigbluebutton.modules.whiteboard.services sender.toggleGrid(); } - public function undoGraphic():void { - var wbId:String = whiteboardModel.getCurrentWhiteboardId(); - if (wbId != null) { - - sender.undoGraphic(wbId) + public function undoGraphic(e:WhiteboardDrawEvent):void { + if (e.wbId != null) { + sender.undoGraphic(e.wbId) } } - public function clearBoard():void { - var wbId:String = whiteboardModel.getCurrentWhiteboardId(); - if (wbId != null) { - LOGGER.debug("Clear shape for wb [{0}]", [wbId]); - sender.clearBoard(wbId); + public function clearBoard(e:WhiteboardDrawEvent):void { + if (e.wbId != null) { + sender.clearBoard(e.wbId); } } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/IDrawListener.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/IDrawListener.as index 916198f2f5..428adaa4dc 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/IDrawListener.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/IDrawListener.as @@ -22,7 +22,7 @@ package org.bigbluebutton.modules.whiteboard.views public interface IDrawListener { - function onMouseDown(mouseX:Number, mouseY:Number, tool:WhiteboardTool):void; + function onMouseDown(mouseX:Number, mouseY:Number, tool:WhiteboardTool, wbId:String):void; function onMouseMove(mouseX:Number, mouseY:Number, tool:WhiteboardTool):void; function onMouseUp(mouseX:Number, mouseY:Number, tool:WhiteboardTool):void; } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/models/WhiteboardCanvasModel.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/IWhiteboardReceiver.as similarity index 77% rename from bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/models/WhiteboardCanvasModel.as rename to bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/IWhiteboardReceiver.as index c591385952..29bce8fc4a 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/models/WhiteboardCanvasModel.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/IWhiteboardReceiver.as @@ -16,12 +16,10 @@ * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. * */ -package org.bigbluebutton.modules.whiteboard.views.models -{ - public class WhiteboardCanvasModel - { - public function WhiteboardCanvasModel() - { - } + +package org.bigbluebutton.modules.whiteboard.views { + public interface IWhiteboardReceiver { + function receiveToolbars(wt:WhiteboardToolbar, wtt:WhiteboardTextToolbar):void; + function receiveCanvas(wc:WhiteboardCanvas):void; } } \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/PencilDrawListener.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/PencilDrawListener.as index 49332f8c7c..2c9f6ce08a 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/PencilDrawListener.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/PencilDrawListener.as @@ -37,28 +37,22 @@ package org.bigbluebutton.modules.whiteboard.views private var _isDrawing:Boolean = false;; private var _segment:Array = new Array(); private var _wbCanvas:WhiteboardCanvas; - private var _sendFrequency:int; private var _shapeFactory:ShapeFactory; private var _idGenerator:AnnotationIDGenerator; private var _curID:String; - private var _wbModel:WhiteboardModel; private var _wbId:String = null; public function PencilDrawListener(idGenerator:AnnotationIDGenerator, wbCanvas:WhiteboardCanvas, - sendShapeFrequency:int, - shapeFactory:ShapeFactory, - wbModel:WhiteboardModel) + shapeFactory:ShapeFactory) { _idGenerator = idGenerator; _wbCanvas = wbCanvas; - _sendFrequency = sendShapeFrequency; _shapeFactory = shapeFactory; - _wbModel = wbModel; } - public function onMouseDown(mouseX:Number, mouseY:Number, tool:WhiteboardTool):void { + public function onMouseDown(mouseX:Number, mouseY:Number, tool:WhiteboardTool, wbId:String):void { //if (tool.graphicType == WhiteboardConstants.TYPE_SHAPE) { if (tool.toolType == AnnotationType.PENCIL) { if (_isDrawing) { @@ -69,7 +63,7 @@ package org.bigbluebutton.modules.whiteboard.views _isDrawing = true; _drawStatus = AnnotationStatus.DRAW_START; - _wbId = _wbModel.getCurrentWhiteboardId(); + _wbId = wbId; // Generate a shape id so we can match the mouse down and up events. Then we can // remove the specific shape when a mouse up occurs. @@ -131,11 +125,7 @@ package org.bigbluebutton.modules.whiteboard.views dobj.status = status; dobj.id = _curID; - var an:Annotation = dobj.createAnnotation(_wbModel); - - if (_wbId != null) { - an.annotation["whiteboardId"] = _wbId; - } + var an:Annotation = dobj.createAnnotation(_wbId); if (an != null) { _wbCanvas.sendGraphicToServer(an); diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/ShapeDrawListener.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/ShapeDrawListener.as index 0ba108b1ac..50463b1072 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/ShapeDrawListener.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/ShapeDrawListener.as @@ -21,14 +21,11 @@ package org.bigbluebutton.modules.whiteboard.views import flash.geom.Point; import org.bigbluebutton.modules.whiteboard.business.shapes.DrawAnnotation; - import org.bigbluebutton.modules.whiteboard.business.shapes.DrawObject; import org.bigbluebutton.modules.whiteboard.business.shapes.ShapeFactory; import org.bigbluebutton.modules.whiteboard.business.shapes.WhiteboardConstants; - import org.bigbluebutton.modules.whiteboard.events.WhiteboardDrawEvent; import org.bigbluebutton.modules.whiteboard.models.Annotation; import org.bigbluebutton.modules.whiteboard.models.AnnotationStatus; import org.bigbluebutton.modules.whiteboard.models.AnnotationType; - import org.bigbluebutton.modules.whiteboard.models.WhiteboardModel; import org.bigbluebutton.modules.whiteboard.views.models.WhiteboardTool; public class ShapeDrawListener implements IDrawListener @@ -37,26 +34,20 @@ package org.bigbluebutton.modules.whiteboard.views private var _isDrawing:Boolean = false; private var _segment:Array = new Array(); private var _wbCanvas:WhiteboardCanvas; - private var _sendFrequency:int; private var _shapeFactory:ShapeFactory; private var _idGenerator:AnnotationIDGenerator; private var _curID:String; - private var _wbModel:WhiteboardModel; private var _wbId:String = null; public function ShapeDrawListener(idGenerator:AnnotationIDGenerator, wbCanvas:WhiteboardCanvas, - sendShapeFrequency:int, - shapeFactory:ShapeFactory, - wbModel:WhiteboardModel) { + shapeFactory:ShapeFactory) { _idGenerator = idGenerator; _wbCanvas = wbCanvas; - _sendFrequency = sendShapeFrequency; _shapeFactory = shapeFactory; - _wbModel = wbModel; } - public function onMouseDown(mouseX:Number, mouseY:Number, tool:WhiteboardTool):void { + public function onMouseDown(mouseX:Number, mouseY:Number, tool:WhiteboardTool, wbId:String):void { if (tool.toolType == AnnotationType.RECTANGLE || tool.toolType == AnnotationType.TRIANGLE || tool.toolType == AnnotationType.ELLIPSE || @@ -69,7 +60,7 @@ package org.bigbluebutton.modules.whiteboard.views _isDrawing = true; _drawStatus = AnnotationStatus.DRAW_START; - _wbId = _wbModel.getCurrentWhiteboardId(); + _wbId = wbId; // Generate a shape id so we can match the mouse down and up events. Then we can // remove the specific shape when a mouse up occurs. @@ -128,11 +119,7 @@ package org.bigbluebutton.modules.whiteboard.views dobj.status = status; dobj.id = _curID; - var an:Annotation = dobj.createAnnotation(_wbModel); - - if (_wbId != null) { - an.annotation["whiteboardId"] = _wbId; - } + var an:Annotation = dobj.createAnnotation(_wbId); if (an != null) { _wbCanvas.sendGraphicToServer(an); diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/TextDrawListener.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/TextDrawListener.as index f5e906fae0..1632e0a244 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/TextDrawListener.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/TextDrawListener.as @@ -29,8 +29,6 @@ package org.bigbluebutton.modules.whiteboard.views { public class TextDrawListener implements IDrawListener { private var _wbCanvas:WhiteboardCanvas; - private var _sendFrequency:int; - private var _shapeFactory:ShapeFactory; private var _mouseXDown:Number = 0; @@ -53,19 +51,17 @@ package org.bigbluebutton.modules.whiteboard.views { private var _curID:String; - private var feedback:RectangleFeedbackTextBox = new RectangleFeedbackTextBox(); + private var _wbId:String; - private var _wbModel:WhiteboardModel; + private var feedback:RectangleFeedbackTextBox = new RectangleFeedbackTextBox(); - public function TextDrawListener(idGenerator:AnnotationIDGenerator, wbCanvas:WhiteboardCanvas, sendShapeFrequency:int, shapeFactory:ShapeFactory, wbModel:WhiteboardModel) { + public function TextDrawListener(idGenerator:AnnotationIDGenerator, wbCanvas:WhiteboardCanvas, shapeFactory:ShapeFactory) { _idGenerator = idGenerator; _wbCanvas = wbCanvas; - _sendFrequency = sendShapeFrequency; _shapeFactory = shapeFactory; - _wbModel = wbModel; } - public function onMouseDown(mouseX:Number, mouseY:Number, tool:WhiteboardTool):void { + public function onMouseDown(mouseX:Number, mouseY:Number, tool:WhiteboardTool, wbId:String):void { if (tool.graphicType == WhiteboardConstants.TYPE_TEXT) { _mouseXDown = _mouseXMove = mouseX; _mouseYDown = _mouseYMove = mouseY; @@ -75,10 +71,12 @@ package org.bigbluebutton.modules.whiteboard.views { // even if the user has mousedDown yet. _mousedDown = true; + _wbId = wbId; + // Need to check whether we were editing on mouse down because the edit will be finished by the time mouse up happens _wasEditing = _wbCanvas.isEditingText(); - _wbCanvas.addRawChild(feedback); + _wbCanvas.addGraphic(feedback); } } @@ -98,7 +96,7 @@ package org.bigbluebutton.modules.whiteboard.views { if (tool.graphicType == WhiteboardConstants.TYPE_TEXT && _mousedDown) { feedback.clear(); if (_wbCanvas.contains(feedback)) { - _wbCanvas.removeRawChild(feedback); + _wbCanvas.removeGraphic(feedback); } _mousedDown = false; @@ -130,7 +128,7 @@ package org.bigbluebutton.modules.whiteboard.views { tobj.status = status; tobj.id = _curID; - _wbCanvas.sendGraphicToServer(tobj.createAnnotation(_wbModel)); + _wbCanvas.sendGraphicToServer(tobj.createAnnotation(_wbId)); } } } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/TextUpdateListener.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/TextUpdateListener.as index b229c499ae..00b4fc2c48 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/TextUpdateListener.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/TextUpdateListener.as @@ -16,18 +16,15 @@ package org.bigbluebutton.modules.whiteboard.views { public class TextUpdateListener { private var _whiteboardCanvas:WhiteboardCanvas; - private var _whiteboardModel:WhiteboardModel; private var _shapeFactory:ShapeFactory; private var _currentTextObject:TextObject; - private var _whiteboardId:String; public function TextUpdateListener() { } - public function setDependencies(whiteboardCanvas:WhiteboardCanvas, whiteboardModel:WhiteboardModel, shapeFactory:ShapeFactory):void { + public function setDependencies(whiteboardCanvas:WhiteboardCanvas, shapeFactory:ShapeFactory):void { _whiteboardCanvas = whiteboardCanvas; - _whiteboardModel = whiteboardModel; _shapeFactory = shapeFactory; } @@ -54,8 +51,7 @@ package org.bigbluebutton.modules.whiteboard.views { canvasMouseDown(); } _currentTextObject = tobj; - _whiteboardId = _whiteboardModel.getCurrentWhiteboardId(); - _whiteboardCanvas.textToolbar.syncPropsWith(_currentTextObject); + _whiteboardCanvas.textToolbarSyncProxy(_currentTextObject); _whiteboardCanvas.stage.focus = tobj; tobj.registerListeners(textObjLostFocusListener, textObjTextChangeListener, textObjKeyDownListener); } @@ -63,7 +59,7 @@ package org.bigbluebutton.modules.whiteboard.views { public function removedTextObject(tobj:TextObject):void { if (tobj == _currentTextObject) { _currentTextObject = null; - _whiteboardCanvas.textToolbar.syncPropsWith(null); + _whiteboardCanvas.textToolbarSyncProxy(null); tobj.deregisterListeners(textObjLostFocusListener, textObjTextChangeListener, textObjKeyDownListener); } } @@ -106,7 +102,7 @@ package org.bigbluebutton.modules.whiteboard.views { if (status == AnnotationStatus.DRAW_END) { tobj.deregisterListeners(textObjLostFocusListener, textObjTextChangeListener, textObjKeyDownListener); _currentTextObject = null; - _whiteboardCanvas.textToolbar.syncPropsWith(null); + _whiteboardCanvas.textToolbarSyncProxy(null); } // LogUtil.debug("SENDING TEXT: [" + tobj.textSize + "]"); @@ -115,11 +111,7 @@ package org.bigbluebutton.modules.whiteboard.views { tda.status = status; tda.id = tobj.id; - var an:Annotation = tda.createAnnotation(_whiteboardModel); - - if (_whiteboardId != null) { - an.annotation["whiteboardId"] = _whiteboardId; - } + var an:Annotation = tda.createAnnotation(tobj.whiteboardId); _whiteboardCanvas.sendGraphicToServer(an); } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardCanvas.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardCanvas.as new file mode 100755 index 0000000000..2e16caeef5 --- /dev/null +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardCanvas.as @@ -0,0 +1,300 @@ +/** + * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ + * + * Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). + * + * This program is free software; you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free Software + * Foundation; either version 3.0 of the License, or (at your option) any later + * version. + * + * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License along + * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. + * + */ + +package org.bigbluebutton.modules.whiteboard.views { + + import com.asfusion.mate.events.Dispatcher; + import com.asfusion.mate.events.Listener; + + import flash.display.DisplayObject; + import flash.events.Event; + import flash.events.MouseEvent; + + import mx.containers.Canvas; + import mx.managers.CursorManager; + + import org.bigbluebutton.common.Images; + import org.bigbluebutton.main.events.MadePresenterEvent; + import org.bigbluebutton.modules.whiteboard.WhiteboardCanvasDisplayModel; + import org.bigbluebutton.modules.whiteboard.WhiteboardCanvasModel; + import org.bigbluebutton.modules.whiteboard.business.shapes.DrawObject; + import org.bigbluebutton.modules.whiteboard.business.shapes.TextObject; + import org.bigbluebutton.modules.whiteboard.commands.GetWhiteboardAccessCommand; + import org.bigbluebutton.modules.whiteboard.commands.GetWhiteboardShapesCommand; + import org.bigbluebutton.modules.whiteboard.events.WhiteboardAccessEvent; + import org.bigbluebutton.modules.whiteboard.events.WhiteboardButtonEvent; + import org.bigbluebutton.modules.whiteboard.events.WhiteboardDrawEvent; + import org.bigbluebutton.modules.whiteboard.events.WhiteboardUpdateReceived; + import org.bigbluebutton.modules.whiteboard.models.Annotation; + import org.bigbluebutton.modules.whiteboard.models.AnnotationType; + import org.bigbluebutton.modules.whiteboard.models.WhiteboardModel; + + public class WhiteboardCanvas extends Canvas { + private var canvasModel:WhiteboardCanvasModel; + private var canvasDisplayModel:WhiteboardCanvasDisplayModel; + private var whiteboardToolbar:WhiteboardToolbar; + private var textToolbar:WhiteboardTextToolbar; + + private var graphicObjectHolder:Canvas = new Canvas(); + private var images:Images = new Images(); + + [Bindable] private var pencil_icon:Class = images.pencil_icon; + [Bindable] private var rectangle_icon:Class = images.square_icon; + [Bindable] private var triangle_icon:Class = images.triangle_icon; + [Bindable] private var ellipse_icon:Class = images.circle_icon; + [Bindable] private var line_icon:Class = images.line_icon; + [Bindable] private var text_icon:Class = images.text_icon; + private var toolType:String = AnnotationType.PENCIL; + private var whiteboardEnabled:Boolean = false; + private var currentWhiteboardId:String; + + public function WhiteboardCanvas(wbModel:WhiteboardModel):void { + canvasModel = new WhiteboardCanvasModel(); + canvasDisplayModel = new WhiteboardCanvasDisplayModel(); + + //set up model cross dependencies + canvasModel.setDependencies(this, canvasDisplayModel); + canvasDisplayModel.setDependencies(this, wbModel); + + whiteboardToolbar = new WhiteboardToolbar(); + whiteboardToolbar.canvas = this; + + textToolbar = new WhiteboardTextToolbar(); + textToolbar.canvas = this; + + //create the annotation display container + this.addChild(graphicObjectHolder); + graphicObjectHolder.x = 0; + graphicObjectHolder.y = 0; + graphicObjectHolder.clipContent = true; + graphicObjectHolder.tabFocusEnabled = false; + + addEventListener(MouseEvent.MOUSE_OVER, onMouseOver); + addEventListener(MouseEvent.MOUSE_OUT, onMouseOut); + + wbModel.addEventListener(WhiteboardUpdateReceived.NEW_ANNOTATION, onNewAnnotationEvent); + wbModel.addEventListener(WhiteboardUpdateReceived.RECEIVED_ANNOTATION_HISTORY, onReceivedAnnotationsHistory); + wbModel.addEventListener(WhiteboardUpdateReceived.CLEAR_ANNOTATIONS, onClearAnnotations); + wbModel.addEventListener(WhiteboardUpdateReceived.UNDO_ANNOTATION, onUndoAnnotation); + wbModel.addEventListener(WhiteboardAccessEvent.MODIFIED_WHITEBOARD_ACCESS, onModifiedAccess); + + whiteboardToolbar.addEventListener(WhiteboardButtonEvent.ENABLE_WHITEBOARD, onEnableWhiteboardEvent); + whiteboardToolbar.addEventListener(WhiteboardButtonEvent.DISABLE_WHITEBOARD, onDisableWhiteboardEvent); + } + + public function attachToReceivingObject(ro:IWhiteboardReceiver):void { + ro.receiveCanvas(this); + ro.receiveToolbars(whiteboardToolbar, textToolbar); + } + + private function registerForMouseEvents():void { + addEventListener(MouseEvent.MOUSE_DOWN, doMouseDown); + } + + private function unregisterForMouseEvents():void { + removeEventListener(MouseEvent.MOUSE_DOWN, doMouseDown); + } + + private function doMouseUp(event:MouseEvent):void { + canvasModel.doMouseUp(Math.min(Math.max(parent.mouseX, 0), parent.width) - this.x, Math.min(Math.max(parent.mouseY, 0), parent.height) - this.y); + + stage.removeEventListener(MouseEvent.MOUSE_UP, doMouseUp); + stage.removeEventListener(MouseEvent.MOUSE_MOVE, doMouseMove); + } + + private function doMouseDown(event:MouseEvent):void { + canvasModel.doMouseDown(this.mouseX, this.mouseY, currentWhiteboardId); + canvasDisplayModel.doMouseDown(this.mouseX, this.mouseY); + event.stopPropagation(); // we want to stop the bubbling so slide doesn't move + + stage.addEventListener(MouseEvent.MOUSE_UP, doMouseUp); + stage.addEventListener(MouseEvent.MOUSE_MOVE, doMouseMove); + } + + private function doMouseMove(event:MouseEvent):void { + canvasModel.doMouseMove(Math.min(Math.max(parent.mouseX, 0), parent.width-1) - this.x, Math.min(Math.max(parent.mouseY, 0), parent.height-1) - this.y); + } + + public function changeColor(e:Event):void { + canvasModel.changeColor(e.target.selectedColor); + } + + public function isEditingText():Boolean { + return canvasDisplayModel.isEditingText(); + } + + public function sendGraphicToServer(gobj:Annotation):void { + // LogUtil.debug("DISPATCHING SEND sendGraphicToServer [" + type + "]"); + var event:WhiteboardDrawEvent = new WhiteboardDrawEvent(WhiteboardDrawEvent.SEND_SHAPE); + event.annotation = gobj; + var dispatcher:Dispatcher = new Dispatcher(); + dispatcher.dispatchEvent(event); + } + + public function sendUndoToServer():void { + var event:WhiteboardDrawEvent = new WhiteboardDrawEvent(WhiteboardDrawEvent.UNDO); + event.wbId = currentWhiteboardId; + var dispatcher:Dispatcher = new Dispatcher(); + dispatcher.dispatchEvent(event); + } + + public function sendClearToServer():void { + var event:WhiteboardDrawEvent = new WhiteboardDrawEvent(WhiteboardDrawEvent.CLEAR); + event.wbId = currentWhiteboardId; + var dispatcher:Dispatcher = new Dispatcher(); + dispatcher.dispatchEvent(event); + } + + public function setGraphicType(type:String):void { + if (canvasModel == null) return; + canvasModel.setGraphicType(type); + } + + public function setTool(s:String):void { + if (canvasModel == null) return; + canvasModel.setTool(s); + toolType = s; + } + + public function changeThickness(e:Event):void { + canvasModel.changeThickness(e.target.value); + } + + private function setWhiteboardInteractable():void { + if (this.whiteboardEnabled) { + registerForMouseEvents(); + } else { + unregisterForMouseEvents(); + } + } + + private function onMouseOver(e:MouseEvent):void { + setCursor(toolType); + } + + private function onMouseOut(e:MouseEvent):void { + removeCursor(); + } + + private function setCursor(toolType:String):void { + if(toolType == AnnotationType.ELLIPSE) { + CursorManager.setCursor(ellipse_icon); + } else if(toolType == AnnotationType.RECTANGLE) { + CursorManager.setCursor(rectangle_icon); + } else if(toolType == AnnotationType.TRIANGLE) { + CursorManager.setCursor(triangle_icon); + } else if(toolType == AnnotationType.PENCIL) { + CursorManager.setCursor(pencil_icon, 2, -2, -22); + } else if(toolType == AnnotationType.LINE) { + CursorManager.setCursor(line_icon); + } else if(toolType == AnnotationType.TEXT) { + CursorManager.setCursor(text_icon); + } + } + + private function removeCursor():void { + CursorManager.removeCursor(CursorManager.currentCursorID); + } + + public function doesContain(child:DisplayObject):Boolean { + return this.graphicObjectHolder.rawChildren.contains(child); + } + + public function getMouseXY():Array { + return [Math.min(Math.max(parent.mouseX, 0), parent.width-2) - this.x, Math.min(Math.max(parent.mouseY, 0), parent.height-2) - this.y]; + } + + public function removeGraphic(child:DisplayObject):void { + if (doesContain(child)) this.graphicObjectHolder.rawChildren.removeChild(child); + else trace("Does not contain"); + } + + public function addGraphic(child:DisplayObject):void { + this.graphicObjectHolder.rawChildren.addChild(child); + } + + public function textToolbarSyncProxy(tobj:TextObject):void { + textToolbar.syncPropsWith(tobj); + } + + public function moveCanvas(x:Number, y:Number):void { + this.x = x; + this.y = y; + } + + public function zoomCanvas(width:Number, height:Number):void { + graphicObjectHolder.width = width; + graphicObjectHolder.height = height; + this.width = width; + this.height = height; + canvasDisplayModel.zoomCanvas(width, height); + canvasModel.zoomCanvas(width, height); + textToolbar.adjustForZoom(width, height); + } + + public function displayWhiteboardById(wbId:String):void { + currentWhiteboardId = wbId; + canvasDisplayModel.changeWhiteboard(wbId); + } + + private function onNewAnnotationEvent(e:WhiteboardUpdateReceived):void { + if (e.annotation.whiteboardId == currentWhiteboardId) { + canvasDisplayModel.drawGraphic(e.annotation); + } + } + + private function onClearAnnotations(e:WhiteboardUpdateReceived):void { + if (e.wbId == currentWhiteboardId || e.wbId == "all") { + canvasDisplayModel.clearBoard(e.userId); + } + } + + private function onReceivedAnnotationsHistory(e:WhiteboardUpdateReceived):void { + if (e.wbId == currentWhiteboardId) { + canvasDisplayModel.receivedAnnotationsHistory(e.wbId); + } + } + + private function onUndoAnnotation(e:WhiteboardUpdateReceived):void { + if (e.annotation.whiteboardId == currentWhiteboardId) { + canvasDisplayModel.undoAnnotation(e.annotation); + } + } + + private function onModifiedAccess(e:WhiteboardAccessEvent):void { + //if (e.whiteboardId == currentWhiteboardId) { + whiteboardToolbar.whiteboardAccessModified(e.multiUser); + //} + } + + private function onEnableWhiteboardEvent(e:WhiteboardButtonEvent):void { + e.stopPropagation(); + + this.whiteboardEnabled = true; + setWhiteboardInteractable(); + } + + private function onDisableWhiteboardEvent(e:WhiteboardButtonEvent):void { + e.stopPropagation(); + + this.whiteboardEnabled = false; + setWhiteboardInteractable(); + } + } +} diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardCanvas.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardCanvas.mxml deleted file mode 100755 index 1662be845e..0000000000 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardCanvas.mxml +++ /dev/null @@ -1,279 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<!-- - -BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ - -Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). - -This program is free software; you can redistribute it and/or modify it under the -terms of the GNU Lesser General Public License as published by the Free Software -Foundation; either version 3.0 of the License, or (at your option) any later -version. - -BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License along -with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. - ---> - -<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%" xmlns:mate="http://mate.asfusion.com/" - creationComplete="init()" visible="false" mouseOver="setCursor(toolType)" mouseOut="removeCursor()" implements="org.bigbluebutton.common.IBbbCanvas"> - <mx:Script> - <![CDATA[ - import com.asfusion.mate.events.Dispatcher; - - import mx.managers.CursorManager; - - import org.bigbluebutton.common.IBbbCanvas; - import org.bigbluebutton.common.Images; - import org.bigbluebutton.main.events.MadePresenterEvent; - import org.bigbluebutton.modules.whiteboard.WhiteboardCanvasDisplayModel; - import org.bigbluebutton.modules.whiteboard.WhiteboardCanvasModel; - import org.bigbluebutton.modules.whiteboard.business.shapes.DrawObject; - import org.bigbluebutton.modules.whiteboard.commands.GetWhiteboardAccessCommand; - import org.bigbluebutton.modules.whiteboard.commands.GetWhiteboardShapesCommand; - import org.bigbluebutton.modules.whiteboard.events.PageEvent; - import org.bigbluebutton.modules.whiteboard.events.WhiteboardButtonEvent; - import org.bigbluebutton.modules.whiteboard.events.WhiteboardDrawEvent; - import org.bigbluebutton.modules.whiteboard.models.Annotation; - import org.bigbluebutton.modules.whiteboard.models.AnnotationType; - - public var model:WhiteboardCanvasModel; - public var displayModel:WhiteboardCanvasDisplayModel; - - public var textToolbar:WhiteboardTextToolbar; - private var bbbCanvas:IBbbCanvas; - private var _xPosition:int; - private var _yPosition:int; - private var images:Images = new Images(); - - [Bindable] private var pencil_icon:Class = images.pencil_icon; - [Bindable] private var rectangle_icon:Class = images.square_icon; - [Bindable] private var triangle_icon:Class = images.triangle_icon; - [Bindable] private var ellipse_icon:Class = images.circle_icon; - [Bindable] private var line_icon:Class = images.line_icon; - [Bindable] private var text_icon:Class = images.text_icon; - private var toolType:String = AnnotationType.PENCIL; - private var whiteboardEnabled:Boolean = false; - private var showWhiteboard:Boolean = true; - - private function init():void { - this.label = "Highlighter"; - registerForMouseEvents(); - } - - public function queryForAnnotationHistory(webId:String):void { - var dispatcher:Dispatcher = new Dispatcher(); - dispatcher.dispatchEvent(new GetWhiteboardShapesCommand(webId)); - } - - public function queryForWhiteboardAccess():void { - var dispatcher:Dispatcher = new Dispatcher(); - dispatcher.dispatchEvent(new GetWhiteboardAccessCommand()); - } - - public function registerForMouseEvents():void { - addEventListener(MouseEvent.MOUSE_DOWN, doMouseDown); - } - - public function unregisterForMouseEvents():void { - removeEventListener(MouseEvent.MOUSE_DOWN, doMouseDown); - } - - private function doMouseUp(event:MouseEvent):void { - model.doMouseUp(Math.min(Math.max(parent.mouseX, 0), parent.width) - this.x, Math.min(Math.max(parent.mouseY, 0), parent.height) - this.y); - - stage.removeEventListener(MouseEvent.MOUSE_UP, doMouseUp); - stage.removeEventListener(MouseEvent.MOUSE_MOVE, doMouseMove); - } - - private function doMouseDown(event:MouseEvent):void { - model.doMouseDown(this.mouseX, this.mouseY); - displayModel.doMouseDown(this.mouseX, this.mouseY); - event.stopPropagation(); // we want to stop the bubbling so slide doesn't move - - stage.addEventListener(MouseEvent.MOUSE_UP, doMouseUp); - stage.addEventListener(MouseEvent.MOUSE_MOVE, doMouseMove); - } - - private function doMouseMove(event:MouseEvent):void { - model.doMouseMove(Math.min(Math.max(parent.mouseX, 0), parent.width-1) - this.x, Math.min(Math.max(parent.mouseY, 0), parent.height-1) - this.y); - } - - public function changeColor(e:Event):void { - model.changeColor(e.target.selectedColor); - } - - public function isEditingText():Boolean { - return displayModel.isEditingText(); - } - - public function sendGraphicToServer(gobj:Annotation):void { - // LogUtil.debug("DISPATCHING SEND sendGraphicToServer [" + type + "]"); - var event:WhiteboardDrawEvent = new WhiteboardDrawEvent(WhiteboardDrawEvent.SEND_SHAPE); - event.annotation = gobj; - var dispatcher:Dispatcher = new Dispatcher(); - dispatcher.dispatchEvent(event); - } - - public function setGraphicType(type:String):void { - if (model == null) return; - model.setGraphicType(type); - } - - public function setTool(s:String):void { - if (model == null) return; - model.setTool(s); - toolType = s; - } - - public function changeThickness(e:Event):void { - model.changeThickness(e.target.value); - } - - public function get xPosition():int { - return _xPosition; - } - - public function get yPosition():int { - return _yPosition; - } - - public function set xPosition(x:int):void { - _xPosition = x; - } - - public function set yPosition(y:int):void { - _yPosition = y; - } - - private function setWhiteboardVisibility():void { - if (this.whiteboardEnabled && this.showWhiteboard) { - this.visible = true; - registerForMouseEvents(); - } else { - this.visible = false; - unregisterForMouseEvents(); - } - } - - /* added this functionality in WhiteboardToolbar.mxml instead to allow a variety of cursors */ - public function setCursorPencil():void { - CursorManager.setCursor(pencil_icon); - } - - public function setCursor(toolType:String):void { - if(toolType == AnnotationType.ELLIPSE) { - CursorManager.setCursor(ellipse_icon); - } else if(toolType == AnnotationType.RECTANGLE) { - CursorManager.setCursor(rectangle_icon); - } else if(toolType == AnnotationType.TRIANGLE) { - CursorManager.setCursor(triangle_icon); - } else if(toolType == AnnotationType.PENCIL) { - CursorManager.setCursor(pencil_icon, 2, -2, -22); - } else if(toolType == AnnotationType.LINE) { - CursorManager.setCursor(line_icon); - } else if(toolType == AnnotationType.TEXT) { - CursorManager.setCursor(text_icon); -// } else if(toolType == SelectObject.SELECT_TOOL) { -// CursorManager.setCursor(select_icon); - } - } - - private function removeCursor():void { - CursorManager.removeCursor(CursorManager.currentCursorID); - } - - /** Inherited from org.bigbluebutton.common.IBbbCanvas*/ - public function addRawChild(child:DisplayObject):void { - this.bbbCanvas.addRawChild(child); - } - - public function removeRawChild(child:DisplayObject):void { - this.bbbCanvas.removeRawChild(child); - } - - public function doesContain(child:DisplayObject):Boolean { - return bbbCanvas.doesContain(child); - } - - public function acceptOverlayCanvas(overlay:IBbbCanvas):void { -// LogUtil.debug("WhiteboardCanvas::acceptOverlayCanvas()"); -// LogUtil.debug("OVERLAYING PRESENTATION CANVAS"); - - this.bbbCanvas = overlay; - //Load existing shapes onto the canvas. - dispatchEvent(new PageEvent(PageEvent.LOAD_PAGE)); - - /** - * Check if this is the first time we overlayed the whiteboard canvas into the - * presentation canvas. If so, query for annotations history. - */ - if (! displayModel.canvasInited) { - displayModel.parentCanvasInitialized(); - var webId:String = model.whiteboardModel.getCurrentWhiteboardId(); - if (webId != null) { - queryForAnnotationHistory(webId); - queryForWhiteboardAccess(); - } - } - - } - - public function moveCanvas(x:Number, y:Number):void { - this.x = x; - this.y = y; - } - - public function getMouseXY():Array { - return [Math.min(Math.max(parent.mouseX, 0), parent.width-2) - this.x, Math.min(Math.max(parent.mouseY, 0), parent.height-2) - this.y]; - } - - public function removeGraphic(child:DisplayObject):void { - if (bbbCanvas == null) return; - if (doesContain(child)) removeRawChild(child); - } - - public function addGraphic(child:DisplayObject):void { - if (bbbCanvas == null) return; - addRawChild(child); - } - - public function zoomCanvas(width:Number, height:Number):void { - this.width = width; - this.height = height; - displayModel.zoomCanvas(width, height); - model.zoomCanvas(width, height); - textToolbar.adjustForZoom(width, height); - } - - public function showCanvas(show:Boolean):void{ - this.showWhiteboard = show; - - setWhiteboardVisibility(); - } - - /** End IBBBCanvas*/ - public function isPageEmpty():Boolean { - return displayModel.isPageEmpty(); - } - - public function enableWhiteboard(e:WhiteboardButtonEvent):void{ - this.whiteboardEnabled = true; - setWhiteboardVisibility(); - useHandCursor = false; - } - - public function disableWhiteboard(e:WhiteboardButtonEvent):void{ - this.whiteboardEnabled = false; - setWhiteboardVisibility(); - useHandCursor = true; - } - - ]]> - </mx:Script> -</mx:Canvas> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardTextToolbar.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardTextToolbar.mxml index 286666552f..08ddea6168 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardTextToolbar.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardTextToolbar.mxml @@ -24,20 +24,22 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. xmlns:mate="http://mate.asfusion.com/" visible="false" backgroundColor="0xCCCCCC" cornerRadius="5" borderStyle="solid" paddingBottom="3" paddingTop="3" paddingLeft="3" paddingRight="3" alpha="0" - xmlns:views="org.bigbluebutton.modules.whiteboard.views.*" xmlns:local="*"> + xmlns:views="org.bigbluebutton.modules.whiteboard.views.*" xmlns:local="*" + creationComplete="onCreationComplete()"> <mate:Listener type="{MadePresenterEvent.SWITCH_TO_VIEWER_MODE}" method="viewerMode" /> <mate:Listener type="{WhiteboardButtonEvent.DISABLE_WHITEBOARD}" method="disableTextToolbar" /> <mate:Listener type="{StopWhiteboardModuleEvent.STOP_HIGHLIGHTER_MODULE_EVENT}" method="closeToolbar" /> <mx:Script> <![CDATA[ + import flexlib.mdi.containers.MDIWindow; + import mx.events.MoveEvent; import mx.events.ResizeEvent; import org.as3commons.logging.api.ILogger; import org.as3commons.logging.api.getClassLogger; import org.bigbluebutton.main.events.MadePresenterEvent; - import org.bigbluebutton.modules.present.ui.views.PresentationWindow; import org.bigbluebutton.modules.whiteboard.business.shapes.TextObject; import org.bigbluebutton.modules.whiteboard.events.StopWhiteboardModuleEvent; import org.bigbluebutton.modules.whiteboard.events.WhiteboardButtonEvent; @@ -51,13 +53,13 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. public var backgroundVisible:Boolean; private var currentlySelectedTextObject:TextObject = null; - private var presentationWindow:PresentationWindow; + private var containerToOverlay:MDIWindow; private var normalAlpha:Number = 0.55; private var focusedAlpha:Number = 1.0; private var hasFocus:Boolean; [Bindable] private var fontSizes:Array = ["12", "14", "16", "18", "22", "24", "32", "36"]; - public function init():void { + private function onCreationComplete():void { this.alpha = normalAlpha; this.addEventListener(MouseEvent.ROLL_OVER, makeFocused); this.addEventListener(MouseEvent.ROLL_OUT, makeDim); @@ -74,11 +76,11 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. } /* Following two methods are used for aesthetics when mouse hovers over TextToolbar and when it hovers out of it */ - public function makeDim(event:MouseEvent):void { + private function makeDim(event:MouseEvent):void { this.alpha = normalAlpha; } - public function makeFocused(event:MouseEvent):void { + private function makeFocused(event:MouseEvent):void { this.alpha = focusedAlpha; } @@ -141,11 +143,11 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. } // invoked by WhiteboardManager when the TextToolbar is first loaded - public function positionToolbar(window:PresentationWindow):void{ - this.presentationWindow = window; - presentationWindow.addEventListener(ResizeEvent.RESIZE, repositionToolbarByWindow); - presentationWindow.addEventListener(MouseEvent.CLICK, repositionToolbarByWindow); - presentationWindow.addEventListener(MoveEvent.MOVE, repositionToolbarByWindow); + public function positionToolbar(container:MDIWindow):void{ + containerToOverlay = container; + containerToOverlay.addEventListener(ResizeEvent.RESIZE, repositionToolbarByWindow); + containerToOverlay.addEventListener(MouseEvent.CLICK, repositionToolbarByWindow); + containerToOverlay.addEventListener(MoveEvent.MOVE, repositionToolbarByWindow); } /* required for repositioning the TextToolbar when an event occurs on the presentation window */ diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardToolbar.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardToolbar.mxml index 5051144ef9..016ee5114a 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardToolbar.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardToolbar.mxml @@ -21,7 +21,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. --> <mx:VBox xmlns="flexlib.containers.*" - initialize="init()" xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:view="org.bigbluebutton.modules.whiteboard.views.*" xmlns:wbBtns="org.bigbluebutton.modules.whiteboard.views.buttons.*" @@ -35,13 +34,10 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <mate:Listener type="{MadePresenterEvent.SWITCH_TO_PRESENTER_MODE}" method="presenterMode" /> <mate:Listener type="{MadePresenterEvent.SWITCH_TO_VIEWER_MODE}" method="viewerMode" /> - <mate:Listener type="{WhiteboardPresenterEvent.MODIFIED_WHITEBOARD_ACCESS}" method="whiteboardAccessModified" /> <mate:Listener type="{StopWhiteboardModuleEvent.STOP_HIGHLIGHTER_MODULE_EVENT}" method="closeToolbar" /> <mate:Listener type="{ShortcutEvent.UNDO_WHITEBOARD}" method="undoShortcut" /> - <mate:Listener type="{WhiteboardButtonEvent.WHITEBOARD_BUTTON_PRESSED}" method="handleWhiteboardButtonPressed"/> <mate:Listener type="{ChangeMyRole.CHANGE_MY_ROLE_EVENT}" method="refreshRole" /> <mate:Listener type="{DisplaySlideEvent.DISPLAY_SLIDE_EVENT}" method="handleSlideLoaded" /> - <mate:Listener type="{UploadEvent.PRESENTATION_READY}" method="handlePresentationSwitch" /> <mate:Listener type="{PresenterStatusEvent.ANNOTATIONS_PERMISSION_CHANGE}" method="handleEnableAnnotations" /> <mx:Style> @@ -68,6 +64,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. import com.asfusion.mate.core.GlobalDispatcher; import com.asfusion.mate.events.Listener; + import flexlib.mdi.containers.MDIWindow; + import mx.events.MoveEvent; import mx.events.ResizeEvent; @@ -80,15 +78,10 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. import org.bigbluebutton.main.events.ShortcutEvent; import org.bigbluebutton.main.model.users.events.ChangeMyRole; import org.bigbluebutton.modules.present.events.DisplaySlideEvent; - import org.bigbluebutton.modules.present.events.UploadEvent; - import org.bigbluebutton.modules.present.model.Presenter; - import org.bigbluebutton.modules.present.ui.views.PresentationWindow; - import org.bigbluebutton.modules.whiteboard.business.shapes.GraphicObject; import org.bigbluebutton.modules.whiteboard.business.shapes.WhiteboardConstants; import org.bigbluebutton.modules.whiteboard.events.StopWhiteboardModuleEvent; + import org.bigbluebutton.modules.whiteboard.events.WhiteboardAccessEvent; import org.bigbluebutton.modules.whiteboard.events.WhiteboardButtonEvent; - import org.bigbluebutton.modules.whiteboard.events.WhiteboardDrawEvent; - import org.bigbluebutton.modules.whiteboard.events.WhiteboardPresenterEvent; import org.bigbluebutton.modules.whiteboard.views.models.WhiteboardOptions; import org.bigbluebutton.util.i18n.ResourceUtil; @@ -107,7 +100,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. private var enableAnnotations:Boolean = true; public var canvas:WhiteboardCanvas; - private var presentationWindow:PresentationWindow; + private var containerToOverlay:MDIWindow; [Bindable] private var multiUser:Boolean = false; @@ -116,14 +109,11 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. '0xCCFF00', '0x00FF00', '0x00FF88', '0x00FFFF', '0x0088FF', '0x0000FF', '0x8800FF', '0xFF00FF', '0xC0C0C0']; private var _hideToolbarTimer:Timer = new Timer(500, 1); - - private function init():void{ - - } private function onCreationComplete():void { setToolType(WhiteboardConstants.TYPE_ZOOM, null); _hideToolbarTimer.addEventListener(TimerEvent.TIMER, onHideToolbarTimerComplete); + addEventListener(WhiteboardButtonEvent.WHITEBOARD_BUTTON_PRESSED, handleWhiteboardButtonPressed); } private function handleWhiteboardButtonPressed(e:WhiteboardButtonEvent):void { @@ -132,7 +122,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. private function setToolType(graphicType:String, toolType:String):void { if (graphicType == WhiteboardConstants.TYPE_CLEAR) { - dispatchEvent(new WhiteboardDrawEvent(WhiteboardDrawEvent.CLEAR)); + canvas.sendClearToServer(); } else if (graphicType == WhiteboardConstants.TYPE_UNDO) { sendUndoCommand(); } else { @@ -182,7 +172,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. var dispatcher:GlobalDispatcher = new GlobalDispatcher(); - var event:WhiteboardPresenterEvent = new WhiteboardPresenterEvent(WhiteboardPresenterEvent.MODIFY_WHITEBOARD_ACCESS); + var event:WhiteboardAccessEvent = new WhiteboardAccessEvent(WhiteboardAccessEvent.MODIFY_WHITEBOARD_ACCESS); event.multiUser = !multiUser; dispatcher.dispatchEvent(event); } @@ -196,8 +186,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. checkVisibility(); } - private function whiteboardAccessModified(e:WhiteboardPresenterEvent):void { - multiUser = e.multiUser; + public function whiteboardAccessModified(mu:Boolean):void { + multiUser = mu; checkToolReset(); checkVisibility(); } @@ -208,28 +198,26 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. } private function sendUndoCommand():void { -// if (!canvas.isPageEmpty()) { - dispatchEvent(new WhiteboardDrawEvent(WhiteboardDrawEvent.UNDO)); -// } + canvas.sendUndoToServer(); } - public function positionToolbar(window:PresentationWindow):void { + public function positionToolbar(container:MDIWindow):void { LOGGER.debug("Positioning whiteboard toolbar"); - presentationWindow = window; - presentationWindow.addEventListener(MoveEvent.MOVE, setPositionAndDepth); - presentationWindow.addEventListener(ResizeEvent.RESIZE, setPositionAndDepth); - presentationWindow.addEventListener(MouseEvent.CLICK, setPositionAndDepth); + containerToOverlay = container; + containerToOverlay.addEventListener(MoveEvent.MOVE, setPositionAndDepth); + containerToOverlay.addEventListener(ResizeEvent.RESIZE, setPositionAndDepth); + containerToOverlay.addEventListener(MouseEvent.CLICK, setPositionAndDepth); - if (!wbOptions.keepToolbarVisible) { - window.presCtrlBar.addEventListener(MouseEvent.ROLL_OVER, handleMouseOut); - window.presCtrlBar.addEventListener(MouseEvent.ROLL_OUT, handleMouseIn); - - window.addEventListener(MouseEvent.ROLL_OVER, handleMouseIn); - window.addEventListener(MouseEvent.ROLL_OUT, handleMouseOut); - - this.addEventListener(MouseEvent.ROLL_OVER, handleMouseIn); - this.addEventListener(MouseEvent.ROLL_OUT, handleMouseOut); - } + if (!wbOptions.keepToolbarVisible) { + //containerToOverlay.presCtrlBar.addEventListener(MouseEvent.ROLL_OVER, handleMouseOut); + //containerToOverlay.presCtrlBar.addEventListener(MouseEvent.ROLL_OUT, handleMouseIn); + + containerToOverlay.addEventListener(MouseEvent.ROLL_OVER, handleMouseIn); + containerToOverlay.addEventListener(MouseEvent.ROLL_OUT, handleMouseOut); + + this.addEventListener(MouseEvent.ROLL_OVER, handleMouseIn); + this.addEventListener(MouseEvent.ROLL_OUT, handleMouseOut); + } } private function refreshRole(e:ChangeMyRole):void { @@ -237,7 +225,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. } private function checkVisibility(e:MadePresenterEvent = null):void { - if (toolbarAllowed() && slideLoaded && enableAnnotations && (wbOptions.keepToolbarVisible || mousedOver) && !presentationWindow.minimized) { + if (toolbarAllowed() && slideLoaded && enableAnnotations && (wbOptions.keepToolbarVisible || mousedOver) && !containerToOverlay.minimized) { setPositionAndDepth(); showToolbar(); } else { @@ -267,8 +255,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. private function setPositionAndDepth(e:Event = null):void { if (parent == null) return; - this.x = presentationWindow.x + presentationWindow.width - 43; - this.y = presentationWindow.y + 30; + this.x = containerToOverlay.x + containerToOverlay.width - 43; + this.y = containerToOverlay.y + 30; parent.setChildIndex(this, parent.numChildren - 1); } @@ -296,14 +284,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. slideLoaded = true; checkVisibility(); } - - private function handlePresentationSwitch(e:UploadEvent):void { - slideLoaded = false; - if (panzoomBtn) { - panzoomBtn.dispatchEvent(new MouseEvent(MouseEvent.CLICK)); - } - checkVisibility(); - } private function toolbarAllowed():Boolean { return (multiUser? true : isPresenter); -- GitLab