/* globals jQuery */ 
 | 
/** 
 | 
 * ext-eyedropper.js 
 | 
 * 
 | 
 * @license MIT 
 | 
 * 
 | 
 * @copyright 2010 Jeff Schiller 
 | 
 * 
 | 
 */ 
 | 
  
 | 
export default { 
 | 
  name: 'eyedropper', 
 | 
  async init (S) { 
 | 
    const strings = await S.importLocale(); 
 | 
    const svgEditor = this; 
 | 
    const $ = jQuery; 
 | 
    const {ChangeElementCommand} = S, // , svgcontent, 
 | 
      // svgdoc = S.svgroot.parentNode.ownerDocument, 
 | 
      svgCanvas = svgEditor.canvas, 
 | 
      addToHistory = function (cmd) { svgCanvas.undoMgr.addCommandToHistory(cmd); }, 
 | 
      currentStyle = { 
 | 
        fillPaint: 'red', fillOpacity: 1.0, 
 | 
        strokePaint: 'black', strokeOpacity: 1.0, 
 | 
        strokeWidth: 5, strokeDashArray: null, 
 | 
        opacity: 1.0, 
 | 
        strokeLinecap: 'butt', 
 | 
        strokeLinejoin: 'miter' 
 | 
      }; 
 | 
  
 | 
    function getStyle (opts) { 
 | 
      // if we are in eyedropper mode, we don't want to disable the eye-dropper tool 
 | 
      const mode = svgCanvas.getMode(); 
 | 
      if (mode === 'eyedropper') { return; } 
 | 
  
 | 
      const tool = $('#tool_eyedropper'); 
 | 
      // enable-eye-dropper if one element is selected 
 | 
      let elem = null; 
 | 
      if (!opts.multiselected && opts.elems[0] && 
 | 
        !['svg', 'g', 'use'].includes(opts.elems[0].nodeName) 
 | 
      ) { 
 | 
        elem = opts.elems[0]; 
 | 
        tool.removeClass('disabled'); 
 | 
        // grab the current style 
 | 
        currentStyle.fillPaint = elem.getAttribute('fill') || 'black'; 
 | 
        currentStyle.fillOpacity = elem.getAttribute('fill-opacity') || 1.0; 
 | 
        currentStyle.strokePaint = elem.getAttribute('stroke'); 
 | 
        currentStyle.strokeOpacity = elem.getAttribute('stroke-opacity') || 1.0; 
 | 
        currentStyle.strokeWidth = elem.getAttribute('stroke-width'); 
 | 
        currentStyle.strokeDashArray = elem.getAttribute('stroke-dasharray'); 
 | 
        currentStyle.strokeLinecap = elem.getAttribute('stroke-linecap'); 
 | 
        currentStyle.strokeLinejoin = elem.getAttribute('stroke-linejoin'); 
 | 
        currentStyle.opacity = elem.getAttribute('opacity') || 1.0; 
 | 
      // disable eye-dropper tool 
 | 
      } else { 
 | 
        tool.addClass('disabled'); 
 | 
      } 
 | 
    } 
 | 
  
 | 
    const buttons = [ 
 | 
      { 
 | 
        id: 'tool_eyedropper', 
 | 
        icon: svgEditor.curConfig.extIconsPath + 'eyedropper.png', 
 | 
        type: 'mode', 
 | 
        events: { 
 | 
          click () { 
 | 
            svgCanvas.setMode('eyedropper'); 
 | 
          } 
 | 
        } 
 | 
      } 
 | 
    ]; 
 | 
  
 | 
    return { 
 | 
      name: strings.name, 
 | 
      svgicons: svgEditor.curConfig.extIconsPath + 'eyedropper-icon.xml', 
 | 
      buttons: strings.buttons.map((button, i) => { 
 | 
        return Object.assign(buttons[i], button); 
 | 
      }), 
 | 
  
 | 
      // if we have selected an element, grab its paint and enable the eye dropper button 
 | 
      selectedChanged: getStyle, 
 | 
      elementChanged: getStyle, 
 | 
  
 | 
      mouseDown (opts) { 
 | 
        const mode = svgCanvas.getMode(); 
 | 
        if (mode === 'eyedropper') { 
 | 
          const e = opts.event; 
 | 
          const {target} = e; 
 | 
          if (!['svg', 'g', 'use'].includes(target.nodeName)) { 
 | 
            const changes = {}; 
 | 
  
 | 
            const change = function (elem, attrname, newvalue) { 
 | 
              changes[attrname] = elem.getAttribute(attrname); 
 | 
              elem.setAttribute(attrname, newvalue); 
 | 
            }; 
 | 
  
 | 
            if (currentStyle.fillPaint) { change(target, 'fill', currentStyle.fillPaint); } 
 | 
            if (currentStyle.fillOpacity) { change(target, 'fill-opacity', currentStyle.fillOpacity); } 
 | 
            if (currentStyle.strokePaint) { change(target, 'stroke', currentStyle.strokePaint); } 
 | 
            if (currentStyle.strokeOpacity) { change(target, 'stroke-opacity', currentStyle.strokeOpacity); } 
 | 
            if (currentStyle.strokeWidth) { change(target, 'stroke-width', currentStyle.strokeWidth); } 
 | 
            if (currentStyle.strokeDashArray) { change(target, 'stroke-dasharray', currentStyle.strokeDashArray); } 
 | 
            if (currentStyle.opacity) { change(target, 'opacity', currentStyle.opacity); } 
 | 
            if (currentStyle.strokeLinecap) { change(target, 'stroke-linecap', currentStyle.strokeLinecap); } 
 | 
            if (currentStyle.strokeLinejoin) { change(target, 'stroke-linejoin', currentStyle.strokeLinejoin); } 
 | 
  
 | 
            addToHistory(new ChangeElementCommand(target, changes)); 
 | 
          } 
 | 
        } 
 | 
      } 
 | 
    }; 
 | 
  } 
 | 
}; 
 |