{"version":3,"sources":["https://lively-kernel.org/lively4/BP2019RH-stable/components/bp2019-y-axis-widget.js"],"names":["d3","inside","Morph","FreehandDrawer","InspectHuman","getRandomInteger","deepCopy","collapse","assertListenerInterface","assertFreeHandSelectionListenerInterface","InspectAction","SelectAction","FilterAction","ColorAction","GroupAction","NullAction","InspectActionType","SelectActionType","FilterActionType","ColorActionType","GroupActionType","NullActionType","ctx","Bp2019YAxisWidget","initialize","name","dataProcessor","undefined","colorStore","individualIndexByIdentifyingColor","listeners","container","get","canvas","drawSVG","controlPanel","controlPanelContainer","addSizeListener","addEventListener","event","_onCanvasClicked","canvasPadding","style","paddingLeft","left","paddingTop","top","paddingRight","right","paddingBottom","bottom","drawer","addListener","start","context","getContext","scalesSVG","select","xAxisGroup","xScale","scaleBand","padding","yAxisGroup","yScale","groupingInformation","currentActions","collapsed","controlWidget","setDataProcessor","_propagateDataProcessor","setColorStore","setContainerType","type","containerType","setExtent","extent","lively","data","_updateExtent","setLocalControls","setData","forEach","element","convertColorObjectToRGBHexString","drawing","identifyingColor","index","activate","getData","listener","push","setFreeHandSelectionListener","freeHandSelectionListener","applyAction","action","_dispatchAction","_initializeData","originalData","initializeAfterDataFetch","_initializeAxes","_runCurrentActions","_draw","stop","onSizeChange","_updateLocalControlsExtent","freehandSelectionCreated","drawSelections","freehandSelectionDeleted","selection","dispatchEvent","CustomEvent","detail","bubbles","freehandSelectionOnContextMenu","evt","selectionSVG","linePointsArray","linePoints","map","point","x","y","selectedIndividuals","filter","currentPosition","freehandSelectionSVGElement","clientX","clientY","individualsSelection","selectionColor","color","unsetLocalControls","myWindow","findWindow","isWindow","overflow","display","parentPosition","getGlobalPosition","setGlobalPosition","addPt","pt","getExtent","parentElement","zIndex","getType","_handleGroupAction","_handleColorAction","_handleSelectAction","_handleFilterAction","_handleInspectAction","_handleNullAction","_handleNotSupportedAction","save","canvasSize","_getCanvasSize","clearRect","width","height","_drawGroupingRectangles","individual","drawingInformation","beginPath","arc","currentSize","Math","PI","strokeStyle","convertColorObjectToRGBAHexString","currentColor","stroke","restore","_drawWithIdentifyingColors","fillStyle","fill","getGroupingRectangleColor","groupingAttributeX","attributes","groupingAttributeY","_drawDefaultBackgroundShade","fillRect","_drawGroupingTiles","scales","domain","xDomainElement","yDomainElement","bandwidth","_drawGroupingStripes","range","_drawGroupingBars","amountsByValues","_getAmountsByValues","attribute","offset","xOffset","yOffset","axesGroups","attr","_updateAxis","_rescaleData","oldExtent","newExtent","_calculateNewPositions","applyScaling","_resetAxes","Object","keys","axisName","resetAxis","_resetAxis","scale","axis","axisBottom","axisLeft","call","xAxisGroupingWidget","attributeSelect","value","yAxisGroupingWidget","_handleEmptyGroupingAction","_handleGroupingActionAmount","_handleGroupingActionAttribute","otherAxis","_signalLocalActionsChanged","localActions","inspect","groupingAttribute","notify","values","getValuesForAttribute","maxValue","max","scaleLinear","individualValue","getUniqueValueFromIndividual","selectAll","_getValuesForAttribute","reverse","runOn","key","filterAction","filters","filterAttribute","concat","filterValues","length","slice","_buildIdentifyingImageData","clickPosition","_getCursorPosition","_getIdentifyingColor","_isBackgroundColor","_getIndividualByIdentifyingColor","layerX","layerY","floor","position","startPosition","identifyingImageData","colorInt","convertColorObjectToColorInt","colorString","convertColorIntToRGBHexString","_getIndividualByIndex","result","canvasDimensions","getImageData","oldCanvasExtent","newCanvasExtent","contaianerType"],"mappings":"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","file":"bp2019-y-axis-widget.js","sourcesContent":["\"enable aexpr\";\n\nimport d3 from 'src/external/d3.v5.js'\nimport inside from \"https://lively-kernel.org/lively4/BP2019RH1/src/internal/individuals-as-points/common/npm-point-in-polygon.js\"\n\nimport Morph from 'src/components/widgets/lively-morph.js';\nimport FreehandDrawer from '../src/internal/individuals-as-points/common/drawFreehand.js'\n\nimport InspectHuman from './bp2019-inspect-human.js'\n\nimport { getRandomInteger, deepCopy, collapse } from \"../src/internal/individuals-as-points/common/utils.js\"\n\nimport { assertListenerInterface, assertFreeHandSelectionListenerInterface } from \"../src/internal/individuals-as-points/common/interfaces.js\";\n\nimport { \n  InspectAction, \n  SelectAction,\n  FilterAction, \n  ColorAction, \n  GroupAction, \n  NullAction,\n  InspectActionType, \n  SelectActionType,\n  FilterActionType, \n  ColorActionType, \n  GroupActionType, \n  NullActionType\n} from '../src/internal/individuals-as-points/common/actions.js'\n\nvar ctx\nexport default class Bp2019YAxisWidget extends Morph {\n  async initialize() {\n    ctx = this\n    this.name = \"yAxisWidget\"\n    \n    this.dataProcessor = undefined\n    this.colorStore = undefined\n    \n    this.individualIndexByIdentifyingColor = undefined\n    \n    this.listeners = []\n\n    this.container = this.get(\"#y-axis-widget-root-container\")\n    this.canvas = this.get(\"#y-axis-widget-canvas\")\n    this.drawSVG = this.get(\"#draw-svg\")\n    this.controlPanel = this.get(\"#control-widget\")\n    this.controlPanelContainer = this.get(\"#canvas-widget-control-panel-container\")\n    this.controlPanel.addSizeListener(this)\n    \n    this.canvas.addEventListener(\"click\", (event) => {this._onCanvasClicked(event)})\n    \n    this.canvasPadding = {\"left\": 50, \"top\": 10, \"right\": 10, \"bottom\": 50}\n    \n    this.canvas.style.paddingLeft = this.canvasPadding.left + \"px\"\n    this.canvas.style.paddingTop = this.canvasPadding.top + \"px\"\n    this.canvas.style.paddingRight = this.canvasPadding.right + \"px\"\n    this.canvas.style.paddingBottom = this.canvasPadding.bottom + \"px\"\n        \n    this.drawer = new FreehandDrawer(this.container, this.canvas, this.drawSVG)\n    this.drawer.addListener(this)\n    this.drawer.start()\n    \n    this.context = this.canvas.getContext(\"2d\")\n    \n    this.scalesSVG = d3.select(this.get(\"#scales-svg\"))\n    \n    let xAxisGroup = d3.select(this.get(\"#x-axis-group\"))\n    let xScale = d3.scaleBand().padding(0.1)\n    \n    let yAxisGroup = d3.select(this.get(\"#y-axis-group\"))\n    let yScale = d3.scaleBand().padding(0.1)\n    \n    this.groupingInformation = {\n      \"attributes\": {\n        \"x\": \"none\",\n        \"y\": \"none\"\n      },\n      \"axesGroups\": {\n        \"x\": xAxisGroup,\n        \"y\": yAxisGroup\n      },\n      \"scales\": {\n        \"x\": xScale,\n        \"y\": yScale\n      },\n    }\n    \n    this.currentActions = {\n      \"x\": new NullAction(),\n      \"y\": new NullAction(),\n      \"color\": new NullAction(),\n      \"filter\": new NullAction(),\n      \"select\": new NullAction(),\n      \"inspect\": new NullAction()\n    }\n    this.collapsed = false \n        \n    this.controlWidget = this.get(\"#control-widget\")\n    this.controlWidget.addListener(this)\n    this.controlWidget.addSizeListener(this)\n  }\n  \n  // ------------------------------------------\n  // Public Methods\n  // ------------------------------------------\n  \n  setDataProcessor(dataProcessor) {\n    this.dataProcessor = dataProcessor\n    this._propagateDataProcessor()\n  }\n  \n  setColorStore(colorStore) {\n    this.colorStore = colorStore\n  }\n  \n  setContainerType(type) {\n    this.containerType = type\n  }\n  \n  async setExtent(extent) {\n    lively.setExtent(this, extent)\n    lively.setExtent(this.container, extent)\n    if (this.data) this._updateExtent()\n    if (this.containerType === \"pane\") {\n      this.setLocalControls()\n    }\n  }\n  \n  async setData(data) {\n    this.data = data\n    \n    this.individualIndexByIdentifyingColor = {}\n    this.data.forEach(element => {\n      this.individualIndexByIdentifyingColor[this.colorStore.convertColorObjectToRGBHexString(element.drawing.identifyingColor)] = element.index\n    })\n    \n    this.activate()\n  }\n  \n  getData() {\n    return this.data\n  }\n  \n  addListener(listener) {\n    assertListenerInterface(listener)\n    this.listeners.push(listener)\n  }\n  \n  setFreeHandSelectionListener(listener) {\n    assertFreeHandSelectionListenerInterface(listener)\n    this.freeHandSelectionListener = listener\n  }\n  \n  async applyAction(action) {\n    this._dispatchAction(action)\n  }\n  \n  async activate() {\n    this._initializeData()\n    this.originalData = deepCopy(this.data)\n    this.controlWidget.initializeAfterDataFetch()\n    this._initializeAxes()\n    this._runCurrentActions()\n     \n    this._draw()\n  }\n  \n  async stop() {\n    \n  }\n  \n  onSizeChange(collapsed) {\n    this.collapsed = collapsed\n    this._updateLocalControlsExtent()\n  }\n  \n freehandSelectionCreated() {\n    this._draw()\n    this.drawer.drawSelections()\n  }\n  \n  freehandSelectionDeleted(selection) {\n    this._draw()\n    this.drawer.drawSelections()\n\n    this.dispatchEvent(new CustomEvent(\"freehand-selection-deleted\", {\n      detail: {\n        selection: selection\n      },\n      bubbles: true\n    }))\n  }\n  \n  freehandSelectionOnContextMenu(evt, selection, selectionSVG) {\n    let linePointsArray = selection.linePoints.map(point => [point.x, point.y])\n    let selectedIndividuals = this.data.filter(point => inside([point.drawing.currentPosition.x, point.drawing.currentPosition.y], linePointsArray))\n    \n    this.dispatchEvent(new CustomEvent(\"freehand-selection-contextmenu\", {\n      detail: {\n        freehandSelectionSVGElement: selectionSVG,\n        clientX: evt.clientX,\n        clientY: evt.clientY,\n        individualsSelection: {selectedIndividuals: selectedIndividuals, selectionColor: selection.color}\n      },\n      bubbles: true\n    }))\n  }\n  \n  setLocalControls() {\n    this.unsetLocalControls()\n    \n    var myWindow = lively.findWindow(this)\n    if (myWindow.isWindow) {\n      myWindow.get(\".window-content\").style.overflow = \"visible\"\n    }\n\n    this.controlPanelContainer.style.display = \"block\"\n    \n    let parentPosition = lively.getGlobalPosition(this)\n\n    lively.setGlobalPosition(this.controlPanelContainer, \n          parentPosition.addPt(lively.pt(lively.getExtent(this.parentElement).x, 0)));  \n\n    this.controlPanelContainer.style.zIndex = 20000;    \n  }\n  \n  unsetLocalControls() {\n    // this.controlPanelContainer.remove()\n    this.controlPanelContainer.style.display = \"none\";\n  }\n\n  \n  // ------------------------------------------\n  // Private Methods\n  // ------------------------------------------\n  \n  _propagateDataProcessor() {\n    this.controlWidget.setDataProcessor(this.dataProcessor)\n  }\n  \n  _dispatchAction(action) {\n    \n    switch(action.getType()) {\n      case (GroupActionType):\n        this._handleGroupAction(action);\n        break;\n      case (ColorActionType):\n        this._handleColorAction(action);\n        break;\n      case (SelectActionType):\n    this._handleSelectAction(action);\n        break;\n      case (FilterActionType):\n        this._handleFilterAction(action);\n        break;\n      case (InspectActionType):\n          this._handleInspectAction(action)\n        break;\n      case (NullActionType):\n          this._handleNullAction(action)\n        break;\n      default:\n        this._handleNotSupportedAction(action);\n    }\n    \n    this._draw()\n  }\n  \n  _draw() {\n    let context = this.canvas.getContext(\"2d\")\n\n    context.save()\n    \n    let canvasSize = this._getCanvasSize()\n    context.clearRect(0, 0, canvasSize.width, canvasSize.height)\n    \n    this._drawGroupingRectangles(context)\n    \n    this.data.forEach(individual => {\n      const drawingInformation = individual.drawing\n      context.beginPath()\n      context.arc(\n        drawingInformation.currentPosition.x, \n        drawingInformation.currentPosition.y, \n        drawingInformation.currentSize / 2, \n        0, \n        2 * Math.PI, \n        false\n      )\n      context.strokeStyle = this.colorStore.convertColorObjectToRGBAHexString(drawingInformation.currentColor)\n      context.stroke()\n    })\n\n    context.restore()\n  }\n  \n  _drawWithIdentifyingColors() {\n    const context = this.canvas.getContext(\"2d\")\n    context.save()\n    \n    let canvasSize = this._getCanvasSize()\n    context.clearRect(0, 0, canvasSize.width, canvasSize.height)\n    \n    this.data.forEach(individual => {\n      const drawingInformation = individual.drawing\n      context.beginPath()\n      context.arc(\n        drawingInformation.currentPosition.x, \n        drawingInformation.currentPosition.y, \n        drawingInformation.currentSize / 2, \n        0, \n        2 * Math.PI, \n        false\n      )\n      context.fillStyle = this.colorStore.convertColorObjectToRGBAHexString(drawingInformation.identifyingColor)\n      context.fill()\n    })\n\n    context.restore()\n  }\n  \n  _drawGroupingRectangles(context) {\n    /*cases: \n        both attributes -> tiles\n        one attribute one none -> stripes\n        one attribute one amount -> bars\n        both none, both amount, one amount one none -> nothing*/\n    \n    context.fillStyle = this.colorStore.convertColorObjectToRGBAHexString(this.colorStore.getGroupingRectangleColor())\n    \n    let groupingAttributeX = this.groupingInformation.attributes.x\n    let groupingAttributeY = this.groupingInformation.attributes.y\n    \n    if (groupingAttributeX === \"none\" || groupingAttributeY === \"none\") {\n      if (groupingAttributeX === \"none\" && groupingAttributeY === \"none\") {\n        //this._drawDefaultBackgroundShade(context)\n      } else if (groupingAttributeX === \"amount\" || groupingAttributeY === \"amount\") {\n        //this._drawDefaultBackgroundShade(context)\n      } else {\n        //this._drawGroupingStripes(context)\n      }\n    } else if (groupingAttributeX === \"amount\" || groupingAttributeY === \"amount\") {\n      if (groupingAttributeX === \"amount\" && groupingAttributeY === \"amount\") {\n        //this._drawDefaultBackgroundShade(context)\n      } else {\n        //this._drawGroupingBars(context)\n      }\n    } else {\n      //this._drawGroupingTiles(context)\n    }\n  }\n  \n  _drawDefaultBackgroundShade(context) {\n    let canvasSize = this._getCanvasSize()\n    context.fillRect(\n      1, \n      1, \n      canvasSize.width - 1, \n      canvasSize.height - 1\n    )\n  }\n  \n  _drawGroupingTiles(context) {\n    let xScale = this.groupingInformation.scales.x\n    let yScale = this.groupingInformation.scales.y\n\n    xScale.domain().forEach(xDomainElement => {\n      yScale.domain().forEach(yDomainElement => {\n        context.fillRect(\n          xScale(xDomainElement), \n          yScale(yDomainElement), \n          xScale.bandwidth(), \n          yScale.bandwidth()\n        )\n      })\n    })\n  }\n  \n  _drawGroupingStripes(context) {\n    let groupingAttributeX = this.groupingInformation.attributes.x\n    let groupingAttributeY = this.groupingInformation.attributes.y\n    let xScale = this.groupingInformation.scales.x\n    let yScale = this.groupingInformation.scales.y\n    if (groupingAttributeX !== \"none\") {\n      xScale.domain().forEach(xDomainElement => {\n        context.fillRect(\n          xScale(xDomainElement), \n          1, \n          xScale.bandwidth(), \n          yScale.range()[0] // the range for y is inverted, thats why we take [0]\n        )\n      })\n    } else if (groupingAttributeY !== \"none\") {\n      yScale.domain().forEach(yDomainElement => {\n        context.fillRect(\n          1, \n          yScale(yDomainElement), \n          xScale.range()[1], \n          yScale.bandwidth())\n      })\n    }\n  }\n  \n  _drawGroupingBars(context) {\n    let groupingAttributeX = this.groupingInformation.attributes.x\n    let groupingAttributeY = this.groupingInformation.attributes.y\n    let xScale = this.groupingInformation.scales.x\n    let yScale = this.groupingInformation.scales.y\n    \n    if (groupingAttributeX !== \"amount\") {\n      let amountsByValues = this._getAmountsByValues(this.currentActions[\"x\"].attribute, xScale.domain()\n        )\n      xScale.domain().forEach(xDomainElement => {\n        context.fillRect(\n          xScale(xDomainElement), \n          yScale(amountsByValues[xDomainElement]), \n          xScale.bandwidth(), \n          yScale.range()[0] - yScale(amountsByValues[xDomainElement])\n        )\n      })\n    } else if (groupingAttributeY !== \"amount\") {\n      let amountsByValues = this._getAmountsByValues(this.currentActions[\"y\"].attribute, yScale.domain())\n      yScale.domain().forEach(yDomainElement => {\n        context.fillRect(\n          xScale(amountsByValues[yDomainElement]), \n          yScale(yDomainElement), \n          xScale.range()[0] - xScale(amountsByValues[yDomainElement]), \n          yScale.bandwidth()\n        )\n      })\n    }\n  }\n    \n  _initializeData() {\n    this.data.forEach(individual => {\n      let offset = individual.drawing.currentSize / 2\n      \n      individual.drawing.currentPosition = {\n        \"x\": getRandomInteger(offset, this._getCanvasSize().width - offset),\n        \"y\": getRandomInteger(offset, this._getCanvasSize().height - offset)\n      }\n    })\n  }\n  \n  _initializeAxes() {\n    let xOffset = this.canvasPadding.left\n    let yOffset = this._getCanvasSize().height + this.canvasPadding.top\n    \n    \n    this.groupingInformation.axesGroups.x.attr(\n      'transform', \n      `translate(${xOffset}, ${yOffset})`\n    )\n    this.groupingInformation.axesGroups.y.attr(\n      'transform', \n      `translate(${xOffset}, ${this.canvasPadding.top})`\n    )\n    \n    this.groupingInformation.scales.x.range([0, this._getCanvasSize().width])\n    this.groupingInformation.scales.y.range([this._getCanvasSize().height, 0])\n    \n    this._updateAxis(\"x\")\n    this._updateAxis(\"y\")\n  }\n  \n  _rescaleData(oldExtent, newExtent) {\n    this._calculateNewPositions(this.data, oldExtent, newExtent)\n    this._calculateNewPositions(this.originalData, oldExtent, newExtent)\n    this.drawer.applyScaling({x: newExtent.x / oldExtent.x * 1.0, y: newExtent.y / oldExtent.y * 1.0})\n  }\n  \n  _calculateNewPositions(data, oldExtent, newExtent) {\n    data.forEach(individual => {\n      individual.drawing.currentPosition.x = individual.drawing.currentPosition.x / oldExtent.x * newExtent.x * 1.0\n      individual.drawing.currentPosition.y = individual.drawing.currentPosition.y / oldExtent.y *  newExtent.y * 1.0\n    })\n  }\n  \n  _resetAxes() {\n    Object.keys(this.groupingInformation.axesGroups).forEach(axisName => {\n      this.resetAxis(axisName)\n    })\n  }\n  \n  _resetAxis(axisName) {\n    this.groupingInformation.attributes[axisName] = \"none\"\n\n    this.groupingInformation.scales[axisName] = d3.scaleBand().padding(0.1).domain([]).range(axisName === \"x\" ? [0, this.canvas.width] : [this.canvas.height, 0])\n    this._updateAxis(axisName)\n  }\n  \n  _updateAxis(axisName) {\n    let scale = this.groupingInformation.scales[axisName]\n\n    let axis\n    if (axisName === \"x\") {\n      axis = d3.axisBottom(scale)\n    } else {\n      axis = d3.axisLeft(scale)\n    }\n\n    this.groupingInformation.axesGroups[axisName].call(axis)\n  }\n  \n  _handleGroupAction(action) {\n    \n    if (action.axis === \"x\") {\n      this.controlWidget.xAxisGroupingWidget.attributeSelect.value = action.attribute\n    } else {\n      this.controlWidget.yAxisGroupingWidget.attributeSelect.value = action.attribute\n    }\n    \n    if (action.attribute === \"none\") {\n      this._handleEmptyGroupingAction(action)\n    } else if (action.attribute === \"amount\") {\n      this._handleGroupingActionAmount(action)\n    } else {\n      this._handleGroupingActionAttribute(action)\n    }\n    \n    this.groupingInformation.attributes[action.axis] = action.attribute\n    this.currentActions[action.axis] = action\n    \n    let otherAxis = action.axis === \"x\" ? \"y\" : \"x\"\n    if (this.groupingInformation.attributes[otherAxis] === \"amount\") {\n      if (this.groupingInformation.attributes[action.axis] !== \"amount\") {\n        this._handleGroupAction(this.currentActions[otherAxis])\n      }\n    }\n    \n    // this needs to be sent after update of this.currentActions\n    this._signalLocalActionsChanged()\n  }\n  \n  _signalLocalActionsChanged(){\n    this.dispatchEvent(new CustomEvent(\"local-actions-changed\", {\n      detail: {\n        localActions: [this.currentActions.x, this.currentActions.y, this.currentActions.inspect]\n      },\n      bubbles: true\n    }))\n  }\n  \n  _handleEmptyGroupingAction(action) {\n    let axisName = action.axis    \n    this._resetAxis(axisName)\n    let canvasSize = this._getCanvasSize()\n    \n    this.data.forEach(individual => {\n      let offset = individual.drawing.currentSize / 2\n      individual.drawing.currentPosition[axisName] = getRandomInteger(offset, axisName === \"x\" ? canvasSize.width - offset : canvasSize.height - offset)\n    })\n  }\n  \n  _handleGroupingActionAmount(action) {\n    let axisName = action.axis\n    let otherAxis = axisName === \"x\" ? \"y\" : \"x\"\n    let groupingAttribute = this.groupingInformation.attributes[otherAxis]\n    \n    if (groupingAttribute === \"amount\" || groupingAttribute === \"none\") {\n      lively.notify(\"you cannot get an amount of amounts or randomness\")\n      return\n    }\n    \n    let values = this.dataProcessor.getValuesForAttribute(groupingAttribute)\n    let amountsByValues = this._getAmountsByValues(groupingAttribute, values)\n    let maxValue = 0\n    maxValue = Math.max(...Object.values(amountsByValues))\n    \n    this.groupingInformation.scales[axisName] = d3.scaleLinear().domain([0, maxValue]).range(axisName === \"x\" ? [0, this.canvas.width] : [this.canvas.height, 0])\n    let scale = this.groupingInformation.scales[axisName]\n    \n    this.data.forEach(individual => {\n      let individualValue = this.dataProcessor.getUniqueValueFromIndividual(individual, groupingAttribute)\n      let offset = individual.drawing.currentSize / 2\n      if (axisName === \"x\") {\n        individual.drawing.currentPosition[axisName] = getRandomInteger(offset, scale(amountsByValues[individualValue]) - offset)\n      } else {\n        individual.drawing.currentPosition[axisName] = getRandomInteger(offset + scale(amountsByValues[individualValue]), this.canvas.height - offset)\n      }\n    })\n    \n    let axis\n    if (axisName === \"x\") {\n      axis = d3.axisBottom(scale)\n    } else {\n      axis = d3.axisLeft(scale)\n    }\n    \n    this.groupingInformation.axesGroups[axisName].call(axis)\n    if (axisName === \"x\") {\n      this.groupingInformation.axesGroups[axisName].selectAll(\"text\")\n          .attr(\"y\", 0)\n          .attr(\"x\", 9)\n          .attr(\"dy\", \".35em\")\n          .attr(\"transform\", \"rotate(90)\")\n          .style(\"text-anchor\", \"start\");\n    }\n  }\n  \n  _handleGroupingActionAttribute(action) {\n    let groupingAttribute = action.attribute\n    let values = this._getValuesForAttribute(groupingAttribute)\n    \n    let axisName = action.axis\n    \n    this.groupingInformation.scales[axisName] = d3.scaleBand().padding(0.1).domain(axisName === \"x\" ? values : values.reverse()).range(axisName === \"x\" ? [0, this.canvas.width] : [this.canvas.height, 0])\n    \n    let scale = this.groupingInformation.scales[axisName]\n    let bandwidth = this.groupingInformation.scales[axisName].bandwidth()\n    \n    this.data.forEach(individual => {\n      let offset = individual.drawing.currentSize / 2\n      let individualValue = this.dataProcessor.getUniqueValueFromIndividual(individual, groupingAttribute)\n      individual.drawing.currentPosition[axisName] = scale(individualValue) + getRandomInteger(offset, bandwidth)\n    })\n    \n    let axis\n    if (axisName === \"x\") {\n      axis = d3.axisBottom(scale)\n    } else {\n      axis = d3.axisLeft(scale)\n    }\n    \n    this.groupingInformation.axesGroups[axisName].call(axis)\n    if (axisName === \"x\") {\n      this.groupingInformation.axesGroups[axisName].selectAll(\"text\")\n          .attr(\"y\", 0)\n          .attr(\"x\", 9)\n          .attr(\"dy\", \".35em\")\n          .attr(\"transform\", \"rotate(90)\")\n          .style(\"text-anchor\", \"start\");\n    }\n  }\n       \n  _handleColorAction(action) {\n    this.data = action.runOn(this.data)\n    \n    this.currentActions[\"color\"] = action\n  }\n        \n  _handleFilterAction(action) {\n    this.data = deepCopy(this.originalData)\n    this.data = action.runOn(this.data)\n    \n    Object.keys(this.currentActions).forEach(key => {\n      if (key !== \"filter\") {\n        this._dispatchAction(this.currentActions[key])\n      }\n    })  \n     \n    this.currentActions[\"filter\"] = action\n  }\n        \n  _handleSelectAction(action) {\n    action.runOn(this.data)\n    this.currentActions[\"select\"] = action \n  }\n  \n  _handleInspectAction(action) {\n    action.runOn(this.data)\n    this.currentActions[\"inspect\"] = action \n  }\n  \n  _handleNullAction(action) {\n    \n  }\n        \n  _handleNotSupportedAction(action) {\n  \n  }\n  \n  _getAmountsByValues(attribute, values) {\n    let amountsByValues = {}\n    \n    values.forEach(value => {\n      amountsByValues[value] = 0\n    })\n    \n    this.data.forEach(individual => {\n      let individualValue = this.dataProcessor.getUniqueValueFromIndividual(individual, attribute)\n      amountsByValues[individualValue] += 1\n    })\n    return amountsByValues\n  }\n  \n  _getValuesForAttribute(groupingAttribute) {\n    debugger\n    let filterAction = this.currentActions[\"filter\"]\n    let values = []\n    // if contains index filter, then get attributes from all data\n    filterAction.filters.forEach(filter => {\n      if (filter.filterAttribute === groupingAttribute) {\n        values = values.concat(filter.filterValues)\n      }\n    })\n    if (values.length <= 0) {\n      return this.dataProcessor.getValuesForAttribute(groupingAttribute).slice()\n    } else {\n      return values\n    }\n  }\n  \n  _onCanvasClicked(event) {\n    this._buildIdentifyingImageData()\n    \n    let clickPosition = this._getCursorPosition(event)\n    let identifyingColor = this._getIdentifyingColor(clickPosition)\n    \n    let individual\n    if (!this._isBackgroundColor(identifyingColor)) {\n      individual = this._getIndividualByIdentifyingColor(identifyingColor)\n    } \n    \n    let action = new InspectAction(individual, true, this.dataProcessor, this.colorStore)\n    \n    this.dispatchEvent(new CustomEvent(\"individual-inspected\", {\n      detail: {\n        action: action\n      },\n      bubbles: true\n    }))\n    \n    this.applyAction(action)\n  }\n  \n  _getCursorPosition(event) {\n    // layerX and layerY are the mouse coordinates on the scalesSVG\n    const x = event.layerX - this.canvasPadding.left\n    const y = event.layerY - this.canvasPadding.top\n    return {\"x\": Math.floor(x), \"y\": Math.floor(y)}\n  }\n  \n  _getIdentifyingColor(position) {\n    let startPosition = (position.y * this.identifyingImageData.width + position.x) * 4\n    \n    let color = {\n      \"r\": this.identifyingImageData.data[startPosition],\n      \"g\": this.identifyingImageData.data[startPosition+1],\n      \"b\": this.identifyingImageData.data[startPosition+2],\n      \"opacity\": this.identifyingImageData.data[startPosition+3]\n    }\n    \n    let colorInt = this.colorStore.convertColorObjectToColorInt(color)\n    let colorString = this.colorStore.convertColorIntToRGBHexString(colorInt)\n\n    return colorString\n  }\n  \n  _getIndividualByIdentifyingColor(identifyingColor) {\n    let index = this.individualIndexByIdentifyingColor[identifyingColor]\n    return this._getIndividualByIndex(index)\n  }\n  \n  _getIndividualByIndex(index) {\n    let result\n    \n    this.data.forEach(individual => {\n      if (individual.index == index) {\n        result = individual\n      }\n    })\n    \n    return result\n  }\n  \n  _buildIdentifyingImageData() {\n    this._drawWithIdentifyingColors()\n    \n    const context = this.canvas.getContext(\"2d\")\n    let canvasDimensions = this._getCanvasSize()\n    this.identifyingImageData = context.getImageData(0, 0, canvasDimensions.width, canvasDimensions.height)\n    \n    this._draw()\n  }\n  \n  _isBackgroundColor(color) {\n    return color === \"#00000000\"\n  }\n  \n  _updateExtent() {\n    let extent = lively.getExtent(this.get(\"#canvas-widget-canvas-container\"))\n    if (extent.x == 0 && extent.y == 0) {\n      //canvas widget canvas container is not initialised yet\n      extent = lively.getExtent(this.container)\n      extent.x = extent.x * 0.65\n    }\n    \n    let oldCanvasExtent = {\n      \"x\": this.canvas.width,\n      \"y\": this.canvas.height,\n    }\n    \n    let newCanvasExtent = {\n      \"x\": extent.x - this.canvasPadding.left - this.canvasPadding.right,\n      \"y\": extent.y - this.canvasPadding.top - this.canvasPadding.bottom,\n    }\n    \n    this.scalesSVG\n      .attr(\"width\", extent.x)\n      .attr(\"height\", extent.y)\n    \n    d3.select(this.drawSVG)\n      .attr(\"width\", extent.x)\n      .attr(\"height\", extent.y)\n    \n    d3.select(this.canvas)\n      .attr(\"width\", newCanvasExtent.x)\n      .attr(\"height\", newCanvasExtent.y)\n    \n    this._initializeAxes()\n    this._rescaleData(oldCanvasExtent, newCanvasExtent)\n    this._runCurrentActions()\n    \n    this._draw()\n    \n    this._updateLocalControlsExtent()\n    \n    if (this.contaianerType === \"pane\") {\n      this.setLocalControls()\n    }\n  }\n  \n  _updateLocalControlsExtent() {\n    let canvasSize = this._getCanvasSize()\n    \n    if(!this.collapsed) {\n      lively.setExtent(this.controlPanelContainer, lively.pt(200, canvasSize.height))\n    } else {\n      lively.setExtent(this.controlPanelContainer, lively.pt(40, canvasSize.height))\n    }\n  }\n  \n  _getCanvasSize() {\n    return {\"width\": this.canvas.width, \"height\": this.canvas.height}\n  }\n  \n  _runCurrentActions() {\n    Object.keys(this.currentActions).forEach(key => {\n      this._dispatchAction(this.currentActions[key])\n    })\n  }\n}"]}