Added whiteboard functionality to the deskshare tab.

Some pending issues:

- Notes made in DeskstopPublishWindow appear a little dislocated in DesktopViewWindow.

- Independence between SlideView and Deskshare notes. Deskshare and SlideView tabs share current slide notes. Perhaps make Deskshare Window be treated as a new page of the current presentation or as a new presentation.
This commit is contained in:
kreismann 2016-07-13 17:39:55 -03:00
parent 90c1c84771
commit 1197d1a3ad
9 changed files with 266 additions and 61 deletions

View File

@ -25,12 +25,12 @@ package org.bigbluebutton.main.events
public static const PRESENTER_NAME_CHANGE:String = "PRESENTER_NAME_CHANGE"; public static const PRESENTER_NAME_CHANGE:String = "PRESENTER_NAME_CHANGE";
public static const SWITCH_TO_VIEWER_MODE:String = "VIEWER_MODE"; public static const SWITCH_TO_VIEWER_MODE:String = "VIEWER_MODE";
public static const SWITCH_TO_PRESENTER_MODE:String = "PRESENTER_MODE"; public static const SWITCH_TO_PRESENTER_MODE:String = "PRESENTER_MODE";
public static const SWITCHED_TO_PRESENTATION_TAB:String = "SWITCHED TO PRESENTATION TAB"; public static const ANNOTATIONS_PERMISSION_CHANGE:String = "ANNOTATIONS_PERMISSION_CHANGE";
public static const SWITCHED_TO_DESKSHARE_TAB:String = "SWITCHED TO DESKSHARE TAB";
public var presenterName:String; public var presenterName:String;
public var assignerBy:Number; public var assignerBy:Number;
public var userID:String; public var userID:String;
public var enableAnnotations:Boolean;
public function PresenterStatusEvent(type:String) public function PresenterStatusEvent(type:String)
{ {

View File

@ -80,13 +80,13 @@ package org.bigbluebutton.modules.deskshare.managers
closeWindow(shareWindow); closeWindow(shareWindow);
} }
private function openWindow(window:IBbbModuleWindow):void { private function openWindow(window:DesktopPublishWindow):void {
var e:ShareEvent = new ShareEvent(ShareEvent.CREATE_DESKTOP_PUBLISH_TAB); var e:ShareEvent = new ShareEvent(ShareEvent.CREATE_DESKTOP_PUBLISH_TAB);
e.publishTabContent = window as DesktopPublishWindow; e.publishTabContent = window;
globalDispatcher.dispatchEvent(e); globalDispatcher.dispatchEvent(e);
} }
private function closeWindow(window:IBbbModuleWindow):void { private function closeWindow(window:DesktopPublishWindow):void {
var e:ShareEvent = new ShareEvent(ShareEvent.CLEAN_DESKTOP_PUBLISH_TAB); var e:ShareEvent = new ShareEvent(ShareEvent.CLEAN_DESKTOP_PUBLISH_TAB);
globalDispatcher.dispatchEvent(e); globalDispatcher.dispatchEvent(e);
} }

View File

@ -52,9 +52,9 @@ package org.bigbluebutton.modules.deskshare.managers
service.sendStartedViewingNotification(stream); service.sendStartedViewingNotification(stream);
} }
private function openWindow(window:IBbbModuleWindow):void{ private function openWindow(window:DesktopViewWindow):void{
var e:ShareEvent = new ShareEvent(ShareEvent.OPEN_DESKTOP_VIEW_TAB); var e:ShareEvent = new ShareEvent(ShareEvent.OPEN_DESKTOP_VIEW_TAB);
e.viewTabContent = window as DesktopViewWindow; e.viewTabContent = window;
globalDispatcher.dispatchEvent(e); globalDispatcher.dispatchEvent(e);
} }
@ -64,7 +64,7 @@ package org.bigbluebutton.modules.deskshare.managers
isViewing = false; isViewing = false;
} }
private function closeWindow(window:IBbbModuleWindow):void { private function closeWindow(window:DesktopViewWindow):void {
var e:ShareEvent = new ShareEvent(ShareEvent.CLOSE_DESKTOP_VIEW_TAB); var e:ShareEvent = new ShareEvent(ShareEvent.CLOSE_DESKTOP_VIEW_TAB);
globalDispatcher.dispatchEvent(e); globalDispatcher.dispatchEvent(e);
} }

View File

