AutorÃa | Ultima modificación | Ver Log |
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle 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 Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Provides an in browser PDF editor.
*
* @module moodle-assignfeedback_editpdf-editor
*/
/**
* Class representing a highlight.
*
* @namespace M.assignfeedback_editpdf
* @class annotation
* @constructor
*/
var ANNOTATION = function(config) {
ANNOTATION.superclass.constructor.apply(this, [config]);
};
ANNOTATION.NAME = "annotation";
ANNOTATION.ATTRS = {};
Y.extend(ANNOTATION, Y.Base, {
/**
* Reference to M.assignfeedback_editpdf.editor.
* @property editor
* @type M.assignfeedback_editpdf.editor
* @public
*/
editor: null,
/**
* Grade id
* @property gradeid
* @type Int
* @public
*/
gradeid: 0,
/**
* Comment page number
* @property pageno
* @type Int
* @public
*/
pageno: 0,
/**
* X position
* @property x
* @type Int
* @public
*/
x: 0,
/**
* Y position
* @property y
* @type Int
* @public
*/
y: 0,
/**
* Ending x position
* @property endx
* @type Int
* @public
*/
endx: 0,
/**
* Ending y position
* @property endy
* @type Int
* @public
*/
endy: 0,
/**
* Path
* @property path
* @type String - list of points like x1,y1:x2,y2
* @public
*/
path: '',
/**
* Tool.
* @property type
* @type String
* @public
*/
type: 'rect',
/**
* Annotation colour.
* @property colour
* @type String
* @public
*/
colour: 'red',
/**
* Reference to M.assignfeedback_editpdf.drawable
* @property drawable
* @type M.assignfeedback_editpdf.drawable
* @public
*/
drawable: false,
/**
* Initialise the annotation.
*
* @method initializer
* @return void
*/
initializer: function(config) {
this.editor = config.editor || null;
this.gradeid = parseInt(config.gradeid, 10) || 0;
this.pageno = parseInt(config.pageno, 10) || 0;
this.x = parseInt(config.x, 10) || 0;
this.y = parseInt(config.y, 10) || 0;
this.endx = parseInt(config.endx, 10) || 0;
this.endy = parseInt(config.endy, 10) || 0;
this.path = config.path || '';
this.type = config.type || 'rect';
this.colour = config.colour || 'red';
this.drawable = false;
},
/**
* Clean a comment record, returning an oject with only fields that are valid.
* @public
* @method clean
* @return {}
*/
clean: function() {
return {
gradeid: this.gradeid,
x: parseInt(this.x, 10),
y: parseInt(this.y, 10),
endx: parseInt(this.endx, 10),
endy: parseInt(this.endy, 10),
type: this.type,
path: this.path,
pageno: this.pageno,
colour: this.colour
};
},
/**
* Draw a selection around this annotation if it is selected.
* @public
* @method draw_highlight
* @return M.assignfeedback_editpdf.drawable
*/
draw_highlight: function() {
var bounds,
drawingregion = this.editor.get_dialogue_element(SELECTOR.DRAWINGREGION),
offsetcanvas = this.editor.get_dialogue_element(SELECTOR.DRAWINGCANVAS).getXY(),
shape;
if (this.editor.currentannotation === this) {
// Draw a highlight around the annotation.
bounds = new M.assignfeedback_editpdf.rect();
bounds.bound([new M.assignfeedback_editpdf.point(this.x, this.y),
new M.assignfeedback_editpdf.point(this.endx, this.endy)]);
shape = this.editor.graphic.addShape({
type: Y.Rect,
width: bounds.width,
height: bounds.height,
stroke: {
weight: STROKEWEIGHT,
color: SELECTEDBORDERCOLOUR
},
fill: {
color: SELECTEDFILLCOLOUR
},
x: bounds.x,
y: bounds.y
});
this.drawable.shapes.push(shape);
// Add a delete X to the annotation.
var deleteicon = Y.Node.create('<img src="' + M.util.image_url('trash', 'assignfeedback_editpdf') + '"/>'),
deletelink = Y.Node.create('<a href="#" role="button"></a>');
deleteicon.setAttrs({
'alt': M.util.get_string('deleteannotation', 'assignfeedback_editpdf')
});
deleteicon.setStyles({
'backgroundColor': 'white'
});
deletelink.addClass('deleteannotationbutton');
deletelink.append(deleteicon);
drawingregion.append(deletelink);
deletelink.setData('annotation', this);
deletelink.on('click', this.remove, this);
deletelink.on('key', this.remove, 'space,enter', this);
deletelink.setX(offsetcanvas[0] + bounds.x + bounds.width - 18);
deletelink.setY(offsetcanvas[1] + bounds.y + 6);
this.drawable.nodes.push(deletelink);
}
return this.drawable;
},
/**
* Draw an annotation
* @public
* @method draw
* @return M.assignfeedback_editpdf.drawable|false
*/
draw: function() {
// Should be overridden by the subclass.
this.draw_highlight();
return this.drawable;
},
/**
* Delete an annotation
* @protected
* @method remove
* @param event
*/
remove: function(e) {
var annotations,
i;
e.preventDefault();
annotations = this.editor.pages[this.editor.currentpage].annotations;
for (i = 0; i < annotations.length; i++) {
if (annotations[i] === this) {
annotations.splice(i, 1);
if (this.drawable) {
this.drawable.erase();
}
this.editor.currentannotation = false;
this.editor.save_current_page();
return;
}
}
},
/**
* Move an annotation to a new location.
* @public
* @param int newx
* @param int newy
* @method move_annotation
*/
move: function(newx, newy) {
var diffx = newx - this.x,
diffy = newy - this.y,
newpath, oldpath, xy,
x, y;
this.x += diffx;
this.y += diffy;
this.endx += diffx;
this.endy += diffy;
if (this.path) {
newpath = [];
oldpath = this.path.split(':');
Y.each(oldpath, function(position) {
xy = position.split(',');
x = parseInt(xy[0], 10);
y = parseInt(xy[1], 10);
newpath.push((x + diffx) + ',' + (y + diffy));
});
this.path = newpath.join(':');
}
if (this.drawable) {
this.drawable.erase();
}
this.editor.drawables.push(this.draw());
},
/**
* Draw the in progress edit.
*
* @public
* @method draw_current_edit
* @param M.assignfeedback_editpdf.edit edit
*/
draw_current_edit: function(edit) {
var noop = edit && false;
// Override me please.
return noop;
},
/**
* Promote the current edit to a real annotation.
*
* @public
* @method init_from_edit
* @param M.assignfeedback_editpdf.edit edit
* @return bool if width/height is more than min. required.
*/
init_from_edit: function(edit) {
var bounds = new M.assignfeedback_editpdf.rect();
bounds.bound([edit.start, edit.end]);
this.gradeid = this.editor.get('gradeid');
this.pageno = this.editor.currentpage;
this.x = bounds.x;
this.y = bounds.y;
this.endx = bounds.x + bounds.width;
this.endy = bounds.y + bounds.height;
this.colour = edit.annotationcolour;
this.path = '';
return (bounds.has_min_width() && bounds.has_min_height());
}
});
M.assignfeedback_editpdf = M.assignfeedback_editpdf || {};
M.assignfeedback_editpdf.annotation = ANNOTATION;