Index: lams_build/lib/lams/lams-central.jar =================================================================== diff -u -r606581007abbdaee5483777096f32ffac1c3e3eb -rb78ac844426c4d69e6104349bdf7cae2ecc6644d Binary files differ Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -raee0c08639547cfdf353db8f22c4aedf22092787 -rb78ac844426c4d69e6104349bdf7cae2ecc6644d Binary files differ Fisheye: Tag b78ac844426c4d69e6104349bdf7cae2ecc6644d refers to a dead (removed) revision in file `lams_central/src/java/org/lamsfoundation/lams/authoring/dto/ToolDTO.java'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_central/src/java/org/lamsfoundation/lams/authoring/service/AuthoringService.java =================================================================== diff -u -r430f979ac0574e45242bd6e3df353d8592276121 -rb78ac844426c4d69e6104349bdf7cae2ecc6644d --- lams_central/src/java/org/lamsfoundation/lams/authoring/service/AuthoringService.java (.../AuthoringService.java) (revision 430f979ac0574e45242bd6e3df353d8592276121) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/service/AuthoringService.java (.../AuthoringService.java) (revision b78ac844426c4d69e6104349bdf7cae2ecc6644d) @@ -27,6 +27,7 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; +import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.HashSet; @@ -72,6 +73,8 @@ import org.lamsfoundation.lams.learningdesign.dto.AuthoringActivityDTO; import org.lamsfoundation.lams.learningdesign.dto.DesignDetailDTO; import org.lamsfoundation.lams.learningdesign.dto.LearningDesignDTO; +import org.lamsfoundation.lams.learningdesign.dto.LearningLibraryDTO; +import org.lamsfoundation.lams.learningdesign.dto.LibraryActivityDTO; import org.lamsfoundation.lams.learningdesign.dto.ValidationErrorDTO; import org.lamsfoundation.lams.learningdesign.exception.LearningDesignException; import org.lamsfoundation.lams.learningdesign.service.ILearningDesignService; @@ -109,6 +112,7 @@ import org.lamsfoundation.lams.util.wddx.FlashMessage; import org.lamsfoundation.lams.util.wddx.WDDXProcessor; import org.lamsfoundation.lams.util.wddx.WDDXTAGS; +import org.lamsfoundation.lams.web.DisplayGroupAction; import org.lamsfoundation.lams.web.session.SessionManager; import org.lamsfoundation.lams.web.util.AttributeNames; import org.lamsfoundation.lams.workspace.service.IWorkspaceManagementService; Index: lams_central/src/java/org/lamsfoundation/lams/authoring/service/IAuthoringService.java =================================================================== diff -u -r430f979ac0574e45242bd6e3df353d8592276121 -rb78ac844426c4d69e6104349bdf7cae2ecc6644d --- lams_central/src/java/org/lamsfoundation/lams/authoring/service/IAuthoringService.java (.../IAuthoringService.java) (revision 430f979ac0574e45242bd6e3df353d8592276121) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/service/IAuthoringService.java (.../IAuthoringService.java) (revision b78ac844426c4d69e6104349bdf7cae2ecc6644d) @@ -27,7 +27,6 @@ import java.util.List; import java.util.Vector; -import org.lamsfoundation.lams.authoring.dto.ToolDTO; import org.lamsfoundation.lams.learningdesign.Activity; import org.lamsfoundation.lams.learningdesign.GateActivity; import org.lamsfoundation.lams.learningdesign.Grouping; Index: lams_central/src/java/org/lamsfoundation/lams/web/AuthoringAction.java =================================================================== diff -u --- lams_central/src/java/org/lamsfoundation/lams/web/AuthoringAction.java (revision 0) +++ lams_central/src/java/org/lamsfoundation/lams/web/AuthoringAction.java (revision b78ac844426c4d69e6104349bdf7cae2ecc6644d) @@ -0,0 +1,77 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +/* $Id$ */ +package org.lamsfoundation.lams.web; + +import java.io.IOException; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; +import org.apache.struts.actions.DispatchAction; +import org.lamsfoundation.lams.authoring.service.IAuthoringService; +import org.lamsfoundation.lams.learningdesign.service.ILearningDesignService; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; + +/** + * this is an action where all lams client environments launch. initial configuration of the individual environment + * setting is done here. + * + * @struts:action path="/authoring" validate="false" parameter="method" + * @struts:action-forward name="openAutoring" path="/author2.jsp" + */ +public class AuthoringAction extends DispatchAction { + private static Logger log = Logger.getLogger(AuthoringAction.class); + + private static IAuthoringService authoringService; + private static ILearningDesignService learningDesignService; + + public ActionForward openAuthoring(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws IOException { + request.setAttribute("tools", getLearningDesignService().getToolDTOs(request.getRemoteUser())); + return mapping.findForward("openAutoring"); + } + + private IAuthoringService getAuthoringService() { + if (AuthoringAction.authoringService == null) { + WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(getServlet() + .getServletContext()); + AuthoringAction.authoringService = (IAuthoringService) ctx.getBean("authoringService"); + } + return AuthoringAction.authoringService; + } + + private ILearningDesignService getLearningDesignService() { + if (AuthoringAction.learningDesignService == null) { + WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(getServlet() + .getServletContext()); + AuthoringAction.learningDesignService = (ILearningDesignService) ctx.getBean("learningDesignService"); + } + return AuthoringAction.learningDesignService; + } +} \ No newline at end of file Index: lams_central/src/java/org/lamsfoundation/lams/web/DisplayGroupAction.java =================================================================== diff -u -rdc7b67e7677c8cd2289130c67094a62b39177d05 -rb78ac844426c4d69e6104349bdf7cae2ecc6644d --- lams_central/src/java/org/lamsfoundation/lams/web/DisplayGroupAction.java (.../DisplayGroupAction.java) (revision dc7b67e7677c8cd2289130c67094a62b39177d05) +++ lams_central/src/java/org/lamsfoundation/lams/web/DisplayGroupAction.java (.../DisplayGroupAction.java) (revision b78ac844426c4d69e6104349bdf7cae2ecc6644d) @@ -44,7 +44,6 @@ import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; -import org.lamsfoundation.lams.authoring.dto.ToolDTO; import org.lamsfoundation.lams.index.IndexLessonBean; import org.lamsfoundation.lams.index.IndexLinkBean; import org.lamsfoundation.lams.index.IndexOrgBean; @@ -72,15 +71,6 @@ * @struts.action-forward name="group" path="/group.jsp" */ public class DisplayGroupAction extends Action { - - // sorts Tool display names - private static final Comparator TOOL_NAME_COMPARATOR = new Comparator() { - @Override - public int compare(ToolDTO o1, ToolDTO o2) { - return o1.getToolDisplayName().toLowerCase().compareTo(o2.getToolDisplayName().toLowerCase()); - } - }; - private static Logger log = Logger.getLogger(DisplayGroupAction.class); private static IUserManagementService service; private static LessonService lessonService; @@ -121,7 +111,7 @@ if (org.getEnableSingleActivityLessons() && (roles.contains(Role.ROLE_GROUP_MANAGER) || roles.contains(Role.ROLE_MONITOR))) { // if sinble activity lessons are enabled, put sorted list of tools - request.setAttribute("tools", getToolDTOs(request.getRemoteUser())); + request.setAttribute("tools", getLearningDesignService().getToolDTOs(request.getRemoteUser())); } } @@ -368,30 +358,6 @@ return map; } - /** - * Gets basic information on available tools: IDs and i18n names. - */ - private List getToolDTOs(String userName) throws IOException { - User user = (User) getService().findByProperty(User.class, "login", userName).get(0); - String languageCode = user.getLocale().getLanguageIsoCode(); - ArrayList learningLibraries = getLearningDesignService().getAllLearningLibraryDetails( - languageCode); - List tools = new ArrayList(); - for (LearningLibraryDTO learningLibrary : learningLibraries) { - // skip invalid and complex tools - if (learningLibrary.getValidFlag() && (learningLibrary.getTemplateActivities().size() == 1)) { - ToolDTO tool = new ToolDTO(); - tool.setToolId(learningLibrary.getLearningLibraryID()); - tool.setToolDisplayName(((LibraryActivityDTO) learningLibrary.getTemplateActivities().get(0)) - .getActivityTitle()); - tools.add(tool); - } - } - - Collections.sort(tools, DisplayGroupAction.TOOL_NAME_COMPARATOR); - return tools; - } - private IUserManagementService getService() { if (DisplayGroupAction.service == null) { WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(getServlet() Index: lams_central/web/author2.jsp =================================================================== diff -u -r683ac3db4941cccb643fa7b7a832f8f9262d8322 -rb78ac844426c4d69e6104349bdf7cae2ecc6644d --- lams_central/web/author2.jsp (.../author2.jsp) (revision 683ac3db4941cccb643fa7b7a832f8f9262d8322) +++ lams_central/web/author2.jsp (.../author2.jsp) (revision b78ac844426c4d69e6104349bdf7cae2ecc6644d) @@ -8,17 +8,72 @@ Flashless Authoring + + -
+ + + + + +
+
+ +
+ + + +
+
+
+
+
\ No newline at end of file Index: lams_central/web/includes/javascript/authoring.js =================================================================== diff -u -r683ac3db4941cccb643fa7b7a832f8f9262d8322 -rb78ac844426c4d69e6104349bdf7cae2ecc6644d --- lams_central/web/includes/javascript/authoring.js (.../authoring.js) (revision 683ac3db4941cccb643fa7b7a832f8f9262d8322) +++ lams_central/web/includes/javascript/authoring.js (.../authoring.js) (revision b78ac844426c4d69e6104349bdf7cae2ecc6644d) @@ -1,70 +1,204 @@ var paper = null; -var templateContainer = null; +var canvas = null; +var maxActivityId = 0; +var activities = []; +var layout = { + 'activityWidth' : 125, + 'activityHeight' : 50 +} + $(document).ready(function() { paper = Raphael('canvas'); - templateContainer = paper.rect(0, 0, 120, 200).attr({ - 'stroke-width' : 3 - }); - - drawTemplate(1, 'icon_forum.png', 'Forum'); - drawTemplate(2, 'icon_notebook.png', 'Notebook'); + canvas = $('#canvas'); + + initTemplates(); }); -function drawTemplate(index, icon, text) { - var template = paper.set(); - var shape = template.shape = paper.rect(10, 10 + (index - 1) * 55, 100, 50) - .attr({ - 'fill' : 'yellow' - }); - template.push(shape); - var icon = paper.image('images/svg/' + icon, shape.attr('x') - + shape.attr('width') / 2 - 10, shape.attr('y') + 5, 30, 30); - template.push(icon); +function initTemplates(){ + $('.template').each(function(){ + $(this).draggable({ + 'containment' : '#authoringTable', + 'revert' : 'invalid', + 'distance' : 20, + 'scroll' : false, + 'helper' : function(event){ + var helper = $(this).clone().css({ + 'border' : 'thin black solid', + 'z-index' : 1, + 'cursor' : 'move' + }); + return helper; + } + }); + }); + + canvas.droppable({ + 'tolerance' : 'touch', + 'accept' : function (draggable) { + return true; + }, + 'drop' : function (event, draggable) { + ActivityUtils.constructActivityFromTemplate(draggable); + } + }); +} - var label = paper.text(shape.attr('x') + shape.attr('width') / 2, shape - .attr('y') + 40, text); - template.push(label); - template.drag(function(dx, dy) { - startDrag(this.helper, dx, dy); - }, function() { - this.helper = this.clone(); - this.helper.shape = this.helper[0]; - }, function() { - var helper = this.helper; - this.helper = null; - if (Raphael.isBBoxIntersect(templateContainer.getBBox(), helper - .getBBox())) { - helper.remove(); - return; +var ActivityUtils = { + constructActivityFromTemplate : function(template) { + $(template.helper).remove(); + + var activityId = ++maxActivityId; + var activity = new Activity(activityId); + activities.push(activity); + + var canvasOffset = canvas.offset(); + var shape = activity.shape = paper.rect( + template.offset.left - canvasOffset.left, + template.offset.top - canvasOffset.top, + 125, 50) + .attr({ + 'fill' : '#A9C8FD' + }); + activity.items.push(shape); + + var icon = paper.image($('img', template.draggable).attr('src'), shape.attr('x') + + shape.attr('width') / 2 - 15, shape.attr('y') + 2, 30, 30); + activity.items.push(icon); + + var label = paper.text(shape.attr('x') + shape.attr('width') / 2, shape + .attr('y') + 40, $('div', template.draggable).text()); + activity.items.push(label); + + activity.addDecoration(); + activity.addEffects(); + }, + + drawTransition : function(fromActivity, toActivity) { + if (fromActivity.fromTransition) { + fromActivity.fromTransition.remove(); } + if (toActivity.toTransition) { + toActivity.toTransition.remove(); + } + + var transition = paper.set(); + transition.fromActivity = fromActivity; + transition.toActivity = toActivity; + fromActivity.fromTransition = transition; + toActivity.toTransition = transition; + + var path = paper.path('M ' + + (fromActivity.shape.attr('x') + fromActivity.shape.attr('width') / 2) + ' ' + + (fromActivity.shape.attr('y') + fromActivity.shape.attr('height') / 2) + ' L ' + + (toActivity.shape.attr('x') + toActivity.shape.attr('width') / 2) + ' ' + + (toActivity.shape.attr('y') + toActivity.shape.attr('height') / 2)); + transition.push(path); + transition.toBack(); + } +}; - endDrag(helper); - helper.drag(function(dx, dy) { - startDrag(this, dx, dy); - }, null, function() { - endDrag(this, Raphael.isBBoxIntersect(templateContainer.getBBox(), - this.getBBox())); - }, helper, null, helper); - }, template, null, template); -} +function Activity(id) { + this.id = id; + this.items = paper.set(); + + this.addEffects = function(){ + var activity = this; + + activity.items.mousedown(function(event, x, y){ + if (event.ctrlKey) { + var startX = x - canvas.offset().left; + var startY = y - canvas.offset().top; + + canvas.mousemove(function(event){ + if (activity.tempTransition) { + activity.tempTransition.remove(); + activity.tempTransition = null; + } + if (!event.ctrlKey) { + canvas.off('mousemove'); + canvas.off('mouseup'); + return; + } + + var endX = event.pageX - canvas.offset().left; + var endY = event.pageY - canvas.offset().top; + + activity.tempTransition = paper.set(); + activity.tempTransition.push(paper.circle(startX, startY, 3)); + activity.tempTransition.push(paper.path('M ' + startX + ' ' + startY + + 'L ' + endX + ' ' + endY).attr({ + 'arrow-end' : 'open-wide-long', + 'stroke-dasharray' : '- ' + })); + }).mouseup(function(event){ + canvas.off('mousemove'); + canvas.off('mouseup'); + + if (activity.tempTransition) { + activity.tempTransition.remove(); + activity.tempTransition = null; + } + + var endX = event.pageX - canvas.offset().left; + var endY = event.pageY - canvas.offset().top; + var endActivity = null; + $.each(activities, function(){ + if (this.shape.isPointInside(endX, endY)) { + endActivity = this; + return false; + } + }); -function startDrag(activity, dx, dy) { - activity.transform('t' + dx + ' ' + dy); -} - -function endDrag(activity, cancelDrag) { - if (!cancelDrag) { - var transformation = activity.shape.attr('transform'); - activity.forEach(function(elem) { - elem.attr({ - 'x' : elem.attr('x') + transformation[0][1], - 'y' : elem.attr('y') + transformation[0][2] - }); + if (endActivity) { + ActivityUtils.drawTransition(activity, endActivity); + } + }); + } + + else { + activity.items.toFront(); + activity.items.attr('cursor', 'move'); + + canvas.mousemove(function(event) { + var dx = event.pageX - x; + var dy = event.pageY - y; + activity.items.transform('t' + dx + ' ' + dy); + }); + + activity.mouseupHandler = function(){ + canvas.off('mousemove'); + activity.items.unmouseup(activity.mouseupHandler); + activity.mouseupHandler = null; + + var transformation = activity.shape.attr('transform'); + activity.items.forEach(function(elem) { + elem.attr({ + 'x' : elem.attr('x') + transformation[0][1], + 'y' : elem.attr('y') + transformation[0][2] + }); + }); + activity.items.transform(''); + + if (activity.fromTransition) { + ActivityUtils.drawTransition(activity, activity.fromTransition.toActivity); + } + if (activity.toTransition) { + ActivityUtils.drawTransition(activity.toTransition.fromActivity, activity); + } + }; + + activity.items.mouseup(activity.mouseupHandler); + } }); - } - activity.transform(''); + }; + + this.addDecoration = function(){ + this.items.attr({ + 'cursor' : 'pointer' + }); + }; } \ No newline at end of file Index: lams_central/web/main.jsp =================================================================== diff -u -r683ac3db4941cccb643fa7b7a832f8f9262d8322 -rb78ac844426c4d69e6104349bdf7cae2ecc6644d --- lams_central/web/main.jsp (.../main.jsp) (revision 683ac3db4941cccb643fa7b7a832f8f9262d8322) +++ lams_central/web/main.jsp (.../main.jsp) (revision b78ac844426c4d69e6104349bdf7cae2ecc6644d) @@ -242,7 +242,7 @@