@ -20,9 +20,9 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
--> -->
<mx:VBox <mx:Canvas
xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:mx="http://www.adobe.com/2006/mxml"
implements="org.bigbluebutton.common.IBbbModuleWindow" implements="org.bigbluebutton.common.IBbbCanvas"
xmlns:mate="http://mate.asfusion.com/" xmlns:mate="http://mate.asfusion.com/"
xmlns:dspub="org.bigbluebutton.common.*" xmlns:dspub="org.bigbluebutton.common.*"
initialize="init()" initialize="init()"
@ -63,6 +63,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
import org.bigbluebutton.modules.deskshare.utils.JavaCheck; import org.bigbluebutton.modules.deskshare.utils.JavaCheck;
import org.bigbluebutton.modules.deskshare.utils.BrowserCheck; import org.bigbluebutton.modules.deskshare.utils.BrowserCheck;
import org.bigbluebutton.modules.deskshare.events.ShareEvent; import org.bigbluebutton.modules.deskshare.events.ShareEvent;
import org.bigbluebutton.common.IBbbCanvas;
import org.bigbluebutton.util.i18n.ResourceUtil; import org.bigbluebutton.util.i18n.ResourceUtil;
@ -97,6 +98,9 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
[Bindable] private var cursor:Sprite; [Bindable] private var cursor:Sprite;
[Bindable] private var dsOptions:DeskshareOptions; [Bindable] private var dsOptions:DeskshareOptions;
private var whiteboardCanvas:Canvas = null;
private var whiteboardCanvasHolder:Canvas = new Canvas();
private var calledStopApplet:Boolean = false; private var calledStopApplet:Boolean = false;
@ -233,7 +237,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
} }
private function startPreviewStream(nc:NetConnection, streamName:String, capWidth:Number, capHeight:Number):void{ private function startPreviewStream(nc:NetConnection, streamName:String, capWidth:Number, capHeight:Number):void{
if(cursor == null || cursorImg == null) if(cursor == null || cursorImg == null || video != null)
return; return;
streaming = true; streaming = true;
@ -255,7 +259,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
videoHolder.addChild(cursor); videoHolder.addChild(cursor);
videoHolder.addChild(cursorImg); videoHolder.addChild(cursorImg);
cursor.visible = false; cursor.visible = false;
this.addChild(videoHolder); this.addChildAt(videoHolder,0);
fitVideoToWindow(); fitVideoToWindow();
ns = new NetStream(nc); ns = new NetStream(nc);
@ -268,7 +272,43 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
video.attachNetStream(ns); video.attachNetStream(ns);
ns.play(streamName); ns.play(streamName);
} }
private function addWhiteboardCanvasHolder():void{
updateWhiteboardCanvasHolder();
if(streaming)
this.addChildAt(this.whiteboardCanvasHolder,1);
}
private function updateWhiteboardCanvasHolder():void{
if(video != null) {
this.whiteboardCanvasHolder.x = video.x;
this.whiteboardCanvasHolder.y = video.y;
this.whiteboardCanvasHolder.width = video.width;
this.whiteboardCanvasHolder.height = video.height;
LOGGER.debug("Whiteboard canvas holder dimensions updated");
}
}
public function addWhiteboardOverlay():void {
updateWhiteboardCanvasOverlay();
if(streaming && this.whiteboardCanvas != null) {
this.addChild(this.whiteboardCanvas);
LOGGER.debug("Whiteboard Canvas OVERLAY added.");
}
else
LOGGER.debug("COULD NOT add whiteboard overlay");
}
private function updateWhiteboardCanvasOverlay():void{
if(video != null && this.whiteboardCanvas != null) {
this.whiteboardCanvas.x = video.x;
this.whiteboardCanvas.y = video.y;
this.whiteboardCanvas.width = video.width;
this.whiteboardCanvas.height = video.height;
LOGGER.debug("Whiteboard canvas overlay dimensions updated");
}
}
private function onResize(e:ResizeEvent):void { private function onResize(e:ResizeEvent):void {
fitVideoToWindow(); fitVideoToWindow();
} }
@ -290,6 +330,10 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
video.y = 0; video.y = 0;
video.x = (videoHolder.width - video.width) / 2; video.x = (videoHolder.width - video.width) / 2;
} }
//update the whiteboard canvas holder and overlay with new video dimensions...
updateWhiteboardCanvasHolder();
updateWhiteboardCanvasOverlay();
} }
private function stopStream():void{ private function stopStream():void{
@ -315,6 +359,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
break; break;
case "NetStream.Play.Start": case "NetStream.Play.Start":
LOGGER.debug("Netstatus: {0}", [e.info.code]); LOGGER.debug("Netstatus: {0}", [e.info.code]);
addWhiteboardCanvasHolder();
addWhiteboardOverlay();
globalDispatcher.dispatchEvent(new BBBEvent(BBBEvent.DESKSHARE_STARTED)); globalDispatcher.dispatchEvent(new BBBEvent(BBBEvent.DESKSHARE_STARTED));
} }
} }
@ -377,6 +423,40 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
} }
} }
} }
/** 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{
LOGGER.debug("DesktopPublishWindow: acceptOverlayCanvas");
whiteboardCanvas = overlay as Canvas;
}
private function handleWhiteboardCanvasClick(e:MouseEvent):void {
LOGGER.debug("DesktopPublishWindow: handleWhiteboardCanvasClick");
}
public function moveCanvas(x:Number, y:Number):void{
LOGGER.debug("DesktopPublishWindow: moveCanvas");
}
public function zoomCanvas(width:Number, height:Number, zoom:Number):void{
LOGGER.debug("DesktopPublishWindow: zoomCanvas");
}
public function showCanvas(show:Boolean):void{
LOGGER.debug("DesktopPublishWindow: showCanvas");
}
]]> ]]>
</mx:Script> </mx:Script>
@ -429,4 +509,4 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
</mx:states> </mx:states>
<mx:Image id="cursorImg" visible="false" source="@Embed('../../assets/images/cursor4.png')"/> <mx:Image id="cursorImg" visible="false" source="@Embed('../../assets/images/cursor4.png')"/>
</mx:VBox> </mx:Canvas>

View File

@ -20,13 +20,13 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
--> -->
<mx:VBox xmlns="org.bigbluebutton.common.*" <mx:Canvas xmlns="org.bigbluebutton.common.*"
xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:common="org.bigbluebutton.common.*" xmlns:common="org.bigbluebutton.common.*"
width="600" height="400" width="600" height="400"
initialize="init()" initialize="init()"
creationComplete="onCreationComplete()" creationComplete="onCreationComplete()"
implements="org.bigbluebutton.common.IBbbModuleWindow" implements="org.bigbluebutton.common.IBbbCanvas"
xmlns:mate="http://mate.asfusion.com/" xmlns:mate="http://mate.asfusion.com/"
backgroundColor="#C0C0C0"> backgroundColor="#C0C0C0">
@ -86,6 +86,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
private var isMaximized:Boolean = false; private var isMaximized:Boolean = false;
[Bindable] private var dsOptions:DeskshareOptions; [Bindable] private var dsOptions:DeskshareOptions;
private var whiteboardCanvasHolder:Canvas = new Canvas();
private function init():void{ private function init():void{
dsOptions = new DeskshareOptions(); dsOptions = new DeskshareOptions();
@ -94,7 +96,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
private function onCreationComplete():void{ private function onCreationComplete():void{
videoHolder.addChild(video); videoHolder.addChild(video);
videoHolder.addEventListener(ResizeEvent.RESIZE, onResize); videoHolder.addEventListener(ResizeEvent.RESIZE, onResize);
this.addChild(videoHolder); this.addChildAt(videoHolder,0);
videoHolder.percentWidth = 100; videoHolder.percentWidth = 100;
videoHolder.percentHeight = 100; videoHolder.percentHeight = 100;
fitVideoToWindow(); fitVideoToWindow();
@ -149,7 +151,31 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
video.attachNetStream(ns); video.attachNetStream(ns);
ns.play(stream); ns.play(stream);
this.stream = stream; this.stream = stream;
}
private function addWhiteboardCanvasHolder():void{
if(video != null) {
cleanCanvasHolder();
updateWhiteboardCanvasHolder();
this.addChild(whiteboardCanvasHolder);
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) {
whiteboardCanvasHolder.x = video.x;
whiteboardCanvasHolder.y = video.y;
whiteboardCanvasHolder.width = video.width;
whiteboardCanvasHolder.height = video.height;
LOGGER.debug("Whiteboard canvas holder dimensions updated");
}
} }
protected function updateButtonsPosition():void { protected function updateButtonsPosition():void {
@ -243,6 +269,9 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
btnActualSize.toolTip = ResourceUtil.getInstance().getString('bbb.desktopView.actualSize'); btnActualSize.toolTip = ResourceUtil.getInstance().getString('bbb.desktopView.actualSize');
btnActualSize.label = ResourceUtil.getInstance().getString('bbb.desktopView.actualSize'); btnActualSize.label = ResourceUtil.getInstance().getString('bbb.desktopView.actualSize');
} }
//update the whiteboard canvas holder with new video dimensions...
updateWhiteboardCanvasHolder();
} }
private function closeWindow():void { private function closeWindow():void {
@ -256,6 +285,40 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
private function localeChanged(e:Event):void{ private function localeChanged(e:Event):void{
resourcesChanged(); resourcesChanged();
} }
/** 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{
LOGGER.debug("DesktopPublishWindow: acceptOverlayCanvas");
addWhiteboardCanvasHolder();
}
private function handleWhiteboardCanvasClick(e:MouseEvent):void {
LOGGER.debug("DesktopPublishWindow: handleWhiteboardCanvasClick");
}
public function moveCanvas(x:Number, y:Number):void{
LOGGER.debug("DesktopPublishWindow: moveCanvas");
}
public function zoomCanvas(width:Number, height:Number, zoom:Number):void{
LOGGER.debug("DesktopPublishWindow: zoomCanvas");
}
public function showCanvas(show:Boolean):void{
LOGGER.debug("DesktopPublishWindow: showCanvas");
}
]]> ]]>
</mx:Script> </mx:Script>
@ -274,4 +337,4 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
label="{btnActualSize.selected ? ResourceUtil.getInstance().getString('bbb.desktopView.fitToWindow') : ResourceUtil.getInstance().getString('bbb.desktopView.actualSize')}" label="{btnActualSize.selected ? ResourceUtil.getInstance().getString('bbb.desktopView.fitToWindow') : ResourceUtil.getInstance().getString('bbb.desktopView.actualSize')}"
toolTip="{btnActualSize.selected ? ResourceUtil.getInstance().getString('bbb.desktopView.fitToWindow') : ResourceUtil.getInstance().getString('bbb.desktopView.actualSize')}"/> toolTip="{btnActualSize.selected ? ResourceUtil.getInstance().getString('bbb.desktopView.fitToWindow') : ResourceUtil.getInstance().getString('bbb.desktopView.actualSize')}"/>
</mx:HBox> </mx:HBox>
</mx:VBox> </mx:Canvas>

View File

@ -110,6 +110,9 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
import org.bigbluebutton.modules.whiteboard.events.WhiteboardButtonEvent; import org.bigbluebutton.modules.whiteboard.events.WhiteboardButtonEvent;
import org.bigbluebutton.modules.deskshare.events.ShareEvent; import org.bigbluebutton.modules.deskshare.events.ShareEvent;
import org.bigbluebutton.util.i18n.ResourceUtil; import org.bigbluebutton.util.i18n.ResourceUtil;
import org.bigbluebutton.common.IBbbCanvas;
import org.bigbluebutton.modules.deskshare.view.components.DesktopPublishWindow;
import org.bigbluebutton.modules.deskshare.view.components.DesktopViewWindow;
private static const LOGGER:ILogger = getClassLogger(PresentationWindow); private static const LOGGER:ILogger = getClassLogger(PresentationWindow);
@ -171,6 +174,10 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
[Embed(source="../../../polling/sounds/Poll.mp3")] [Embed(source="../../../polling/sounds/Poll.mp3")]
private var noticeSoundClass:Class; private var noticeSoundClass:Class;
private var noticeSound:Sound = new noticeSoundClass() as Sound; private var noticeSound:Sound = new noticeSoundClass() as Sound;
private var whiteboardOverlay:IBbbCanvas = null;
private var DSPublishCanvas:DesktopPublishWindow = null;
private var DSViewCanvas:DesktopViewWindow = null;
private function init():void{ private function init():void{
presentOptions = new PresentOptions(); presentOptions = new PresentOptions();
@ -532,8 +539,17 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
private function addOverlayCanvas(e:AddOverlayCanvasEvent):void{ private function addOverlayCanvas(e:AddOverlayCanvasEvent):void{
LOGGER.debug("OVERLAYING WHITEBOARD CANVAS"); LOGGER.debug("OVERLAYING WHITEBOARD CANVAS");
whiteboardOverlay = e.canvas;
LOGGER.debug("addOverlayCanvas: Adding whiteboard canvas to SlideView");
e.canvas.acceptOverlayCanvas(slideView); e.canvas.acceptOverlayCanvas(slideView);
slideView.acceptOverlayCanvas(e.canvas); slideView.acceptOverlayCanvas(e.canvas);
if(currentTabIndex == DESKSHARE_VIEW_TAB_INDEX && DSViewCanvas != null) {
LOGGER.debug("addOverlayCanvas: Adding whiteboard canvas to DesktopViewWindow");
DSViewCanvas.acceptOverlayCanvas(whiteboardOverlay);
whiteboardOverlay.acceptOverlayCanvas(DSViewCanvas);
}
} }
override protected function resourcesChanged():void{ override protected function resourcesChanged():void{
@ -842,11 +858,18 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
if(presenterTabs.selectedIndex == PRESENTATION_TAB_INDEX) { if(presenterTabs.selectedIndex == PRESENTATION_TAB_INDEX) {
currentTabIndex = PRESENTATION_TAB_INDEX; currentTabIndex = PRESENTATION_TAB_INDEX;
LOGGER.debug("Presentation Tab selected."); LOGGER.debug("Presentation Tab selected.");
if(sharing) if(sharing)
stopSharing(); stopSharing();
if(whiteboardOverlay != null) {
slideView.acceptOverlayCanvas(whiteboardOverlay);
whiteboardOverlay.acceptOverlayCanvas(slideView);
}
if(currentControlBarState == PRESENTER_STATE) { if(currentControlBarState == PRESENTER_STATE) {
setControlBarState("presenter"); setControlBarState("presenter");
dispatchEvent(new PresenterStatusEvent(PresenterStatusEvent.SWITCHED_TO_PRESENTATION_TAB)); annotationsPermissionChanged(true);
} }
} }
@ -862,13 +885,18 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
deskshareControls.visible = true; deskshareControls.visible = true;
deskshareControls.includeInLayout = true; deskshareControls.includeInLayout = true;
} }
dispatchEvent(new PresenterStatusEvent(PresenterStatusEvent.SWITCHED_TO_DESKSHARE_TAB)); annotationsPermissionChanged(false);
} }
} }
else { else {
currentTabIndex = DESKSHARE_VIEW_TAB_INDEX; currentTabIndex = DESKSHARE_VIEW_TAB_INDEX;
LOGGER.debug("Deskshare Viewing Tab selected."); LOGGER.debug("Deskshare Viewing Tab selected.");
if(whiteboardOverlay != null && DSViewCanvas != null) {
DSViewCanvas.acceptOverlayCanvas(whiteboardOverlay);
whiteboardOverlay.acceptOverlayCanvas(DSViewCanvas);
} else LOGGER.debug("openDesktopViewTab: whiteboard overlay or desktop view canvas is null!");
} }
} }
} }
@ -884,33 +912,35 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
private function createDesktopPublishTab(e:ShareEvent):void { private function createDesktopPublishTab(e:ShareEvent):void {
if(e.publishTabContent != null && desksharePublishTab.numElements == 0) { if(e.publishTabContent != null && desksharePublishTab.numElements == 0) {
LOGGER.debug("Setting the content of dekstop share PUBLISHING tab"); DSPublishCanvas = e.publishTabContent;
canPublish = e.publishTabContent.canPublish(); canPublish = e.publishTabContent.canPublish();
LOGGER.debug("Setting the content of dekstop share PUBLISHING tab");
e.publishTabContent.percentHeight = 100; e.publishTabContent.percentHeight = 100;
e.publishTabContent.percentWidth = 100; e.publishTabContent.percentWidth = 100;
desksharePublishTab.addChild(e.publishTabContent); desksharePublishTab.addChild(e.publishTabContent);
if(canPublish && e.publishTabContent.autoStart) if(canPublish && e.publishTabContent.autoStart)
handleDeskshareAutoStart(); handleDeskshareAutoStart();
} }
else else
LOGGER.debug("publishTabContent is NULL."); LOGGER.debug("publishTabContent is NULL.");
} }
private function cleanDesktopPublishTab(e:ShareEvent):void { private function cleanDesktopPublishTab(e:ShareEvent):void {
LOGGER.debug("desksharePublishTab.numElements = " + desksharePublishTab.numElements)
if(desksharePublishTab.numElements != 0) { if(desksharePublishTab.numElements != 0) {
LOGGER.debug("Removing content of dekstop share PUBLISHING tab"); LOGGER.debug("Removing content of dekstop share PUBLISHING tab");
desksharePublishTab.removeAllElements(); desksharePublishTab.removeAllElements();
DSPublishCanvas = null;
} }
} }
private function openDesktopViewTab(e:ShareEvent):void { private function openDesktopViewTab(e:ShareEvent):void {
if(e.viewTabContent != null && presenterTabs.numElements == 2) { if(e.viewTabContent != null && presenterTabs.numElements == 2) {
LOGGER.debug("Opening a new tab for dekstop share VIEWING"); DSViewCanvas = e.viewTabContent;
LOGGER.debug("Opening a new tab for dekstop share VIEWING");
e.viewTabContent.percentHeight = 100; e.viewTabContent.percentHeight = 100;
e.viewTabContent.percentWidth = 100; e.viewTabContent.percentWidth = 100;
e.viewTabContent.setStyle("horizontalAlign","center"); e.viewTabContent.setStyle("horizontalAlign","center");
@ -926,11 +956,21 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
private function closeDesktopViewTab(e:ShareEvent):void { private function closeDesktopViewTab(e:ShareEvent):void {
LOGGER.debug("Closing the dekstop share VIEWING tab"); LOGGER.debug("Closing the dekstop share VIEWING tab");
selectPresentationTab(); selectPresentationTab();
if(presenterTabs.numElements == 3) if(presenterTabs.numElements == 3) {
presenterTabs.removeChildAt(DESKSHARE_VIEW_TAB_INDEX); presenterTabs.removeChildAt(DESKSHARE_VIEW_TAB_INDEX);
DSViewCanvas = null;
}
} }
private function shareScreen(fullScreen:Boolean):void { private function shareScreen(fullScreen:Boolean):void {
if(whiteboardOverlay != null && DSPublishCanvas != null) {
LOGGER.debug("Adding whiteboard layer to Deskshare Publish Canvas");
DSPublishCanvas.acceptOverlayCanvas(whiteboardOverlay);
whiteboardOverlay.acceptOverlayCanvas(DSPublishCanvas);
annotationsPermissionChanged(true);
} else LOGGER.debug("shareScreen: whiteboard overlay or desktop publish canvas is null!");
var e:ShareEvent = new ShareEvent(ShareEvent.SHARE_SCREEN); var e:ShareEvent = new ShareEvent(ShareEvent.SHARE_SCREEN);
e.fullScreen = fullScreen; e.fullScreen = fullScreen;
@ -957,6 +997,12 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
onSelectTab(); onSelectTab();
} }
private function annotationsPermissionChanged(enableAnnotations:Boolean):void {
var event:PresenterStatusEvent = new PresenterStatusEvent(PresenterStatusEvent.ANNOTATIONS_PERMISSION_CHANGE);
event.enableAnnotations = enableAnnotations;
dispatchEvent(event);
}
private function handleDeskshareAutoStart():void { private function handleDeskshareAutoStart():void {
if(deskshareTimer == null) { if(deskshareTimer == null) {
deskshareTimer = new Timer(2000, 1); deskshareTimer = new Timer(2000, 1);

View File

@ -473,6 +473,9 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
} }
public function acceptOverlayCanvas(overlay:IBbbCanvas):void{ public function acceptOverlayCanvas(overlay:IBbbCanvas):void{
if(whiteboardCanvas != null)
cleanCanvasHolder();
whiteboardCanvas = overlay; whiteboardCanvas = overlay;
var c:Canvas = overlay as Canvas; var c:Canvas = overlay as Canvas;
// add the canvas below the thumbnails // add the canvas below the thumbnails
@ -517,9 +520,14 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
focusManager.setFocus(slideLoader); focusManager.setFocus(slideLoader);
slideLoader.drawFocus(true); slideLoader.drawFocus(true);
} }
private function cleanCanvasHolder():void{
while (this.whiteboardCanvasHolder.rawChildren.numChildren > 0)
this.whiteboardCanvasHolder.rawChildren.removeChildAt(0);
}
]]> ]]>
</mx:Script> </mx:Script>
<fimage:FocusableImage id="slideLoader" width="{slideModel.loaderW}" height="{slideModel.loaderH}" <fimage:FocusableImage id="slideLoader" width="{slideModel.loaderW}" height="{slideModel.loaderH}"
x="{slideModel.loaderX}" y="{slideModel.loaderY}" useHandCursor="true" buttonMode="false" x="{slideModel.loaderX}" y="{slideModel.loaderY}" useHandCursor="true" buttonMode="false"
creationComplete="listenForSlideLoadedCompleteEvent()" creationComplete="listenForSlideLoadedCompleteEvent()"

View File

@ -24,23 +24,29 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
creationComplete="init()" visible="false" mouseOver="setCursor(toolType)" mouseOut="removeCursor()" implements="org.bigbluebutton.common.IBbbCanvas"> creationComplete="init()" visible="false" mouseOver="setCursor(toolType)" mouseOut="removeCursor()" implements="org.bigbluebutton.common.IBbbCanvas">
<mx:Script> <mx:Script>
<![CDATA[ <![CDATA[
import com.asfusion.mate.events.Dispatcher; import com.asfusion.mate.events.Dispatcher;
import mx.managers.CursorManager; import mx.managers.CursorManager;
import org.bigbluebutton.common.IBbbCanvas; import org.bigbluebutton.common.IBbbCanvas;
import org.bigbluebutton.common.Images; import org.bigbluebutton.common.Images;
import org.bigbluebutton.main.events.MadePresenterEvent; import org.bigbluebutton.main.events.MadePresenterEvent;
import org.bigbluebutton.modules.whiteboard.WhiteboardCanvasDisplayModel; import org.bigbluebutton.modules.whiteboard.WhiteboardCanvasDisplayModel;
import org.bigbluebutton.modules.whiteboard.WhiteboardCanvasModel; import org.bigbluebutton.modules.whiteboard.WhiteboardCanvasModel;
import org.bigbluebutton.modules.whiteboard.business.shapes.DrawObject; import org.bigbluebutton.modules.whiteboard.business.shapes.DrawObject;
import org.bigbluebutton.modules.whiteboard.business.shapes.TextObject; import org.bigbluebutton.modules.whiteboard.business.shapes.TextObject;
import org.bigbluebutton.modules.whiteboard.commands.GetWhiteboardShapesCommand; import org.bigbluebutton.modules.whiteboard.commands.GetWhiteboardShapesCommand;
import org.bigbluebutton.modules.whiteboard.events.PageEvent; import org.bigbluebutton.modules.whiteboard.events.PageEvent;
import org.bigbluebutton.modules.whiteboard.events.WhiteboardButtonEvent; import org.bigbluebutton.modules.whiteboard.events.WhiteboardButtonEvent;
import org.bigbluebutton.modules.whiteboard.events.WhiteboardDrawEvent; import org.bigbluebutton.modules.whiteboard.events.WhiteboardDrawEvent;
import org.bigbluebutton.modules.whiteboard.models.Annotation; import org.bigbluebutton.modules.whiteboard.models.Annotation;
import org.bigbluebutton.modules.present.ui.views.SlideView;
import org.bigbluebutton.modules.deskshare.view.components.DesktopPublishWindow;
import org.bigbluebutton.modules.deskshare.view.components.DesktopViewWindow;
import org.as3commons.logging.api.ILogger;
import org.as3commons.logging.api.getClassLogger;
private static const LOGGER:ILogger = getClassLogger(WhiteboardCanvas);
public var model:WhiteboardCanvasModel; public var model:WhiteboardCanvasModel;
public var displayModel:WhiteboardCanvasDisplayModel; public var displayModel:WhiteboardCanvasDisplayModel;
@ -68,6 +74,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
} }
public function queryForAnnotationHistory(webId:String):void { public function queryForAnnotationHistory(webId:String):void {
LOGGER.debug("Query for annotation history: " + webId);
var dispatcher:Dispatcher = new Dispatcher(); var dispatcher:Dispatcher = new Dispatcher();
dispatcher.dispatchEvent(new GetWhiteboardShapesCommand(webId)); dispatcher.dispatchEvent(new GetWhiteboardShapesCommand(webId));
} }
@ -97,10 +104,10 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
stage.removeEventListener(MouseEvent.MOUSE_UP, doMouseUp); stage.removeEventListener(MouseEvent.MOUSE_UP, doMouseUp);
stage.removeEventListener(MouseEvent.MOUSE_MOVE, doMouseMove); stage.removeEventListener(MouseEvent.MOUSE_MOVE, doMouseMove);
} }
private function doMouseDown(event:Event):void { private function doMouseDown(event:Event):void {
displayModel.doMouseDown(this.mouseX, this.mouseY); displayModel.doMouseDown(this.mouseX, this.mouseY);
model.doMouseDown(this.mouseX, this.mouseY); model.doMouseDown(this.mouseX, this.mouseY);
event.stopPropagation(); // we want to stop the bubbling so slide doesn't move event.stopPropagation(); // we want to stop the bubbling so slide doesn't move
@ -111,7 +118,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
private function doMouseMove(event:Event):void { private function doMouseMove(event:Event):void {
model.doMouseMove(Math.min(Math.max(parent.mouseX, 0), parent.width-2) - this.x, Math.min(Math.max(parent.mouseY, 0), parent.height-2) - this.y); model.doMouseMove(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 setShape(s:String):void { public function setShape(s:String):void {
// LogUtil.debug("SET SHAPE [" + s + "]"); // LogUtil.debug("SET SHAPE [" + s + "]");
@ -122,7 +128,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
model.changeColor(e.target.selectedColor); model.changeColor(e.target.selectedColor);
} }
public function sendGraphicToServer(gobj:Annotation, type:String):void { public function sendGraphicToServer(gobj:Annotation, type:String):void {
// LogUtil.debug("DISPATCHING SEND sendGraphicToServer [" + type + "]"); // LogUtil.debug("DISPATCHING SEND sendGraphicToServer [" + type + "]");
var event:WhiteboardDrawEvent = new WhiteboardDrawEvent(type); var event:WhiteboardDrawEvent = new WhiteboardDrawEvent(type);
@ -146,7 +152,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
// model.changeFillColor(e.target.selectedColor); // model.changeFillColor(e.target.selectedColor);
} }
public function changeThickness(e:Event):void { public function changeThickness(e:Event):void {
model.changeThickness(e.target.value); model.changeThickness(e.target.value);
} }
@ -244,6 +250,14 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
public function acceptOverlayCanvas(overlay:IBbbCanvas):void { public function acceptOverlayCanvas(overlay:IBbbCanvas):void {
// LogUtil.debug("WhiteboardCanvas::acceptOverlayCanvas()"); // LogUtil.debug("WhiteboardCanvas::acceptOverlayCanvas()");
// LogUtil.debug("OVERLAYING PRESENTATION CANVAS"); // LogUtil.debug("OVERLAYING PRESENTATION CANVAS");
var changedCanvas:Boolean = false;
if( (this.bbbCanvas as DesktopPublishWindow != null || this.bbbCanvas as DesktopViewWindow != null) &&
overlay as SlideView != null )
changedCanvas = true;
else if(this.bbbCanvas as SlideView != null &&
(overlay as DesktopPublishWindow != null || overlay as DesktopViewWindow != null))
changedCanvas = true;
this.bbbCanvas = overlay; this.bbbCanvas = overlay;
//Load existing shapes onto the canvas. //Load existing shapes onto the canvas.
@ -251,15 +265,15 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
/** /**
* Check if this is the first time we overlayed the whiteboard canvas into the * Check if this is the first time we overlayed the whiteboard canvas into the
* presentation canvas. If so, query for annotations history. * presentation canvas or the user changed tabs on Presentation Window. If so, query for annotations history.
*/ */
if (! displayModel.canvasInited) { if (! displayModel.canvasInited || changedCanvas) {
displayModel.parentCanvasInitialized(); displayModel.parentCanvasInitialized();
var webId:String = model.whiteboardModel.getCurrentWhiteboardId(); var webId:String = model.whiteboardModel.getCurrentWhiteboardId();
if (webId != null) { if (webId != null) {
queryForAnnotationHistory(webId); queryForAnnotationHistory(webId);
} }
} } else LOGGER.debug("Not querying annotations history");
} }

