{"version":3,"sources":["https://lively-kernel.org/lively4/BP2019RH1/components/bp2019-y-axis-widget.js"],"names":["d3","inside","Morph","FreehandDrawer","getRandomInteger","deepCopy","assertListenerInterface","InspectAction","NullAction","InspectActionType","SelectActionType","FilterActionType","ColorActionType","GroupActionType","NullActionType","ctx","Bp2019YAxisWidget","initialize","name","dataProcessor","undefined","colorStore","strokeStyle","individualIdByIdentifyingColor","listeners","container","get","canvas","drawSVG","rectangleSVG","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","id","deleteSelections","activate","getData","setStrokeStyle","updateStrokeStyle","_draw","listener","push","applyAction","action","_dispatchAction","_initializeData","originalData","initializeAfterDataFetch","_initializeAxes","_runCurrentActions","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","_handleGroupingAction","_handleColorAction","_handleSelectAction","_handleFilterAction","_handleInspectAction","_handleNullAction","_handleNotSupportedAction","_drawGroupingRectangles","save","canvasSize","_getCanvasSize","clearRect","width","height","individual","beginPath","arc","currentSize","Math","PI","convertColorObjectToRGBAHexString","currentColor","stroke","fillStyle","fill","restore","_drawWithIdentifyingColors","selectAll","remove","fillColor","getGroupingRectangleColor","groupingAttributeX","attributes","groupingAttributeY","_drawDefaultBackgroundShade","_drawGroupingStripes","_drawGroupingBars","_drawGroupingTiles","append","attr","scales","domain","xDomainElement","yDomainElement","bandwidth","range","amountsByValues","_getAmountsByValues","attribute","offset","xOffset","yOffset","axesGroups","_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","_setAxisAnnotations","_getValuesForAttribute","reverse","runOn","key","text","filterAction","filters","filterAttribute","includes","concat","sort","filterValues","length","slice","_buildIdentifyingImageData","clickPosition","_getCursorPosition","_getIdentifyingColor","_isBackgroundColor","_getIndividualByIdentifyingColor","inspectAction","layerX","layerY","floor","position","startPosition","identifyingImageData","colorInt","convertColorObjectToColorInt","colorString","convertColorIntToRGBHexString","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 { \n  getRandomInteger, \n  deepCopy, \n} from \"../src/internal/individuals-as-points/common/utils.js\"\n\nimport { assertListenerInterface } from \"../src/internal/individuals-as-points/common/interfaces.js\";\n\nimport { \n  InspectAction, \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    this.strokeStyle = false\n    \n    this.individualIdByIdentifyingColor = 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.rectangleSVG = this.get(\"#rectangle-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.individualIdByIdentifyingColor = {}\n    this.data.forEach(element => {\n      this.individualIdByIdentifyingColor[this.colorStore.convertColorObjectToRGBHexString(element.drawing.identifyingColor)] = element.id\n    })\n    \n    this.drawer.deleteSelections()\n    \n    this.activate()\n  }\n  \n  getData() {\n    return this.data\n  }\n  \n  setStrokeStyle(strokeStyle) {\n    this.strokeStyle = strokeStyle\n  }\n  \n  updateStrokeStyle(strokeStyle) {\n    this.strokeStyle = strokeStyle\n    this._draw()\n  }\n  \n  addListener(listener) {\n    assertListenerInterface(listener)\n    this.listeners.push(listener)\n  }\n  \n  async applyAction(action) {\n    if (action.id !== \"localActionsVenn\") {\n      this._dispatchAction(action)\n    }\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    /*let skip = false\n    \n    Object.keys(this.currentActions).forEach(actionName => {\n      if (action === this.currentActions[actionName]) skip = true\n    })\n    \n    if (skip) return*/\n    \n    switch(action.getType()) {\n      case (GroupActionType):\n        this._handleGroupingAction(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    this._drawGroupingRectangles()\n    \n    this.context.save()\n    \n    let canvasSize = this._getCanvasSize()\n    this.context.clearRect(0, 0, canvasSize.width, canvasSize.height)\n    \n    this.data.forEach(individual => {\n      this.context.beginPath()\n      this.context.arc(\n        individual.drawing.currentPosition.x, \n        individual.drawing.currentPosition.y, \n        individual.drawing.currentSize / 2, \n        0, \n        2 * Math.PI, \n        false\n      )\n      \n      let color = this.colorStore.convertColorObjectToRGBAHexString(individual.drawing.currentColor)\n      if (this.strokeStyle) {\n        this.context.strokeStyle = color\n        this.context.stroke()\n      } else {\n        this.context.fillStyle = color\n        this.context.fill()\n      }\n    })\n\n    this.context.restore()\n  }\n  \n  _drawWithIdentifyingColors() {\n    this.context.save()\n    \n    let canvasSize = this._getCanvasSize()\n    this.context.clearRect(0, 0, canvasSize.width, canvasSize.height)\n    \n    this.data.forEach(individual => {\n      this.context.beginPath()\n      this.context.arc(\n        individual.drawing.currentPosition.x, \n        individual.drawing.currentPosition.y, \n        individual.drawing.currentSize / 2, \n        0, \n        2 * Math.PI, \n        false\n      )\n      this.context.fillStyle = this.colorStore.convertColorObjectToRGBAHexString(individual.drawing.identifyingColor)\n      this.context.fill()\n    })\n\n    this.context.restore()\n  }\n  \n  _drawGroupingRectangles() {\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    d3.select(this.rectangleSVG).selectAll('*').remove()\n    \n    let fillColor = 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(fillColor)\n      } else if (groupingAttributeX === \"amount\" || groupingAttributeY === \"amount\") {\n        this._drawDefaultBackgroundShade(fillColor)\n      } else {\n        this._drawGroupingStripes(fillColor)\n      }\n    } else if (groupingAttributeX === \"amount\" || groupingAttributeY === \"amount\") {\n      if (groupingAttributeX === \"amount\" && groupingAttributeY === \"amount\") {\n        this._drawDefaultBackgroundShade(fillColor)\n      } else {\n        this._drawGroupingBars(fillColor)\n      }\n    } else {\n      this._drawGroupingTiles(fillColor)\n    }\n  }\n  \n  _drawDefaultBackgroundShade(fillColor) {\n    let canvasSize = this._getCanvasSize()\n    \n    d3.select(this.get(\"#scales-svg\")).selectAll(\".xtitle\").remove()\n    d3.select(this.get(\"#scales-svg\")).selectAll(\".ytitle\").remove()\n    \n    d3.select(this.rectangleSVG).append(\"rect\")\n      .attr(\"x\", 1 + this.canvasPadding[\"left\"])\n      .attr(\"y\", 1 + this.canvasPadding[\"top\"])\n      .attr(\"width\", canvasSize.width - 1)\n      .attr(\"height\", canvasSize.height - 1)\n      .attr(\"fill\", fillColor)\n  }\n  \n  _drawGroupingTiles(fillColor) {\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        \n        d3.select(this.rectangleSVG).append(\"rect\")\n          .attr(\"x\", xScale(xDomainElement) + this.canvasPadding[\"left\"])\n          .attr(\"y\", yScale(yDomainElement) + this.canvasPadding[\"top\"])\n          .attr(\"width\", xScale.bandwidth())\n          .attr(\"height\", yScale.bandwidth())\n          .attr(\"fill\", fillColor)\n      })\n    })\n  }\n  \n  _drawGroupingStripes(fillColor) {\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      d3.select(this.get(\"#scales-svg\")).selectAll(\".ytitle\").remove()\n      xScale.domain().forEach(xDomainElement => {\n        \n        d3.select(this.rectangleSVG).append(\"rect\")\n          .attr(\"x\", xScale(xDomainElement) + this.canvasPadding[\"left\"])\n          .attr(\"y\", 1 + this.canvasPadding[\"top\"])\n          .attr(\"width\", xScale.bandwidth())\n          .attr(\"height\", yScale.range()[0]) // the range for y is inverted, thats why we take [0]\n          .attr(\"fill\", fillColor)\n\n      })\n    } else if (groupingAttributeY !== \"none\") {\n      d3.select(this.get(\"#scales-svg\")).selectAll(\".xtitle\").remove()\n      yScale.domain().forEach(yDomainElement => {\n        \n        d3.select(this.rectangleSVG).append(\"rect\")\n          .attr(\"x\", 1 + this.canvasPadding[\"left\"])\n          .attr(\"y\", yScale(yDomainElement) + this.canvasPadding[\"top\"])\n          .attr(\"width\", xScale.range()[1])\n          .attr(\"height\", yScale.bandwidth())\n          .attr(\"fill\", fillColor)\n      })\n    }\n  }\n  \n  _drawGroupingBars(fillColor) {\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        d3.select(this.rectangleSVG).append(\"rect\")\n          .attr(\"x\", xScale(xDomainElement) + this.canvasPadding[\"left\"])\n          .attr(\"y\", yScale(amountsByValues[xDomainElement]) + this.canvasPadding[\"top\"])\n          .attr(\"width\", xScale.bandwidth())\n          .attr(\"height\", yScale.range()[0] - yScale(amountsByValues[xDomainElement]))\n          .attr(\"fill\", fillColor)\n      })\n    } else if (groupingAttributeY !== \"amount\") {\n      let amountsByValues = this._getAmountsByValues(this.currentActions[\"y\"].attribute, yScale.domain())\n      yScale.domain().forEach(yDomainElement => {\n        d3.select(this.rectangleSVG).append(\"rect\")\n          .attr(\"x\", /*xScale(amountsByValues[yDomainElement]) + */this.canvasPadding[\"left\"])\n          .attr(\"y\", yScale(yDomainElement) + this.canvasPadding[\"top\"])\n          .attr(\"width\", xScale.range()[0] + xScale(amountsByValues[yDomainElement]))\n          .attr(\"height\", yScale.bandwidth())\n          .attr(\"fill\", fillColor)\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  _handleGroupingAction(action) {\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] = deepCopy(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._handleGroupingAction(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    this._setAxisAnnotations(axisName)\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    this._setAxisAnnotations(axisName)\n    \n  }\n       \n  _handleColorAction(action) {    \n    this.data = action.runOn(this.data)\n    \n    this.currentActions[\"color\"] = deepCopy(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\"] = deepCopy(action)\n  }\n        \n  _handleSelectAction(action) {    \n    action.runOn(this.data)\n    this.currentActions[\"select\"] = deepCopy(action)\n  }\n  \n  _handleInspectAction(action) {    \n    action.runOn(this.data)\n    this.currentActions[\"inspect\"] = deepCopy(action)\n  }\n  \n  _handleNullAction(action) {\n    \n  }\n        \n  _handleNotSupportedAction(action) {\n  \n  }\n  \n  _setAxisAnnotations(axisName) {\n    let canvasSize = this._getCanvasSize()\n    let groupingAttribute = this.currentActions[axisName].attribute\n    let scale = this.groupingInformation.scales[axisName]\n    \n    let axis\n    if (axisName === \"x\") {\n      axis = d3.axisBottom(scale)\n      d3.select(this.get(\"#scales-svg\")).selectAll(\".xtitle\").remove() \n      this.scalesSVG.append(\"text\")\n        .attr(\"class\", \"xtitle\")\n        .attr(\"text-anchor\", \"end\")\n        .attr(\"x\", canvasSize.width + 50)\n        .attr(\"y\", canvasSize.height + 50)\n        .text(groupingAttribute)\n    } else {\n      axis = d3.axisLeft(scale)\n      d3.select(this.get(\"#scales-svg\")).selectAll(\".ytitle\").remove() \n      this.scalesSVG.append(\"text\")\n        .attr(\"class\", \"ytitle\")\n        .attr(\"text-anchor\", \"end\")\n        .attr(\"transform\", \"rotate(-90)\")\n        .attr(\"y\", 10)\n        .attr(\"x\", -20)\n        .text(groupingAttribute)\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  _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    let filterAction = this.currentActions[\"filter\"]\n    let values = []\n    \n    filterAction.filters.forEach(filter => {\n      if (filter.filterAttribute === \"index\") {\n        this.data.forEach(individual => {\n          let value = this.dataProcessor.getUniqueValueFromIndividual(individual, groupingAttribute)\n          if (!values.includes(value)) {\n            values = values.concat(value)\n          }\n          \n        })\n        values.sort()\n      }\n      \n      if (filter.filterAttribute === groupingAttribute) {\n        values = values.concat(filter.filterValues)\n      }\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 inspectAction = new InspectAction(individual, true, this.dataProcessor, this.colorStore)\n  \n    this.dispatchEvent(new CustomEvent(\"individual-inspected\", {\n      detail: {\n        action: inspectAction\n      },\n      bubbles: true\n    }))\n    \n    this.applyAction(inspectAction)\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 id = this.individualIdByIdentifyingColor[identifyingColor]\n    let result\n    \n    this.data.forEach(individual => {\n      if (individual.id == id) {\n        result = individual\n      }\n    })\n    \n    return result\n  }\n  \n  _buildIdentifyingImageData() {\n    this._drawWithIdentifyingColors()\n    \n    let canvasDimensions = this._getCanvasSize()\n    this.identifyingImageData = this.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.rectangleSVG)\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._setAxisAnnotations(\"x\")\n    this._setAxisAnnotations(\"y\")\n    \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}"]}