Skip to content
Snippets Groups Projects
Select Git revision
  • v5
  • master default protected
2 results

print.js

Blame
  • print.js 5.78 KiB
    (function () {
      function Print(ysy) {
        this.printReady = false;
        this.$area = null;
        this.ysy = ysy;
        this.patch(ysy);
      }
    
      Print.prototype.margins = {
        left: 10,
        right: 10,
        top: 20,
        bottom: 10
      };
      Print.prototype.patch = function (ysy) {
        var self = this;
        var mediaQueryList = window.matchMedia('print');
        mediaQueryList.addListener(function (mql) {
          if (mql.matches) {
            self.beforePrint();
          } else {
            self.afterPrint();
          }
        });
        window.onbeforeprint = $.proxy(this.beforePrint, this);
        window.onafterprint = $.proxy(this.afterPrint, this);
      };
      Print.prototype.directPrint = function () {
        this.beforePrint();
        window.print();
        this.afterPrint();
      };
      Print.prototype.beforePrint = function (isCompact) {
        if (this.printReady) return;
        this.ysy.mapModel.resetView();
        this.$area = isCompact? this.createCompactArea():this.createPrintArea();
        $("body").append(this.$area);
        $("#wrapper").hide();
        this.printReady = true;
      };
      Print.prototype.afterPrint = function () {
        if (!this.printReady) return;
        this.$area.remove();
        $("#wrapper").show();
        this.ysy.mapModel.resetView();
        this.printReady = false;
      };
      Print.prototype.createPrintArea = function () {
        var $stage = this.ysy.$container.children();
        // var width = $stage.width();
        // var height = $stage.height();
        var stripWidth = 330;
        var children = $stage.children(":not(:hidden)");
        var dims = this.getStageDims(children);
        var $area = $('<div class="mindmup-print-area scheme-by-' + this.ysy.styles.setting + '" \
            style="height:' + (dims.bottom - dims.top + this.margins.top + this.margins.bottom) + 'px"></div>');
        for (var p = dims.left - this.margins.left; p < dims.right + this.margins.right; p += stripWidth) {
          $area.append(this.createStrip(children, dims, p, p + stripWidth));
          //p -= 2;
        }
        return $area;
      };
      Print.prototype.createStrip = function (children, dims, start, end) {
        /* start can be negative*/
        if (end <= start) return null;
        // var stageOffset = $stage.height();
        var $strip = $('<div class="mindmup-print-strip" style="height:' + (dims.bottom - dims.top + this.margins.top + this.margins.bottom) + 'px;width:' + (end - start) + 'px"></div>');
        // var children = $stage.children(":not(:hidden)");
        var added = 0;
        for (var i = 0; i < children.length; i++) {
          var child = children[i];
          var left = parseInt(child.style.left);
          var width = child.offsetWidth;
          var top = parseInt(child.style.top) - dims.top + this.margins.top;
          var height = child.offsetHeight;
          if (left > end) continue;
          if (left + width < start) continue;
          added++;
          var $child = $(child);
          var transform = $child.css("transform");
          if (transform === "none") transform = "";
          transform = "translate(" + (left - start) + "px," + top + "px) " + transform;
          $strip.append(
              $child
                  .clone()
                  .css({left: 0, top: 0, transform: transform})
          );
        }
        if (!added) return null;
        return $strip;
      };
      Print.prototype.getStageDims = function (children) {
        var dims = {
          left: Infinity,
          top: Infinity,
          right: -Infinity,
          bottom: -Infinity
        };
        for (var i = 0; i < children.length; i++) {
          var child = children[i];
          var left = parseInt(child.style.left);
          var top = parseInt(child.style.top);
          var width = child.offsetWidth;
          var height = child.offsetHeight;
          if (left < dims.left) dims.left = left;
          if (top < dims.top) dims.top = top;
          if (left + width > dims.right) dims.right = left + width;
          if (top + height > dims.bottom) dims.bottom = top + height;
        }
        return dims;
      };
      Print.prototype.createCompactArea = function () {
        var $stage = this.ysy.$container.children();
        var children = $stage.children(":not(:hidden)");
        var dims = this.getStageDims(children);
        var leftEdge = dims.left - this.margins.left;
        var $area = $('<div class="mindmup-pdf-print-area scheme-by-' + this.ysy.styles.setting + '" style="'
            + 'height:' + (dims.bottom - dims.top + this.margins.top + this.margins.bottom) + 'px;'
            + 'width:' + (dims.right - leftEdge + this.margins.right) + 'px"></div>');
        for (var i = 0; i < children.length; i++) {
          var child = children[i];
          var left = parseInt(child.style.left);
          var width = child.offsetWidth;
          var top = parseInt(child.style.top) - dims.top + this.margins.top;
          var height = child.offsetHeight;
          var $child = $(child);
          var transform = $child.css("transform");
          if (transform === "none") transform = "";
          transform = "translate(" + (left - leftEdge) + "px," + top + "px) " + transform;
          $area.append(
              $child
                  .clone()
                  .css({left: 0, top: 0, transform: transform})
          );
        }
        return $area;
      };
    
      window.easyMindMupClasses.Print = Print;
      //####################################################################################################################
      /**
       * Button, which prepare Mind Map into printable version
       * @param {MindMup} ysy
       * @param {jQuery} $parent
       * @constructor
       */
      function PrintButton(ysy, $parent) {
        this.$element = null;
        this.ysy = ysy;
        this.init(ysy, $parent);
      }
    
      PrintButton.prototype.id = "PrintButton";
    
      /**
       *
       * @param {MindMup} ysy
       * @param {jQuery} $parent
       * @return {PrintButton}
       */
      PrintButton.prototype.init = function (ysy, $parent) {
        this.$element = $parent.find(".mindmup-button-print");
        var self = this;
        this.$element.click(function () {
          self.ysy.print.directPrint();
        });
        return this;
      };
      PrintButton.prototype._render = function () {
      };
    
      window.easyMindMupClasses.PrintButton = PrintButton;
    
    })();