View File

@ -41,8 +41,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
<mate:Listener type="{NavigationEvent.GOTO_PAGE}" method="handleSlideChange" /> <mate:Listener type="{NavigationEvent.GOTO_PAGE}" method="handleSlideChange" />
<mate:Listener type="{DisplaySlideEvent.DISPLAY_SLIDE_EVENT}" method="handleSlideLoaded" /> <mate:Listener type="{DisplaySlideEvent.DISPLAY_SLIDE_EVENT}" method="handleSlideLoaded" />
<mate:Listener type="{UploadEvent.PRESENTATION_READY}" method="handlePresentationSwitch" /> <mate:Listener type="{UploadEvent.PRESENTATION_READY}" method="handlePresentationSwitch" />
<mate:Listener type="{PresenterStatusEvent.SWITCHED_TO_PRESENTATION_TAB}" method="handlePresentationTabSelected" /> <mate:Listener type="{PresenterStatusEvent.ANNOTATIONS_PERMISSION_CHANGE}" method="handleEnableAnnotations" />
<mate:Listener type="{PresenterStatusEvent.SWITCHED_TO_DESKSHARE_TAB}" method="handleDeskshareTabSelected" />
<mx:Style> <mx:Style>
.colorPickerStyle { .colorPickerStyle {
@ -118,7 +117,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
private var mousedOver:Boolean = false; private var mousedOver:Boolean = false;
private var slideLoaded:Boolean = false; private var slideLoaded:Boolean = false;
private var presentationTabSelected:Boolean = true; private var enableAnnotations:Boolean = true;
public var canvas:WhiteboardCanvas; public var canvas:WhiteboardCanvas;
private var presentationWindow:PresentationWindow; private var presentationWindow:PresentationWindow;
@ -254,7 +253,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
} }
private function checkVisibility(e:MadePresenterEvent = null):void { private function checkVisibility(e:MadePresenterEvent = null):void {
if (toolbarAllowed() && slideLoaded && presentationTabSelected && (wbOptions.keepToolbarVisible || mousedOver)) { if (toolbarAllowed() && slideLoaded && enableAnnotations && (wbOptions.keepToolbarVisible || mousedOver)) {
setPositionAndDepth(); setPositionAndDepth();
showWhiteboardToolbar = true; showWhiteboardToolbar = true;
} else { } else {
@ -332,13 +331,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
return UsersUtil.amIModerator(); return UsersUtil.amIModerator();
} }
private function handlePresentationTabSelected(e:PresenterStatusEvent):void { private function handleEnableAnnotations(e:PresenterStatusEvent):void {
presentationTabSelected = true; enableAnnotations = e.enableAnnotations;
checkVisibility();
}
private function handleDeskshareTabSelected(e:PresenterStatusEvent):void {
presentationTabSelected = false;
checkVisibility(); checkVisibility();
} }