You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2017/03/30 17:59:45 UTC

svn commit: r1789544 - in /openmeetings/application/trunk: openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/ openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/ openmeetings-util/src/main/java/org/apache/op...

Author: solomax
Date: Thu Mar 30 17:59:45 2017
New Revision: 1789544

URL: http://svn.apache.org/viewvc?rev=1789544&view=rev
Log:
[OPENMEETINGS-551] more work on Presentation upload

Removed:
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomFileResourceReference.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPdfResourceReference.java
Modified:
    openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardCache.java
    openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileItem.java
    openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/OmFileHelper.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomResourceReference.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/JpgRecordingResourceReference.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/Mp4RecordingResourceReference.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FileItemResourceReference.java

Modified: openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardCache.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardCache.java?rev=1789544&r1=1789543&r2=1789544&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardCache.java (original)
+++ openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardCache.java Thu Mar 30 17:59:45 2017
@@ -51,7 +51,8 @@ public class WhiteboardCache {
 	public Set<Entry<Long, Whiteboard>> list(Long roomId, Long langId) {
 		Whiteboards wbs = get(roomId);
 		if (wbs.getWhiteboards().isEmpty()) {
-			add(wbs, langId);
+			Whiteboard wb = add(wbs, langId);
+			wbs.setActiveWb(wb.getId());
 		}
 		return wbs.getWhiteboards().entrySet();
 	}

Modified: openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileItem.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileItem.java?rev=1789544&r1=1789543&r2=1789544&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileItem.java (original)
+++ openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileItem.java Thu Mar 30 17:59:45 2017
@@ -21,6 +21,7 @@ package org.apache.openmeetings.db.entit
 import static org.apache.openmeetings.util.OmFileHelper.DOC_PAGE_PREFIX;
 import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_JPG;
 import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_MP4;
+import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_PDF;
 import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_PNG;
 import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_WML;
 import static org.apache.openmeetings.util.OmFileHelper.getStreamsHibernateDir;
@@ -271,14 +272,18 @@ public abstract class FileItem implement
 					f = new File(d, String.format("%s.%s", getHash(), ext == null ? EXTENSION_MP4 : ext));
 					break;
 				case Presentation:
-					int slide = 0;
+					int slide = (ext == null) ? 0 : -1;
 					try {
+						//ext is used for slide here
 						slide = Integer.parseInt(ext);
 					} catch (Exception e) {
 						//no-op
 					}
-					//ext is used for slide here
-					f = new File(d, String.format("%1$s-%2$04d.%3$s", DOC_PAGE_PREFIX, slide, EXTENSION_PNG));
+					if (slide > -1) {
+						f = new File(d, String.format("%1$s-%2$04d.%3$s", DOC_PAGE_PREFIX, slide, EXTENSION_PNG));
+					} else {
+						f = new File(d, String.format("%s.%s", getHash(), ext == null ? EXTENSION_PDF : ext));
+					}
 					break;
 				case PollChart:
 				case Folder:

Modified: openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/OmFileHelper.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/OmFileHelper.java?rev=1789544&r1=1789543&r2=1789544&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/OmFileHelper.java (original)
+++ openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/OmFileHelper.java Thu Mar 30 17:59:45 2017
@@ -137,8 +137,8 @@ public class OmFileHelper {
 	}
 
 	public static File getUserProfilePicture(Long userId, String uri) {
-		File img = new File(getUploadProfilesUserDir(userId), profileImagePrefix + uri);
-		if (!img.exists()) {
+		File img = new File(getUploadProfilesUserDir(userId), uri == null ? "" : uri);
+		if (!img.exists() || img.isDirectory()) {
 			img = getDefaultProfilePicture();
 		}
 		return img;

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomResourceReference.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomResourceReference.java?rev=1789544&r1=1789543&r2=1789544&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomResourceReference.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomResourceReference.java Thu Mar 30 17:59:45 2017
@@ -38,7 +38,6 @@ import org.apache.openmeetings.db.dto.ro
 import org.apache.openmeetings.db.dto.room.Whiteboards;
 import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.file.FileExplorerItem;
-import org.apache.openmeetings.db.entity.file.FileItem.Type;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.util.FileItemResourceReference;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
@@ -83,8 +82,8 @@ public class RoomResourceReference exten
 	}
 
 	@Override
-	protected FileExplorerItem getFileItem(Attributes attributes) {
-		PageParameters params = attributes.getParameters();
+	protected FileExplorerItem getFileItem(Attributes attr) {
+		PageParameters params = attr.getParameters();
 		StringValue _id = params.get("id");
 		StringValue _preview = params.get("preview");
 		preview = _preview.toBoolean(false);
@@ -127,8 +126,20 @@ public class RoomResourceReference exten
 	}
 
 	@Override
-	protected File getFile(FileExplorerItem f) {
-		return getFile(f, Type.Video == f.getType() && preview ? EXTENSION_JPG : null);
+	protected File getFile(FileExplorerItem f, Attributes attr) {
+		String ext = null;
+		switch (f.getType()) {
+			case Video:
+				if (preview) {
+					ext = EXTENSION_JPG;
+				}
+				break;
+			case Presentation:
+				ext = attr.getParameters().get("slide").toString();
+				break;
+			default:
+		}
+		return getFile(f, ext);
 	}
 
 	@Override

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html?rev=1789544&r1=1789543&r2=1789544&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html Thu Mar 30 17:59:45 2017
@@ -50,7 +50,7 @@
 		</div>
 		
 		<div id="wb-area">
-			<canvas></canvas>
+			<div class="canvases"></div>
 			<div class="tools ui-state-active vertical clear" style="position: absolute; top: 20px; right: 0px;">
 				<div class="bumper"></div>
 				<div wicket:message="title:72" class="ui-widget-header clickable om-icon big pointer"></div>

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java?rev=1789544&r1=1789543&r2=1789544&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java Thu Mar 30 17:59:45 2017
@@ -208,7 +208,9 @@ public class WbPanel extends Panel {
 		WhiteboardCache cache = getBean(WhiteboardCache.class);
 		Whiteboards wbs = cache.get(roomId);
 		for (Entry<Long, Whiteboard> entry : cache.list(roomId, rp.getClient().getUser().getLanguageId())) {
-			sb.append(getAddWbScript(entry.getKey(), entry.getValue().getName()));
+			sb.append(new StringBuilder("WbArea.create(")
+					.append(getAddWbJson(entry.getKey(), entry.getValue().getName()).toString())
+					.append(");"));
 			JSONArray arr = new JSONArray();
 			for (Entry<String, JSONObject> wbEntry : entry.getValue().getRoomItems().entrySet()) {
 				JSONObject o = wbEntry.getValue();
@@ -216,6 +218,7 @@ public class WbPanel extends Panel {
 			}
 			sb.append("WbArea.load(").append(getObjWbJson(entry.getKey(), arr).toString()).append(");");
 		}
+		sb.append("WbArea.activate({id: ").append(wbs.getActiveWb()).append("});");
 		response.render(OnDomReadyHeaderItem.forScript(sb));
 	}
 
@@ -249,12 +252,6 @@ public class WbPanel extends Panel {
 				.put("name", name);
 	}
 
-	private static CharSequence getAddWbScript(Long id, String name) {
-		return new StringBuilder("WbArea.add(")
-				.append(getAddWbJson(id, name).toString())
-				.append(");");
-	}
-
 	public boolean isReadOnly() {
 		return readOnly;
 	}
@@ -354,6 +351,7 @@ public class WbPanel extends Panel {
 			JSONObject file = new JSONObject()
 					.put("fileId", fi.getId())
 					.put("fileType", fi.getType().name())
+					.put("count", fi.getCount())
 					.put("type", "image")
 					.put("left", UPLOAD_WB_LEFT)
 					.put("top", UPLOAD_WB_TOP)

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js?rev=1789544&r1=1789543&r2=1789544&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js Thu Mar 30 17:59:45 2017
@@ -40,12 +40,23 @@ var UUID = (function() {
 	}
 	return self;
 })();
-var Pointer = function(canvas, s) {
+var Base = function() {
+	var base = {};
+	base.objectCreated = function(o, canvas) {
+		o.uid = UUID.generate();
+		canvas.trigger("wb:object:created", o);
+		return o.uid;
+	}
+	return base;
+}
+var Pointer = function(wb, s) {
 	return {
 		activate: function() {
-			canvas.selection = true;
-			canvas.forEachObject(function(o) {
-				o.selectable = true;
+			wb.eachCanvas(function(canvas) {
+				canvas.selection = true;
+				canvas.forEachObject(function(o) {
+					o.selectable = true;
+				});
 			});
 			s.find('[class^="wb-prop"]').prop('disabled', true);
 			if (!!s.find('.wb-prop-b').button("instance")) {
@@ -53,26 +64,19 @@ var Pointer = function(canvas, s) {
 			}
 		}
 		, deactivate: function() {
-			canvas.selection = false;
-			canvas.forEachObject(function(o) {
-				o.selectable = false;
+			wb.eachCanvas(function(canvas) {
+				canvas.selection = false;
+				canvas.forEachObject(function(o) {
+					o.selectable = false;
+				});
 			});
 		}
 	};
 }
-var Base = function(canvas) {
-	var base = {};
-	base.objectCreated = function(o) {
-		o.uid = UUID.generate();
-		canvas.trigger("wb:object:created", o);
-		return o.uid;
-	}
-	return base;
-}
-var APointer = function(canvas) {
-	var pointer = Base(canvas);
+var APointer = function(wb) {
+	var pointer = Base(wb);
 	pointer.user = '';
-	pointer.create = function(_cnvs, o) {
+	pointer.create = function(canvas, o) {
 		fabric.Image.fromURL('./css/images/pointer.png', function(img) {
 			img.set({
 				left:15
@@ -106,28 +110,28 @@ var APointer = function(canvas) {
 				, top: o.y - 20
 			});
 			
-			_cnvs.add(group);
+			canvas.add(group);
 			group.uid = o.uid;
 			group.loaded = !!o.loaded;
 
 			var count = 3;
 			function go(_cnt) {
 				if (_cnt < 0) {
-					_cnvs.remove(group);
+					canvas.remove(group);
 				}
 				circle1.set({radius: 3});
 				circle2.set({radius: 6});
 				circle1.animate(
 					'radius', '20'
 					, {
-						onChange: _cnvs.renderAll.bind(_cnvs)
+						onChange: canvas.renderAll.bind(canvas)
 						, duration: 1000
 						, onComplete: function() {go(_cnt - 1);}
 					});
 				circle2.animate(
 					'radius', '20'
 					, {
-						onChange: _cnvs.renderAll.bind(_cnvs)
+						onChange: canvas.renderAll.bind(canvas)
 						, duration: 1000
 					});
 			}
@@ -135,6 +139,7 @@ var APointer = function(canvas) {
 		});
 	}
 	pointer.mouseUp = function(o) {
+		var canvas = this;
 		var ptr = canvas.getPointer(o.e);
 		var obj = {
 			type: 'pointer'
@@ -142,20 +147,24 @@ var APointer = function(canvas) {
 			, y: ptr.y
 			, user: pointer.user
 		};
-		obj.uid = uid = pointer.objectCreated(obj);
+		obj.uid = uid = pointer.objectCreated(obj, canvas);
 		pointer.create(canvas, obj);
 	}
 	pointer.activate = function() {
-		canvas.on('mouse:up', pointer.mouseUp);
+		wb.eachCanvas(function(canvas) {
+			canvas.on('mouse:up', pointer.mouseUp);
+		});
 		pointer.user = $('.room.sidebar.left .user.list .current .name').text();
 	}
 	pointer.deactivate = function() {
-		canvas.off('mouse:up', pointer.mouseUp);
+		wb.eachCanvas(function(canvas) {
+			canvas.off('mouse:up', pointer.mouseUp);
+		});
 	};
 	return pointer;
 }
-var ShapeBase = function(canvas) {
-	var base = Base(canvas);
+var ShapeBase = function(wb) {
+	var base = Base(wb);
 	base.fill = {enabled: true, color: '#FFFF33'};
 	base.stroke = {enabled: true, color: '#FF6600', width: 5};
 	base.opacity = 1;
@@ -182,11 +191,12 @@ var ShapeBase = function(canvas) {
 	};
 	return base;
 }
-var Text = function(canvas, s) {
-	var text = ShapeBase(canvas);
+var Text = function(wb, s) {
+	var text = ShapeBase(wb);
 	text.obj = null;
 
 	text.mouseDown = function(o) {
+		var canvas = this;
 		var pointer = canvas.getPointer(o.e);
 		var ao = canvas.getActiveObject();
 		if (!!ao && ao.type == 'i-text') {
@@ -205,58 +215,67 @@ var Text = function(canvas, s) {
 		text.obj.enterEditing();
 	};
 	text.activate = function() {
-		canvas.on('mouse:down', text.mouseDown);
-		canvas.selection = true;
-		canvas.forEachObject(function(o) {
-			if (o.type == 'i-text') {
-				o.selectable = true;
-			}
+		wb.eachCanvas(function(canvas) {
+			canvas.on('mouse:down', text.mouseDown);
+			canvas.selection = true;
+			canvas.forEachObject(function(o) {
+				if (o.type == 'i-text') {
+					o.selectable = true;
+				}
+			});
 		});
 		text.enableAllProps(s);
 	};
 	text.deactivate = function() {
-		canvas.off('mouse:down', text.mouseDown);
-		canvas.selection = false;
-		canvas.forEachObject(function(o) {
-			if (o.type == 'i-text') {
-				o.selectable = false;
-			}
+		wb.eachCanvas(function(canvas) {
+			canvas.off('mouse:down', text.mouseDown);
+			canvas.selection = false;
+			canvas.forEachObject(function(o) {
+				if (o.type == 'i-text') {
+					o.selectable = false;
+				}
+			});
 		});
 	};
 	return text;
 }
-var Paint = function(canvas, s) {
-	var paint = ShapeBase(canvas);
+var Paint = function(wb, s) {
+	var paint = ShapeBase(wb);
 	paint.activate = function() {
-		canvas.isDrawingMode = true;
-		canvas.freeDrawingBrush.width = paint.stroke.width;
-		canvas.freeDrawingBrush.color = paint.stroke.color;
-		canvas.freeDrawingBrush.opacity = paint.opacity; //TODO not working
-
+		wb.eachCanvas(function(canvas) {
+			canvas.isDrawingMode = true;
+			canvas.freeDrawingBrush.width = paint.stroke.width;
+			canvas.freeDrawingBrush.color = paint.stroke.color;
+			canvas.freeDrawingBrush.opacity = paint.opacity; //TODO not working
+		});
 		paint.enableLineProps(s).o.prop('disabled', true); //TODO not working
 	};
 	paint.deactivate = function() {
-		canvas.isDrawingMode = false;
+		wb.eachCanvas(function(canvas) {
+			canvas.isDrawingMode = false;
+		});
 	};
 	return paint;
 }
-var Shape = function(canvas) {
-	var shape = ShapeBase(canvas);
+var Shape = function(wb) {
+	var shape = ShapeBase(wb);
 	shape.obj = null;
 	shape.isDown = false;
 	shape.orig = {x: 0, y: 0};
 
-	shape.add2Canvas = function() {
+	shape.add2Canvas = function(canvas) {
 		canvas.add(shape.obj);
 	}
 	shape.mouseDown = function(o) {
+		var canvas = this;
 		shape.isDown = true;
 		var pointer = canvas.getPointer(o.e);
 		shape.orig = {x: pointer.x, y: pointer.y};
-		shape.createShape();
-		shape.add2Canvas();
+		shape.createShape(canvas);
+		shape.add2Canvas(canvas);
 	};
 	shape.mouseMove = function(o) {
+		var canvas = this;
 		if (!shape.isDown) return;
 		var pointer = canvas.getPointer(o.e);
 		shape.updateShape(pointer);
@@ -266,33 +285,38 @@ var Shape = function(canvas) {
 		return o;
 	};
 	shape.mouseUp = function(o) {
+		var canvas = this;
 		shape.isDown = false;
 		shape.obj.setCoords();
 		shape.obj.selectable = false;
 		canvas.renderAll();
-		shape.objectCreated(shape.obj);
+		shape.objectCreated(shape.obj, canvas);
 	};
 	shape.internalActivate = function() {};
 	shape.activate = function() {
-		canvas.on({
-			'mouse:down': shape.mouseDown
-			, 'mouse:move': shape.mouseMove
-			, 'mouse:up': shape.mouseUp
+		wb.eachCanvas(function(canvas) {
+			canvas.on({
+				'mouse:down': shape.mouseDown
+				, 'mouse:move': shape.mouseMove
+				, 'mouse:up': shape.mouseUp
+			});
 		});
 		shape.internalActivate();
 	};
 	shape.deactivate = function() {
-		canvas.off({
-			'mouse:down': shape.mouseDown
-			, 'mouse:move': shape.mouseMove
-			, 'mouse:up': shape.mouseUp
+		wb.eachCanvas(function(canvas) {
+			canvas.off({
+				'mouse:down': shape.mouseDown
+				, 'mouse:move': shape.mouseMove
+				, 'mouse:up': shape.mouseUp
+			});
 		});
 	};
 	return shape;
 };
-var Line = function(canvas, s) {
-	var line = Shape(canvas);
-	line.createShape = function() {
+var Line = function(wb, s) {
+	var line = Shape(wb);
+	line.createShape = function(canvas) {
 		line.obj = new fabric.Line([line.orig.x, line.orig.y, line.orig.x, line.orig.y], {
 			strokeWidth: line.stroke.width
 			, fill: line.stroke.color
@@ -309,15 +333,15 @@ var Line = function(canvas, s) {
 	};
 	return line;
 }
-var ULine = function(canvas, s) {
-	var uline = Line(canvas, s);
+var ULine = function(wb, s) {
+	var uline = Line(wb, s);
 	uline.stroke.width = 20;
 	uline.opacity = .5;
 	return uline;
 }
-var Rect = function(canvas, s) {
-	var rect = Shape(canvas);
-	rect.createShape = function() {
+var Rect = function(wb, s) {
+	var rect = Shape(wb);
+	rect.createShape = function(canvas) {
 		rect.obj = new fabric.Rect({
 			strokeWidth: rect.stroke.width
 			, fill: rect.fill.enabled ? rect.fill.color : 'rgba(0,0,0,0)'
@@ -346,9 +370,9 @@ var Rect = function(canvas, s) {
 	};
 	return rect;
 }
-var Ellipse = function(canvas, s) {
-	var ellipse = Rect(canvas, s);
-	ellipse.createShape = function() {
+var Ellipse = function(wb, s) {
+	var ellipse = Rect(wb, s);
+	ellipse.createShape = function(canvas) {
 		ellipse.obj = new fabric.Ellipse({
 			strokeWidth: ellipse.stroke.width
 			, fill: ellipse.fill.enabled ? ellipse.fill.color : 'rgba(0,0,0,0)'
@@ -370,9 +394,9 @@ var Ellipse = function(canvas, s) {
 	};
 	return ellipse;
 }
-var Arrow = function(canvas, s) {
-	var arrow = Line(canvas, s);
-	arrow.createShape = function() {
+var Arrow = function(wb, s) {
+	var arrow = Line(wb, s);
+	arrow.createShape = function(canvas) {
 		arrow.obj = new fabric.Polygon([
 			{x: 0, y: 0},
 			{x: 0, y: 0},
@@ -425,10 +449,10 @@ var Arrow = function(canvas, s) {
 	};
 	return arrow;
 }
-var Clipart = function(canvas, btn) {
-	var art = Shape(canvas);
-	art.add2Canvas = function() {}
-	art.createShape = function() {
+var Clipart = function(wb, btn) {
+	var art = Shape(wb);
+	art.add2Canvas = function(canvas) {}
+	art.createShape = function(canvas) {
 		fabric.Image.fromURL(btn.data('image'), function(img) {
 			art.orig.width = img.width;
 			art.orig.height = img.height;
@@ -457,7 +481,7 @@ var Clipart = function(canvas, btn) {
 }
 var Wb = function() {
 	const ACTIVE = 'active';
-	var wbId, a, t, s, canvas, mode;
+	var wb = {id: -1}, a, t, s, canvases = [], mode, slide = 0;
 
 	function getBtn(m) {
 		return t.find(".om-icon." + (m || mode));
@@ -500,7 +524,7 @@ var Wb = function() {
 					c.find('ul li').prepend(old);
 					c.find('a').prepend(cur);
 				});
-			initToolBtn(cur.data('mode'), false, Clipart(canvas, cur));
+			initToolBtn(cur.data('mode'), false, Clipart(wb, cur));
 		});
 	}
 	function internalInit(t) {
@@ -515,18 +539,17 @@ var Wb = function() {
 				} else if (pos.top == 0 || pos.top + ui.helper.height() == ui.helper.parent().height()) {
 					ui.helper.removeClass('vertical').addClass('horisontal');
 				}
-				setRoomSizes(); // TODO should be better option
 			}
 		});
-		initToolBtn('pointer', true, Pointer(canvas, s));
-		initToolBtn('apointer', false, APointer(canvas));
-		initToolBtn('text', false, Text(canvas, s));
-		initToolBtn('paint', false, Paint(canvas, s));
-		initToolBtn('line', false, Line(canvas, s));
-		initToolBtn('uline', false, ULine(canvas, s));
-		initToolBtn('rect', false, Rect(canvas, s));
-		initToolBtn('ellipse', false, Ellipse(canvas, s));
-		initToolBtn('arrow', false, Arrow(canvas, s));
+		initToolBtn('pointer', true, Pointer(wb, s));
+		initToolBtn('apointer', false, APointer(wb));
+		initToolBtn('text', false, Text(wb, s));
+		initToolBtn('paint', false, Paint(wb, s));
+		initToolBtn('line', false, Line(wb, s));
+		initToolBtn('uline', false, ULine(wb, s));
+		initToolBtn('rect', false, Rect(wb, s));
+		initToolBtn('ellipse', false, Ellipse(wb, s));
+		initToolBtn('arrow', false, Arrow(wb, s));
 		initCliparts();
 		t.find(".om-icon.settings").click(function() {
 			s.show();
@@ -553,7 +576,9 @@ var Wb = function() {
 				var v = $(this).val();
 				btn.data('obj').stroke.color = v;
 				if ('paint' == mode) {
-					canvas.freeDrawingBrush.color = v;
+					wb.eachCanvas(function(canvas) {
+						canvas.freeDrawingBrush.color = v;
+					});
 				}
 			}
 		});
@@ -563,7 +588,9 @@ var Wb = function() {
 				var v = 1 * $(this).val();
 				btn.data('obj').stroke.width = v;
 				if ('paint' == mode) {
-					canvas.freeDrawingBrush.width = v;
+					wb.eachCanvas(function(canvas) {
+						canvas.freeDrawingBrush.width = v;
+					});
 				}
 			}
 		});
@@ -573,7 +600,9 @@ var Wb = function() {
 				var v = (1 * $(this).val()) / 100;
 				btn.data('obj').opacity = v;
 				if ('paint' == mode) {
-					canvas.freeDrawingBrush.opacity = v;
+					wb.eachCanvas(function(canvas) {
+						canvas.freeDrawingBrush.opacity = v;
+					});
 				}
 			}
 		});
@@ -586,7 +615,6 @@ var Wb = function() {
 			, start: function(event, ui) {
 				if (!!s.css("bottom")) {
 					s.css("bottom", "").css("right", "");
-					setRoomSizes(); // TODO should be better option
 				}
 			}
 			, drag: function(event, ui) {
@@ -598,10 +626,10 @@ var Wb = function() {
 	}
 
 	function toOmJson(o) {
-		return o.toJSON(['uid', 'fileId', 'fileType']);
+		return o.toJSON(['uid', 'fileId', 'fileType', 'count']);
 	}
 	//events
-	var wbObjCreatedHandler = function (o) {
+	function wbObjCreatedHandler(o) {
 		var json = {};
 		switch(o.type) {
 			case 'pointer':
@@ -613,11 +641,11 @@ var Wb = function() {
 				break;
 		}
 		wbAction('createObj', JSON.stringify({
-			wbId: wbId
+			wbId: wb.id
 			, obj: json
 		}));
 	};
-	var objAddedHandler = function (e) {
+	function objAddedHandler(e) {
 		var o = e.target;
 		if (!!o.loaded) return;
 		switch(o.type) {
@@ -627,22 +655,22 @@ var Wb = function() {
 				break;
 		}
 	};
-	var objModifiedHandler = function (e) {
+	function objModifiedHandler(e) {
 		var o = e.target;
 		o.includeDefaultValues = false;
 		wbAction('modifyObj', JSON.stringify({
-			wbId: wbId
+			wbId: wb.id
 			, obj: toOmJson(o)
 		}));
 	};
-	var objSelectedHandler = function (e) {
+	function objSelectedHandler(e) {
 		var o = e.target;
 		s.find('.wb-dim-x').val(o.left);
 		s.find('.wb-dim-y').val(o.top);
 		s.find('.wb-dim-w').val(o.width);
 		s.find('.wb-dim-h').val(o.height);
 	}
-	var pathCreatedHandler = function (o) {
+	function pathCreatedHandler(o) {
 		o.path.uid = UUID.generate();
 		wbObjCreatedHandler(o.path);
 	};
@@ -655,53 +683,57 @@ var Wb = function() {
 		var obj = e.target;
 		console.log('Text Changed', obj);
 	};*/
-	return {
-		init: function(_wbId, tid) {
-			wbId = _wbId;
-			a = $('#' + tid);
-			t = a.find('.tools'), c = a.find('canvas'), s = a.find(".wb-settings");
-			c.attr('id', 'can-' + tid);
-			canvas = new fabric.Canvas(c.attr('id'));
-			canvas.wbId = _wbId;
-			//TODO create via WS canvas:cleared
-			canvas.on({
-				'object:added': objAddedHandler
-				, 'object:modified': objModifiedHandler
-				, 'object:selected': objSelectedHandler
-				, 'path:created': pathCreatedHandler
-				//, 'text:editing:exited': textEditedHandler
-				//, 'text:changed': textChangedHandler
-				, 'wb:object:created': wbObjCreatedHandler
-			});
-			internalInit(t);
-			setRoomSizes();
-		}
-		, resize: function(w, h) {
-			if (t.position().left + t.width() > a.width()) {
-				t.position({
-					my: "right"
-					, at: "right"
-					, of: a.selector
-					, collision: "fit"
-				});
-			}
-			canvas.setWidth(w);
-			canvas.setHeight(h);
-		}
-		, getCanvas: function() {
-			return canvas;
-		}
-		, getWbId: function() {
-			return wbId;
+	function addCanvas() {
+		var c = $('<canvas></canvas>').attr('id', 'can-' + a.attr('id'));
+		a.find('.canvases').append(c);
+		var canvas = new fabric.Canvas(c.attr('id'));
+		canvas.wbId = wb.id;
+		canvas.slide = canvases.length;
+		//TODO create via WS canvas:cleared
+		canvas.on({
+			'object:added': objAddedHandler
+			, 'object:modified': objModifiedHandler
+			, 'object:selected': objSelectedHandler
+			, 'path:created': pathCreatedHandler
+			//, 'text:editing:exited': textEditedHandler
+			//, 'text:changed': textChangedHandler
+			, 'wb:object:created': wbObjCreatedHandler
+		});
+		canvases.push(canvas);
+	}
+	wb.init = function(_wbId, tid) {
+		wb.id = _wbId;
+		a = $('#' + tid);
+		t = a.find('.tools'), s = a.find(".wb-settings");
+		addCanvas();
+		internalInit(t);
+	};
+	wb.resize = function(w, h) {
+		if (t.position().left + t.width() > a.width()) {
+			t.position({
+				my: "right"
+				, at: "right"
+				, of: a.selector
+				, collision: "fit"
+			});
 		}
+		wb.eachCanvas(function(canvas) {
+			canvas.setWidth(w).setHeight(h);
+		});
+	};
+	wb.getCanvas = function() {
+		return canvases[slide];
 	};
+	wb.eachCanvas = function(func) {
+		for (var i = 0; i < canvases.length; ++i) {
+			func(canvases[i]);
+		}
+	}
+	return wb;
 };
 var WbArea = (function() {
 	var container, area, tabs, scroll, self = {};
 
-	function getWbTabId(id) {
-		return "wb-tab-" + id;
-	}
 	function refreshTabs() {
 		tabs.tabs("refresh").find('ul').removeClass('ui-corner-all').removeClass('ui-widget-header');
 	}
@@ -733,7 +765,7 @@ var WbArea = (function() {
 							}
 						}
 						wbAction('deleteObj', JSON.stringify({
-							wbId: wb.data('getWbId')()
+							wbId: wb.data('id')()
 							, obj: arr
 						}));
 						return false;
@@ -753,19 +785,26 @@ var WbArea = (function() {
 		canvas.add(_o);
 	}
 	function _createHandler(canvas, _o) {
-		if ('Video' === _o.fileType || 'Recording' === _o.fileType) {
-			var vid = $('<video>').hide().attr('id', 'video-' + _o.uid).attr('poster', _o._poster + '&preview=true')
-				.attr("width", _o.width).attr("height", _o.height)
-				.append($('<source>').attr('type', 'video/mp4').attr('src', _o._src))
-			$('#wb-tab-' + canvas.wbId).append(vid);
-			var vImg = new fabric.Image(vid[0], {
-				left: _o.left
-				, top: _o.top
-			});
-			canvas.add(vImg);
-			//console.log(vImg.toJSON(['uid', 'fileId', 'fileType']));
-		} else {
-			canvas.add(_o);
+		switch (_o.fileType) {
+			case 'Video':
+			case 'Recording':
+			{
+				var vid = $('<video>').hide().attr('id', 'video-' + _o.uid).attr('poster', _o._poster + '&preview=true')
+					.attr("width", _o.width).attr("height", _o.height)
+					.append($('<source>').attr('type', 'video/mp4').attr('src', _o._src))
+				$('#wb-tab-' + canvas.wbId).append(vid);
+				var vImg = new fabric.Image(vid[0], {
+					left: _o.left
+					, top: _o.top
+				});
+				canvas.add(vImg);
+				//console.log(vImg.toJSON(['uid', 'fileId', 'fileType']));
+			}
+				break;
+			case 'Presentation':
+			default:
+				canvas.add(_o);
+				break;
 		}
 	}
 	function _findObject(canvas, uid) {
@@ -797,10 +836,20 @@ var WbArea = (function() {
 		container.find('.wb-tabbar li').each(function(idx) {
 			if (wbId == 1 * $(this).data('wb-id')) {
 				tabs.tabs("option", "active", idx);
+				$(this)[0].scrollIntoView();
 				return false;
 			}
 		});
 	}
+	self.getWbTabId = function(id) {
+		return "wb-tab-" + id;
+	};
+	self.getCanvas = function(id) {
+		return $('#' + self.getWbTabId(id)).data('getCanvas')();
+	};
+	self.eachCanvas = function(id, func) {
+		return $('#' + self.getWbTabId(id)).data('eachCanvas')(func);
+	};
 	self.init = function() {
 		container = $(".room.wb.area");
 		tabs = container.find('.tabs').tabs({
@@ -826,35 +875,37 @@ var WbArea = (function() {
 		});
 		area = container.find(".wb-area");
 		$(window).keyup(deleteHandler);
-	}
+	};
 	self.destroy = function() {
 		$(window).off('keyup', deleteHandler);
 	};
-	self.add = function(obj) {
-		var tid = getWbTabId(obj.id)
+	self.create = function(obj) {
+		var tid = self.getWbTabId(obj.id)
 			, li = $('#wb-area-tab').clone().attr('id', '').data('wb-id', obj.id)
 			, wb = $('#wb-area').clone().attr('id', tid);
 		li.find('a').text(obj.name).attr('title', obj.name).attr('href', "#" + tid);
 		li.find('button').click(function() {
 			wbAction('removeWb', JSON.stringify({id: obj.id}));
 		});
-
+	
 		tabs.find(".ui-tabs-nav").append(li);
 		tabs.append(wb);
 		refreshTabs();
-
-		_activateTab(obj.id);
+	
 		wb.data(Wb()).data('init')(obj.id, tid);
+	}
+	self.add = function(obj) {
+		self.create(obj);
+		_activateTab(obj.id);
 	};
 	self.activate = function(obj) {
 		_activateTab(obj.id);
 	}
-	self.load = function(json) { //TODO need to be unified
-		var canvas = $('#' + getWbTabId(json.wbId)).data('getCanvas')();
-		_createObject(canvas, json.obj, _createHandler);
+	self.load = function(json) {
+		_createObject(self.getCanvas(json.wbId), json.obj, _createHandler);
 	};
 	self.createObj = function(json) { //TODO need to be unified
-		var canvas = $('#' + getWbTabId(json.wbId)).data('getCanvas')();
+		var canvas = self.getCanvas(json.wbId);
 		var o = json.obj;
 		switch(o.type) {
 			case 'pointer':
@@ -875,7 +926,7 @@ var WbArea = (function() {
 		}
 	};
 	self.modifyObj = function(json) { //TODO need to be unified
-		var canvas = $('#' + getWbTabId(json.wbId)).data('getCanvas')();
+		var canvas = self.getCanvas(json.wbId);
 		var o = json.obj;
 		switch(o.type) {
 			case 'pointer':
@@ -896,13 +947,13 @@ var WbArea = (function() {
 		}
 	};
 	self.removeObj = function(json) {
-		var canvas = $('#' + getWbTabId(json.wbId)).data('getCanvas')();
+		var canvas = self.getCanvas(json.wbId);
 		for (var i = 0; i < json.obj.length; ++i) {
 			_removeHandler(canvas, json.obj[i]);
 		}
 	};
 	self.remove = function(obj) {
-		var tabId = getWbTabId(obj.id);
+		var tabId = self.getWbTabId(obj.id);
 		tabs.find('li[aria-controls="' + tabId + '"]').remove();
 		$("#" + tabId).remove();
 		refreshTabs();

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/JpgRecordingResourceReference.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/JpgRecordingResourceReference.java?rev=1789544&r1=1789543&r2=1789544&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/JpgRecordingResourceReference.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/JpgRecordingResourceReference.java Thu Mar 30 17:59:45 2017
@@ -25,6 +25,7 @@ import static org.apache.openmeetings.ut
 import java.io.File;
 
 import org.apache.openmeetings.db.entity.record.Recording;
+import org.apache.wicket.request.resource.IResource.Attributes;
 
 public class JpgRecordingResourceReference extends RecordingResourceReference {
 	private static final long serialVersionUID = 1L;
@@ -44,7 +45,7 @@ public class JpgRecordingResourceReferen
 	}
 
 	@Override
-	protected File getFile(Recording r) {
+	protected File getFile(Recording r, Attributes attr) {
 		return r.getFile(EXTENSION_JPG);
 	}
 }

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/Mp4RecordingResourceReference.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/Mp4RecordingResourceReference.java?rev=1789544&r1=1789543&r2=1789544&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/Mp4RecordingResourceReference.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/Mp4RecordingResourceReference.java Thu Mar 30 17:59:45 2017
@@ -25,6 +25,7 @@ import static org.apache.openmeetings.ut
 import java.io.File;
 
 import org.apache.openmeetings.db.entity.record.Recording;
+import org.apache.wicket.request.resource.IResource.Attributes;
 
 public class Mp4RecordingResourceReference extends RecordingResourceReference {
 	private static final long serialVersionUID = 1L;
@@ -44,7 +45,7 @@ public class Mp4RecordingResourceReferen
 	}
 
 	@Override
-	protected File getFile(Recording r) {
+	protected File getFile(Recording r, Attributes attr) {
 		return r.getFile();
 	}
 }

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FileItemResourceReference.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FileItemResourceReference.java?rev=1789544&r1=1789543&r2=1789544&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FileItemResourceReference.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FileItemResourceReference.java Thu Mar 30 17:59:45 2017
@@ -54,10 +54,10 @@ public abstract class FileItemResourceRe
 			}
 
 			@Override
-			protected ResourceResponse newResourceResponse(Attributes attributes) {
-				r = getFileItem(attributes);
+			protected ResourceResponse newResourceResponse(Attributes attr) {
+				r = getFileItem(attr);
 				if (r != null) {
-					file = getFile(r);
+					file = getFile(r, attr);
 					ResourceResponse rr = createResourceResponse(file.toPath());
 					rr.setFileName(getFileName(r));
 					return rr;
@@ -73,6 +73,6 @@ public abstract class FileItemResourceRe
 
 	protected abstract String getMimeType(T r);
 	protected abstract String getFileName(T r);
-	protected abstract File getFile(T r);
-	protected abstract T getFileItem(Attributes attributes);
+	protected abstract File getFile(T r, Attributes attr);
+	protected abstract T getFileItem(Attributes attr);
 }