Source: core/drawing/tool/toolMagnifier.js

  1. /**
  2. * @fileoverview A class implementing a magnifier tool for
  3. * a drawing canvas.
  4. * @private
  5. */
  6. goog.provide('xrx.drawing.tool.Magnifier');
  7. goog.require('goog.dom.DomHelper');
  8. goog.require('goog.events');
  9. goog.require('goog.events.EventType');
  10. goog.require('goog.fx.Dragger');
  11. goog.require('goog.math.AffineTransform');
  12. goog.require('goog.math.Rect');
  13. goog.require('goog.style');
  14. goog.require('xrx.canvas');
  15. goog.require('xrx.drawing.tool.Tool');
  16. goog.require('xrx.engine.Engines');
  17. goog.require('xrx.svg');
  18. goog.require('xrx.vml');
  19. /**
  20. * @constructor
  21. * @private
  22. */
  23. xrx.drawing.tool.Magnifier = function(drawing, element, canvas, group, image) {
  24. goog.base(this, drawing, element, canvas);
  25. this.group_ = group;
  26. this.image_ = image;
  27. this.width_ = 110;
  28. this.height_ = 100;
  29. this.ctm_ = new goog.math.AffineTransform();
  30. };
  31. goog.inherits(xrx.drawing.tool.Magnifier, xrx.drawing.tool.Tool);
  32. xrx.drawing.tool.Magnifier.prototype.hide = function() {
  33. goog.style.setStyle(this.element_, 'display', 'none');
  34. this.isActive_ = false;
  35. };
  36. xrx.drawing.tool.Magnifier.prototype.show = function() {
  37. goog.style.setStyle(this.element_, 'display', 'block');
  38. this.isActive_ = true;
  39. };
  40. xrx.drawing.tool.Magnifier.prototype.reset = function() {
  41. var canvas = this.canvas_;
  42. canvas.setWidth(this.width_);
  43. canvas.setHeight(this.height_);
  44. goog.style.setStyle(this.element_, 'position', 'absolute');
  45. goog.style.setStyle(this.element_, 'display', 'block');
  46. goog.style.setStyle(this.element_, 'z-index', '1001');
  47. goog.style.setStyle(this.element_, 'left', '50px');
  48. goog.style.setStyle(this.element_, 'top', '50px');
  49. goog.style.setStyle(this.element_, 'border', 'solid black 4px');
  50. this.group_.draw();
  51. };
  52. xrx.drawing.tool.Magnifier.prototype.handleDrag_ = function(e, dragger) {
  53. var ctm;
  54. var eventPoint = [dragger.deltaX + (this.width_ / 2), dragger.deltaY];
  55. var point = new Array(2);
  56. var viewboxCtm = this.drawing_.getViewbox().getCTM()
  57. var engine = this.drawing_.getEngine();
  58. viewboxCtm.createInverse().transform(eventPoint, 0, point, 0, 1);
  59. ctm = this.ctm_.createInverse().translate(-point[0], -point[1]);
  60. // TODO: same as in xrx.drawing.Drawing
  61. if (engine.typeOf(xrx.engine.CANVAS)) {
  62. var c = this.canvas_.getElement();
  63. var ctx = c.getContext('2d');
  64. ctx.save();
  65. ctx.fillStyle = 'white';
  66. ctx.fillRect(0, 0, c.width, c.height);
  67. ctx.beginPath();
  68. xrx.canvas.setTransform_(ctx, ctm);
  69. this.group_.draw();
  70. ctx.closePath();
  71. ctx.restore();
  72. } else if (engine.typeOf(xrx.engine.SVG)) {
  73. xrx.svg.render(this.group_.getElement(), ctm);
  74. } else if (engine.typeOf(xrx.engine.VML)) {
  75. xrx.vml.render(this.group_.getRaphael(), ctm);
  76. } else {
  77. throw Error('Unknown engine.');
  78. }
  79. };
  80. xrx.drawing.tool.Magnifier.prototype.registerDrag_ = function() {
  81. var size = goog.style.getSize(this.drawing_.getElement());
  82. var limits = new goog.math.Rect(0, 0, size.width, size.height);
  83. var dragger = new goog.fx.Dragger(this.element_, this.element_, limits); // TODO: limits (IE < 9)
  84. goog.events.listen(dragger, goog.events.EventType.DRAG, function(e) {
  85. this.handleDrag_(e, dragger);
  86. }, false, this);
  87. };
  88. xrx.drawing.tool.Magnifier.create = function(drawing) {
  89. var graphics = drawing.getGraphics();
  90. var backgroundImage = drawing.getLayerBackground().getImage();
  91. var div = goog.dom.createElement('div');
  92. var canvas = graphics.Canvas.create(drawing.getElement());
  93. var group = graphics.Group.create(canvas);
  94. var image = graphics.Image.create(backgroundImage.getImage(), canvas);
  95. var magnifier = new xrx.drawing.tool.Magnifier(drawing, div, canvas, group, image);
  96. goog.dom.appendChild(div, canvas.getElement());
  97. canvas.addChild(group);
  98. group.addChildren(image);
  99. goog.dom.appendChild(drawing.getElement(), div);
  100. magnifier.reset();
  101. magnifier.registerDrag_();
  102. return magnifier;
  103. };