123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408 |
- /* This file is part of AToMPM - A Tool for Multi-Paradigm Modelling
- * Copyright 2011 by the AToMPM team and licensed under the LGPL
- * See COPYING.lesser and README.md in the root of this project for full details
- */
- ///////////////////////////////////////////////////////////////////////////////
- // DEPRECATED FUNCTIONS
- ///////////////////////////////////////////////////////////////////////////////
- function _compileToASMM(fname){
- AtomPMClient.alertDeprecatedFunctionCall("_compileToASMM");
- CompileUtils.compileToASMM(fname);
- }
- function _compileToCSMM(fname){
- AtomPMClient.alertDeprecatedFunctionCall("_compileToCSMM");
- CompileUtils.compileToCSMM(fname);
- }
- function _compileToPatternMM(fname){
- AtomPMClient.alertDeprecatedFunctionCall("_compileToPatternMM");
- CompileUtils.compileToPatternMM(fname);
- }
- ///////////////////////////////////////////////////////////////////////////////
- // DEPRECATED FUNCTIONS
- ///////////////////////////////////////////////////////////////////////////////
- /* draw the icon specified by the given icon model on the provided canvas
- 0. initialize a group that will contain the 'compiled' icon
- 1. for every ConcreteSyntax primitive (e.g., Rectangle, Text) contained
- within the given icon model
- a. create appropriate Raphael-SVG objects
- b. style these and position/orient/scale them
- c. initialize various attributes and remember various values that are used
- to manipulate and reason about vobjects later on
- d. apply layout constraint solver and/or link decorator positioner
- transformations... to remain backward-compatible with existing
- pre-lcs/ldp models, default values are provided if needed
- e. add objects to group from step 0.
- 2. apply options:
- size: force the icon to have a certain size
- wrap: wrap the canvas around the icon
- id: this icon is a canvas icon (not a toolbar icon)... save it
- and its vobjects in __icons and give it some default
- parameters
- attrs: add extra attributes to icon
- behaviour: indicates that the icon should have event listeners
- NOTE:: because text's origin defaults to (0,height/2), we move text elements
- by (0,height/2) (via __valignText()) to ensure their top-left corner
- lands on the specified (x,y)... for the computed height to be correct,
- we must style the text element beforehand
- NOTE:: because (x,y) are not parameters of Raphael.Paths, we translate paths
- according to vobj['position'] manually
- NOTE:: when im.nodes is empty (this may occur when a Link defines no
- decorators), a Raphael.point is used to ensure the icon is not empty
-
- NOTE:: text is made non-selectable to avoid default browser mouse dragging
- behaviour (select any encoutered text) and subsequent default browser
- selected text dragging behaviour
-
- NOTE:: throught this function, we use *.initial and *.latest values... the
- former are attributes of vobjects as they were drawn by the user...
- the latter are added translations/rotations/scalings applied by the
- layout constraint solver and link decorator positioner */
- CompileUtils = function(){
-
- /* draw the edge specified by the given segments
- 1. draw the edge given the specified segments and style
- 2. encapsulate it within a group, remember the uris of the start and end
- icons, and save the edge and segments in __edges
- 3. give the edge appropriate event handlers and return it
-
- NOTE:: we use insertBefore() to ensure that edges get drawn beneath link
- decorators, if any */
- /**
- * Draws the edge specified by the given segments
- *
- * 1. Draws the edge given the specified segments and style
- * 2. Encapsulates it within a group and remembers the URIs of the start and
- * end icons, then saves the edge and segments in the AtomPMClient edges
- * variable
- * 3. Assigns the appropriate event handles to the edge and then returns
- */
- this.compileAndDrawEdge = function(segments, linkStyle, start, end, linkuri){
- var path = __canvas.path(segments),
- edge = __canvas.group(),
- edgeId = start+'--'+end;
- edge.insertBefore(__getIcon(linkuri).node);
- path.attr(linkStyle);
- edge.push(path);
- edge.setAttr('__edgeId',edgeId);
- edge.setAttr('__linkuri',linkuri);
- edge.setAttr('class','clickable');
- __edges[edgeId] =
- {'icon':edge,
- 'start':start,
- 'end':end,
- 'segments':segments};
-
- edge.node.onmousedown =
- function(event)
- {
- if( event.button == 0 )
- BehaviorManager.handleUserEvent(__EVENT_LEFT_PRESS_ICON,event);
- else if( event.button == 2 )
- BehaviorManager.handleUserEvent(__EVENT_RIGHT_PRESS_ICON,event);
- };
- edge.node.onmouseup =
- function(event)
- {
- if( event.button == 0 )
- BehaviorManager.handleUserEvent(__EVENT_LEFT_RELEASE_ICON,event);
- else if( event.button == 2 )
- BehaviorManager.handleUserEvent(__EVENT_RIGHT_RELEASE_ICON,event);
- else if( event.button == 1 )
- BehaviorManager.handleUserEvent(__EVENT_MIDDLE_RELEASE_ICON,event);
- };
- /*edge.node.onmouseover =
- function(event)
- {
- BehaviorManager.handleUserEvent(__EVENT_MOUSE_OVER_ICON,event);
- }*/
-
- return edge;
- };
-
- // TODO: split this function up
- /**
- * Compiles the icon and returns it in order to be placed
- * on the canvas
- */
- this.compileAndDrawIconModel = function( im, canvas, options ){
- var icon = canvas.group(),
- vobjects = {};
- for( var vid in im.nodes )
- {
- var vobj = im.nodes[vid],
- x = __getVobjGeomAttrVal(vobj['position']['value'][0]),
- y = __getVobjGeomAttrVal(vobj['position']['value'][1]);
-
- if( vobj['$type'].match(/\/Text$/) )
- {
- var tc = vobj['textContent']['value'];
- vobjects[vid] = canvas.text(x.initial,y.initial,tc);
- vobjects[vid].attr('text-anchor','start');
- vobjects[vid].attr(vobj['style']['value']);
- __valignText(vobjects[vid]);
- vobjects[vid].node.setAttribute('class','unselectable');
- }
- else if( vobj['$type'].match(/\/Rectangle$/) )
- {
- var w = parseFloat(vobj['width']['value']),
- h = parseFloat(vobj['height']['value']),
- cr = parseFloat(vobj['cornerRadius']['value']);
- vobjects[vid] = canvas.rect(x.initial,y.initial,w,h,cr);
- }
- else if( vobj['$type'].match(/\/Circle$/) )
- {
- var r = parseFloat(vobj['r']['value']);
- vobjects[vid] = canvas.circle(x.initial+r,y.initial+r,r);
- }
- else if( vobj['$type'].match(/\/Ellipse$/) )
- {
- var rx = parseFloat(vobj['rx']['value']),
- ry = parseFloat(vobj['ry']['value']);
- vobjects[vid] = canvas.ellipse(x.initial+rx,y.initial+ry,rx,ry);
- }
- else if( vobj['$type'].match(/\/Polygon$/) )
- {
- var r = parseFloat(vobj['r']['value']),
- sides = parseInt(vobj['sides']['value']);
- vobjects[vid] = __drawPolygon(canvas,x.initial,y.initial,r,sides);
- }
- else if( vobj['$type'].match(/\/Star$/) )
- {
- var r = parseFloat(vobj['r']['value']),
- rays = parseInt(vobj['rays']['value']);
- vobjects[vid] = __drawStar(canvas,x.initial,y.initial,r,rays);
- }
- else if( vobj['$type'].match(/\/Path$/) )
- {
- var segments = vobj['segments']['value'];
- vobjects[vid] = canvas.path(segments);
- __translatePath(vobjects[vid],x.initial,y.initial);
- }
- else if( vobj['$type'].match(/\/Image$/) )
- {
- var w = parseFloat(vobj['width']['value']),
- h = parseFloat(vobj['height']['value']),
- src = __relativizeURL(vobj['src']['value']);
- vobjects[vid] = canvas.image(src,x.initial,y.initial,w,h);
- }
-
- else
- /* ignore layout constraints */
- continue;
-
- var r = __getVobjGeomAttrVal(vobj['orientation']['value']),
- sx = __getVobjGeomAttrVal(vobj['scale']['value'][0]);
- sy = __getVobjGeomAttrVal(vobj['scale']['value'][1]);
- vobjects[vid].attr(vobj['style']['value']);
- vobjects[vid].transform(
- 'r'+r.initial+','+x.initial+','+y.initial+
- 's'+sx.initial+','+sy.initial+','+x.initial+','+y.initial);
-
- vobjects[vid].node.setAttribute('__vobjuri',vid);
- vobjects[vid].node.setAttribute('__x',
- utils.buildVobjGeomAttrVal(x.initial, x.latest || 0));
- vobjects[vid].node.setAttribute('__y',
- utils.buildVobjGeomAttrVal(y.initial, y.latest || 0));
- vobjects[vid].node.setAttribute('__r',
- utils.buildVobjGeomAttrVal(r.initial, r.latest || 0));
- vobjects[vid].node.setAttribute('__sx',
- utils.buildVobjGeomAttrVal(sx.initial, sx.latest || 1));
- vobjects[vid].node.setAttribute('__sy',
- utils.buildVobjGeomAttrVal(sy.initial, sy.latest || 1));
- __setVobjectTransform(vobjects[vid]);
-
- icon.push(vobjects[vid]);
- }
-
- if( utils.keys(im.nodes).length == 0 )
- {
- icon.push( __canvas.point(0,0) );
- icon.setAttr('class','empty_icon');
- }
-
- if( options != undefined )
- {
- if( 'size' in options )
- {
- var size = options['size'],
- bbox = icon.getBBox();
- scaleBy = Math.min(size/bbox.width,size/bbox.height);
- icon.scale( scaleBy, scaleBy );
- }
-
- if( 'wrap' in options )
- {
- var bbox = icon.getBBox(),
- size = Math.max(bbox.width, bbox.height);
- icon.translate( -bbox.x, -bbox.y );
-
- bbox = icon.getBBox();
- if( bbox.width > bbox.height )
- icon.translate( 0, (size/2 - bbox.height/2) );
- else
- icon.translate( (size/2 - bbox.width/2), 0 );
- icon.translate( 1, 1 );
- canvas.setSize( size+2, size+2);
- }
-
- if( 'id' in options )
- {
- var id = options['id'];
- __icons[id] =
- {'icon':icon,
- 'vobjects':vobjects,
- 'edgesIn':[],
- 'edgesOut':[]};
- icon.setAttr('__csuri',id);
- icon.setAttr('__x',0);
- icon.setAttr('__y',0);
- icon.setAttr('__r',0);
- icon.setAttr('__sx',1);
- icon.setAttr('__sy',1);
- icon.setAttr('id', id);
- }
-
- if( 'attrs' in options )
- {
- var attrs = options['attrs'];
- for( var attr in attrs )
- icon.setAttr(attr,attrs[attr]);
- }
-
- if( 'behaviours' in options )
- {
- icon.setAttr('class','clickable');
- icon.node.onmousedown =
- function(event)
- {
- if( event.button == 0 )
- BehaviorManager.handleUserEvent(__EVENT_LEFT_PRESS_ICON,event);
- else if( event.button == 2 )
- BehaviorManager.handleUserEvent(__EVENT_RIGHT_PRESS_ICON,event);
- };
- icon.node.onmouseup =
- function(event)
- {
- if( event.button == 0 )
- {
- if( event.shiftKey )
- BehaviorManager.handleUserEvent(__EVENT_SHIFT_LEFT_RELEASE_ICON,event);
- else
- BehaviorManager.handleUserEvent(__EVENT_LEFT_RELEASE_ICON,event);
- }
- else if( event.button == 2 )
- BehaviorManager.handleUserEvent(__EVENT_RIGHT_RELEASE_ICON,event);
- else if( event.button == 1 )
- {
- if( event.shiftKey )
- BehaviorManager.handleUserEvent(__EVENT_SHIFT_MIDDLE_RELEASE_ICON,event);
- else
- BehaviorManager.handleUserEvent(__EVENT_MIDDLE_RELEASE_ICON,event);
- }
- };
- let shiftWheelFunction =
- function(event)
- {
- if( event.shiftKey )
- {
- BehaviorManager.handleUserEvent(__EVENT_SHIFT_WHEEL_ICON,event);
- return false;
- }
- };
- icon.node.onmousewheel = shiftWheelFunction;
- icon.node.onwheel = shiftWheelFunction;
- /*icon.node.onmouseover =
- function(event)
- {
- BehaviorManager.handleUserEvent(__EVENT_MOUSE_OVER_ICON,event);
- };
- icon.node.onmouseout =
- function(event)
- {
- BehaviorManager.handleUserEvent(__EVENT_MOUSE_OUT_ICON,event);
- };*/
- }
- }
-
- return icon;
- };
-
- /**
- * Compile the current model to an Abstract Syntax Metamodel
- */
- this.compileToASMM = function (fname) {
- if (!__isAbstractSyntaxMetamodel(fname))
- WindowManagement.openDialog(
- _ERROR,
- 'invalid extension... abstract syntax metamodels are "*.metamodel" files');
- else
- HttpUtils.httpReq('PUT', HttpUtils.url(fname, __FORCE_GET), null,
- function (status, text) {
- //there was a problem
- if (!utils.isHttpSuccessCode(status)) {
- //let resp = JSON.parse(text);
- WindowManagement.openDialog(_ERROR, JSON.stringify(text));
- }
- });
- };
- /**
- * Compile the current model to a Concrete Syntax Metamodel
- */
- this.compileToCSMM = function (fname) {
- if (!__isIconMetamodel(fname))
- WindowManagement.openDialog(
- _ERROR,
- 'invalid extension... icon definition metamodels are "*Icons.metamodel" files');
- else
- HttpUtils.httpReq('PUT', HttpUtils.url(fname, __FORCE_GET), null,
- function (status, text) {
- //there was a problem
- if (!utils.isHttpSuccessCode(status)) {
- let resp = text;
- if (!(resp.startsWith("500"))) {
- resp = JSON.parse(text);
- }
- if (resp["code"] && resp["code"].includes("ENOENT")) {
- let msg = "ERROR: Corresponding metamodel could not be found in same directory!";
- WindowManagement.openDialog(_ERROR, msg);
- } else {
- WindowManagement.openDialog(_ERROR, JSON.stringify(text));
- }
- }
- });
- };
-
- /**
- * Compiles the current model to an Icon Pattern Metamodel
- */
- this.compileToPatternMM = function(fname){
- if( ! __isAbstractSyntaxMetamodel(fname) )
- WindowManagement.openDialog(
- _ERROR,
- 'invalid extension... abstract syntax metamodels are "*.metamodel" files');
- else
- {
- var patternmm = fname.substring(0,fname.length-'metamodel'.length)+'pattern.metamodel';
- HttpUtils.httpReq('PUT', HttpUtils.url(patternmm,__FORCE_GET));
- }
- };
-
- return this;
- }();
|