{"version":3,"sources":["webpack:///webpack/universalModuleDefinition?5ca6******","webpack:///ui.js","webpack:///./src/ui/view/index.js","webpack:///./src/ui/view/util.js","webpack:///./src/ui/view/events.js","webpack:///./src/ui/view/plugin.js","webpack:///./src/ui/view/tool.js","webpack:///./src/ui/view/composition.js","webpack:///./src/ui/view/texture-composition.js","webpack:///./src/ui/view/view.js","webpack:///./src/ui/view/view2d.js","webpack:///./src/ui/view/figure-view.js","webpack:///./src/ui/view/representation.js","webpack:///./src/ui/view/server-rendering/server-representation.js","webpack:///./src/ui/view/server-rendering/server-images.js","webpack:///./src/ui/view/synced-figure-views.js","webpack:///./src/ui/view/document-view-mixin.js","webpack:///./src/ui/view/clipboard.js","webpack:///./src/ui/view/selected-figures-mixin.js","webpack:///./src/ui/view/interactive-view.js","webpack:///./src/ui/plugin/active-renderer.js","webpack:///./src/cdl/style/color-showthrough.js","webpack:///./src/cdl/style/glEffects/replaceST.js","webpack:///./src/ui/plugin/special-pens.js","webpack:///./src/ui/plugin/alignment-lines.js","webpack:///./src/ui/plugin/figure-annotations.js","webpack:///./src/ui/plugin/index.js","webpack:///./src/ui/plugin/view-controls.js","webpack:///./src/ui/tool/zoom.js","webpack:///./src/ui/tool/pan.js","webpack:///./src/ui/plugin/grid.js","webpack:///./src/ui/plugin/key-shortcuts.js","webpack:///./src/ui/plugin/wheel-shortcuts.js","webpack:///./src/ui/plugin/pages-selector.js","webpack:///./src/ui/plugin/tool-help.js","webpack:///./src/web/ui.js"],"names":["root","factory","exports","module","define","amd","this","webpackJsonpGrafika","0","__webpack_require__","84","Object","defineProperty","value","_util","keys","forEach","key","enumerable","get","_events","_plugin","_tool","_composition","_textureComposition","_view","_view2d","_figureView","_syncedFigureViews","_documentViewMixin","_selectedFiguresMixin","_interactiveView","_clipboard","85","createDomContainer","id","container","window","document","createElement","_lodash","assign","style","width","height","position","overflow","pixelCenter","point","t","p","apply","_cdl","Point","floor","x","y","strokePixelCenterSegment","context","from","to","transform","_gear","strokeSegment","g$$","g$","fastThrottle","AnimationLoop","undefined","Math","requestAnimFrame","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","callback","setTimeout","drawCalls","animationLoop","i","iEnd","length","register","call","push","unregister","splice","indexOf","func","timeout","last","r","now","arguments","selector","querySelector","dim","querySelectorAll","d","el","getBoundingClientRect","addClass","className","classList","add","append","child","isString","tempDiv","innerHTML","firstChild","appendChild","remove","parentNode","removeChild","show","display","hide","setSize","on","eventName","handler","addEventListener","off","removeEventListener","focus","activeElement","getBox","rect","top","body","scrollTop","left","scrollLeft","bottom","right","86","initGlobalTextInputEl","textInputId","textInputButtonId","textInputEl","textInputButtonEl","createEventPrototype","getters","proto","extendProto","forwardEventGetters","specialKeys","concat","eventBasePrototype","simulatePointerEvent","event","touch","touchId","isPrimary","usingTouch","pointerEvent","createEvent","type","initMouseEvent","target","ownerDocument","defaultView","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","pointerType","pointerId","forwardTrackerGetters","getter","_target","_tracker","track","_e","config","descriptor","getOwnPropertyDescriptor","set","InteractiveHelper","interactiveViewEvents","ViewPointerEvent","ViewMouseWheelEvent","ViewKeyEvent","ViewEvent","padScaling","_config","preventDefault","view","_v","_t","route","originalEvent","cmdKey","e","stopped","_s","stopPropagation","prototype","char","which","keyCode","String","fromCharCode","wheelDelta","detail","DefaultPointerTracker","_ref","modelPoint","docPoint","modelPointRaw","docPointRaw","defaultPointerTracker","pointers","eventDown","tracker","_p","_vp","viewPoint","_ed","_cache","Map","retarget","re","figureHit","has","figureHitAtEvent","figure","rawFigureHits","rawFigureHitsAtEvent","rawFigures","map","clientPoint","pagePoint","pageX","pageY","offsetPoint","domElement","captureKey","enabled","focused","elK","consume_click","pointersMap","primaryId","mouseisdown","lastClick","unList","element","click","bind","PointerEvent","pointerdown","pointermove","pointerup","mousemove","navigator","msPointerEnabled","mousedown","doc_mousemove","doc_mouseup","touchstart","touchmove","touchend","mousewheel","keydown","keyup","keypress","bindToTextInputEl","focusout","fireViewEvent","fireDomEvent","fireKeyEvent","fireMouseWheelEvent","firePointerEvent","stopClick","fireMouseMoveEvent","firePointerMoveEvent","fireEvent","on_domEvent","triggerKeyboard","Config","mobileKeyboard","dispose","_ref2","clickConsumed","cc","clear","checkDblclick","lc","epsilon","abs","dblclick","pointerdown_ongoing","pointermove_ongoing","valid","pointerup_ongoing","start","oldPointerInfo","pull","pointerInfo","current","clone","n","delete","touches","changedTouches","item","identifier","87","_toConsumableArray","arr","Array","isArray","arr2","redraw_this","redraw","Plugin","RenderPlugin","OwnedObject","extend","typeName","drawTo","Properties","visible","def","onChange","_visible","initPlugin","draw","link","unlink","un","updateSize","init","_len","params","_key","_params","initView","initLayer","has_try_pointerdown","try_pointerdown","has_try_click","try_click","has_try_dblclick","try_dblclick","has_try_contextmenu","try_contextmenu","isInteractive","takeControl","_this","state","_state","_plugins","plugin","name","_enabled","isThis","releaseControl","_this2","pluginState","helper","somethingToDraw","needsToDrawFor","handleDomEvent","move","end","console","log","PluginsLayer","88","Tool","isCommitable","pause","resume","finish","commit$","doc","_document","_commit$","resolve","then","stop","cancel$","_cancel$","tools","h","a","b","c","_this3","_sleeping","_deferred","Deferred","isPlainObject","initProperties","_bind","_this4","initTool","promise","sleep","wakeup","_this5","_stopped","popTool","tool","cursor","cursor_","toolhelp","canUndo","undo","canRedo","redo","supportsClipboard","defaultPen","Pen","color","rgb","defaultBrush","Brush","Tools","_tools","_toolhelp","_trackPointer","change","string","th","flatten","k","kEnd","batchRedraw","commitEditionTools$","_this6","tool_type","tool_","_this7","toolsRemoved","pop","ct","render$","Select","addNewTool","currentTool","selectedFigures","ft","_stackViewTools","callParent","docIsland","89","clearLayerIfNeeded","layer","autoClear","needsRedraw","needsBatchRedraw","clearCanvas","canvas","cleanRedrawFlags","Composition","CompositionLayer","owned","layers","added","removed","updateLayersOrder","textureType","main","getDrawToLayers","textureLayers","layersContainer","addLayersFor","zOrder","addLayer","createLayer","createCanvas","Helper","_owner","redrawAll","setForEach","getContext","drawPlugin2D","specializedFunc","drawPlugin","drawConfig","Matrix","transformModel","getViewPortTransform","transformDoc","drawPlugins","plugins","layersToDraw","nEnd","shouldRedraw","find","clearLayersRedrawFlags","appendTo","90","nextPowerOf2","N","size","fillDefaultTextureMapContext","fillStyle","fillContext","fillWithBackgroundColor","Color","White","createTexture","texture","THREE","Texture","needsUpdate","TextureTile","TextureComposition","Renderer3D","preserveDrawingBuffer","redrawFigure","renderer","WebGLRenderer","alpha","antialias","setPixelRatio","useDevicePixelRatio","devicePixelRatio","draw3D","TextureMap","textureSize","layerName","updateMap","model3dchanged","textureMap","getFixedTextureMap","wrap","loadImage$","image","save","isIdentity","transformContext","scale","model","textureWidth","imageMatrix","multiply","translate","drawImage","restore","composedCanvas","clearComposedCanvas","_threeTexture","drawToLayers","l","lEnd","threeTexture","waitingCanvas","loadTextureTile$","ready$","91","findByTextureType","textures","View","Stats","fps","prevTime","frames","update","time","round","_viewCount","Base","autoDraw","backgroundColor","onBackgroundColorChange","scene","linkPlugin","disposePlugin","v","widget","debug","compositions","pageTopLeft","_pageTopLeft","clientTopLeft","viewCenter","topLeft","colorAtViewPoint","fromImageData","getImageData","data","toDataURL","drawDone","pluginsToDraw","figureTextureTypes","stats","drawn","composition","addEvents","_internalId","disabledTemporally","createTextures","createScene","linkPlugins","invokeMap","pushDisabledTemporally","popDisabledTemporally","_width","_height","postResize","fireResizeEvent","getState","backgrondColor","setState","s","_backgroundColor","rgba","addPlugin","removePlugin","insertViewPlugins","fixUpPlugins","afterInit","showTexture","opacity","handlePluginDomEvent","92","scaledRenderBounds","bounds","scaleX","scaleY","Bounds","lx","hx","ly","hy","pixelWidenedRenderBounds","ceil","View2D_Mixin","ViewTransform","zoom","center","matrixFor","offset","viewOffsetFor","m","zoomAroundViewBounds","viewBounds","margin","fit","scalingTransformed","zoomAround","docMargin","viewDeltaToDoc","currentBounds","boundsWith","scaleWidth","scaleHeight","docToView","viewToDoc","docDeltaToView","docDelta","viewDelta","is2D","_viewTransform","viewTransform","textureZoom","getRenderArgs","wireframe","zoomBy","delta","on_zoomupdated","zoomIn","factor","zoomOut","zoomTo","_defaultMargin","min","zoom_","originalZoom","keepLowerLeftCornerAsOrigin","originalOffset","newOffset","center$","Figures","viewDeltaToTexture","viewToModel","viewDeltaToModel","modelToDoc","asFastOffset","around","viewOffset","boundsToViewBox","pixelsBounds","93","withWireframe","defaults","GroupView","FigureView","_representation","_serverRepresentation","hitTestViewDistance","_wireframe","representation","EmptyFigureRepresentation","initEvents","updateRepresentation","representationType","newRep","ServerFigureRepresentation","LocalFigureRepresentation","masked","_masked","newRepresentation","mask","clearBuffer","drawShowthroughMask","hidden","invalidateBuffer","showthroughMask","rendercomplete","onRenderComplete","redrawneeded","onRedrawNeeded","response","invalidationState","broadcastInfo","viewsInvalidationState","renderArgs","viewPortTransform","toMatrixString","previousParams","layercolor","layerColor","InvalidationStates","upgrade","hideMask","hitTest","options","distance","GroupedFiguresView","group","_figureViews","figures","create","invokeMap$","_hidden","figure_alpha","_alpha","changeGlobalAlpha","globalAlpha","fv","serverinvalidate","onServerInvalidate","figureViews","minSize","minSize2","frame","globalFrame_","frameBased","width2","height2","some","processingstarted","onProcessingStarted","_figureViewsToDispose","_updateViewType","groupedFigures","_processor","GroupProcessor","isGroup","94","FigureRepresentation","rendered","_previewing","globalBounds_","temporalRep","buffers","_preRendered","_lastMasked","figureAlpha","box","_bufferBox","matrix","globalMatrix_","_invBufferTransform","drawBuffer","w","quickToDraw","vpTransform","bufferVpTransform","bufferTransform","inverted","_bufferScale","scaleFactor","shouldDrawTextureType","removeKeys","includes","buffer","ignoreAlpha","bufferNeedsRedraw","process","forceRedraw","needsFixedDrawing","actionToTake","95","_slicedToArray","sliceIterator","_arr","_n","_d","_i","Symbol","iterator","next","done","err","TypeError","_serverImages","_readyDeferreds","renderImage","Image","renderSTImage","supportsCrossOriginImages","crossOrigin","lastRequestedRenderUrl","lastRequestedSourceTimeStamp","lastUsedTargetSourceTimeStamp","currentInfo","getRenderPinOffset","_pin","showLocalPreviewRepresentation","hasPreview","invalidated","processST","isShowthrough","stRenderArgs","renderUrl","getRenderCacheUrl","targetTimeStamp","lastRequestedTargetSourceTimeStamp","info","timeStamp","ServerImagesManager","request$","onRenderImageLoad","targetRenderCacheUrl","deferred","overlayedNoClip","lFigure","_lFigure$getClippedBy","getClippedBy","_lFigure$getClippedBy2","lClipContent","lClipParent","editingClip","lOldTransform","clipAbsolute","clipContext","fill","96","toFixed","renderFloatResolution","getDefaultedRenderArgs","defaultRenderArgs","fixZoomAndPin","pin","useSubpixelPinForServerRendering","relX","relY","use","_window","Cx","figureRenderModel","stamp","fixed","f_pin","CachedCdl","Figure","cacheModel","matrix22","toMatrix22","Zoom","WireFrame","ProcessST","IsShowthrough","Compress","serverImagesCompression","PngCompressionParams","Speed","Stamp","Core","_cacheList","_cacheMap","_cacheSize","_doBatch","_batch","fm","cacheId","_cacheId","owner","pz","fzoom","fpin","cm","_match","_requestImage$","createPromise","_preCache","onLoad","attachImageLoadEvent","base64Images","request","batchRender","_base64Request","src","_batchRequest","requests","batchRender$","Renders","images","batch","batch_length","maxConnections","chunks","fairSpread","res","list","ck","cpin","isNear","_storeInCache","cid","pre","_removeFromCache","cidt","rc","detachImageLoadEvent","97","SyncedFigureViews","_figureToView","mapToFigureViews","f","WeakMap","_linkedDocuments","_disposedFigureViews","figureschanged","onFiguresChanged","layerschanged","onLayersChanged","pageschanged","onPagesChanged","commit","onCommit","revert","onUndoRedo","createPagesFigureViews","_pages","forEachFigure","disposeFigureView","createFigureView","figureView","disposed","disposedIndex","createFigureViews","createLayersFigureViews","_figures","pages","page","_layers","figureToView","disposeFigureViews","_disposeTemporalFigures","delayedDisposeFigureViews","_this8","delayedDisposeLayersFigureViews","_this9","delayedDisposePagesFigureViews","_this10","98","forwardDocumentFunctions","forwardDocumentGetters","forwardDocumentProperties","linkDocumentEvents","documentEvents","forwardDocumentEvents","events","_len2","_key2","fireDocEvent","DocumentView_Mixin","_color","showThroughColor","Transparent","onShowThroughChange","undoRedoDisabled","activeFigures","showPin","doc_","_setDoc","_showThroughColor","deepInvalidate","aFigure","invalidate","powerClipContents","lPC","lPCF","isProxyGroup","_colorMap","startIsolatedFiguresEdition","_activeFigures","stopIsolatedFiguresEdition","drawIsolatedFigures","viewport","figuresThumbnailElement$","bounds$","bounds_width","bounds_height","figuresThumbnail$","sizeX","sizeY","fireRenderEvents","commiting","fireChangeEvents","isEqual","_lastState","redrawDoc","_stateChanged","_activePageChanged","_activeLayerChanged","on_renderstarted","on_rendercomplete","on_commit","commitLog","on_lock","originator","on_unlock","_undoRedoDisabled","canDuplicate","are","canCopy","canCut","canPaste","Clipboard","isEmpty","canRemove","canBump","canGroup","canUngroup","copy","localStorageFiguresClipboard","cut","paste","fastTranslate","pasteAt$","linkDoc","unlinkDoc","showDocument$","zoomToFit$","zoomToFitFigures$","getZoomToFitFigures","duplicate","clones","cloneDeep","bump","colorAt$","canEditContent","is","editContent","isShape","_polyregions","_powerClipContents","nodeEdit","spawnContentLayersFor","update$","activeLayer","initialSelectedFigures","updateEditContentStatus","editingContent","commitContent$","_commitContent$","status","message","statusMessage","99","ClipboardWrapper","copyButtonId","toCopy","clipboard","text","SystemClipboard","localStorageClipboard","metadata","ClipboardImp","_pageState","_store","where","filter","_get","pastedFigures","compact","_clear","localStorage","removeItem","pageState","stateString","getItem","JSON","parse","timestamp","figuresString","sameConfig","GlobalResourceManager","originalFigures","fromXmlString","containsLinkedResources","figuresXml","toXmlString","setItem","stringify","100","SelectedFigures_Mixin","Selection","onSelectionChanged","autoSelection","destinationLayerSelector","allowCrossLayerSelection","allowMultiLayerSelection","_createdFigures","_crossLayerSelection","_keepSelection","_selectionChanged","fixUpSelectedFigures","figuresMap","layerFigures","fixedFigures","selectableFigures","_allowCrossLayerSelection","f_localId","_localId","f_layer","layer_zOrder","sort","a_layer_zOrder","b_layer_zOrder","_set","activePageLayers","sortBy","sf","commitrun","on_commitrun","render","on_render","activelayerchanged","on_activelayerchanged","on_revert","on_figureschanged","on_layerschanged","on_pageschanged","activepagechanged","on_activepagechanged","consumeCreatedFigures","canSelect","createdFigures","activeSelectableFigures","autoSelectionFigures","_autoSelection","selection","keepSelection","contextFigures","activeLayerFigures","activeSelectableLayers","_locked","filterTargetLayers","filterSelectableFigures","activeSelectableFiguresForDoc","locked","selectAll","clearSelection","selectNext","crossLayerSelection","figureAtEvent","tabFigures","figureAtModelPoint","figureAtModelPointEx","rawFigureHitsAtModelPoint","rawFigureHitsAt","candidates","activePage","contains","candidate","tight","containsPoint","extractHitInfo","figureAtPointEx","figureAtPoint","topFigureFromEx","hit","figuresBetweenEvents","initSelection","topFigureFrom","fromFigures","filterRight","frame_","bestFigureCandidate","candidateHitTest","filterHittedCandidates","findHittedCandidate","tab","useCurvesBasedSelection","selectionChanged","101","InteractiveView_Mixin","keyShortcuts","stackViewTools","get_cursor","set_cursor","hasFocus","ContentLayer","KeyShortcuts","_remove","_insert","_iConfig","setAttribute","_eventsHelper","initStatus","initTooltip","eh","NodeEdit","nodeEditEnvelope","NodeEditEnvelope","statusId","statusEl","_statusEl","commitStatus","_status","updateStatus","html","tooltipId","_tooltipEl","showTooltip","tel","hideTooltip","cp","_tooltipVisible","102","_colorShowthrough","ActiveRenderer","drawTo_color","_mainDocument","draw_background","firstActiveFigure","lastFigure","drawFigures","until","draw_document","_activeAlpha","lastActiveFigure","draw_colorShowthrough_gl","drawSpecialPens","draw_foreground","_ref3","firstFigure","skipFirst","specialPens","drawForPage","span","drawing","backgroundPage","backgroundPageFor","drawPage","_ref4","includeLast","showthroughColor","beforeDraw","_showPin","dot","afterDraw","103","_figure","_replaceST","modifyImageDataRGBA","imageData","extended","inpos","outpos","g","currentPos","c2","c3","draw_colorShowthrough","lAvoidSlowST","avoidRenderingShowThroughNoGL","lSTColors","forEachColor","showThrough","ctx","lImageData","lRet","putImageData","mGlCanvas","mGlCtx","mEffect","mCanvasST","mCanvasNormal","deepRasterOff","lHasST","lNeedsBufferClear","lNrLayers","iLayer","lLayer","lFigures","lNrFigures","lColors","getColors","lNrColors","lShowThroughColor","premultipliedAlpha","pixelStorei","UNPACK_ALIGNMENT","ReplaceSTEffect","lPositionsBuffer","createBuffer","bindBuffer","ARRAY_BUFFER","bufferData","Float32Array","STATIC_DRAW","lTexCoordBuffer","enableVertexAttribArray","a_position","vertexAttribPointer","FLOAT","a_texCoord","firstSemiTransparent","Set","ctxST","deepRasterOn","imageSmoothingEnabled","activeTexture","TEXTURE0","bindTexture","TEXTURE_2D","texImage2D","RGBA","UNSIGNED_BYTE","getError","NO_ERROR","texParameteri","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","TEXTURE_MIN_FILTER","NEAREST","TEXTURE_MAG_FILTER","textureST","TEXTURE1","uniform2f","u_textureSize","drawArrays","TRIANGLES","figureAnnotations","isRaster","isMonochrome","oldLightShift","lightShift","oldRgb","pFigures","104","_classCallCheck","instance","Constructor","_possibleConstructorReturn","self","ReferenceError","_inherits","subClass","superClass","constructor","writable","configurable","setPrototypeOf","__proto__","_createClass","defineProperties","props","protoProps","staticProps","_effect","_Effect","aGl","getPrototypeOf","fragmentShader","vertexShader","addShader","gl","VERTEX_SHADER","FRAGMENT_SHADER","linkProgram","program","getProgramParameter","LINK_STATUS","lastError","getProgramInfoLog","deleteProgram","u_image0","getUniformLocation","u_image1","getAttribLocation","activate","uniform1i","Effect","105","displayStroke","setLineDash","strokeStyle","stroke","SpecialPens","maskSolid","maskColor","Gray","maskAlpha","maskVisible","_maskDraw","prepareMask","maskCanvas","_maskVisible","drawSpecialPensForPage","blitMask","drawMask","maskPolyregions","maskContext","clip","_maskColor","svgColor","polyregion","customDraw","clearContext","specialPensPolyregions","gatherSpecialPenPolyregionsFor","drawDisplayPens","specialPenPolyregions","output","_outputFigure","deepForEachPolyregion","pen","_pen","_type","displayPolyregions","lineWidth","globalCompositeOperation","_maskAlpha","106","UserLine","snap","UserLines","horizontalLines","verticalLines","_view$bounds","_horizontalLines","userLine","_verticalLines","AlignmentLines","107","FigureAnnotations","_annotations","_annotationsAreDraw","annotate","unannotate","clearAnnotations","generate_","ann","annotation","addAnnotation","ready","_processedAnnotations","whenAll","brush","mainDocument","backgroundDocument","_background","textIsFunc","isFunction","colorIsFunc","penIsFunc","brushIsFunc","boxStyle","background","backgroundFigures","activePageFigures","isFigure","grouped","drawAnnotation","updated","every","inflated","beginPath","moveTo","lineTo","setupContext","textBaseline","textAlign","fa","count","fillText","font","is3D","readyAnnotations","needsToDrawAnnotation","bounds_","Frame","areOverlapping","fromBounds","109","_viewControls","_alignmentLines","_grid","_keyShortcuts","_wheelShortcuts","_pagesSelector","_toolHelp","_figureAnnotations","_specialPens","_activeRenderer","110","_zoom","_pan","ViewControls","on_pointerdown","TouchZoomHelper","ZoomHelper","PanHelper","111","twoFingersTransform","sp1","cp1","sp2","cp2","cx","cy","x1","y1","x2","y2","x3","y3","x4","y4","tx","ty","s00","s01","s10","s11","dx","dy","ZoomTool","_pointers","touch1","touch2","t1","t2","interpolate","vt","td","transformAround","rectLimit","ofPoints","_ref5","_ref6","_ref7","limit","toolbarName","_ref8","leftClick","112","PanTool","viewPointDown","centerDown","strokeDot","minus","minus_","on_pointerup","Pan","113","snapValue","step","Grid","_step","114","selectionchanged","on_keyup","on_keyup_alt","startTransparentMode","_transparentMode","tf","_transparentFigureViews","endTransparentMode","on_keydown_alt","on_focusout","on_keydown","toLowerCase","lKeyValues","hotKeys","values","hk_char","hk","allowKeyShortcuts","ungroup","test","platform","115","WheelShortcuts","speed","zoomMin","zoomMax","on_mousewheel","lZoom","116","sqrt","PagesSelector","show$","on_click","_view$scene","columns","rows","columnsWidth","rowsHeight","columnsInLastRow","columnsWidthForLastRow","selectedRow","lastRow","selectedColumn","selectedPage","_pagesSelectorDraw","_context$canvas","max","xOffset","yOffset","xOffsetForLastRow","col","row","cWidth","rHeight","lcx","lcy","pageViewTransform","117","ToolHelp","collapsed","toolhelpBounds","_collapsed","ls","lines","split","line","167","_interopRequireWildcard","obj","__esModule","newObj","hasOwnProperty","default"],"mappings":"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","file":"ui.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Grafika\"] = factory();\n\telse\n\t\troot[\"Grafika\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Grafika\"] = factory();\n\telse\n\t\troot[\"Grafika\"] = factory();\n})(this, function() {\nreturn webpackJsonpGrafika([7],{\n\n/***/ 0:\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(167);\n\n\n/***/ },\n\n/***/ 84:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _util = __webpack_require__(85);\n\t\n\tObject.keys(_util).forEach(function (key) {\n\t if (key === \"default\") return;\n\t Object.defineProperty(exports, key, {\n\t enumerable: true,\n\t get: function () {\n\t return _util[key];\n\t }\n\t });\n\t});\n\t\n\tvar _events = __webpack_require__(86);\n\t\n\tObject.keys(_events).forEach(function (key) {\n\t if (key === \"default\") return;\n\t Object.defineProperty(exports, key, {\n\t enumerable: true,\n\t get: function () {\n\t return _events[key];\n\t }\n\t });\n\t});\n\t\n\tvar _plugin = __webpack_require__(87);\n\t\n\tObject.keys(_plugin).forEach(function (key) {\n\t if (key === \"default\") return;\n\t Object.defineProperty(exports, key, {\n\t enumerable: true,\n\t get: function () {\n\t return _plugin[key];\n\t }\n\t });\n\t});\n\t\n\tvar _tool = __webpack_require__(88);\n\t\n\tObject.keys(_tool).forEach(function (key) {\n\t if (key === \"default\") return;\n\t Object.defineProperty(exports, key, {\n\t enumerable: true,\n\t get: function () {\n\t return _tool[key];\n\t }\n\t });\n\t});\n\t\n\tvar _composition = __webpack_require__(89);\n\t\n\tObject.keys(_composition).forEach(function (key) {\n\t if (key === \"default\") return;\n\t Object.defineProperty(exports, key, {\n\t enumerable: true,\n\t get: function () {\n\t return _composition[key];\n\t }\n\t });\n\t});\n\t\n\tvar _textureComposition = __webpack_require__(90);\n\t\n\tObject.keys(_textureComposition).forEach(function (key) {\n\t if (key === \"default\") return;\n\t Object.defineProperty(exports, key, {\n\t enumerable: true,\n\t get: function () {\n\t return _textureComposition[key];\n\t }\n\t });\n\t});\n\t\n\tvar _view = __webpack_require__(91);\n\t\n\tObject.keys(_view).forEach(function (key) {\n\t if (key === \"default\") return;\n\t Object.defineProperty(exports, key, {\n\t enumerable: true,\n\t get: function () {\n\t return _view[key];\n\t }\n\t });\n\t});\n\t\n\tvar _view2d = __webpack_require__(92);\n\t\n\tObject.keys(_view2d).forEach(function (key) {\n\t if (key === \"default\") return;\n\t Object.defineProperty(exports, key, {\n\t enumerable: true,\n\t get: function () {\n\t return _view2d[key];\n\t }\n\t });\n\t});\n\t\n\tvar _figureView = __webpack_require__(93);\n\t\n\tObject.keys(_figureView).forEach(function (key) {\n\t if (key === \"default\") return;\n\t Object.defineProperty(exports, key, {\n\t enumerable: true,\n\t get: function () {\n\t return _figureView[key];\n\t }\n\t });\n\t});\n\t\n\tvar _syncedFigureViews = __webpack_require__(97);\n\t\n\tObject.keys(_syncedFigureViews).forEach(function (key) {\n\t if (key === \"default\") return;\n\t Object.defineProperty(exports, key, {\n\t enumerable: true,\n\t get: function () {\n\t return _syncedFigureViews[key];\n\t }\n\t });\n\t});\n\t\n\tvar _documentViewMixin = __webpack_require__(98);\n\t\n\tObject.keys(_documentViewMixin).forEach(function (key) {\n\t if (key === \"default\") return;\n\t Object.defineProperty(exports, key, {\n\t enumerable: true,\n\t get: function () {\n\t return _documentViewMixin[key];\n\t }\n\t });\n\t});\n\t\n\tvar _selectedFiguresMixin = __webpack_require__(100);\n\t\n\tObject.keys(_selectedFiguresMixin).forEach(function (key) {\n\t if (key === \"default\") return;\n\t Object.defineProperty(exports, key, {\n\t enumerable: true,\n\t get: function () {\n\t return _selectedFiguresMixin[key];\n\t }\n\t });\n\t});\n\t\n\tvar _interactiveView = __webpack_require__(101);\n\t\n\tObject.keys(_interactiveView).forEach(function (key) {\n\t if (key === \"default\") return;\n\t Object.defineProperty(exports, key, {\n\t enumerable: true,\n\t get: function () {\n\t return _interactiveView[key];\n\t }\n\t });\n\t});\n\t\n\tvar _clipboard = __webpack_require__(99);\n\t\n\tObject.keys(_clipboard).forEach(function (key) {\n\t if (key === \"default\") return;\n\t Object.defineProperty(exports, key, {\n\t enumerable: true,\n\t get: function () {\n\t return _clipboard[key];\n\t }\n\t });\n\t});\n\n/***/ },\n\n/***/ 85:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.g$$ = exports.g$ = exports.fastThrottle = exports.AnimationLoop = undefined;\n\texports.createDomContainer = createDomContainer;\n\texports.pixelCenter = pixelCenter;\n\texports.strokePixelCenterSegment = strokePixelCenterSegment;\n\t\n\tvar _lodash = __webpack_require__(4);\n\t\n\tvar _gear = __webpack_require__(8);\n\t\n\tvar _cdl = __webpack_require__(15);\n\t\n\tfunction createDomContainer(id) {\n\t\n\t var container = window.document.createElement('div');\n\t if (id) {\n\t container.id = id; // This is not needed, maybe just good for debugging\n\t }\n\t (0, _lodash.assign)(container.style, {\n\t width: '100%', height: '100%',\n\t position: 'relative',\n\t overflow: 'hidden'\n\t });\n\t return container;\n\t}\n\t\n\tvar floor = Math.floor;\n\t\n\tfunction pixelCenter(point, t) {\n\t var p = t ? t.apply(point) : point;\n\t return new _cdl.Point(floor(p.x) + 0.5, floor(p.y) + 0.5);\n\t}\n\t\n\tfunction strokePixelCenterSegment(context, from, to, transform) {\n\t (0, _gear.strokeSegment)(context, pixelCenter(from, transform), pixelCenter(to, transform));\n\t}\n\t\n\t// [TODO] We can simplify this, IE10+ supports requestAnimationFrame\n\t\n\tvar requestAnimFrame = function () {\n\t return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) {\n\t return setTimeout(callback, 1000 / 60);\n\t };\n\t}();\n\t\n\t// Shared Animation Loop, we may directly eliminate this\n\t// It is adding complexity (and leaks), and it may not be giving as\n\t// anything\n\t// Maybe we do not even need a loop and we can just ask animation frames\n\t// when needed\n\t\n\tvar drawCalls = [];\n\tvar animationLoop = function () {\n\t for (var i = 0, iEnd = drawCalls.length; i < iEnd; ++i) {\n\t drawCalls[i]();\n\t }\n\t requestAnimFrame(animationLoop);\n\t};\n\tanimationLoop();\n\t\n\tvar AnimationLoop = exports.AnimationLoop = {\n\t register: function (call) {\n\t drawCalls.push(call);\n\t },\n\t unregister: function (call) {\n\t drawCalls.splice(drawCalls.indexOf(call), 1);\n\t }\n\t};\n\t\n\t// A simple throttle that call the function the first time is\n\t// issued and after that only if it is called after a certain timeout\n\t// lo-dash uses setTimeout, clearTimeout for doing the same thing\n\t// Equivalent to _.throttle(func,timeout,{leading:true})\n\tvar fastThrottle = exports.fastThrottle = function (func, timeout) {\n\t var last = { t: 0, r: null };\n\t return function () {\n\t var t = (0, _lodash.now)();\n\t if (last.t < t - timeout) {\n\t last.r = func.apply(this, arguments);\n\t last.t = t;\n\t }\n\t return last.r;\n\t };\n\t};\n\t\n\t// Browser like shortcuts and utils from http://youmightnotneedjquery.com/\n\t//=============================================================================\n\t\n\tvar g$ = exports.g$ = function (selector) {\n\t return document.querySelector(selector);\n\t};\n\t\n\tvar g$$ = exports.g$$ = function (selector) {\n\t return document.querySelectorAll(selector);\n\t};\n\t\n\t// [TODO] Use offsetWidth, offsetHeight\n\t\n\tvar dim = function (d) {\n\t return function (el, value) {\n\t if (value === undefined) {\n\t return el.getBoundingClientRect()[d];\n\t } else {\n\t el.style[d] = value + 'px';\n\t }\n\t };\n\t};\n\t\n\t(0, _lodash.assign)(g$, {\n\t addClass: function (el, className) {\n\t if (el.classList) {\n\t el.classList.add(className);\n\t } else {\n\t el.className += ' ' + className;\n\t }\n\t },\n\t append: function (el, child) {\n\t if ((0, _lodash.isString)(child)) {\n\t\n\t //Ensure we are working with a Node and then we can always just use appendChild\n\t //Cross browser trick (except old IE) to get DOM element from string\n\t var tempDiv = document.createElement('div');\n\t tempDiv.innerHTML = child;\n\t child = tempDiv.firstChild;\n\t }\n\t\n\t el.appendChild(child);\n\t },\n\t remove: function (el) {\n\t if (el) {\n\t el.parentNode.removeChild(el);\n\t }\n\t },\n\t show: function (el) {\n\t el.style.display = '';\n\t },\n\t hide: function (el) {\n\t el.style.display = 'none';\n\t },\n\t\n\t\n\t width: dim('width'),\n\t height: dim('height'),\n\t\n\t setSize: function (el, width, height) {\n\t el.style.width = width + 'px';\n\t el.style.height = height + 'px';\n\t },\n\t on: function (el, eventName, handler) {\n\t el.addEventListener(eventName, handler, false);\n\t },\n\t off: function (el, eventName, handler) {\n\t el.removeEventListener(eventName, handler, false);\n\t },\n\t focus: function (el) {\n\t if (el !== document.activeElement) {\n\t el.focus();\n\t }\n\t },\n\t\n\t\n\t // [TODO] Unused, we can remove this\n\t getBox: function (el) {\n\t var rect = el.getBoundingClientRect();\n\t\n\t // retrieve the current position of an element relative to the document\n\t // el.offset();\n\t var top = rect.top + document.body.scrollTop,\n\t left = rect.left + document.body.scrollLeft,\n\t height = rect.height,\n\t width = rect.width;\n\t\n\t return {\n\t x: left, y: top,\n\t width: width, height: height,\n\t bottom: height + top,\n\t right: width + left\n\t };\n\t }\n\t});\n\n/***/ },\n\n/***/ 86:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.InteractiveHelper = exports.interactiveViewEvents = exports.ViewPointerEvent = exports.ViewMouseWheelEvent = exports.ViewKeyEvent = exports.ViewEvent = exports.usingTouch = exports.padScaling = undefined;\n\t\n\tvar _config = __webpack_require__(2);\n\t\n\tvar _lodash = __webpack_require__(4);\n\t\n\tvar _cdl = __webpack_require__(15);\n\t\n\tvar _util = __webpack_require__(85);\n\t\n\tvar padScaling = exports.padScaling = 1.0;\n\tvar usingTouch = exports.usingTouch = false;\n\t\n\tvar specialKeys = ['altKey', 'shiftKey', 'ctrlKey', 'metaKey'];\n\t\n\t// Use view.triggerKeyboard() to get the virtual keyboard in mobile\n\tvar textInputEl = void 0,\n\t textInputButtonEl = void 0;\n\tfunction initGlobalTextInputEl() {\n\t var textInputId = 'grafika-hidden-text-input',\n\t textInputButtonId = textInputId + '-button';\n\t _util.g$.append((0, _util.g$)('body'), '');\n\t _util.g$.append((0, _util.g$)('body'), '');\n\t textInputEl = (0, _util.g$)(\"#\" + textInputId);\n\t textInputButtonEl = (0, _util.g$)(\"#\" + textInputButtonId);\n\t}\n\t\n\tvar eventBasePrototype = {\n\t preventDefault: function () {\n\t return this._e.preventDefault();\n\t },\n\t\n\t\n\t get view() {\n\t return this._v;\n\t },\n\t\n\t get event() {\n\t return this;\n\t },\n\t\n\t get type() {\n\t return this._t;\n\t },\n\t\n\t get route() {\n\t return 'on_' + this._t;\n\t },\n\t\n\t get originalEvent() {\n\t return this._e;\n\t },\n\t\n\t get cmdKey() {\n\t var e = this._e;\n\t return e.ctrlKey || e.metaKey;\n\t },\n\t\n\t get stopped() {\n\t return this._s;\n\t },\n\t stopPropagation: function () {\n\t this._s = true;\n\t }\n\t};\n\t\n\tfunction createEventPrototype(getters, proto) {\n\t return extendProto(forwardEventGetters(specialKeys.concat(getters), proto), eventBasePrototype);\n\t}\n\t\n\t// focus, focusout\n\t\n\tvar ViewEvent = exports.ViewEvent = function (view, type, originalEvent) {\n\t this._v = view;\n\t this._t = type;\n\t this._s = false; // stopped\n\t this._e = originalEvent;\n\t};\n\tViewEvent.prototype = createEventPrototype([], {});\n\t\n\t// keypress, keydown, keyup\n\t\n\tvar ViewKeyEvent = exports.ViewKeyEvent = function (view, type, originalEvent) {\n\t this._v = view;\n\t this._t = type;\n\t this._s = false; // stopped\n\t this._e = originalEvent;\n\t};\n\tViewKeyEvent.prototype = createEventPrototype(['which', 'keyCode', 'key', 'charCode'], {\n\t get char() {\n\t var _e = this._e;var which = _e.which || _e.keyCode;\n\t return which !== undefined ? String.fromCharCode(which) : undefined;\n\t }\n\t});\n\t\n\t// keypress, keydown, keyup\n\t\n\tvar ViewMouseWheelEvent = exports.ViewMouseWheelEvent = function (view, type, originalEvent) {\n\t this._v = view;\n\t this._t = type;\n\t this._s = false; // stopped\n\t this._e = originalEvent;\n\t};\n\tViewMouseWheelEvent.prototype = createEventPrototype([], {\n\t get wheelDelta() {\n\t var _e = this._e;\n\t\n\t if (_e.wheelDelta !== undefined) {\n\t // WebKit / Opera / Explorer 9\n\t return _e.wheelDelta;\n\t } else {\n\t // Firefox\n\t return -_e.detail;\n\t }\n\t }\n\t});\n\t\n\t// 3D views uses a ray tracing tracker\n\t\n\tvar DefaultPointerTracker = function () {};\n\tDefaultPointerTracker.prototype.track = function (_ref) {\n\t var view = _ref.view;\n\t var originalEvent = _ref.originalEvent;\n\t\n\t\n\t var modelPoint = view.modelPoint(originalEvent),\n\t docPoint = view.docPoint(originalEvent);\n\t\n\t return {\n\t\n\t modelPoint: modelPoint,\n\t docPoint: docPoint,\n\t\n\t // In 3D, this points are allowed to jump between texture islands\n\t modelPointRaw: modelPoint,\n\t docPointRaw: docPoint\n\t };\n\t};\n\t\n\tvar defaultPointerTracker = new DefaultPointerTracker();\n\t\n\t// pointerdown, pointermove, pointerup, click, dblclick\n\t\n\tvar ViewPointerEvent = exports.ViewPointerEvent = function (view, type, originalEvent, pointers, eventDown, tracker) {\n\t this._v = view;\n\t this._t = type;\n\t this._e = originalEvent;\n\t this._p = pointers;\n\t this._s = false; // stopped\n\t this._vp = view.viewPoint(originalEvent);\n\t this._ed = eventDown || this;\n\t this._target = null;\n\t this._tracker = tracker || defaultPointerTracker;\n\t // Cached properties that doesn't change during retargetting\n\t this._cache = new Map();\n\t};\n\t\n\tViewPointerEvent.prototype = createEventPrototype(['pageX', 'pageY', 'clientX', 'clientY', 'screenX', 'screenY', 'offsetX', 'offsetY', 'which', 'pointerType', 'button', 'buttons'], forwardTrackerGetters(['modelPoint', 'docPoint', 'modelIsland', 'docIsland', 'modelPointRaw', 'docPointRaw', 'modelIslandRaw', 'docIlsandRaw'], {\n\t retarget: function (eventDown, target) {\n\t var _v = this._v;\n\t var _t = this._t;\n\t var _e = this._e;\n\t var _p = this._p;\n\t\n\t var re = new ViewPointerEvent(_v, _t, _e, _p, eventDown, target);\n\t // Copy common properties, that are expensive to recompute\n\t re._cache = this._cache;\n\t return re;\n\t },\n\t\n\t\n\t get viewPoint() {\n\t return this._vp;\n\t },\n\t\n\t get figureHit() {\n\t var _cache = this._cache;\n\t\n\t if (!_cache.has('figureHit')) {\n\t _cache.set('figureHit', this._v.figureHitAtEvent(this._e));\n\t }\n\t return _cache.get('figureHit');\n\t },\n\t get figure() {\n\t var figureHit = this.figureHit;\n\t\n\t if (figureHit) {\n\t return figureHit.figure;\n\t }\n\t },\n\t\n\t get rawFigureHits() {\n\t var _cache = this._cache;\n\t\n\t if (!_cache.has('rawFigureHits')) {\n\t _cache.set('rawFigureHits', this._v.rawFigureHitsAtEvent(this._e));\n\t }\n\t return _cache.get('rawFigureHits');\n\t },\n\t\n\t get rawFigures() {\n\t var rawFigureHits = this.rawFigureHits;\n\t\n\t return (0, _lodash.map)(rawFigureHits, 'figure');\n\t },\n\t\n\t get clientPoint() {\n\t var event = this._e;\n\t return (0, _cdl.Point)(event.clientX, event.clientY);\n\t },\n\t\n\t get pagePoint() {\n\t var event = this._e;\n\t return (0, _cdl.Point)(event.pageX, event.pageY);\n\t },\n\t\n\t // [CHECK]\n\t // There are offsetX, offsetY properties that seems to be inconsistent\n\t // Maybe we can try them at one point\n\t\n\t // [TODO]\n\t // We may want to clone the points, but users shouldn't be modifiying this\n\t\n\t get offsetPoint() {\n\t return this.viewPoint;\n\t },\n\t\n\t get pointers() {\n\t return this._p;\n\t },\n\t\n\t get pointerId() {\n\t var _e = this._e;\n\t\n\t return _e.pointerId || _e.touchId;\n\t },\n\t\n\t get isPrimary() {\n\t var _e = this._e;\n\t\n\t return _e.isPrimary === undefined ? true : _e.isPrimary;\n\t }\n\t}));\n\t\n\tvar interactiveViewEvents = exports.interactiveViewEvents = ['contextmenu', 'click', 'dblclick', 'keydown', 'keyup', 'keypress', 'focus', 'focusout', 'pointerdown', 'pointermove', 'pointerup', 'mousemove', 'mousewheel'];\n\t\n\tvar InteractiveHelper = exports.InteractiveHelper = function (view, domElement) {\n\t var config = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];\n\t\n\t\n\t this.view = view;\n\t\n\t var el = this.el = domElement;\n\t\n\t var captureKey = this.captureKey = config.captureKey; // function(object, event ) { return capture... };\n\t\n\t\n\t this.enabled = true;\n\t this.focused = false;\n\t\n\t var elK = this.elK = captureKey ? document : el;\n\t\n\t this.consume_click = 0;\n\t\n\t this.pointersMap = new Map();\n\t this.pointers = [];\n\t\n\t this.primaryId = null;\n\t\n\t this.mouseisdown = false;\n\t\n\t this.lastClick = { t: 0, x: 0, y: 0 };\n\t\n\t // Keep track of added handlers to remove them on dispose\n\t var unList = this.unList = [];\n\t var on = function (element, event, handler) {\n\t unList.push({ element: element, event: event, handler: handler });\n\t _util.g$.on(element, event, handler);\n\t };\n\t\n\t // Using the container to pick up mouse events\n\t on(el, 'click', this.click.bind(this));\n\t\n\t // Handling dblclick by hand so we can support touch\n\t on(el, 'dblclick', function (event) {\n\t event.preventDefault();\n\t });\n\t\n\t // We are going to generate an equivalent but simplified API to PointerEvents\n\t // The polyfills that I found were not good enough to be able to just replace\n\t // listenning to mouse events and touch events, they included timers and other\n\t // things that were just getting in our way.\n\t\n\t if (window.PointerEvent) {\n\t // IE11\n\t\n\t el.style['touch-action'] = 'none';\n\t\n\t on(el, 'pointerdown', this.pointerdown.bind(this));\n\t on(document, 'pointermove', this.pointermove.bind(this));\n\t on(document, 'pointerup', this.pointerup.bind(this));\n\t\n\t on(el, 'mousedown', function (event) {\n\t event.preventDefault();\n\t });\n\t // Forward mouse move to provide hover feedback\n\t on(el, 'mousemove', this.mousemove.bind(this));\n\t } else if (window.navigator.msPointerEnabled) {\n\t // IE10\n\t\n\t el.style['touch-action'] = 'none';\n\t\n\t on(el, 'MSPointerDown', this.pointerdown.bind(this));\n\t on(document, 'MSPointerMove', this.pointermove.bind(this));\n\t on(document, 'MSPointerUp', this.pointerup.bind(this));\n\t\n\t on(el, 'mousedown', function (event) {\n\t event.preventDefault();\n\t });\n\t // Forward mouse move to provide hover feedback\n\t on(el, 'mousemove', this.mousemove.bind(this));\n\t } else {\n\t // Mouse + Touch for other cases\n\t\n\t on(el, 'mousedown', this.mousedown.bind(this));\n\t on(el, 'mousemove', this.mousemove.bind(this));\n\t\n\t // Mouse move and mouseup attached to the document so we can drag\n\t // even when out of the Canvas\n\t on(document, 'mousemove', this.doc_mousemove.bind(this));\n\t on(document, 'mouseup', this.doc_mouseup.bind(this));\n\t\n\t on(el, 'touchstart', this.touchstart.bind(this));\n\t on(el, 'touchmove', this.touchmove.bind(this));\n\t on(el, 'touchend', this.touchend.bind(this));\n\t on(el, 'touchleave', this.touchend.bind(this));\n\t on(el, 'touchcancel', this.touchend.bind(this));\n\t }\n\t\n\t on(el, 'mousewheel', this.mousewheel.bind(this));\n\t on(el, 'MozMousePixelScroll', this.mousewheel.bind(this)); // firefox\n\t\n\t // Cancel context menu\n\t _util.g$.on(el, 'contextmenu', function (event) {\n\t event.preventDefault();\n\t event.stopPropagation();\n\t });\n\t\n\t _util.g$.on(elK, 'keydown', this.keydown.bind(this));\n\t _util.g$.on(elK, 'keyup', this.keyup.bind(this));\n\t _util.g$.on(elK, 'keypress', this.keypress.bind(this));\n\t\n\t if (textInputEl) {\n\t // TextInputEl is delayed til needed\n\t this.bindToTextInputEl();\n\t }\n\t\n\t _util.g$.on(el, 'focus', this.focus.bind(this));\n\t _util.g$.on(el, 'focusout', this.focusout.bind(this));\n\t};\n\t\n\tInteractiveHelper.prototype = {\n\t bindToTextInputEl: function () {\n\t if (textInputEl) {\n\t _util.g$.on(textInputEl, 'keydown', this.keydown.bind(this));\n\t _util.g$.on(textInputEl, 'keyup', this.keyup.bind(this));\n\t _util.g$.on(textInputEl, 'keypress', this.keypress.bind(this));\n\t\n\t // g$.on( textInputEl, 'keydown' , () => { console.log('...');} );\n\t }\n\t },\n\t fireViewEvent: function (type, originalEvent) {\n\t this.fireDomEvent(type, new ViewEvent(this.view, type, originalEvent));\n\t },\n\t fireKeyEvent: function (type, originalEvent) {\n\t this.fireDomEvent(type, new ViewKeyEvent(this.view, type, originalEvent));\n\t },\n\t fireMouseWheelEvent: function (type, originalEvent) {\n\t this.fireDomEvent(type, new ViewMouseWheelEvent(this.view, type, originalEvent));\n\t },\n\t firePointerEvent: function (type, originalEvent) {\n\t var event = new ViewPointerEvent(this.view, type, originalEvent, this.pointers, this.eventDown);\n\t if (type === 'pointerdown' && event.isPrimary) {\n\t this.eventDown = event;\n\t }\n\t if (type === 'pointerup' && event.isPrimary) {\n\t this.eventDown = null;\n\t }\n\t\n\t this.fireDomEvent(type, event);\n\t\n\t if (type === 'pointerdown' && event.stopped) {\n\t this.stopClick();\n\t }\n\t },\n\t\n\t\n\t // Keep separate...\n\t\n\t fireMouseMoveEvent: (0, _util.fastThrottle)(function (type, originalEvent) {\n\t this.firePointerEvent(type, originalEvent);\n\t }, 12),\n\t\n\t firePointerMoveEvent: (0, _util.fastThrottle)(function (type, originalEvent) {\n\t this.firePointerEvent(type, originalEvent);\n\t }, 12),\n\t\n\t /*\r\n\t fireMouseMoveEvent( type, originalEvent ) {\r\n\t this.firePointerEvent(type,originalEvent);\r\n\t },\r\n\t firePointerMoveEvent( type, originalEvent ) {\r\n\t this.firePointerEvent(type,originalEvent);\r\n\t },\r\n\t */\n\t\n\t fireDomEvent: function (type, event) {\n\t var view = this.view;\n\t\n\t view.fireEvent(type, event);\n\t if (!event.stopped) {\n\t view.on_domEvent(event);\n\t }\n\t },\n\t triggerKeyboard: function (event) {\n\t if (_config.Config.mobileKeyboard) {\n\t\n\t // This is work in progress, the idea is trigger the virtual keyboard\n\t // in mobile. The approach was clicking through a button and showing\n\t // an invisible input. This is disabled at this point, as I couldn't\n\t // make it work.\n\t\n\t if (!textInputEl) {\n\t initGlobalTextInputEl();\n\t this.bindToTextInputEl();\n\t }\n\t\n\t if (event) {\n\t // Avoid jumps\n\t textInputEl.style.left = event.pageX + 'px';\n\t textInputEl.style.top = event.pageY + 'px';\n\t }\n\t\n\t textInputButtonEl.click();\n\t }\n\t },\n\t dispose: function () {\n\t (0, _lodash.forEach)(this.unList, function (_ref2) {\n\t var element = _ref2.element;\n\t var event = _ref2.event;\n\t var handler = _ref2.handler;\n\t\n\t _util.g$.off(element, event, handler);\n\t });\n\t },\n\t stopClick: function () {\n\t this.consume_click = (0, _lodash.now)();\n\t },\n\t clickConsumed: function () {\n\t var cc = this.consume_click;\n\t if (cc) {\n\t if ((0, _lodash.now)() - cc < 400) {\n\t return true;\n\t } else {\n\t this.consume_click = 0;\n\t }\n\t }\n\t return false;\n\t },\n\t focus: function (event) {\n\t this.focused = true;\n\t this.fireViewEvent('focus', event);\n\t },\n\t focusout: function (event) {\n\t this.pointersMap.clear();\n\t this.pointers = [];\n\t\n\t this.focused = false;\n\t this.fireViewEvent('focusout', event);\n\t },\n\t click: function (event) {\n\t if (this.clickConsumed()) {\n\t event.preventDefault();\n\t return;\n\t }\n\t if (this.enabled) {\n\t event.preventDefault();\n\t this.firePointerEvent('click', event);\n\t }\n\t },\n\t checkDblclick: function (event) {\n\t if (event.isPrimary === false) {\n\t return; // Ignore multi touch\n\t }\n\t var t = (0, _lodash.now)();\n\t var x = event.clientX,\n\t y = event.clientY;\n\t var lc = this.lastClick;\n\t var epsilon = 20;\n\t if (t - lc.t < 300 && Math.abs(x - lc.x) < epsilon && Math.abs(y - lc.y) < epsilon) {\n\t this.dblclick(event);\n\t t = 0; // avoid firing extra dblclick when clicking several times\n\t }\n\t lc.t = t;\n\t lc.x = x;\n\t lc.y = y;\n\t },\n\t dblclick: function (event) {\n\t if (this.enabled) {\n\t event.preventDefault();\n\t this.firePointerEvent('dblclick', event);\n\t }\n\t },\n\t mousedown: function (event) {\n\t if (this.enabled) {\n\t this.mouseisdown = true;\n\t _util.g$.focus(this.el);\n\t event.preventDefault();\n\t exports.padScaling = padScaling = 1.0;\n\t this.firePointerEvent('pointerdown', event);\n\t\n\t // if right click then also fire contextmenu event\n\t if (event.which === 3) {\n\t this.firePointerEvent('contextmenu', event);\n\t }\n\t }\n\t },\n\t\n\t // mousemove\n\t // If the mouse is down, forward events from everywhere in the page\n\t // If the mouse is not being pressed, just use the container events for hover to make the app faster\n\t mousemove: function (event) {\n\t if (!this.mouseisdown && this.pointers.length === 0 && this.enabled) {\n\t exports.padScaling = padScaling = 1.0;\n\t event.preventDefault();\n\t this.firePointerMoveEvent('pointermove', event);\n\t this.fireMouseMoveEvent('mousemove', event);\n\t }\n\t },\n\t doc_mousemove: function (event) {\n\t if (this.mouseisdown && this.enabled) {\n\t event.preventDefault();\n\t this.fireMouseMoveEvent('pointermove', event);\n\t }\n\t },\n\t doc_mouseup: function (event) {\n\t if (!this.mouseisdown) {\n\t return;\n\t }\n\t this.mouseisdown = false;\n\t if (this.enabled) {\n\t event.preventDefault();\n\t this.firePointerEvent('pointerup', event);\n\t\n\t if (event.which === 1) {\n\t this.checkDblclick(event);\n\t }\n\t }\n\t },\n\t pointerdown: function (event) {\n\t // We can not prevent the default here, if not mousedown is not triggered\n\t // We need to call preventDefault directly for mousedown in IE\n\t // event.preventDefault();\n\t this.pointerdown_ongoing(event);\n\t if (this.enabled) {\n\t _util.g$.focus(this.el);\n\t exports.padScaling = padScaling = event.pointerType === 'touch' || event.pointerType === 2 ? 2.2 : 1.0;\n\t this.firePointerEvent('pointerdown', event);\n\t\n\t // if right click then also fire contextmenu event\n\t if (event.which === 3) {\n\t this.fireViewEvent('contextmenu', event);\n\t }\n\t }\n\t },\n\t pointermove: function (event) {\n\t if (this.pointermove_ongoing(event) && this.enabled) {\n\t event.preventDefault();\n\t this.firePointerMoveEvent('pointermove', event);\n\t }\n\t },\n\t pointerup: function (event) {\n\t var valid = this.pointerup_ongoing(event);\n\t if (valid && this.enabled) {\n\t event.preventDefault();\n\t this.firePointerEvent('pointerup', event);\n\t\n\t // dblclick\n\t this.checkDblclick(event);\n\t }\n\t },\n\t pointerdown_ongoing: function (event) {\n\t var pointers = this.pointers;\n\t var pointersMap = this.pointersMap;\n\t var pointerId = event.pointerId;\n\t\n\t\n\t var start = this.view.viewPoint(event);\n\t\n\t var oldPointerInfo = pointersMap.get(pointerId);\n\t if (oldPointerInfo) {\n\t (0, _lodash.pull)(pointers, oldPointerInfo);\n\t }\n\t\n\t var pointerInfo = { id: pointerId, start: start, current: start.clone() };\n\t\n\t pointers.push(pointerInfo);\n\t pointersMap.set(pointerId, pointerInfo);\n\t\n\t if (pointers.length >= 2) {\n\t // Prevent browser pinch to zoom\n\t // console.log('pointers '+pointers.length);\n\t event.preventDefault();\n\t }\n\t },\n\t pointermove_ongoing: function (event) {\n\t var pointerInfo = this.pointersMap.get(event.pointerId);\n\t if (pointerInfo) {\n\t pointerInfo.current = this.view.viewPoint(event);\n\t return true;\n\t } else {\n\t return false;\n\t }\n\t },\n\t pointerup_ongoing: function (event) {\n\t var pointers = this.pointers;\n\t var pointersMap = this.pointersMap;\n\t var pointerId = event.pointerId;\n\t\n\t\n\t var n = (0, _lodash.indexOf)(pointers, pointersMap.get(pointerId));\n\t if (n >= 0) {\n\t pointers.splice(n, 1);\n\t pointersMap.delete(pointerId);\n\t return true;\n\t } else {\n\t return false;\n\t }\n\t },\n\t touchstart: function (event) {\n\t event.preventDefault();\n\t var touches = event.changedTouches;\n\t for (var i = 0, iEnd = touches.length; i < iEnd; ++i) {\n\t var touch = touches.item(i),\n\t id = touch.identifier,\n\t isPrimary = this.pointers.length === 0;\n\t\n\t if (isPrimary) {\n\t this.primaryId = id;\n\t }\n\t var pointerEvent = simulatePointerEvent(event, touch, id, isPrimary);\n\t this.pointerdown(pointerEvent);\n\t }\n\t },\n\t touchmove: function (event) {\n\t var touches = event.changedTouches;\n\t for (var i = 0, iEnd = touches.length; i < iEnd; ++i) {\n\t var touch = touches.item(i);\n\t var id = touch.identifier;\n\t if (this.pointersMap.get(id)) {\n\t event.preventDefault();\n\t var isPrimary = id === this.primaryId;\n\t var pointerEvent = simulatePointerEvent(event, touch, id, isPrimary);\n\t this.pointermove(pointerEvent);\n\t }\n\t }\n\t },\n\t touchend: function (event) {\n\t var touches = event.changedTouches;\n\t for (var i = 0, iEnd = touches.length; i < iEnd; ++i) {\n\t var touch = touches.item(i);\n\t var id = touch.identifier;\n\t var isPrimary = id === this.primaryId;\n\t if (isPrimary) {\n\t this.primaryId = null;\n\t }\n\t if (this.pointersMap.get(id)) {\n\t event.preventDefault();\n\t var pointerEvent = simulatePointerEvent(event, touch, id, isPrimary);\n\t this.pointerup(pointerEvent);\n\t }\n\t }\n\t },\n\t mousewheel: function (event) {\n\t this.fireMouseWheelEvent('mousewheel', event);\n\t },\n\t keydown: function (event) {\n\t var captureKey = this.captureKey;\n\t if ((!captureKey || captureKey(this, event)) && this.enabled) {\n\t this.fireKeyEvent('keydown', event);\n\t }\n\t },\n\t keyup: function (event) {\n\t var captureKey = this.captureKey;\n\t if ((!captureKey || captureKey(this, event)) && this.enabled) {\n\t this.fireKeyEvent('keyup', event);\n\t }\n\t },\n\t keypress: function (event) {\n\t var captureKey = this.captureKey;\n\t if ((!captureKey || captureKey(this, event)) && this.enabled) {\n\t this.fireKeyEvent('keypress', event);\n\t }\n\t }\n\t};\n\t\n\t// Utilities\n\t//------------------------------------------------------------------------------\n\t\n\tfunction simulatePointerEvent(event, touch, touchId, isPrimary) {\n\t exports.usingTouch = usingTouch = true;\n\t\n\t var pointerEvent = document.createEvent(\"MouseEvents\");\n\t var type = null;\n\t\n\t switch (event.type) {\n\t case \"touchstart\":\n\t type = \"mousedown\";break;\n\t case \"touchmove\":\n\t type = \"mousemove\";break;\n\t case \"touchend\":\n\t case \"touchleave\":\n\t case \"touchcancel\":\n\t type = \"mouseup\";break;\n\t default:\n\t type = \"mousedown\";\n\t }\n\t pointerEvent.initMouseEvent(type, true, true, event.target.ownerDocument.defaultView, 0, touch.screenX, touch.screenY, touch.clientX, touch.clientY, event.ctrlKey, event.altKey, event.shiftKey, event.metaKey, 0, null);\n\t pointerEvent.pointerType = 'touch';\n\t pointerEvent.pointerId = touchId;\n\t pointerEvent.isPrimary = isPrimary;\n\t return pointerEvent;\n\t}\n\t\n\tfunction forwardTrackerGetters(getters, proto) {\n\t (0, _lodash.forEach)(getters, function (getter) {\n\t Object.defineProperty(proto, getter, {\n\t get: function () {\n\t if (!this._target) {\n\t this._target = this._tracker.track(this);\n\t }\n\t return this._target[getter];\n\t }\n\t });\n\t });\n\t return proto;\n\t}\n\t\n\tfunction forwardEventGetters(getters, proto) {\n\t (0, _lodash.forEach)(getters, function (getter) {\n\t Object.defineProperty(proto, getter, {\n\t get: function () {\n\t return this._e[getter];\n\t }\n\t });\n\t });\n\t return proto;\n\t}\n\t\n\tfunction extendProto(proto, config) {\n\t (0, _lodash.forEach)((0, _lodash.keys)(config), function (key) {\n\t var descriptor = Object.getOwnPropertyDescriptor(config, key);\n\t if (descriptor.get || descriptor.set) {\n\t Object.defineProperty(proto, key, descriptor);\n\t } else {\n\t proto[key] = config[key];\n\t }\n\t });\n\t return proto;\n\t}\n\n/***/ },\n\n/***/ 87:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.Plugin = exports.RenderPlugin = undefined;\n\texports.redraw_this = redraw_this;\n\t\n\tvar _lodash = __webpack_require__(4);\n\t\n\tvar _gear = __webpack_require__(8);\n\t\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\t\n\t// A non interactive plugin that just render\n\tvar RenderPlugin = exports.RenderPlugin = _gear.OwnedObject.extend({ typeName: 'RenderPlugin',\n\t\n\t drawTo: [],\n\t\n\t target: 'document',\n\t\n\t Properties: {\n\t\n\t visible: { type: 'boolean', def: true, onChange: function () {\n\t this[this._visible ? 'show' : 'hide'](this);\n\t this.redraw();\n\t }\n\t }\n\t },\n\t\n\t initPlugin: function () /*view, ...init params*/{},\n\t draw: function () /*{ view, context, transform }*/{},\n\t show: function () /*view*/{},\n\t hide: function () /*view*/{},\n\t link: function () /*view*/{},\n\t unlink: function (view) {\n\t view.un(this);\n\t },\n\t updateSize: function () /*view,box*/{},\n\t\n\t\n\t // Forward params to initPlugin\n\t init: function () {\n\t for (var _len = arguments.length, params = Array(_len), _key = 0; _key < _len; _key++) {\n\t params[_key] = arguments[_key];\n\t }\n\t\n\t this._params = params;\n\t this.view = null;\n\t },\n\t initView: function (view) {\n\t this.view = view;\n\t this.initPlugin.apply(this, [view].concat(_toConsumableArray(this._params)));\n\t this.link(view);\n\t },\n\t initLayer: function () /* layer */{\n\t // Used by 3D to hook a THREE.WebGLRenderer to a layer\n\t },\n\t dispose: function () {\n\t this.unlink(this.view);\n\t },\n\t redraw: function () {\n\t var _view;\n\t\n\t (_view = this.view).redraw.apply(_view, _toConsumableArray(this.drawTo));\n\t },\n\t has_try_pointerdown: function () {\n\t return this.try_pointerdown;\n\t },\n\t has_try_click: function () {\n\t return this.try_click;\n\t },\n\t has_try_dblclick: function () {\n\t return this.try_dblclick;\n\t },\n\t has_try_contextmenu: function () {\n\t return this.try_contextmenu;\n\t }\n\t});\n\t\n\tvar Plugin = exports.Plugin = RenderPlugin.extend({ typeName: 'Plugin',\n\t\n\t isInteractive: true,\n\t\n\t Properties: {\n\t enabled: { type: 'boolean', def: true, onChange: function () {\n\t this.redraw();\n\t }\n\t }\n\t },\n\t\n\t takeControl: function () {\n\t var _this = this;\n\t\n\t var state = this._state = {};\n\t (0, _lodash.forEach)(this.view._plugins, function (plugin) {\n\t state[plugin.name] = { visible: plugin._visible, enabled: plugin._enabled };\n\t var isThis = plugin === _this;\n\t plugin.visible = isThis;\n\t plugin.enabled = isThis;\n\t });\n\t this.redraw();\n\t },\n\t releaseControl: function () {\n\t var _this2 = this;\n\t\n\t (0, _lodash.forEach)(this.view._plugins, function (plugin) {\n\t var pluginState = _this2._state[plugin.name];\n\t if (pluginState) {\n\t plugin.visible = pluginState.visible;\n\t plugin.enabled = pluginState.enabled;\n\t }\n\t });\n\t this.redraw();\n\t },\n\t draw: function (config) {\n\t var helper = this.helper;\n\t\n\t if (helper && helper.draw) {\n\t helper.draw(config);\n\t }\n\t },\n\t somethingToDraw: function () {\n\t return true;\n\t },\n\t needsToDrawFor: function () /* figure */{\n\t return true;\n\t },\n\t handleDomEvent: function (_ref) {\n\t var event = _ref.event;\n\t var type = _ref.type;\n\t var route = _ref.route;\n\t var isPrimary = _ref.isPrimary;\n\t var helper = this.helper;\n\t\n\t if (helper) {\n\t if (type === 'pointermove') {\n\t helper.move(event);\n\t this.redraw();\n\t } else if (type === 'pointerup') {\n\t helper.end(event);\n\t this.helper = null;\n\t this.redraw();\n\t } else if (type === 'pointerdown' && isPrimary) {\n\t console.log('Missing pointerup');\n\t helper.end(event);\n\t this.helper = null;\n\t this.redraw();\n\t }\n\t }\n\t\n\t if (event.stopped) {\n\t return;\n\t }\n\t\n\t if (this._visible && this._enabled) {\n\t if (this[route]) {\n\t this[route](event);\n\t }\n\t this.on_domEvent(event);\n\t }\n\t },\n\t on_domEvent: function () /* event */{}\n\t}\n\t\n\t/*\r\n\ton_focus ( event ) { },\r\n\ton_focusout ( event ) { },\r\n\ton_click ( event ) { },\r\n\ton_dblclick ( event ) { },\r\n\ton_pointerdown ( event ) { },\r\n\ton_pointerup ( event ) { },\r\n\ton_pointermove ( event ) { },\r\n\ton_mousemove ( event ) { },\r\n\ton_keypress ( event ) { },\r\n\ton_keyup ( event ) { },\r\n\ton_keydown ( event ) { },\r\n\ton_contextmenu ( event ) { },\r\n\ton_mousewheel ( event ) { }\r\n\t*/\n\t);\n\t\n\tPlugin.PluginsLayer = Plugin.extend({ typeName: 'PluginsLayerPlugin',\n\t name: 'pluginsLayer',\n\t drawTo: ['plugins'],\n\t target: 'view'\n\t});\n\t\n\tfunction redraw_this() {\n\t this.redraw();\n\t}\n\n/***/ },\n\n/***/ 88:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.Tool = undefined;\n\t\n\tvar _lodash = __webpack_require__(4);\n\t\n\tvar _gear = __webpack_require__(8);\n\t\n\tvar _cdl = __webpack_require__(15);\n\t\n\tvar _plugin = __webpack_require__(87);\n\t\n\t/*\r\n\tToolType = [\r\n\t 'Select', // Special tool used for selecting and transforming figures\r\n\t 'Flat', // Tools that should forward commits (Zoom,Pan)\r\n\t 'View', // Tools for changing view properties (Zoom,Pan)\r\n\t 'Normal', // Tools that allow the use of View tools on top of them (NodeEdit)\r\n\t 'Final', // Tools that doesn't support any kind of stacking (Draw)\r\n\t 'Stackable' // Tools that creates an edition context (Deprecated, using ContentLayer now)\r\n\t]\r\n\t*/\n\t\n\t//\n\t// Rules\n\t\n\tvar Tool = exports.Tool = _gear.OwnedObject.extend({ typeName: 'Tool',\n\t\n\t type: 'Final',\n\t isCommitable: true,\n\t\n\t // initTool( view, ...init params ) {},\n\t\n\t link: function () /*view*/{},\n\t unlink: function () /*view*/{},\n\t start: function () /*view*/{},\n\t pause: function () /*view*/{},\n\t resume: function () /*view*/{},\n\t finish: function () /*view*/{},\n\t\n\t\n\t // _commit$( view ) {},\n\t // _cancel$( view ) {},\n\t\n\t draw: function () /* config */{},\n\t commit$: function () {\n\t var _this = this;\n\t\n\t var view = this.view;var doc = view._document;\n\t if (this._commit$) {\n\t return (0, _gear.resolve)(this._commit$(view, doc)).then(function () {\n\t return _this.stop('commit$');\n\t });\n\t } else {\n\t return this.stop('commit$');\n\t }\n\t },\n\t cancel$: function () {\n\t var _this2 = this;\n\t\n\t var view = this.view;\n\t var doc = view.doc;\n\t\n\t if (this._cancel$) {\n\t return (0, _gear.resolve)(this._cancel$(view, doc)).then(function () {\n\t return _this2.stop('cancel$');\n\t });\n\t } else {\n\t return this.stop('cancel$');\n\t }\n\t },\n\t redraw: function () {\n\t this.view.redraw('tools');\n\t },\n\t\n\t\n\t // Forward helper ( move, end, draw ) to the plugin\n\t get helper() {\n\t return this.view.tools.helper;\n\t },\n\t set helper(h) {\n\t this.view.tools.helper = h;\n\t },\n\t\n\t init: function (a, b, c) {\n\t var _this3 = this;\n\t\n\t this._sleeping = false;\n\t this._params = { a: a, b: b, c: c };\n\t this._deferred = new _gear.Deferred();\n\t\n\t // [TODO] Eliminate this...\n\t var config = (0, _lodash.isPlainObject)(a) ? a : (0, _lodash.isPlainObject)(b) ? b : (0, _lodash.isPlainObject)(c) ? c : {};\n\t\n\t if (config !== a) {\n\t this.initProperties(config);\n\t }\n\t\n\t (0, _lodash.forEach)(['start', 'finish', 'pause', 'resume'], function (func) {\n\t return config[func] && (_this3[func] = config[func]);\n\t });\n\t\n\t this._bind('commit$')._bind('cancel$')._bind('stop');\n\t },\n\t initView: function (view) {\n\t var _this4 = this;\n\t\n\t this.view = view;\n\t var p = this._params;\n\t (0, _gear.resolve)(this.initTool(view, p.a, p.b, p.c)).then(function () {\n\t _this4.link(view);\n\t _this4.start();\n\t _this4.redraw();\n\t });\n\t },\n\t promise: function () {\n\t return this._deferred.promise;\n\t },\n\t sleep: function () {\n\t this.unlink(this.view);\n\t this.pause();\n\t this._sleeping = true;\n\t },\n\t wakeup: function () {\n\t this._sleeping = false;\n\t this.link(this.view);\n\t this.resume();\n\t },\n\t stop: function (event) {\n\t var _this5 = this;\n\t\n\t var view = this.view;\n\t\n\t this._stopped = true;\n\t this._deferred.resolve();\n\t return (0, _gear.resolve)(view.popTool()).then(function () {\n\t if (event && _this5.type === 'View') {\n\t // Forward commit and cancel event to the underlying tool\n\t return view.tool[event]();\n\t }\n\t });\n\t },\n\t dispose: function () {\n\t this.unlink(this.view);\n\t this.finish();\n\t },\n\t\n\t\n\t get cursor() {\n\t return this.view.cursor;\n\t },\n\t set cursor(cursor_) {\n\t this.view.cursor = cursor_;\n\t },\n\t\n\t toolhelp: function () /* ...params */{\n\t var _view;\n\t\n\t (_view = this.view).toolhelp.apply(_view, arguments);\n\t },\n\t triggerKeyboard: function (event) {\n\t this.view.triggerKeyboard(event);\n\t },\n\t\n\t\n\t /*\r\n\t on_focus( event ) { },\r\n\t on_focusout( event ) { },\r\n\t on_click( event ) { },\r\n\t on_dblclick( event ) { },\r\n\t on_pointerdown( event ) { },\r\n\t on_pointerup( event ) { },\r\n\t on_pointermove( event ) { },\r\n\t on_mousemove( event ) { },\r\n\t on_keypress( event ) { },\r\n\t on_keyup( event ) { },\r\n\t on_keydown( event ) { },\r\n\t on_contextmenu( event ) { }\r\n\t */\n\t\n\t canUndo: function () {\n\t return false;\n\t },\n\t undo: function () {},\n\t canRedo: function () {\n\t return false;\n\t },\n\t redo: function () {},\n\t supportsClipboard: function () {\n\t return false;\n\t },\n\t somethingToDraw: function () {\n\t return true;\n\t },\n\t needsToDrawFor: function () /* docIsland */{\n\t return true;\n\t }\n\t});\n\t\n\tTool.defaultPen = function () {\n\t return (0, _cdl.Pen)({ color: { rgb: '000000' }, width: 2 });\n\t};\n\t\n\tTool.defaultBrush = function () {\n\t return (0, _cdl.Brush)({ color: { rgb: '2533AA' } });\n\t};\n\t\n\t_plugin.Plugin.Tools = _plugin.Plugin.extend({ typeName: 'ToolsPlugin',\n\t\n\t name: 'tools',\n\t\n\t drawTo: ['tools'],\n\t\n\t initPlugin: function (view) {\n\t this._tools = [];\n\t this._toolhelp = '';\n\t this._trackPointer = false;\n\t view.on({ 'change': this.redraw }, this);\n\t },\n\t toolhelp: function (string) {\n\t if (string === null) {\n\t this._toolhelp = null;\n\t } else {\n\t var th = (0, _lodash.flatten)(arguments);\n\t this._toolhelp = th[0];\n\t for (var k = 1, kEnd = th.length; k < kEnd; ++k) {\n\t this._toolhelp += '\\n' + th[k];\n\t }\n\t }\n\t this.view.batchRedraw('plugins');\n\t },\n\t commitEditionTools$: function () {\n\t var _this6 = this;\n\t\n\t var tool = this.tool;\n\t\n\t if (tool) {\n\t var tool_type = tool.type;\n\t // [TODO] isEditionTool() ?\n\t if (!(tool_type === 'Select' || tool_type === 'View')) {\n\t return tool.commit$().then(function () {\n\t return _this6.commitEditionTools$();\n\t });\n\t }\n\t }\n\t return (0, _gear.resolve)();\n\t },\n\t\n\t\n\t get tool() {\n\t return (0, _lodash.last)(this._tools);\n\t },\n\t\n\t set tool(tool_) {\n\t var _this7 = this;\n\t\n\t var tools = this._tools;\n\t var view = this.view;\n\t\n\t\n\t this._trackPointer = false;\n\t\n\t // Remove the tools that are of type View\n\t var toolsRemoved = false;\n\t for (var k = tools.length - 1; k > 0; --k) {\n\t var t = tools[k];\n\t if (t.type === 'View') {\n\t t.dispose();\n\t tools.pop();\n\t toolsRemoved = true;\n\t }\n\t }\n\t\n\t if (tool_ === 'Edit' || tool_ === 'Select') {\n\t // Special (hack?) case\n\t // We need to leave the tool in a select based tool\n\t var ct = this.tool;\n\t if (ct) {\n\t if (tool_ === 'Select' && ct.type === 'Final') {\n\t return this.popTool();\n\t } else if (toolsRemoved) {\n\t ct.wakeup();\n\t view.fireEvent('toolchanged', view, ct);\n\t this.redraw();\n\t return this.render$ ? this.render$() : null; // hack for the moment\n\t }\n\t return;\n\t } else {\n\t tool_ = Tool.Select();\n\t }\n\t }\n\t\n\t var addNewTool = function () {\n\t _this7.toolhelp(null);\n\t var currentTool = _this7.tool;\n\t if (currentTool) {\n\t currentTool.sleep();\n\t }\n\t tools.push(tool_);\n\t tool_.initView(view);\n\t view.fireEvent('toolchanged', view, tool_);\n\t // When adding a new tool, clear the selection\n\t if (tool_.type !== 'View') {\n\t view.selectedFigures.clear();\n\t }\n\t _this7.redraw();\n\t if (_this7.render$) {\n\t _this7.render$(); // hack for the moment\n\t }\n\t };\n\t\n\t var ft = this.tool;\n\t if (!ft || view._stackViewTools && tool_.type === 'View' || tools.length === 1 /* only the select tool */) {\n\t addNewTool();\n\t } else {\n\t (0, _gear.resolve)(ft.commit$()).then(addNewTool);\n\t }\n\t },\n\t\n\t popTool: function () {\n\t var view = this.view,\n\t tools = this._tools;\n\t if (tools.length > 0) {\n\t\n\t // Commit the tool if it is not stopped\n\t var t = (0, _lodash.last)(tools);\n\t if (!t._stopped) {\n\t return t.commit$();\n\t }\n\t tools.pop().dispose();\n\t\n\t this.toolhelp(null);\n\t var tool = this.tool;\n\t\n\t if (tool) {\n\t tool.wakeup();\n\t }\n\t view.fireEvent('toolchanged', view, tool);\n\t this.redraw();\n\t\n\t // [TODO] Why is this render$ needed?\n\t return view.render$ ? view.render$() : null; // hack for the moment\n\t }\n\t },\n\t draw: function (config) {\n\t this.callParent(config);\n\t var tool = this.tool;\n\t\n\t if (tool && !tool._sleeping) {\n\t tool.draw(config);\n\t }\n\t },\n\t has_try_pointerdown: function () {\n\t var tool = this.tool;\n\t\n\t if (tool && !tool._sleeping) {\n\t return tool.try_pointerdown;\n\t }\n\t },\n\t try_pointerdown: function (event) {\n\t this.tool.try_pointerdown(event);\n\t if (event.stopped) {\n\t this._trackPointer = true;\n\t }\n\t },\n\t has_try_contextmenu: function () {\n\t var tool = this.tool;\n\t\n\t if (tool && !tool._sleeping) {\n\t return tool.try_contextmenu;\n\t }\n\t },\n\t\n\t\n\t /* [TODO] ?\r\n\t try_pointerup( event ) {\r\n\t const { tool } = this;\r\n\t if( tool && ! tool._sleeping ) {\r\n\t tool.try_pointerup(event);\r\n\t }\r\n\t },\r\n\t */\n\t has_try_click: function () {\n\t var tool = this.tool;\n\t\n\t if (tool && !tool._sleeping) {\n\t return tool.try_click;\n\t }\n\t },\n\t try_click: function (event) {\n\t this.tool.try_click(event);\n\t },\n\t has_try_dblclick: function () {\n\t var tool = this.tool;\n\t\n\t if (tool && !tool._sleeping) {\n\t return tool.try_dblclick;\n\t }\n\t },\n\t try_dblclick: function (event) {\n\t this.tool.try_dblclick(event);\n\t },\n\t on_domEvent: function (_ref) {\n\t var event = _ref.event;\n\t var type = _ref.type;\n\t var route = _ref.route;\n\t\n\t\n\t // Avoid initial 'pointermove' and 'pointerup' events in case the tool was\n\t // added in a 'pointerdown' event that was consumed\n\t if (type === 'pointerdown') {\n\t this._trackPointer = true;\n\t } else if ((type === 'pointermove' || type === 'pointerup') && !this._trackPointer) {\n\t return;\n\t }\n\t\n\t var tool = this.tool;\n\t\n\t if (tool && !tool._sleeping) {\n\t if (tool[route]) {\n\t tool[route](event);\n\t }\n\t }\n\t },\n\t somethingToDraw: function () {\n\t var tool = this.tool;\n\t\n\t return tool ? tool.somethingToDraw() : false;\n\t },\n\t needsToDrawFor: function (docIsland) {\n\t var tool = this.tool;\n\t\n\t return tool ? tool.needsToDrawFor(docIsland) : true;\n\t }\n\t});\n\n/***/ },\n\n/***/ 89:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.Composition = exports.CompositionLayer = undefined;\n\t\n\tvar _config = __webpack_require__(2);\n\t\n\tvar _lodash = __webpack_require__(4);\n\t\n\tvar _gear = __webpack_require__(8);\n\t\n\tvar _cdl = __webpack_require__(15);\n\t\n\tvar _util = __webpack_require__(85);\n\t\n\tvar CompositionLayer = exports.CompositionLayer = _gear.OwnedObject.extend({ typeName: 'CompositionLayer',\n\t\n\t Properties: {\n\t\n\t canvas: { type: 'canvas', owned: false, def: null },\n\t\n\t autoClear: { type: 'boolean', def: true },\n\t needsRedraw: { type: 'boolean', def: true },\n\t needsBatchRedraw: { type: 'boolean', def: true },\n\t name: { type: 'string', def: 'document' }\n\t }\n\t\n\t});\n\t\n\tvar Composition = exports.Composition = _gear.OwnedObject.extend({ typeName: 'Composition',\n\t\n\t Properties: {\n\t\n\t layers: { type: 'CompositionLayer[]', def: [], onChange: function (added, removed) {\n\t if (!added && !removed) {\n\t this.updateLayersOrder();\n\t }\n\t }\n\t },\n\t\n\t // document color, normal, specular\n\t textureType: { type: 'string', def: 'color' },\n\t\n\t // Also include webGL, tools and annotation layers\n\t main: { type: 'boolean', def: false }\n\t },\n\t\n\t getDrawToLayers: function (plugin) {\n\t var textureLayers = plugin['drawTo_' + this.textureType] || [];\n\t return this.main ? textureLayers.concat(plugin.drawTo) : textureLayers;\n\t },\n\t clone: function () {\n\t return new Composition(this);\n\t },\n\t init: function () {\n\t this.layer = {};\n\t this.container = null;\n\t this.layersContainer = null;\n\t },\n\t addLayersFor: function (plugin) {\n\t var _this = this;\n\t\n\t (0, _lodash.forEach)(this.getDrawToLayers(plugin), function (name, zOrder) {\n\t plugin.initLayer(_this.addLayer(name, zOrder));\n\t });\n\t },\n\t addLayer: function (name, zOrder) {\n\t var layer = this.layer[name];\n\t if (layer) {\n\t return layer; // Already added\n\t }\n\t\n\t layer = this.layer[name] = this.createLayer(name, zOrder);\n\t\n\t this.layers.add(layer);\n\t\n\t return layer;\n\t },\n\t createCanvas: function () /* name */{\n\t return _config.Helper.createCanvas(this.width, this.height);\n\t },\n\t createLayer: function (name) {\n\t\n\t var layer = new CompositionLayer({ name: name,\n\t canvas: this.createCanvas(name)\n\t });\n\t\n\t // In initialization delay canvas creation until initScene is issued\n\t var layersContainer = this.layersContainer;\n\t\n\t if (layersContainer && layer.canvas) {\n\t layersContainer.appendChild(layer.canvas);\n\t }\n\t\n\t return layer;\n\t },\n\t\n\t\n\t get width() {\n\t return this._owner.width;\n\t },\n\t get height() {\n\t return this._owner.height;\n\t },\n\t\n\t updateSize: function (width, height) {\n\t (0, _lodash.forEach)(this.layers, function (layer) {\n\t if (layer.canvas) {\n\t (0, _lodash.assign)(layer.canvas, { width: width, height: height });\n\t }\n\t });\n\t },\n\t needsBatchRedraw: function (name, state) {\n\t var layer = this.layer[name];\n\t if (!layer) {\n\t // scene.log(`Composition Layer ${name} doesn't exist`);\n\t return false;\n\t }\n\t if (state === undefined) {\n\t return layer.needsBatchRedraw;\n\t } else {\n\t layer.needsBatchRedraw = state;\n\t // scene.log(`... batch redraw ${name}`)\n\t return this;\n\t }\n\t },\n\t needsRedraw: function (name, state) {\n\t var layer = this.layer[name];\n\t if (!layer) {\n\t // scene.log(`Composition Layer ${name} doesn't exist`);\n\t return false;\n\t }\n\t if (state === undefined) {\n\t return layer.needsRedraw;\n\t } else {\n\t layer.needsRedraw = state;\n\t // scene.log(`... redraw ${name}`)\n\t return this;\n\t }\n\t },\n\t redrawAll: function () {\n\t (0, _gear.setForEach)(this.layers, 'needsRedraw', true);\n\t },\n\t canvas: function (layer) {\n\t return this.layer[layer].canvas;\n\t },\n\t getContext: function (layer, type) {\n\t return this.canvas(layer).getContext(type);\n\t },\n\t drawPlugin2D: function (view, plugin, name, config) {\n\t var specializedFunc = 'draw_' + name;\n\t if (plugin[specializedFunc]) {\n\t plugin[specializedFunc](config);\n\t } else {\n\t plugin.draw(config);\n\t }\n\t },\n\t drawPlugin: function (view, plugin, name, context) {\n\t var target = plugin.target;\n\t\n\t\n\t var config = (0, _lodash.assign)({ view: view, context: context }, view.drawConfig());\n\t\n\t if (target === 'view') {\n\t // The plugin will just use view coordinates ( HUD )\n\t this.drawPlugin2D(view, plugin, name, (0, _lodash.assign)({\n\t transform: new _cdl.Matrix()\n\t }, config));\n\t } else {\n\t var transformModel = view.getViewPortTransform();\n\t\n\t if (target === 'model') {\n\t this.drawPlugin2D(view, plugin, name, (0, _lodash.assign)({\n\t transformModel: transformModel,\n\t transform: transformModel\n\t }, config));\n\t } else {\n\t // target document\n\t\n\t this.drawPlugin2D(view, plugin, name, (0, _lodash.assign)({\n\t transformModel: transformModel,\n\t transformDoc: transformModel,\n\t transform: transformModel\n\t }, config));\n\t }\n\t }\n\t },\n\t drawPlugins: function (view, plugins) {\n\t\n\t for (var k = 0, kEnd = plugins.length; k < kEnd; ++k) {\n\t var plugin = plugins[k];\n\t if (plugin.visible) {\n\t\n\t var layersToDraw = this.getDrawToLayers(plugin);\n\t for (var n = 0, nEnd = layersToDraw.length; n < nEnd; ++n) {\n\t var name = layersToDraw[n];\n\t var layer = this.layer[name];\n\t\n\t if (layer.needsRedraw || layer.needsBatchRedraw) {\n\t var context = layer.canvas.getContext('2d');\n\t this.drawPlugin(view, plugin, name, context);\n\t }\n\t }\n\t }\n\t }\n\t },\n\t shouldRedraw: function () {\n\t return !!(0, _lodash.find)(this.layers, 'needsRedraw');\n\t },\n\t draw: function (view, plugins) {\n\t\n\t (0, _lodash.forEach)(this.layers, clearLayerIfNeeded);\n\t\n\t this.drawPlugins(view, plugins);\n\t\n\t this.clearLayersRedrawFlags();\n\t },\n\t clearLayersRedrawFlags: function () {\n\t (0, _lodash.forEach)(this.layers, cleanRedrawFlags);\n\t },\n\t\n\t\n\t // DOM manipulation, unused in node\n\t\n\t updateLayersOrder: function () {\n\t if (this.layersContainer) {\n\t (0, _lodash.forEach)(this.layers, function (layer, n) {\n\t if (layer.canvas) {\n\t layer.canvas.style['z-index'] = n;\n\t }\n\t });\n\t }\n\t },\n\t dispose: function () {\n\t this.remove();\n\t },\n\t remove: function () {\n\t if (this.container) {\n\t this.container.removeChild(this.layersContainer);\n\t }\n\t this.layersContainer = null;\n\t this.container = null;\n\t },\n\t appendTo: function (container) {\n\t var id = arguments.length <= 1 || arguments[1] === undefined ? container.id : arguments[1];\n\t\n\t\n\t this.container = container;\n\t\n\t var layersContainer = this.layersContainer = (0, _util.createDomContainer)(id && id + '_scene');\n\t\n\t (0, _lodash.forEach)(this.layers, function (layer) {\n\t var canvas = layer.canvas;\n\t\n\t if (canvas) {\n\t layersContainer.appendChild(canvas);\n\t\n\t if (id) {\n\t canvas.id = id + '_' + layer.name;\n\t }\n\t\n\t (0, _lodash.assign)(canvas.style, {\n\t position: 'absolute',\n\t top: 0,\n\t left: 0\n\t });\n\t }\n\t });\n\t\n\t container.appendChild(layersContainer);\n\t\n\t return this;\n\t }\n\t});\n\t\n\tfunction clearLayerIfNeeded(layer) {\n\t if (layer.autoClear && (layer.needsRedraw || layer.needsBatchRedraw)) {\n\t (0, _gear.clearCanvas)(layer.canvas);\n\t }\n\t}\n\t\n\tfunction cleanRedrawFlags(layer) {\n\t layer.needsRedraw = false;\n\t layer.needsBatchRedraw = false;\n\t}\n\n/***/ },\n\n/***/ 90:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.TextureTile = exports.TextureComposition = undefined;\n\t\n\tvar _config = __webpack_require__(2);\n\t\n\tvar _gear = __webpack_require__(8);\n\t\n\tvar _cdl = __webpack_require__(15);\n\t\n\tvar _plugin = __webpack_require__(87);\n\t\n\tvar _composition = __webpack_require__(89);\n\t\n\tfunction nextPowerOf2(N) {\n\t var size = 256;\n\t while (size < N) {\n\t size *= 2;\n\t }\n\t return size;\n\t}\n\t\n\t// Creates a THREE.WebGLRenderer in the '3D' layer of the composition\n\t// Forwards drawing calls to the view.draw3D(renderer) function\n\t\n\t/* globals THREE */\n\t\n\t_plugin.Plugin.Renderer3D = _plugin.Plugin.extend({ typeName: 'Renderer3D',\n\t\n\t name: 'renderer',\n\t target: 'view',\n\t\n\t Properties: {\n\t preserveDrawingBuffer: { type: 'boolean', def: true }\n\t },\n\t drawTo: ['3D'],\n\t\n\t redrawFigure: function () {\n\t // [TODO]\n\t this.redraw('3D');\n\t },\n\t initLayer: function (layer) {\n\t layer.autoClear = false;\n\t\n\t // Create a Three.js renderer that will render to the 3D scene layer\n\t var renderer = this.renderer = new THREE.WebGLRenderer({ canvas: layer.canvas,\n\t preserveDrawingBuffer: this.preserveDrawingBuffer,\n\t alpha: true, antialias: true\n\t });\n\t renderer.setPixelRatio(_config.Config.useDevicePixelRatio ? window.devicePixelRatio : 1);\n\t },\n\t updateSize: function (width, height) {\n\t this.renderer.setSize(width, height);\n\t },\n\t draw: function (_ref) {\n\t var view = _ref.view;\n\t\n\t view.draw3D(this.renderer);\n\t }\n\t});\n\t\n\tfunction fillDefaultTextureMapContext(view, textureType, context) {\n\t switch (textureType) {\n\t\n\t case 'normal':\n\t context.fillStyle = '#7F7FFF';\n\t (0, _gear.fillContext)(context);\n\t break;\n\t\n\t case 'specular':\n\t case 'bump':\n\t case 'displacement':\n\t context.fillStyle = '#7F7F7F';\n\t (0, _gear.fillContext)(context);\n\t break;\n\t\n\t case 'alpha':\n\t context.fillStyle = '#FFFFFF';\n\t (0, _gear.fillContext)(context);\n\t break;\n\t\n\t case 'color':\n\t view.fillWithBackgroundColor(context, _cdl.Color.White());\n\t }\n\t}\n\t\n\t_plugin.Plugin.TextureMap = _plugin.Plugin.extend({ typeName: 'TextureMapPlugin',\n\t\n\t target: 'model',\n\t\n\t Properties: {\n\t textureSize: { type: 'integer', def: 2048 },\n\t textureType: { type: 'string', def: 'normal' }\n\t },\n\t\n\t get layerName() {\n\t return this.textureType + 'Background';\n\t },\n\t\n\t init: function (config) {\n\t var textureType = this.textureType;\n\t\n\t this['drawTo_' + textureType] = [this.layerName];\n\t this.callParent(config);\n\t },\n\t initPlugin: function (view) {\n\t this.updateMap();\n\t view.on({\n\t 'model3dchanged': this.updateMap\n\t }, this);\n\t },\n\t updateMap: function () {\n\t var _this = this;\n\t\n\t var view = this.view;\n\t\n\t var textureMap = view.getFixedTextureMap(this.textureType);\n\t if (textureMap && textureMap.wrap === 'Stretch') {\n\t textureMap.loadImage$(this.textureSize).then(function (image) {\n\t _this.image = image;\n\t // console.log('texture loaded');\n\t view.redraw(_this.layerName); // [TODO] redraw() should also invalidate drawTo_xxx\n\t });\n\t } else {\n\t if (this.image) {\n\t this.image = null;\n\t view.redraw(this.layerName); // [TODO] redraw() should also invalidate drawTo_xxx\n\t }\n\t }\n\t },\n\t draw: function (_ref2) {\n\t var view = _ref2.view;\n\t var context = _ref2.context;\n\t var transform = _ref2.transform;\n\t\n\t context.save();\n\t var image = this.image;\n\t\n\t if (image) {\n\t // console.log('draw '+this.textureType+' with image');\n\t if (!transform.isIdentity()) {\n\t transform.transformContext(context);\n\t }\n\t var scale = view.model.textureWidth / this.textureSize;\n\t var imageMatrix = _cdl.Matrix.multiply(_cdl.Matrix.scale(scale, -scale), _cdl.Matrix.translate(0, -image.height));\n\t imageMatrix.transformContext(context);\n\t context.drawImage(image, 0, 0);\n\t } else {\n\t\n\t // console.log('draw '+this.textureType+' with solid color');\n\t fillDefaultTextureMapContext(view, this.textureType, context);\n\t }\n\t context.restore();\n\t }\n\t});\n\t\n\tfunction createTexture(canvas) {\n\t var texture = new THREE.Texture(canvas);\n\t texture.needsUpdate = true;\n\t return texture;\n\t}\n\t\n\t/*\r\n\tfunction createQuadRTT( plane, canvas, zOrder ) {\r\n\t\r\n\t const texture = new THREE.Texture( canvas );\r\n\t texture.needsUpdate = true;\r\n\t\r\n\t const material = new THREE.MeshBasicMaterial({ color: 0xffffff, map: texture });\r\n\t\r\n\t const quad = new THREE.Mesh( plane, material );\r\n\t quad.position.z = 100 * zOrder;\r\n\t\r\n\t return { quad, material, texture };\r\n\t}\r\n\t*/\n\t\n\tvar TextureComposition = exports.TextureComposition = _composition.Composition.extend({ typeName: 'TextureComposition',\n\t\n\t // Force all drawing to be done in the 'document' layer\n\t // Ignore needsRedraw, everything is redrawn at every draw request\n\t // The idea when this abstraction was built was that it will be better to\n\t // use layers and GPU buffer, but the CPU => GPU transfer of the image is\n\t // really slow, so we will forced to work in a completely different way\n\t // [TODO] Do not extend from Composition anymore?\n\t //===========================================================================================\n\t\n\t createCanvas: function (name) {\n\t if (!this.composedCanvas) {\n\t var composedCanvas = this.composedCanvas = this.callParent(name);\n\t return composedCanvas;\n\t }\n\t },\n\t clearComposedCanvas: function () {\n\t var composedCanvas = this.composedCanvas;\n\t\n\t if (composedCanvas) {\n\t (0, _gear.clearCanvas)(composedCanvas);\n\t }\n\t },\n\t draw: function (view, plugins) {\n\t\n\t /*\r\n\t let layers = '';\r\n\t forEach( this._layers, layer => {\r\n\t if( layer.needsRedraw ) {\r\n\t layers += layer.name + ' ';\r\n\t }\r\n\t });\r\n\t console.log(layers);\r\n\t */\n\t\n\t this.clearComposedCanvas();\n\t\n\t this.drawPlugins(view, plugins);\n\t\n\t this.clearLayersRedrawFlags();\n\t\n\t var _threeTexture = this._threeTexture;\n\t\n\t if (_threeTexture) {\n\t _threeTexture.needsUpdate = true;\n\t }\n\t },\n\t drawPlugins: function (view, plugins) {\n\t var composedCanvas = this.composedCanvas;\n\t var context = composedCanvas.getContext('2d');\n\t\n\t for (var k = 0, kEnd = plugins.length; k < kEnd; ++k) {\n\t var plugin = plugins[k];\n\t if (plugin.visible) {\n\t var drawToLayers = this.getDrawToLayers(plugin);\n\t\n\t for (var l = 0, lEnd = drawToLayers.length; l < lEnd; ++l) {\n\t var name = drawToLayers[l];\n\t // const layer = this.layer[name];\n\t this.drawPlugin(view, plugin, name, context);\n\t }\n\t }\n\t }\n\t },\n\t\n\t\n\t get threeTexture() {\n\t // return ( this._threeTexture = createTexture( this.composedCanvas ) );\n\t\n\t var threeTexture = this._threeTexture;\n\t if (!this._threeTexture) {\n\t threeTexture = this._threeTexture = createTexture(this.composedCanvas);\n\t }\n\t return threeTexture;\n\t },\n\t\n\t updateSize: function (width, height) {\n\t this.callParent(nextPowerOf2(width), nextPowerOf2(height));\n\t }\n\t}\n\t\n\t//===========================================================================================\n\t\n\t// [TODO]\n\t// Use WebGLRenderTarget to directly create a GPU buffer texture\n\t\n\t/*\r\n\tinit(...params) {\r\n\t this.sceneRTT = new THREE.Scene();\r\n\t this.planeRTT = new THREE.PlaneBufferGeometry( 512, 512 ); // PlaneBufferGeometry\r\n\t this.callParent(...params);\r\n\t},\r\n\t initRTT( width, height ) {\r\n\t const { sceneRTT } = this;\r\n\t this.textureRTT = new THREE.WebGLRenderTarget( width, height, {\r\n\t minFilter: THREE.LinearFilter,\r\n\t magFilter: THREE.NearestFilter,\r\n\t format: THREE.RGBFormat\r\n\t });\r\n\t this.cameraRTT = new THREE.OrthographicCamera( width / - 2, width / 2, height / 2, height / - 2, -10000, 10000 );\r\n\t this.cameraRTT.position.z = 1000;\r\n\t const light = new THREE.DirectionalLight( 0xffffff );\r\n\t\tlight.position.set( 0, 0, 1 ).normalize();\r\n\t\tsceneRTT.add( light );\r\n\t const composedCanvas = this.composedCanvas = Helper.createCanvas(width,height);\r\n\t const rendererRTT = this.rendererRTT = new THREE.WebGLRenderer({\r\n\t canvas: composedCanvas,\r\n\t preserveDrawingBuffer: this.preserveDrawingBuffer,\r\n\t alpha: true, antialias: true\r\n\t });\r\n\t rendererRTT.setPixelRatio( window.devicePixelRatio );\r\n\t rendererRTT.setSize(width,height);\r\n\t},\r\n\t updateSize( width, height ) {\r\n\t console.log(`resizing ${width} - ${height}`);\r\n\t this.callParent(width,height);\r\n\t if( !this._owner.canvas3D ) {\r\n\t return;\r\n\t }\r\n\t if( ! this.rendererRTT ){\r\n\t this.initRTT(width,height);\r\n\t }\r\n\t console.log('resizing');\r\n\t const { composedCanvas, textureRTT, rendererRTT, cameraRTT, sceneRTT } = this;\r\n\t textureRTT.setSize(width,height);\r\n\t rendererRTT.setSize(width,height);\r\n\t composedCanvas.width = width;\r\n\t composedCanvas.height = height;\r\n\t cameraRTT.left = width / - 2;\r\n\t cameraRTT.right = width / 2;\r\n\t cameraRTT.top = height / 2;\r\n\t cameraRTT.bottom = height / - 2;\r\n\t cameraRTT.updateProjectionMatrix();\r\n\t // Replace the old Plane with a new one with the correct size,\r\n\t // [TODO] check how to resize, maybe do not use buffer geometry\r\n\t const planeRTT = this.planeRTT = new THREE.PlaneBufferGeometry( width, height );\r\n\t forEach( this.layers, ({ rtt }) => {\r\n\t const oldQuad = rtt.quad;\r\n\t const zOrder = oldQuad.position.z; // [TODO] add layer.zOrder\r\n\t sceneRTT.remove(oldQuad);\r\n\t const quad = rtt.quad = new THREE.Mesh( planeRTT, rtt.material );\r\n\t quad.position.z = 100 * zOrder;\r\n\t sceneRTT.add(quad);\r\n\t });\r\n\t },\r\n\t createLayer( name, zOrder ) {\r\n\t const layer = this.callParent(name,zOrder);\r\n\t const rtt = layer.rtt = createQuadRTT( this.planeRTT, layer.canvas, zOrder );\r\n\t this.sceneRTT.add( rtt.quad );\r\n\t return layer;\r\n\t},\r\n\t draw( view, plugins ) {\r\n\t let updateTexture = false;\r\n\t if( this._owner.canvas3D ) {\r\n\t forEach( this.layers, layer => {\r\n\t if( layer.needsRedraw ) {\r\n\t layer.rtt.texture.needsUpdate = true;\r\n\t layer.rtt.material.needsUpdate = true;\r\n\t updateTexture = true;\r\n\t }\r\n\t });\r\n\t }\r\n\t this.callParent(view,plugins);\r\n\t if( updateTexture ) {\r\n\t console.log('rendering');\r\n\t this.rendererRTT.render(this.sceneRTT,this.cameraRTT); // [TODO], this.textureRTT, true );\r\n\t }\r\n\t},\r\n\t get threeTexture() {\r\n\t return createTexture(this.composedCanvas);// this.textureRTT;\r\n\t},\r\n\t*/\n\t\n\t);\n\t\n\tvar TextureTile = exports.TextureTile = function (view, textureType, textureMap) {\n\t var _this2 = this;\n\t\n\t // Temporal canvas to avoid render glitches\n\t var waitingCanvas = _config.Helper.createCanvas(256, 256);\n\t var context = waitingCanvas.getContext('2d');\n\t fillDefaultTextureMapContext(view, textureType, context);\n\t\n\t this.threeTexture = new window.THREE.Texture(waitingCanvas);\n\t this.threeTexture.needsUpdate = true;\n\t this.id = textureMap.id;\n\t this.promise = textureMap.loadTextureTile$().then(function (image) {\n\t _this2.image = image;\n\t _this2.threeTexture.image = image;\n\t _this2.threeTexture.needsUpdate = true;\n\t view.fireEvent('drawcomplete');\n\t });\n\t};\n\tTextureTile.prototype = {\n\t ready$: function () {\n\t return this.promise;\n\t }\n\t};\n\n/***/ },\n\n/***/ 91:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.View = undefined;\n\texports.findByTextureType = findByTextureType;\n\t\n\tvar _lodash = __webpack_require__(4);\n\t\n\tvar _gear = __webpack_require__(8);\n\t\n\tvar _cdl = __webpack_require__(15);\n\t\n\tvar _util = __webpack_require__(85);\n\t\n\tvar _composition = __webpack_require__(89);\n\t\n\tvar Stats = function () {\n\t this.fps = 60;\n\t this.prevTime = 0;\n\t this.frames = 0;\n\t};\n\tStats.prototype.update = function () {\n\t var time = (0, _lodash.now)();\n\t this.frames++;\n\t if (time > this.prevTime + 1000) {\n\t this.fps = Math.round(this.frames * 1000 / (time - this.prevTime));\n\t\n\t this.prevTime = time;\n\t this.frames = 0;\n\t\n\t //console.log(this.fps);\n\t }\n\t};\n\t\n\tvar _viewCount = 0;\n\t\n\tvar View = exports.View = _gear.Base.extend({ typeName: 'View',\n\t\n\t Properties: {\n\t\n\t autoDraw: { type: 'boolean', def: true },\n\t\n\t enabled: { type: 'boolean', def: true },\n\t\n\t backgroundColor: { type: 'Color', def: null, onChange: function () {\n\t this.onBackgroundColorChange();\n\t }\n\t },\n\t\n\t // Main scene that will be shown to the user\n\t scene: { type: 'Composition', def: null }, // Initialized in the init() function\n\t\n\t // A scene could use textures (color, normal, bump, specular) and combine them using WebGL\n\t // Each texture is a composition (background, document, foreground, plugins)\n\t textures: { type: 'Composition[]', def: [] },\n\t\n\t // Plugins defines the layers that should be created (both in the main scene and the textures)\n\t // and handle events respecting their z-order.\n\t plugins: { type: 'Plugin[]', def: [], owned: false, onChange: function (added, removed) {\n\t var _this = this;\n\t\n\t if (added) {\n\t (0, _lodash.forEach)(added, function (plugin) {\n\t return _this.linkPlugin(plugin);\n\t });\n\t }\n\t if (removed) {\n\t (0, _lodash.forEach)(removed, function (plugin) {\n\t return _this.disposePlugin(plugin);\n\t });\n\t }\n\t }\n\t },\n\t\n\t width: { type: 'number', def: 512, set: function (v) {\n\t this.updateSize(v, this.height);\n\t }\n\t },\n\t\n\t height: { type: 'number', def: 512, set: function (v) {\n\t this.updateSize(this.width, v);\n\t }\n\t },\n\t\n\t // Access point used by apps to identify the component Canvas is rendered to\n\t // For example, the Ext.js component\n\t widget: { type: 'object', owned: false },\n\t\n\t debug: { type: 'object', owned: false, def: {} }\n\t },\n\t\n\t get compositions() {\n\t return this.textures.concat(this.scene);\n\t },\n\t\n\t get pageTopLeft() {\n\t // [PERFORMANCE]\n\t // We cache this, as it was forcing re-calculation of styles in firefox\n\t // There is a performance hit to do this while moving the mouse around\n\t // User should call view.updateSize() after repositioning\n\t var p = this._pageTopLeft;\n\t if (p) {\n\t return p.clone();\n\t } else {\n\t var rect = this.container.getBoundingClientRect();\n\t var body = window.document.body;\n\t\n\t return this._pageTopLeft = new _cdl.Point(rect.left + body.scrollLeft, rect.top + body.scrollTop);\n\t }\n\t },\n\t\n\t get clientTopLeft() {\n\t var rect = this.container.getBoundingClientRect();\n\t return new _cdl.Point(rect.left, rect.top);\n\t },\n\t\n\t get viewCenter() {\n\t return new _cdl.Point(this.width / 2, this.height / 2);\n\t },\n\t\n\t viewPoint: function (event) {\n\t var topLeft = this.pageTopLeft;\n\t return new _cdl.Point(event.pageX - topLeft.x, event.pageY - topLeft.y);\n\t },\n\t colorAtViewPoint: function (viewPoint) {\n\t // [TODO] extend to obtain the color of the foreground and background?\n\t var context = this.getContext('document', '2d'); // [TODO]\n\t return _cdl.Color.fromImageData(context.getImageData(viewPoint.x, viewPoint.y, 1, 1).data);\n\t },\n\t image: function (layer) {\n\t return this.canvas(layer).toDataURL();\n\t },\n\t batchRedraw: function () /* ...params */{\n\t for (var k = 0, kEnd = arguments.length; k < kEnd; ++k) {\n\t var name = arguments[k];\n\t this.needsBatchRedraw(name, true);\n\t }\n\t },\n\t redraw: function () /* ...params */{\n\t for (var k = 0, kEnd = arguments.length; k < kEnd; ++k) {\n\t var name = arguments[k];\n\t this.needsRedraw(name, true);\n\t }\n\t },\n\t drawDone: function () /* ...params */{\n\t for (var k = 0, kEnd = arguments.length; k < kEnd; ++k) {\n\t var name = arguments[k];\n\t this.needsRedraw(name, false);\n\t }\n\t },\n\t needsRedraw: function (name, state) {\n\t var compositions = this.compositions;\n\t\n\t for (var k = 0, kEnd = compositions.length; k < kEnd; ++k) {\n\t compositions[k].needsRedraw(name, state);\n\t }\n\t },\n\t needsBatchRedraw: function (name, state) {\n\t var compositions = this.compositions;\n\t\n\t for (var k = 0, kEnd = compositions.length; k < kEnd; ++k) {\n\t compositions[k].needsBatchRedraw(name, state);\n\t }\n\t },\n\t redrawAll: function () {\n\t var compositions = this.compositions;\n\t\n\t for (var k = 0, kEnd = compositions.length; k < kEnd; ++k) {\n\t compositions[k].redrawAll();\n\t }\n\t },\n\t canvas: function (layer) {\n\t return this.scene.canvas(layer || 'document');\n\t },\n\t getContext: function (layer, type) {\n\t return this.canvas(layer).getContext(type);\n\t },\n\t texture: function (textureType) {\n\t return findByTextureType(this.textures, textureType);\n\t },\n\t drawConfig: function () {\n\t return {};\n\t },\n\t pluginsToDraw: function () {\n\t return this._plugins;\n\t },\n\t figureTextureTypes: function () {\n\t return ['color'];\n\t },\n\t draw: function () {\n\t\n\t if (this.width === 0 || this.height === 0) {\n\t // Guard in case the view is not ready or has been collapsed\n\t return;\n\t }\n\t\n\t this.stats.update();\n\t\n\t var drawn = false;\n\t\n\t var compositions = this.compositions;\n\t\n\t for (var k = 0, kEnd = compositions.length; k < kEnd; ++k) {\n\t var composition = compositions[k];\n\t if (composition.shouldRedraw()) {\n\t composition.draw(this, this.pluginsToDraw(composition));\n\t drawn = true;\n\t }\n\t }\n\t\n\t if (drawn) {\n\t this.fireEvent('drawcomplete', this);\n\t }\n\t\n\t /*\r\n\t if( this.delayedEnabling && ! this.waitingEnabling ) {\r\n\t this.waitingEnabling = true;\r\n\t setTimeout( () => {\r\n\t const helper = this._eventsHelper;\r\n\t if( helper ) {\r\n\t helper.enabled = true;\r\n\t }\r\n\t this.waitingEnabling = false;\r\n\t this.delayedEnabling = false;\r\n\t console.log('wait');\r\n\t },0);\r\n\t }\r\n\t */\n\t },\n\t init: function (config) {\n\t\n\t this.addEvents('ready', 'resize', 'zoomupdated', 'drawcomplete');\n\t\n\t this.stats = new Stats();\n\t\n\t // DOM nodes, only if appended\n\t this.domElement = null; // Dom Element given by the app\n\t this.container = null; // Container where internals are appended\n\t this._pageTopLeft = null;\n\t\n\t this._internalId = ++_viewCount;\n\t this.disabledTemporally = 0;\n\t\n\t this.plugin = {};\n\t\n\t this.callParent(config);\n\t\n\t this.textures = this.createTextures(config);\n\t this.scene = this.createScene(config);\n\t\n\t this.linkPlugins();\n\t },\n\t\n\t\n\t // Allow each View to define their own Scene type, the default is a\n\t // simple Composition where all plugins are drawn\n\t createScene: function () {\n\t return new _composition.Composition({ main: true });\n\t },\n\t\n\t\n\t // Scenes can use WebGL surfaces that compose textures\n\t createTextures: function () {\n\t return [];\n\t },\n\t dispose: function () {\n\t (0, _lodash.invokeMap)(this.plugins, 'dispose');\n\t (0, _lodash.invokeMap)(this.compositions, 'dispose');\n\t if (this.container) {\n\t this.domElement.removeChild(this.container);\n\t }\n\t },\n\t pushDisabledTemporally: function () {\n\t this.disabledTemporally++;\n\t this.enabled = false;\n\t },\n\t popDisabledTemporally: function () {\n\t if (this.disabledTemporally > 0) {\n\t this.disabledTemporally--;\n\t if (this.disabledTemporally === 0) {\n\t this.enabled = true;\n\t }\n\t }\n\t },\n\t updateSize: function (width, height) {\n\t\n\t // Drop pageTopLeft cache\n\t this._pageTopLeft = null;\n\t\n\t if (!(width && height)) {\n\t\n\t if (this.container) {\n\t var rect = this.container.getBoundingClientRect();\n\t width = rect.width;\n\t height = rect.height;\n\t } else {\n\t width = 1024;\n\t height = 1024;\n\t }\n\t }\n\t\n\t if (this.width === width && this.height === height) {\n\t return false; // nothing to do...\n\t }\n\t\n\t this._width = width;\n\t this._height = height;\n\t\n\t this.redrawAll();\n\t\n\t // The textures and the scene are updated to the same size\n\t // A View3D uses an TextureView to make the size of textures\n\t // independent of the view size. We couls allow to textures\n\t // to have different sizes and maybe fusion TextureView as\n\t // a mixin in Canvas3D.\n\t (0, _lodash.forEach)(this.compositions, function (composition) {\n\t composition.updateSize(width, height);\n\t });\n\t\n\t (0, _lodash.forEach)(this.plugins, function (plugin) {\n\t plugin.updateSize(width, height);\n\t });\n\t\n\t this.postResize();\n\t this.fireResizeEvent();\n\t },\n\t\n\t\n\t // Hooks for derived views\n\t postResize: function () {\n\t // Resize is done, update camera and other params\n\t },\n\t fireResizeEvent: function () {\n\t this.fireEvent('resize', this, this.width, this.height);\n\t },\n\t\n\t\n\t // state\n\t //----------------------------------------------------------------------------\n\t // Returns a copy of the current view state, viewTransform, wireframe\n\t // and other properties are populated by each view\n\t\n\t getState: function () {\n\t var backgrondColor = this.backgrondColor;\n\t\n\t return {\n\t backgroundColor: backgrondColor ? backgrondColor.clone() : null\n\t };\n\t },\n\t setState: function (state) {\n\t var backgroundColor = state.backgroundColor;\n\t\n\t this.backgroundColor = backgroundColor ? backgroundColor.clone() : null;\n\t },\n\t\n\t\n\t get state() {\n\t return this.getState();\n\t },\n\t set state(s) {\n\t this.setState(s);\n\t },\n\t\n\t onBackgroundColorChange: function () {\n\t this.redraw('background');\n\t },\n\t fillWithBackgroundColor: function (context) {\n\t var def = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1];\n\t\n\t var backgroundColor = this._backgroundColor || def;\n\t if (backgroundColor) {\n\t context.save();\n\t context.fillStyle = backgroundColor.rgba;\n\t (0, _gear.fillContext)(context);\n\t context.restore();\n\t }\n\t },\n\t\n\t\n\t // Plugins\n\t //-----------------------------------------------------------------------------\n\t\n\t addPlugin: function (plugin) {\n\t this._plugins.add(plugin);\n\t },\n\t removePlugin: function (plugin) {\n\t this._plugins.remove(plugin);\n\t },\n\t linkPlugin: function (plugin) {\n\t var name = plugin.name;\n\t\n\t this.plugin[name] = plugin;\n\t this[name] = plugin;\n\t this.initPlugin(plugin);\n\t },\n\t initPlugin: function (plugin) {\n\t (0, _lodash.forEach)(this.compositions, function (composition) {\n\t composition.addLayersFor(plugin);\n\t });\n\t plugin.initView(this);\n\t },\n\t disposePlugin: function (plugin) {\n\t plugin.dispose();\n\t var name = plugin.name;\n\t\n\t delete this.plugin[name];\n\t delete this[name];\n\t },\n\t linkPlugins: function () {\n\t var _this2 = this;\n\t\n\t var plugins = this.plugins;\n\t\n\t this.insertViewPlugins(plugins);\n\t this.fixUpPlugins(plugins);\n\t\n\t (0, _lodash.forEach)(plugins, function (plugin) {\n\t if (!_this2.plugin[plugin.name]) {\n\t _this2.linkPlugin(plugin);\n\t }\n\t });\n\t },\n\t fixUpPlugins: function () /* plugins */{},\n\t\n\t\n\t // Append to DOM\n\t\n\t afterInit: function () {\n\t var config = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\t var appendTo = config.appendTo;\n\t\n\t if (appendTo) {\n\t this.appendTo(appendTo);\n\t }\n\t\n\t if (this.autoDraw) {\n\t _util.AnimationLoop.register(this.draw.bind(this));\n\t }\n\t },\n\t appendTo: function (domElement) {\n\t var id = arguments.length <= 1 || arguments[1] === undefined ? domElement.id : arguments[1];\n\t\n\t\n\t this.domElement = domElement;\n\t\n\t // Create a relative inner container to avoid touching the passed domElement\n\t // By doing this, we let Apps decide how to position the original domElement\n\t // using any position attribute\n\t\n\t var container = this.container = (0, _util.createDomContainer)(id && id + '_container');\n\t\n\t this.scene.appendTo(container, id);\n\t\n\t domElement.appendChild(container);\n\t\n\t this.updateSize();\n\t\n\t this.fireEvent('ready', this);\n\t },\n\t showTexture: function (texture) {\n\t texture.appendTo(this.scene.layersContainer);\n\t texture.layersContainer.style.opacity = 0.5;\n\t },\n\t\n\t\n\t // This should conceptually be in Interactive_Mixin, but it makes hard to work\n\t // because we want to place the Interactive_Mixin at the end to provide static\n\t // versions\n\t\n\t handlePluginDomEvent: function (plugin, event) {\n\t\n\t plugin.handleDomEvent(event);\n\t },\n\t on_domEvent: function (_ref) {\n\t var event = _ref.event;\n\t var route = _ref.route;\n\t\n\t\n\t if (!event.stopped) {\n\t var plugins = this._plugins;\n\t for (var k = plugins.length - 1; k >= 0 && !event.stopped; --k) {\n\t var plugin = plugins[k];\n\t // console.log(plugin.typeName);\n\t this.handlePluginDomEvent(plugin, event);\n\t }\n\t }\n\t\n\t if (event.stopped) {\n\t return; // stop propagation\n\t }\n\t\n\t if (this[route]) {\n\t this[route](event);\n\t }\n\t }\n\t});\n\t\n\tfunction findByTextureType(textures, textureType) {\n\t for (var k = 0, kEnd = textures.length; k < kEnd; ++k) {\n\t var texture = textures[k];\n\t if (texture.textureType === textureType) {\n\t return texture;\n\t }\n\t }\n\t}\n\n/***/ },\n\n/***/ 92:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.View2D_Mixin = exports.ViewTransform = undefined;\n\texports.pagePoint = pagePoint;\n\t\n\tvar _config = __webpack_require__(2);\n\t\n\tvar _lodash = __webpack_require__(4);\n\t\n\tvar _gear = __webpack_require__(8);\n\t\n\tvar _cdl = __webpack_require__(15);\n\t\n\tvar floor = Math.floor;\n\tvar ceil = Math.ceil;\n\tfunction pagePoint(event) {\n\t return new _cdl.Point(event.pageX, event.pageY);\n\t}\n\t\n\t// This functions are in sync with server side functions\n\t//---------------------------------------------------------------------------\n\tfunction scaledRenderBounds(bounds, scaleX, scaleY) {\n\t return new _cdl.Bounds(scaleX * (scaleX > 0 ? bounds.lx : bounds.hx), scaleY * (scaleY > 0 ? bounds.ly : bounds.hy), scaleX * (scaleX > 0 ? bounds.hx : bounds.lx), scaleY * (scaleY > 0 ? bounds.hy : bounds.ly));\n\t}\n\t\n\tfunction pixelWidenedRenderBounds(bounds) {\n\t return new _cdl.Bounds(floor(bounds.lx), floor(bounds.ly), ceil(bounds.hx) + 1, ceil(bounds.hy) + 1);\n\t}\n\t//---------------------------------------------------------------------------\n\t\n\t\n\tvar ViewTransform = exports.ViewTransform = _gear.Base.extend({ typeName: 'ViewTransform',\n\t\n\t init: function () {\n\t var zoom = arguments.length <= 0 || arguments[0] === undefined ? 1 : arguments[0];\n\t var center = arguments.length <= 1 || arguments[1] === undefined ? new _cdl.Point(0, 0) : arguments[1];\n\t\n\t this.zoom = zoom;\n\t this.center = center; // View coordinates\n\t },\n\t clone: function () {\n\t return new ViewTransform(this.zoom, this.center.clone());\n\t },\n\t matrixFor: function (view) {\n\t var offset = view.viewOffsetFor(this);\n\t return _cdl.Matrix.m(_cdl.Matrix.translate(offset.x, offset.y), _cdl.Matrix.scale(this.zoom, -this.zoom));\n\t },\n\t zoomAroundViewBounds: function (view, viewBounds, margin, fit) {\n\t var bounds = viewBounds.scalingTransformed(this.matrixFor(view));\n\t this.zoomAround(view, bounds, margin, fit);\n\t },\n\t\n\t\n\t // Bounds in model coordinates\n\t\n\t zoomAround: function (view, bounds, margin, fit) {\n\t var p = arguments[0];\n\t if (p && (0, _lodash.isPlainObject)(p)) {\n\t bounds = p.bounds;\n\t margin = p.margin;\n\t fit = p.fit;\n\t }\n\t\n\t if (margin === undefined) {\n\t margin = 0;\n\t }\n\t var docMargin = Math.abs(this.viewDeltaToDoc(view, margin));\n\t\n\t var currentBounds = view.boundsWith(this);\n\t\n\t var scaleWidth = (currentBounds.width - 2 * docMargin) / bounds.width;\n\t var scaleHeight = (currentBounds.height - 2 * docMargin) / bounds.height;\n\t\n\t if (scaleWidth <= 0 || scaleHeight <= 0) {\n\t // Guard against viewport inversion\n\t return this;\n\t }\n\t\n\t var scale = fit === 'Max' ? scaleWidth > scaleHeight ? scaleWidth : scaleHeight : scaleWidth < scaleHeight ? scaleWidth : scaleHeight;\n\t\n\t this.zoom *= scale;\n\t this.center = bounds.center;\n\t return this;\n\t },\n\t\n\t\n\t // Returns the point in the browser view.\n\t // @param {Object} point The point in the document.\n\t docToView: function (view, docPoint) {\n\t var offset = view.viewOffsetFor(this),\n\t zoom = this.zoom;\n\t return new _cdl.Point(zoom * docPoint.x + offset.x, -zoom * docPoint.y + offset.y);\n\t },\n\t viewToDoc: function (view, viewPoint) {\n\t var offset = view.viewOffsetFor(this),\n\t zoom = this.zoom;\n\t return new _cdl.Point((viewPoint.x - offset.x) / zoom, (viewPoint.y - offset.y) / -zoom);\n\t },\n\t docDeltaToView: function (view, docDelta) {\n\t return docDelta * this.zoom;\n\t },\n\t viewDeltaToDoc: function (view, viewDelta) {\n\t return viewDelta / this.zoom;\n\t }\n\t});\n\t\n\tvar View2D_Mixin = exports.View2D_Mixin = {\n\t\n\t get is2D() {\n\t return true;\n\t },\n\t\n\t getState: function () {\n\t var _viewTransform = this.viewTransform;\n\t var zoom = _viewTransform.zoom;\n\t var center = _viewTransform.center;\n\t\n\t return (0, _lodash.assign)(this.callParent(), { zoom: zoom, center: center });\n\t },\n\t setState: function (state) {\n\t this.callParent(state);\n\t var zoom = state.zoom;\n\t var center = state.center;\n\t\n\t this.zoom = zoom;\n\t this.center = center;\n\t },\n\t init: function () /* ...params */{\n\t this.viewTransform = new ViewTransform();\n\t this.callParent.apply(this, arguments);\n\t },\n\t\n\t\n\t get textureZoom() {\n\t return this.viewTransform.zoom;\n\t },\n\t\n\t getRenderArgs: function () {\n\t return { zoom: this.zoom, wireframe: this.wireframe };\n\t },\n\t zoomBy: function (delta) {\n\t var fireEvent = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1];\n\t var viewTransform = this.viewTransform;\n\t\n\t viewTransform.zoom += delta;\n\t if (fireEvent) {\n\t this.on_zoomupdated();\n\t }\n\t return this;\n\t },\n\t zoomIn: function (factor) {\n\t this.zoom *= factor;\n\t return this;\n\t },\n\t zoomOut: function (factor) {\n\t return this.zoomIn(1 / factor);\n\t },\n\t zoomAroundViewBounds: function (viewBounds, margin, fit) {\n\t this.viewTransform.zoomAroundViewBounds(this, viewBounds, margin, fit);\n\t this.on_zoomupdated();\n\t return this;\n\t },\n\t zoomAround: function (bounds, margin, fit) {\n\t this.viewTransform.zoomAround(this, bounds, margin, fit);\n\t this.on_zoomupdated();\n\t return this;\n\t },\n\t zoomTo: function (zoom, center) {\n\t if (center) {\n\t var viewTransform = this.viewTransform;\n\t\n\t viewTransform.zoom = zoom;\n\t viewTransform.center = center.clone();\n\t this.on_zoomupdated();\n\t } else {\n\t this.zoom = zoom;\n\t }\n\t },\n\t _defaultMargin: function () {\n\t return Math.min(this.width, this.height) / 10;\n\t },\n\t\n\t\n\t get zoom() {\n\t return this.viewTransform.zoom;\n\t },\n\t\n\t set zoom(zoom_) {\n\t var center = this.center.clone();\n\t var originalZoom = this.zoom;\n\t\n\t if (zoom_ > 0) {\n\t this.viewTransform.zoom = zoom_;\n\t if (_config.Config.keepLowerLeftCornerAsOrigin) {\n\t //If we want to keep the lower left as origin, then we need to fix position when zooming.\n\t var originalOffset = this.viewCenter.clone();\n\t originalOffset.x /= originalZoom;\n\t originalOffset.y /= originalZoom;\n\t\n\t var newOffset = this.viewCenter.clone();\n\t newOffset.x /= this.zoom;\n\t newOffset.y /= this.zoom;\n\t\n\t center.x = center.x - originalOffset.x + newOffset.x;\n\t center.y = center.y - originalOffset.y + newOffset.y;\n\t this.viewTransform.center = center.center;\n\t }\n\t this.on_zoomupdated();\n\t }\n\t },\n\t\n\t get center() {\n\t return this.viewTransform.center;\n\t },\n\t set center(c) {\n\t this.viewTransform.center = c.center;\n\t this.on_zoomupdated();\n\t },\n\t\n\t center$: function (c) {\n\t var _this = this;\n\t\n\t return _cdl.Figures.center$(c).then(function (center) {\n\t _this.center = center;\n\t });\n\t },\n\t getViewPortTransform: function () {\n\t return this.viewTransform.matrixFor(this);\n\t },\n\t on_zoomupdated: function () {\n\t this.redrawAll();\n\t this.fireEvent('zoomupdated', this, this.zoom);\n\t },\n\t docToView: function (docPoint) {\n\t return this.viewTransform.docToView(this, docPoint);\n\t },\n\t docDeltaToView: function (docDelta) {\n\t return this.viewTransform.docDeltaToView(this, docDelta);\n\t },\n\t\n\t\n\t // In a 3D View, the texture coordinates are different than\n\t // the view coordinates. This is used by tools and plugins\n\t // know how big they should draw handles for UI\n\t viewDeltaToTexture: function (viewDelta) {\n\t return viewDelta;\n\t },\n\t viewToDoc: function (viewPoint) {\n\t return this.viewTransform.viewToDoc(this, viewPoint);\n\t },\n\t viewDeltaToDoc: function (viewDelta) {\n\t return this.viewTransform.viewDeltaToDoc(this, viewDelta);\n\t },\n\t viewToModel: function (viewPoint) {\n\t return this.viewTransform.viewToDoc(this, viewPoint);\n\t },\n\t viewDeltaToModel: function (viewDelta) {\n\t return this.viewTransform.viewDeltaToDoc(this, viewDelta);\n\t },\n\t\n\t\n\t // In the TextureView, the model and document coordinates are different\n\t modelToDoc: function (modelPoint) {\n\t return modelPoint;\n\t },\n\t asFastOffset: function (offset) {\n\t return _cdl.Point.asFastOffset(offset, this.zoom);\n\t },\n\t\n\t\n\t // View Extent in Document Coordinates\n\t boundsWith: function (viewTransform) {\n\t var center = viewTransform.center;\n\t var zoom = viewTransform.zoom;\n\t\n\t return new _cdl.Bounds.around(center, this.width / zoom, this.height / zoom);\n\t },\n\t\n\t\n\t get bounds() {\n\t return this.boundsWith(this.viewTransform);\n\t },\n\t\n\t viewOffsetFor: function (viewTransform) {\n\t var zoom = viewTransform.zoom;\n\t var center = viewTransform.center;\n\t var viewCenter = this.viewCenter;\n\t\n\t\n\t var offset = new _cdl.Point(Math.round(viewCenter.x - center.x * zoom), Math.round(viewCenter.y - center.y * -zoom));\n\t return offset;\n\t },\n\t\n\t\n\t get viewOffset() {\n\t return this.viewOffsetFor(this.viewTransform);\n\t },\n\t\n\t // Transforms figure RenderInfo bounds rectangle in a browser view compatible Box.\n\t // This is only intended to be used to get the correct position of the images returned by\n\t // the server. In case you just need to convert bounds to the view use the function above\n\t // @param {Object} bounds : {lx,ly,hx,hy} >> box : {x,y,width,height}\n\t\n\t boundsToViewBox: function (bounds) {\n\t\n\t // This function works coherently with the transformation that the server\n\t // use to find the pixel box of the raster returned in the web service\n\t // RenderCacheFigure: the zoomed and y inverted version of the bounds of the\n\t // figure is integer widened.\n\t\n\t // The params that goes to the server are fixed with a certain resolution, we\n\t // need to use the same resolution to be able to obtain the same results here\n\t\n\t var zoom = this.zoom;\n\t var pixelsBounds = pixelWidenedRenderBounds(scaledRenderBounds(bounds, zoom, -zoom));\n\t\n\t var offset = this.viewOffset;\n\t\n\t return {\n\t x: pixelsBounds.lx + offset.x,\n\t y: pixelsBounds.ly + offset.y,\n\t width: pixelsBounds.width,\n\t height: pixelsBounds.height\n\t };\n\t },\n\t modelPoint: function (event) {\n\t return this.viewToModel(this.viewPoint(event));\n\t },\n\t docPoint: function (event) {\n\t return this.viewToDoc(this.viewPoint(event));\n\t }\n\t};\n\n/***/ },\n\n/***/ 93:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.GroupView = exports.FigureView = undefined;\n\t\n\tvar _lodash = __webpack_require__(4);\n\t\n\tvar _gear = __webpack_require__(8);\n\t\n\tvar _cdl = __webpack_require__(15);\n\t\n\tvar _representation = __webpack_require__(94);\n\t\n\tvar _serverRepresentation = __webpack_require__(95);\n\t\n\tvar hitTestViewDistance = 4;\n\t\n\tfunction withWireframe(config, wireframe) {\n\t return !config || wireframe && !config.wireframe ? (0, _lodash.defaults)({ wireframe: wireframe }, config) : config;\n\t}\n\t\n\tvar FigureView = exports.FigureView = _gear.Base.extend({ typeName: 'FigureView',\n\t\n\t init: function (view, figure) {\n\t this.view = view;\n\t this.figure = figure;\n\t this._wireframe = false;\n\t this.representation = new _representation.EmptyFigureRepresentation(view, figure);\n\t this.initEvents();\n\t },\n\t ready$: function () {\n\t return this.representation.ready$();\n\t },\n\t updateRepresentation: function () {\n\t var representation = this.representation;\n\t var view = this.view;\n\t var figure = this.figure;\n\t\n\t var representationType = this.figure.representationType();\n\t if (representation.type !== representationType) {\n\t //console.log(this.representation.type + ' > ' + representationType);\n\t var newRep = representationType === 'server' ? new _serverRepresentation.ServerFigureRepresentation(view, figure) : representationType === 'local' ? new _representation.LocalFigureRepresentation(view, figure) : new _representation.EmptyFigureRepresentation(view, figure);\n\t\n\t var masked = representation._masked;\n\t var wireframe = representation._wireframe;\n\t\n\t var newRepresentation = this.representation = newRep;\n\t\n\t if (masked) {\n\t newRepresentation.mask();\n\t }\n\t newRepresentation._wireframe = wireframe;\n\t\n\t return true;\n\t }\n\t return false;\n\t },\n\t draw: function (context, transform, config) {\n\t var clearBuffer = arguments.length <= 3 || arguments[3] === undefined ? false : arguments[3];\n\t var drawShowthroughMask = arguments.length <= 4 || arguments[4] === undefined ? false : arguments[4];\n\t\n\t if (!this.figure.hidden) {\n\t // [TODO] This should be in the renderer\n\t if (clearBuffer && this.representation.invalidateBuffer) {\n\t this.representation.invalidateBuffer();\n\t }\n\t config = withWireframe(config, this._wireframe);\n\t config.showthroughMask = drawShowthroughMask;\n\t this.representation.draw(context, transform, config);\n\t }\n\t },\n\t initEvents: function () {\n\t this.figure.on({\n\t 'rendercomplete': this.onRenderComplete,\n\t 'redrawneeded': this.onRedrawNeeded\n\t }, this);\n\t },\n\t onRenderComplete: function (response) {\n\t\n\t this.updateRepresentation();\n\t\n\t var invalidationState = response.broadcastInfo.viewsInvalidationState;\n\t\n\t var renderArgs = this.view.getRenderArgs();\n\t if (this._wireframe) {\n\t renderArgs.wireframe = true;\n\t }\n\t\n\t var viewPortTransform = this.view.getViewPortTransform().toMatrixString();\n\t var previousParams = this.previousParams;\n\t\n\t\n\t if (previousParams) {\n\t // We are using the same representation as before, check if the renderArgs have changed\n\t // and updgrade the event to invalidateRenderArgs so the figure is updated to reflect them\n\t if (previousParams.renderArgs.layercolor !== renderArgs.layerColor || previousParams.renderArgs.wireframe !== renderArgs.wireframe) {\n\t\n\t invalidationState = _cdl.InvalidationStates.upgrade('views', invalidationState, 'all');\n\t }\n\t if (previousParams.viewPortTransform !== viewPortTransform) {\n\t // This is triggered when the zoom, the pan offset or any other viewport geometry parameters are changed\n\t // g.log('ViewPort transform changed ' + viewPortTransform);\n\t invalidationState = _cdl.InvalidationStates.upgrade('views', invalidationState, 'viewport');\n\t }\n\t }\n\t\n\t this.previousParams = { renderArgs: renderArgs, viewPortTransform: viewPortTransform };\n\t\n\t // console.log('FigureView.update( ' + invalidationState + ' )');\n\t this.representation.update(invalidationState, response, viewPortTransform);\n\t },\n\t onRedrawNeeded: function () {\n\t this.view.redrawFigure(this.figure);\n\t },\n\t unlink: function () {\n\t this.figure.un(this);\n\t },\n\t dispose: function () {\n\t this.unlink();\n\t },\n\t wireframe: function (state) {\n\t if (state === undefined) {\n\t return this._wireframe;\n\t } else {\n\t this._wireframe = state;\n\t this.representation._wireframe = state;\n\t return this;\n\t }\n\t },\n\t mask: function () {\n\t this.representation.mask();\n\t },\n\t hideMask: function () {\n\t this.representation.hideMask();\n\t },\n\t hitTest: function (point) {\n\t var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\t\n\t if (!options.distance) {\n\t options.distance = this.view.viewDeltaToDoc(hitTestViewDistance);\n\t }\n\t return this.representation.hitTest(point, options);\n\t }\n\t});\n\t\n\t// ============================================================================================\n\t// move away\n\t\n\tvar GroupedFiguresView = _gear.Base.extend({ typeName: 'GroupedFiguresView',\n\t\n\t init: function (view, group) {\n\t this.view = view;\n\t this.figure = group;\n\t this._figureViews = (0, _lodash.map)(group.figures, function (figure) {\n\t return FigureView.create(view, figure);\n\t });\n\t this.initEvents();\n\t },\n\t ready$: function () {\n\t return (0, _gear.invokeMap$)(this._figureViews, 'ready$');\n\t },\n\t draw: function (context, transform, config) {\n\t var clearBuffer = arguments.length <= 3 || arguments[3] === undefined ? false : arguments[3];\n\t var drawShowthroughMask = arguments.length <= 4 || arguments[4] === undefined ? false : arguments[4];\n\t var figure = this.figure;\n\t\n\t if (figure._hidden) {\n\t return;\n\t }\n\t\n\t var figure_alpha = figure._alpha;\n\t var changeGlobalAlpha = figure_alpha !== 1;\n\t if (changeGlobalAlpha) {\n\t context.save();\n\t context.globalAlpha *= figure_alpha;\n\t }\n\t (0, _lodash.forEach)(this._figureViews, function (fv) {\n\t fv.draw(context, transform, config, clearBuffer, drawShowthroughMask);\n\t });\n\t\n\t if (changeGlobalAlpha) {\n\t context.restore();\n\t }\n\t },\n\t initEvents: function () {\n\t this.figure.on({\n\t 'serverinvalidate': this.onServerInvalidate,\n\t 'rendercomplete': this.onRenderComplete\n\t }, this);\n\t },\n\t onServerInvalidate: function () {},\n\t onRenderComplete: function () {},\n\t unlink: function () {\n\t this.figure.un(this);\n\t (0, _lodash.invokeMap)(this._figureViews, 'unlink');\n\t },\n\t dispose: function () {\n\t this.unlink();\n\t (0, _lodash.invokeMap)(this._figureViews, 'dispose');\n\t },\n\t mask: function () {\n\t (0, _lodash.invokeMap)(this._figureViews, 'mask');\n\t },\n\t hideMask: function () {\n\t (0, _lodash.invokeMap)(this._figureViews, 'hideMask');\n\t },\n\t wireframe: function (state) {\n\t var figureViews = this._figureViews;\n\t for (var k = 0, kEnd = figureViews.length; k < kEnd; ++k) {\n\t figureViews[k].wireframe = state;\n\t }\n\t },\n\t hitTest: function (point) {\n\t var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\t var view = this.view;\n\t var figure = this.figure;\n\t\n\t var minSize = view.viewDeltaToDoc(20),\n\t minSize2 = minSize * minSize;\n\t var frame = figure.globalFrame_();\n\t if (options.frameBased === undefined) options.frameBased = frame.width2 < minSize2 || frame.height2 < minSize2;\n\t if (!options.distance) {\n\t options.distance = this.view.viewDeltaToDoc(hitTestViewDistance);\n\t }\n\t return figure.hitTest(point, options) && (0, _lodash.some)(this._figureViews, function (fv) {\n\t return fv.hitTest(point, options);\n\t });\n\t }\n\t});\n\t\n\tvar GroupView = exports.GroupView = _gear.Base.extend({ typeName: 'GroupView',\n\t\n\t init: function (view, group) {\n\t this.view = view;\n\t this.figure = group;\n\t group.on({\n\t 'processingstarted': this.onProcessingStarted,\n\t 'rendercomplete': this.onRenderComplete,\n\t 'redrawneeded': this.onRedrawNeeded\n\t }, this);\n\t\n\t this._figureViewsToDispose = [];\n\t this._figureView = null;\n\t this._wireframe = false;\n\t this._updateViewType();\n\t },\n\t ready$: function () {\n\t return this._figureView.ready$();\n\t },\n\t draw: function (context, transform, config) {\n\t var clearBuffer = arguments.length <= 3 || arguments[3] === undefined ? false : arguments[3];\n\t var drawShowthroughMask = arguments.length <= 4 || arguments[4] === undefined ? false : arguments[4];\n\t\n\t this._figureView.draw(context, transform, withWireframe(config, this._wireframe), clearBuffer, drawShowthroughMask);\n\t },\n\t onProcessingStarted: function () {\n\t this._updateViewType();\n\t },\n\t onRenderComplete: function () {\n\t (0, _lodash.invokeMap)(this._figureViewsToDispose, 'dispose');\n\t this._figureViewsToDispose = [];\n\t },\n\t onRedrawNeeded: function () {\n\t this.view.redrawFigure(this.figure);\n\t },\n\t unlink: function () {\n\t this.figure.un(this);\n\t },\n\t dispose: function () {\n\t this.unlink();\n\t if (this._figureView) {\n\t this._figureView.dispose();\n\t }\n\t },\n\t mask: function () {\n\t this._figureView.mask();\n\t },\n\t hideMask: function () {\n\t this._figureView.hideMask();\n\t },\n\t wireframe: function (state) {\n\t if (state === undefined) {\n\t return this._wireframe;\n\t } else {\n\t this._wireframe = state;\n\t this._figureView.wireframe = state;\n\t return this;\n\t }\n\t },\n\t hitTest: function (point, options) {\n\t return this._figureView.hitTest(point, options);\n\t },\n\t _updateViewType: function () {\n\t var view = this.view;\n\t var figure = this.figure;\n\t var _figureView = this._figureView;\n\t\n\t\n\t var groupedFigures = figure._processor instanceof _cdl.GroupProcessor;\n\t\n\t if (groupedFigures) {\n\t if (!(_figureView instanceof GroupedFiguresView)) {\n\t if (_figureView) {\n\t _figureView.unlink();\n\t this._figureViewsToDispose.push(_figureView);\n\t }\n\t this._figureView = new GroupedFiguresView(view, figure);\n\t }\n\t } else {\n\t if (!(_figureView instanceof FigureView)) {\n\t if (_figureView) {\n\t _figureView.unlink();\n\t this._figureViewsToDispose.push(_figureView);\n\t }\n\t this._figureView = new FigureView(view, figure);\n\t }\n\t }\n\t }\n\t});\n\t\n\tFigureView.create = function (view, figure) {\n\t return figure.isGroup ? new GroupView(view, figure) : new FigureView(view, figure);\n\t};\n\n/***/ },\n\n/***/ 94:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.LocalFigureRepresentation = exports.EmptyFigureRepresentation = exports.FigureRepresentation = undefined;\n\t\n\tvar _lodash = __webpack_require__(4);\n\t\n\tvar _gear = __webpack_require__(8);\n\t\n\tvar _cdl = __webpack_require__(15);\n\t\n\tvar FigureRepresentation = exports.FigureRepresentation = _gear.Base.extend({ typeName: 'FigureRepresentation',\n\t type: 'unknown',\n\t init: function (view, figure) {\n\t this.rendered = false;\n\t this.view = view;\n\t this.figure = figure;\n\t this._masked = false;\n\t this._wireframe = false;\n\t this._previewing = false;\n\t },\n\t ready$: function () {\n\t return (0, _gear.resolve)();\n\t },\n\t mask: function () {\n\t this._masked = true;\n\t },\n\t hideMask: function () {\n\t this._masked = false;\n\t },\n\t boundsToViewBox: function () {\n\t var bounds = this.figure.globalBounds_();\n\t return this.view.boundsToViewBox(bounds);\n\t },\n\t hitTest: function (point) {\n\t var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\t var temporalRep = this.temporalRep;\n\t var view = this.view;\n\t var figure = this.figure;\n\t\n\t if (temporalRep) {\n\t return temporalRep.hitTest(point, options);\n\t }\n\t var minSize = view.viewDeltaToDoc(20),\n\t minSize2 = minSize * minSize;\n\t var frame = figure.globalFrame_();\n\t if (options.frameBased === undefined) options.frameBased = frame.width2 < minSize2 || frame.height2 < minSize2;\n\t return figure.hitTest(point, options);\n\t }\n\t});\n\t\n\tvar EmptyFigureRepresentation = exports.EmptyFigureRepresentation = FigureRepresentation.extend({ typeName: 'EmptyFigureRepresentation',\n\t type: 'empty',\n\t draw: function () {},\n\t update: function () {}\n\t});\n\t\n\tvar LocalFigureRepresentation = exports.LocalFigureRepresentation = FigureRepresentation.extend({ typeName: 'LocalFigureRepresentation',\n\t type: 'local',\n\t\n\t init: function (view, figure) {\n\t this.callParent(view, figure);\n\t this.buffers = null;\n\t this._preRendered = false;\n\t },\n\t draw: function (context, transform, config) {\n\t var figure = this.figure;\n\t var rendered = this.rendered;\n\t\n\t\n\t if (rendered) {\n\t context.save();\n\t\n\t this._lastMasked = this._masked;\n\t if (this._masked) {\n\t context.globalAlpha *= 0.5;\n\t }\n\t\n\t if (this._preRendered && this.buffers) {\n\t\n\t var figureAlpha = figure._alpha;\n\t if (figureAlpha !== 1) {\n\t context.globalAlpha *= figureAlpha;\n\t }\n\t\n\t var box = this._bufferBox,\n\t matrix = _cdl.Matrix.concat(transform, figure.globalMatrix_(), this._invBufferTransform);\n\t\n\t matrix.transformContext(context);\n\t\n\t context.drawImage(this.buffers.get(config.textureType || 'color'), box.x, box.y);\n\t // render.log('draw with buffer');\n\t } else {\n\t\n\t var wireframe = this._wireframe;\n\t figure.draw(context, transform, wireframe && !config.wireframe ? (0, _lodash.defaults)({ wireframe: wireframe }, config) : config);\n\t }\n\t context.restore();\n\t }\n\t },\n\t invalidateBuffer: function () {\n\t this.buffers = null;\n\t this._preRendered = false;\n\t },\n\t drawBuffer: function () {\n\t var _this = this;\n\t\n\t var view = this.view;\n\t var figure = this.figure;\n\t\n\t\n\t var box = this._bufferBox = this.boundsToViewBox();\n\t\n\t // [TODO] To be able to do buffering for transformMode=\"Fixed\" in textureBrush we\n\t // need a revamp in the .draw spec.\n\t\n\t var w = box.width,\n\t h = box.height;\n\t if (figure.quickToDraw()) {\n\t // Too easy to pre-render, avoid buffer\n\t this.buffers = null;\n\t this._preRendered = false;\n\t return;\n\t }\n\t\n\t // render.log('Draw buffer for: ' + this.figure._localId );\n\t // Draw to a buffer, so we can quickly redraw the whole document\n\t\n\t var vpTransform = view.getViewPortTransform();\n\t var bufferVpTransform = _cdl.Matrix.m(_cdl.Matrix.translate(-box.x, -box.y), vpTransform);\n\t var bufferTransform = _cdl.Matrix.m(vpTransform, figure.globalMatrix_());\n\t this._invBufferTransform = bufferTransform.inverted();\n\t this._bufferScale = bufferTransform.scaleFactor();\n\t\n\t var figureTextureTypes = view.figureTextureTypes();\n\t var buffers = this.buffers;\n\t if (!buffers) {\n\t buffers = this.buffers = new Map();\n\t }\n\t\n\t // Right now, only color buffers are rendered. But the machinery is here\n\t // to also render bump buffers to simulate materials. This is why there isn't\n\t // only one buffer.\n\t\n\t // Only keep the canvases that are going to be used\n\t (0, _lodash.forEach)(figureTextureTypes, function (textureType) {\n\t if (figure.shouldDrawTextureType(textureType)) {\n\t if (!buffers.has(textureType)) {\n\t // render.log('create buffer');\n\t buffers.set(textureType, document.createElement('canvas'));\n\t }\n\t } else {\n\t buffers.delete(textureType);\n\t }\n\t });\n\t var removeKeys = [];\n\t buffers.forEach(function (v, textureType) {\n\t if (!(0, _lodash.includes)(figureTextureTypes, textureType)) {\n\t removeKeys.push(textureType);\n\t }\n\t });\n\t removeKeys.forEach(function (textureType) {\n\t buffers.delete(textureType);\n\t });\n\t buffers.forEach(function (buffer, textureType) {\n\t\n\t buffer.width = w;\n\t buffer.height = h;\n\t var config = {\n\t wireframe: view._wireframe || _this._wireframe,\n\t transformDoc: bufferVpTransform\n\t };\n\t var ignoreAlpha = true;\n\t figure.draw(buffer.getContext('2d'), bufferVpTransform, (0, _lodash.defaults)({ textureType: textureType }, config), ignoreAlpha);\n\t });\n\t\n\t this._preRendered = true;\n\t },\n\t bufferNeedsRedraw: function () {\n\t var view = this.view;\n\t var buffers = this.buffers;\n\t var _bufferScale = this._bufferScale;\n\t\n\t if (!buffers) {\n\t return false;\n\t }\n\t\n\t var needsRedraw = this.figure.globalMatrix_().scaleFactor() * view.zoom / _bufferScale > 1.35;\n\t return needsRedraw;\n\t },\n\t update: function (invalidationState, process) {\n\t var type = process.type;\n\t\n\t\n\t var forceRedraw = this.figure.needsFixedDrawing();\n\t if (forceRedraw) {\n\t this.buffers = null;\n\t }\n\t\n\t var actionToTake = this.rendered ? invalidationState : 'all';\n\t\n\t // render.log(`${process.type}, state: ${invalidationState} => action: ${actionToTake}`);\n\t\n\t switch (actionToTake) {\n\t\n\t case 'all':\n\t if (type !== 'preview' && this._previewing) {\n\t this._previewing = false;\n\t }\n\t // representation.log('all');\n\t this.drawBuffer(); // [TODO] Add drawBuffer('preview') for contour? Probably not\n\t // and this will be handled at processing time\n\t break;\n\t\n\t case 'transform':\n\t case 'viewport':\n\t if (type === 'preview') {\n\t\n\t if (!this._previewing && !this.buffers || this.bufferNeedsRedraw()) {\n\t // representation.log('preview buffer');\n\t this.drawBuffer();\n\t }\n\t this._previewing = true;\n\t } else {\n\t // representation.log('preview');\n\t this.drawBuffer();\n\t }\n\t break;\n\t\n\t case 'none':\n\t if (type !== 'preview' && this._previewing) {\n\t // representation.log('draw Buffer end of preview');\n\t this._previewing = false;\n\t this.drawBuffer();\n\t }\n\t return;\n\t }\n\t\n\t this.rendered = true;\n\t }\n\t});\n\n/***/ },\n\n/***/ 95:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.ServerFigureRepresentation = undefined;\n\t\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\t\n\tvar _config = __webpack_require__(2);\n\t\n\tvar _lodash = __webpack_require__(4);\n\t\n\tvar _gear = __webpack_require__(8);\n\t\n\tvar _cdl = __webpack_require__(15);\n\t\n\tvar _representation = __webpack_require__(94);\n\t\n\tvar _serverImages = __webpack_require__(96);\n\t\n\tvar _style = __webpack_require__(29);\n\t\n\tvar ServerFigureRepresentation = exports.ServerFigureRepresentation = _representation.FigureRepresentation.extend({ typeName: 'ServerFigureRepresentation',\n\t type: 'server',\n\t\n\t init: function (view, figure) {\n\t this.callParent(view, figure);\n\t this._readyDeferreds = [];\n\t\n\t this.renderImage = new Image();\n\t this.renderSTImage = null;\n\t\n\t if (_gear.supportsCrossOriginImages) {\n\t this.renderImage.crossOrigin = \"Anonymous\";\n\t }\n\t\n\t this.lastRequestedRenderUrl = null;\n\t this.lastRequestedSourceTimeStamp = 0;\n\t this.lastUsedTargetSourceTimeStamp = 0;\n\t\n\t this.currentInfo = null;\n\t\n\t this.rendered = false;\n\t this.temporalRep = null;\n\t\n\t this._previewing = false;\n\t },\n\t boundsToViewBox: function () {\n\t // The Pin of the figure is fixed to send its value to the renderer, if we want the same image\n\t // size we need to account for the small change here that could produce a wrong rounding\n\t var view = this.view;\n\t var bounds = this.figure.globalBounds_();\n\t var offset = (0, _serverImages.getRenderPinOffset)(view.zoom, this.figure._pin);\n\t bounds.translate(offset.x, offset.y);\n\t return view.boundsToViewBox(bounds);\n\t },\n\t update: function (invalidationState, process) {\n\t var _this = this;\n\t\n\t var figure = this.figure;\n\t var type = process.type;\n\t\n\t\n\t if (this.temporalRep) {\n\t this.temporalRep.update(invalidationState, process);\n\t }\n\t\n\t if (type === 'preview') {\n\t this._previewing = true;\n\t // console.log('previewing');\n\t return;\n\t }\n\t\n\t // Temporal local rendered representation to provide visual feedback before the images\n\t // are loaded from the server.\n\t if (!this.temporalRep && !this.rendered) {\n\t if (_config.Config.showLocalPreviewRepresentation && figure.hasPreview()) {\n\t var temporalRep = this.temporalRep = new _representation.LocalFigureRepresentation(this.view, figure, 'loading');\n\t temporalRep.update(invalidationState, process);\n\t }\n\t }\n\t\n\t // It can happen that the figure was quickly invalidated, in this case, we can not trust\n\t // the current bounds. This only happen because we are letting the user play with the selection\n\t // without waiting til things are properly updated. We may want to review this\n\t if (figure.invalidated()) {\n\t return;\n\t }\n\t\n\t var renderArgs = this.view.getRenderArgs();\n\t renderArgs.processST = true;\n\t renderArgs.isShowthrough = false;\n\t var stRenderArgs = this.view.getRenderArgs();\n\t stRenderArgs.processST = true;\n\t stRenderArgs.isShowthrough = true;\n\t\n\t var renderUrl = (0, _serverImages.getRenderCacheUrl)(figure, renderArgs);\n\t\n\t if (this.lastRequestedRenderUrl === renderUrl) {\n\t return;\n\t }\n\t\n\t if (this.rendered && invalidationState === 'none' && !this._previewing) {\n\t // Nothing to do, the view was already up-to-date\n\t return;\n\t }\n\t\n\t this._previewing = false;\n\t\n\t // render.log('Figure view update: ' + invalidationState);\n\t\n\t // Ask for a new image to the server\n\t var targetTimeStamp = (0, _lodash.now)();\n\t if (targetTimeStamp <= this.lastRequestedTargetSourceTimeStamp) {\n\t targetTimeStamp = this.lastRequestedTargetSourceTimeStamp + 1;\n\t }\n\t\n\t this.lastRequestedSourceTimeStamp = targetTimeStamp;\n\t\n\t var info = {\n\t timeStamp: targetTimeStamp,\n\t transform: figure.globalMatrix_(),\n\t box: this.boundsToViewBox(),\n\t vpTransform: this.view.getViewPortTransform()\n\t };\n\t\n\t this.lastRequestedRenderUrl = renderUrl;\n\t\n\t _serverImages.ServerImagesManager.request$(figure, renderArgs).then(function (image) {\n\t _this.onRenderImageLoad(image, info, false);\n\t _serverImages.ServerImagesManager.request$(figure, stRenderArgs).then(function (image) {\n\t _this.onRenderImageLoad(image, info, true);\n\t });\n\t });\n\t },\n\t onRenderImageLoad: function (image, info, isShowthrough) {\n\t var timeStamp = info.timeStamp;\n\t\n\t\n\t if (timeStamp >= this.lastUsedTargetSourceTimeStamp) {\n\t\n\t // render.log('onRenderImageLoad ' + timeStamp);\n\t\n\t this.renderImage = isShowthrough ? this.renderImage : image;\n\t this.renderSTImage = isShowthrough ? image : null;\n\t\n\t this.lastUsedTargetSourceTimeStamp = timeStamp;\n\t\n\t this.currentInfo = info;\n\t\n\t this._invBufferTransform = _cdl.Matrix.m(info.vpTransform, info.transform).inverted();\n\t\n\t this.rendered = true;\n\t\n\t this.view.redrawFigure(this.figure);\n\t }\n\t\n\t this.temporalRep = null;\n\t this.targetRenderCacheUrl = null;\n\t },\n\t ready$: function () {\n\t if (this.rendered) {\n\t return (0, _gear.resolve)();\n\t } else {\n\t var deferred = new _gear.Deferred();\n\t this._readyDeferreds.push(deferred);\n\t return deferred.promise;\n\t }\n\t },\n\t draw: function (context, transform, config) {\n\t var overlayedNoClip = arguments.length <= 3 || arguments[3] === undefined ? false : arguments[3];\n\t var temporalRep = this.temporalRep;\n\t\n\t if (temporalRep) {\n\t temporalRep.draw(context, transform, config);\n\t } else if (this.rendered) {\n\t context.save();\n\t\n\t // render.log('draw image');\n\t\n\t var figureAlpha = this.figure._alpha;\n\t if (figureAlpha !== 1.0) {\n\t context.globalAlpha *= figureAlpha;\n\t }\n\t if (this._masked) {\n\t context.globalAlpha *= 0.5;\n\t }\n\t\n\t var box = this.currentInfo.box;\n\t\n\t\n\t var lFigure = this.figure;\n\t\n\t if (!overlayedNoClip) {\n\t var _lFigure$getClippedBy = lFigure.getClippedBy();\n\t\n\t var _lFigure$getClippedBy2 = _slicedToArray(_lFigure$getClippedBy, 2);\n\t\n\t var lClipContent = _lFigure$getClippedBy2[0];\n\t var lClipParent = _lFigure$getClippedBy2[1];\n\t\n\t if (lClipContent) {\n\t if (lClipContent.editingClip) {\n\t this.draw(context, transform, config, true);\n\t }\n\t var lOldTransform = transform;\n\t if (!lClipContent.clipAbsolute && !lClipContent.editingClip) {\n\t transform = _cdl.Matrix.m(transform, lClipParent.globalMatrix_());\n\t }\n\t lClipContent.clipContext(context, transform);\n\t //DEBUG\n\t // const ps = lClipContent._polyregions;\n\t // for(let k=0,kEnd=ps.length;k { pre: [], done: [] }\n\t this._cacheSize = 100;\n\t this._doBatch = this._doBatch.bind(this);\n\t this._batch = [];\n\t },\n\t request$: function (figure, renderArgs, stamp) {\n\t\n\t var fm = { cacheId: figure._cacheId,\n\t matrix: figure.globalMatrix_().toMatrix22(),\n\t pin: figure._pin.clone() };\n\t\n\t (0, _lodash.assign)(fm, renderArgs);\n\t\n\t // Fix pin inside for figures inside groups\n\t var owner = figure._owner;\n\t if (owner && owner.isGroup) {\n\t var p = owner.globalMatrix_().apply(figure.pin);\n\t fm.pin.x = p.x;fm.pin.y = p.y;\n\t }\n\t\n\t var pz = fixZoomAndPin(fm.zoom, fm.pin);\n\t fm.fzoom = pz.zoom;\n\t fm.fpin = pz.pin;\n\t fm.fpin.use = fm.pin.use;\n\t\n\t var cm = void 0;\n\t\n\t // (1) Exact match of an image we already have\n\t //---------------------------------------------------------------------------------------------------\n\t\n\t cm = this._match('done', fm);\n\t if (cm) {\n\t return (0, _gear.resolve)(cm.image);\n\t }\n\t\n\t // (3) Are we asking for the same image right now?\n\t //---------------------------------------------------------------------------------------------------\n\t cm = this._match('pre', fm);\n\t if (cm) {\n\t return cm.promise;\n\t }\n\t\n\t // (5) Ask the requested image to the server\n\t //---------------------------------------------------------------------------------------------------\n\t var promise = this._requestImage$(figure, renderArgs, stamp, fm);\n\t\n\t return cm ? cm.promise : promise;\n\t },\n\t _requestImage$: function (figure, renderArgs, stamp, fm) {\n\t var _this = this;\n\t\n\t var promise = fm.promise = (0, _gear.createPromise)(function (resolve) {\n\t\n\t _this._preCache(fm);\n\t\n\t var image = fm.image = new Image();\n\t\n\t if (_gear.supportsCrossOriginImages) {\n\t image.crossOrigin = \"Anonymous\";\n\t }\n\t\n\t var onLoad = fm.onLoad = function () {\n\t resolve(image);\n\t this._cache(fm);\n\t };\n\t (0, _gear.attachImageLoadEvent)(image, onLoad, _this);\n\t\n\t if (_config.Config.base64Images) {\n\t\n\t var request = { figure: figure, renderArgs: renderArgs, stamp: stamp, image: image };\n\t if (!_config.Config.batchRender) {\n\t _this._base64Request(request);\n\t } else {\n\t // We are going to wait a few milliseconds to try to batch rendering calls\n\t _this._batch.push(request);\n\t setTimeout(_this._doBatch, 10);\n\t }\n\t } else {\n\t image.src = getRenderCacheUrl(figure, renderArgs, stamp);\n\t }\n\t });\n\t return promise;\n\t },\n\t _base64Request: function (request) {\n\t return Cx.Core.Figure.render$(figureRenderModel(request.figure, request.renderArgs, request.stamp)).then(function (src) {\n\t request.image.src = src;\n\t });\n\t },\n\t _batchRequest: function (requests) {\n\t return Cx.Core.Figure.batchRender$({\n\t Renders: (0, _lodash.map)(requests, function (r) {\n\t return figureRenderModel(r.figure, r.renderArgs, r.stamp);\n\t }),\n\t Compress: _config.Config.serverImagesCompression === 'true',\n\t PngCompressionParams: { Speed: 10 }\n\t }).then(function (images) {\n\t for (var k = 0, kEnd = images.length; k < kEnd; ++k) {\n\t requests[k].image.src = images[k];\n\t }\n\t });\n\t },\n\t _doBatch: function () {\n\t var batch = this._batch;\n\t var batch_length = batch.length;\n\t if (batch_length === 0) {\n\t return; // Nothing to do... batch already processing\n\t }\n\t\n\t this._batch = []; // Start new batch\n\t\n\t if (batch_length === 1) {\n\t this._base64Request(batch[0]);\n\t } else {\n\t var maxConnections = 6;\n\t var chunks = (0, _gear.fairSpread)(batch, maxConnections);\n\t (0, _lodash.forEach)(chunks, this._batchRequest, this);\n\t }\n\t },\n\t _match: function (type, fm) {\n\t var res = 0.00005;\n\t var cacheId = fm.cacheId;\n\t var fpin = fm.fpin;\n\t var fzoom = fm.fzoom;\n\t var wireframe = fm.wireframe;\n\t var isShowthrough = fm.isShowthrough;\n\t var matrix = fm.matrix;\n\t\n\t var c = this._cacheMap[cacheId];\n\t if (!c) {\n\t return;\n\t }\n\t var list = c[type];\n\t for (var k = list.length - 1; k >= 0; --k) {\n\t var ck = list[k];\n\t var cpin = ck.fpin;\n\t if (ck.wireframe === wireframe && ck.isShowthrough === isShowthrough && Math.abs(ck.fzoom - fzoom) < res && Math.abs(cpin.x - fpin.x) < res && Math.abs(cpin.y - fpin.y) < res && (cpin.use === fpin.use || Math.abs(cpin.relX - fpin.relX) < res && Math.abs(cpin.relY - fpin.relY) < res) && ck.matrix.isNear(matrix, res)) {\n\t return ck;\n\t }\n\t }\n\t return null;\n\t },\n\t _storeInCache: function (type, fm) {\n\t var c = this._cacheMap;\n\t var id = fm.cacheId;\n\t\n\t var cid = c[id];\n\t if (!cid) {\n\t cid = c[id] = { pre: [], done: [] };\n\t }\n\t cid[type].push(fm);\n\t },\n\t _removeFromCache: function (type, fm) {\n\t var c = this._cacheMap;\n\t var id = fm.cacheId;\n\t var cid = c[id];\n\t if (cid) {\n\t var cidt = cid[type];\n\t cidt.splice(cidt.indexOf(fm), 1);\n\t if (cid.pre.length === 0 && cid.done.length === 0) {\n\t delete c[id];\n\t }\n\t }\n\t },\n\t _cache: function (fm) {\n\t this._storeInCache('done', fm);\n\t this._removeFromCache('pre', fm);\n\t // Remove old images from the cache\n\t this._cacheList.push(fm);\n\t if (this._cacheList.length > this._cacheSize) {\n\t var rc = this._cacheList.splice(0, 1)[0];\n\t this._removeFromCache('done', rc);\n\t (0, _gear.detachImageLoadEvent)(rc.image, rc.onLoad);\n\t }\n\t },\n\t _preCache: function (fm) {\n\t this._storeInCache('pre', fm);\n\t }\n\t}))();\n\n/***/ },\n\n/***/ 97:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.SyncedFigureViews = undefined;\n\t\n\tvar _lodash = __webpack_require__(4);\n\t\n\tvar _gear = __webpack_require__(8);\n\t\n\tvar _view = __webpack_require__(84);\n\t\n\tvar SyncedFigureViews = exports.SyncedFigureViews = _gear.Base.extend({ typeName: 'SyncedFigureViews',\n\t\n\t Properties: {\n\t view: { type: 'View', def: null, owned: false }\n\t },\n\t\n\t get: function (figure) {\n\t // figureView.log('get '+figure._localId);\n\t return this._figureToView.get(figure);\n\t },\n\t mapToFigureViews: function (figures) {\n\t var _this = this;\n\t\n\t return (0, _lodash.map)(figures, function (f) {\n\t return _this.get(f);\n\t });\n\t },\n\t init: function () {\n\t this._figureToView = new WeakMap();\n\t this._linkedDocuments = [];\n\t this._disposedFigureViews = [];\n\t },\n\t\n\t\n\t //===================================================================\n\t\n\t link: function (doc) {\n\t\n\t doc.on({\n\t figureschanged: this.onFiguresChanged,\n\t layerschanged: this.onLayersChanged,\n\t pageschanged: this.onPagesChanged,\n\t\n\t commit: this.onCommit,\n\t revert: this.onUndoRedo,\n\t undo: this.onUndoRedo,\n\t redo: this.onUndoRedo\n\t }, this);\n\t\n\t this.createPagesFigureViews(doc._pages);\n\t\n\t this._linkedDocuments.push(doc);\n\t },\n\t unlink: function (doc) {\n\t var _this2 = this;\n\t\n\t (0, _gear.remove)(this._linkedDocuments, doc);\n\t\n\t doc.forEachFigure(function (figure) {\n\t return _this2.disposeFigureView(figure);\n\t });\n\t },\n\t\n\t\n\t //=======================================================================\n\t\n\t createFigureView: function (figure) {\n\t // figureView.log('set '+figure._localId);\n\t\n\t var figureView = _view.FigureView.create(this.view, figure);\n\t this._figureToView.set(figure, figureView);\n\t\n\t // Remove it from disposed views (i.e. moved between layers)\n\t var disposed = this._disposedFigureViews,\n\t disposedIndex = disposed.indexOf(figure);\n\t if (disposedIndex !== -1) {\n\t disposed.splice(disposedIndex, 1);\n\t }\n\t\n\t return figureView;\n\t },\n\t createFigureViews: function (figures) {\n\t var _this3 = this;\n\t\n\t return (0, _lodash.map)(figures, function (figure) {\n\t return _this3.createFigureView(figure);\n\t });\n\t },\n\t createLayersFigureViews: function (layers) {\n\t var _this4 = this;\n\t\n\t (0, _lodash.forEach)(layers, function (layer) {\n\t return _this4.createFigureViews(layer._figures);\n\t });\n\t },\n\t createPagesFigureViews: function (pages) {\n\t var _this5 = this;\n\t\n\t (0, _lodash.forEach)(pages, function (page) {\n\t return _this5.createLayersFigureViews(page._layers);\n\t });\n\t },\n\t disposeFigureView: function (figure) {\n\t // figureView.log('del '+figure._localId);\n\t\n\t var figureToView = this._figureToView;\n\t figureToView.get(figure).dispose();\n\t figureToView.delete(figure);\n\t },\n\t disposeFigureViews: function (figures) {\n\t var _this6 = this;\n\t\n\t (0, _lodash.forEach)(figures, function (figure) {\n\t return _this6.disposeFigureView(figure);\n\t });\n\t },\n\t dispose: function () {\n\t var _this7 = this;\n\t\n\t (0, _lodash.forEach)(this._linkedDocuments, function (doc) {\n\t return _this7.unlink(doc);\n\t });\n\t },\n\t _disposeTemporalFigures: function () {\n\t this.disposeFigureViews(this._disposedFigureViews);\n\t this._disposedFigureViews = [];\n\t },\n\t onCommit: function () /*doc, event*/{\n\t this._disposeTemporalFigures();\n\t },\n\t onUndoRedo: function () {\n\t this._disposeTemporalFigures(); // [CHECK]\n\t },\n\t delayedDisposeFigureViews: function (figures) {\n\t var _this8 = this;\n\t\n\t (0, _lodash.forEach)(figures, function (figure) {\n\t return _this8._disposedFigureViews.push(figure);\n\t });\n\t },\n\t delayedDisposeLayersFigureViews: function (layers) {\n\t var _this9 = this;\n\t\n\t (0, _lodash.forEach)(layers, function (layer) {\n\t return _this9.delayedDisposeFigureViews(layer._figures);\n\t });\n\t },\n\t delayedDisposePagesFigureViews: function (pages) {\n\t var _this10 = this;\n\t\n\t (0, _lodash.forEach)(pages, function (page) {\n\t return _this10.delayedDisposeLayersFigureViews(page._layers);\n\t });\n\t },\n\t\n\t\n\t // Order is important, first remove then add, this allows moving of figures\n\t\n\t onFiguresChanged: function (doc, added, removed) {\n\t // figureView.log(`figures changed, added: ${ added && added.length } removed: ${ removed && removed.length }`);\n\t if (removed) {\n\t this.delayedDisposeFigureViews(removed);\n\t }\n\t if (added) {\n\t this.createFigureViews(added);\n\t }\n\t },\n\t onLayersChanged: function (doc, added, removed) {\n\t // figureView.log(`layers changed, added: ${ added && added.length } removed: ${ removed && removed.length }`);\n\t if (removed) {\n\t this.delayedDisposeLayersFigureViews(removed);\n\t }\n\t if (added) {\n\t this.createLayersFigureViews(added);\n\t }\n\t },\n\t onPagesChanged: function (doc, added, removed) {\n\t // figureView.log(`pages changed, added: ${ added && added.length } removed: ${ removed && removed.length }`);\n\t if (removed) {\n\t this.delayedDisposePagesFigureViews(removed);\n\t }\n\t if (added) {\n\t this.createPagesFigureViews(added);\n\t }\n\t }\n\t});\n\n/***/ },\n\n/***/ 98:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.DocumentView_Mixin = undefined;\n\t\n\tvar _config = __webpack_require__(2);\n\t\n\tvar _lodash = __webpack_require__(4);\n\t\n\tvar _gear = __webpack_require__(8);\n\t\n\tvar _cdl = __webpack_require__(15);\n\t\n\tvar _clipboard = __webpack_require__(99);\n\t\n\tvar _color = __webpack_require__(31);\n\t\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\t\n\t// Expects\n\t// this._document\n\t//\n\t// and calls to\n\t// this.linkDoc(doc)\n\t// this.unlinkDoc(doc)\n\t\n\tvar DocumentView_Mixin = exports.DocumentView_Mixin = forwardDocumentFunctions(['add', 'remove', 'replace', 'clear', 'release', 'releaseLayers', 'releasePages', 'backOne', 'toBack', 'forwardOne', 'toFront', 'visualForwardOne$', 'visualBackOne$', 'canVisualForwardOne$', 'canVisualBackOne$', 'update$', 'preview$', 'render$', 'commit$', 'revert$', 'lock', 'unlock', 'changing', // [TODO] This should be a getter, isChanging?\n\t\n\t'saveCopy$', 'save$', 'dropPreviousHistory', 'dropPreviousHistoryOnNextCommit', 'addClipart$', 'replaceClipart$', 'autoCreateMultiPartText$', 'breakMultiPartText', 'group', 'ungroup', 'extractPowerClipContents', 'addPowerClipContents', 'reshape$', 'optimize$', 'isSaved'], forwardDocumentGetters(['activePageFigures', 'activePageLayers', 'activeLayerFigures'], forwardDocumentProperties(['pages', 'figures', 'activePage', 'activePageIndex', 'activeLayer', 'activeLayerIndex'], forwardDocumentEvents(_cdl.documentEvents, {\n\t\n\t Properties: {\n\t\n\t showThroughColor: { type: 'Color', def: _color.Color.Transparent(), onChange: function () {\n\t this.onShowThroughChange();\n\t }\n\t },\n\t\n\t wireframe: { type: 'boolean', def: false },\n\t\n\t undoRedoDisabled: { type: 'boolean', def: false },\n\t\n\t activeFigures: { type: 'Figure[]', def: [], owned: false, onChange: function () {\n\t this.redrawAll();\n\t }\n\t },\n\t\n\t showPin: { type: 'boolean', def: false }\n\t },\n\t\n\t get doc() {\n\t return this._document;\n\t },\n\t set doc(doc_) {\n\t this._setDoc(doc_);\n\t },\n\t\n\t onShowThroughChange: function () {\n\t var _this = this;\n\t\n\t _config.Config.showThroughColor = this._showThroughColor;\n\t this.figures.forEach(function (figure) {\n\t _this.deepInvalidate(figure);\n\t });\n\t this.commit$();\n\t },\n\t deepInvalidate: function (aFigure) {\n\t aFigure.invalidate();\n\t if (aFigure.isGroup) {\n\t for (var k = 0, kEnd = aFigure.figures.length; k < kEnd; ++k) {\n\t var f = aFigure.figures[k];\n\t this.deepInvalidate(f);\n\t }\n\t }\n\t if (aFigure.powerClipContents) {\n\t aFigure.powerClipContents.forEach(function (lPC) {\n\t if (lPC.figures) {\n\t lPC.figures.forEach(function (lPCF) {\n\t if (lPCF.isProxyGroup && lPCF._colorMap) {\n\t lPCF.invalidate();\n\t }\n\t });\n\t }\n\t });\n\t }\n\t },\n\t startIsolatedFiguresEdition: function (figures) {\n\t this._activeFigures.set(figures);\n\t },\n\t stopIsolatedFiguresEdition: function () {\n\t this._activeFigures.clear();\n\t },\n\t\n\t drawIsolatedFigures: function (alpha) {\n\t var figures = this._activeFigures,\n\t canvas,\n\t context,\n\t drawConfig,\n\t transform;\n\t\n\t if (figures) {\n\t transform = this.getViewPortTransform();\n\t canvas = this.canvas();\n\t context = canvas.getContext('2d');\n\t canvas.width = canvas.width;\n\t\n\t if (alpha === 0) {\n\t return;\n\t }\n\t\n\t if (alpha !== undefined && alpha < 1) {\n\t context.globalAlpha *= alpha;\n\t }\n\t\n\t // Do not use figure view caching mechanism...\n\t drawConfig = { wireframe: this._wireframe, viewport: transform };\n\t (0, _lodash.forEach)(figures, function (figure) {\n\t figure.draw(context, transform, drawConfig);\n\t });\n\t }\n\t },\n\t\n\t figuresThumbnailElement$: function (figures, width, height) {\n\t var _this2 = this;\n\t\n\t if (height === undefined) {\n\t height = width;\n\t }\n\t if (!(0, _gear.isArray)(figures)) {\n\t figures = [figures];\n\t }\n\t return _cdl.Figures.bounds$(figures).then(function (bounds) {\n\t\n\t var canvas = document.createElement('canvas');\n\t canvas.width = width;\n\t canvas.height = height;\n\t var context = canvas.getContext('2d');\n\t\n\t var bounds_width = bounds.width,\n\t bounds_height = bounds.height;\n\t var scaleX = width / bounds_width;\n\t var scaleY = height / bounds_height;\n\t var scale = Math.min(scaleX, scaleY);\n\t\n\t var transform = _cdl.Matrix.concat(_cdl.Matrix.translate((width - bounds_width * scale) / 2, (height - bounds_height * scale) / 2), _cdl.Matrix.scale(scale, -scale), _cdl.Matrix.translate(-bounds.lx, -bounds.hy));\n\t\n\t var drawConfig = {\n\t transformDoc: transform\n\t };\n\t (0, _lodash.forEach)(_this2.mapToFigureViews(figures), function (figureView) {\n\t if (figureView) {\n\t figureView.draw(context, transform, drawConfig);\n\t }\n\t });\n\t\n\t return canvas;\n\t });\n\t },\n\t drawConfig: function () {\n\t return (0, _lodash.assign)({\n\t wireframe: this.wireframe\n\t }, this.callParent());\n\t },\n\t getRenderArgs: function () {\n\t return {\n\t zoom: this.zoom,\n\t wireframe: this.wireframe\n\t };\n\t },\n\t figuresThumbnail$: function (figures, sizeX, sizeY) {\n\t return this.figuresThumbnailElement$(figures, sizeX, sizeY).then(function (el) {\n\t return el.toDataURL();\n\t });\n\t },\n\t fireRenderEvents: function (type, doc) {\n\t\n\t // console.log(type);\n\t\n\t var commiting = type === 'commit';\n\t\n\t var change = this.fireChangeEvents(type, doc);\n\t\n\t var state = this.state;\n\t\n\t\n\t if (commiting || !(0, _lodash.isEqual)(state, this._lastState)) {\n\t change = true;\n\t\n\t this.fireEvent('draw', this);\n\t\n\t if (!commiting) {\n\t this.fireEvent('redraw', this);\n\t }\n\t }\n\t this._lastState = state;\n\t\n\t if (change) {\n\t this.fireEvent('change', this);\n\t }\n\t\n\t this.redrawDoc();\n\t },\n\t\n\t\n\t // Overwritten to redraw the proper layers\n\t redrawDoc: function () {\n\t this.redraw('document');\n\t },\n\t fireChangeEvents: function (type, doc) {\n\t var _stateChanged = this._stateChanged; // [TODO] Move to a better place?\n\t\n\t this._stateChanged = false;\n\t\n\t return _stateChanged || doc._activePageChanged || doc._activeLayerChanged;\n\t },\n\t on_renderstarted: function (doc, type) {\n\t this.fireEvent('renderstarted', this, type);\n\t },\n\t on_rendercomplete: function (doc, type) {\n\t this.fireRenderEvents(type, doc);\n\t this.fireEvent('rendercomplete', this, type);\n\t },\n\t on_commit: function () /* doc */{\n\t if (_config.Config.commitLog) {\n\t console.log('commit');\n\t }\n\t this.fireEvent('commit', this);\n\t },\n\t\n\t\n\t // [TODO] Review view.lock, could we remove it?\n\t\n\t on_lock: function (doc, originator) {\n\t this.pushDisabledTemporally();\n\t this.fireEvent('lock', this, originator);\n\t },\n\t on_unlock: function (doc, originator) {\n\t this.popDisabledTemporally();\n\t this.fireEvent('unlock', this, originator);\n\t },\n\t getState: function () {\n\t var wireframe = this.wireframe;\n\t\n\t return (0, _lodash.assign)(this.callParent(), { wireframe: wireframe });\n\t },\n\t setState: function (state) {\n\t this.callParent(state);\n\t this.wireframe = state.wireframe;\n\t this.redraw('document');\n\t },\n\t\n\t\n\t // [TODO] This shouldn't be here, move to InteractiveDocView\n\t\n\t canUndo: function () {\n\t return !this._undoRedoDisabled && (this.tool || this.doc).canUndo();\n\t },\n\t undo: function () {\n\t return !this._undoRedoDisabled && (this.tool || this.doc).undo();\n\t },\n\t canRedo: function () {\n\t return !this._undoRedoDisabled && (this.tool || this.doc).canRedo();\n\t },\n\t redo: function () {\n\t return !this._undoRedoDisabled && (this.tool || this.doc).redo();\n\t },\n\t\n\t\n\t // [TODO] Remove in favor of direct use of conditions\n\t // We need to revamp conditions to be dynamic\n\t // bumpable depends on movable, and if movable changes,\n\t // bumpbable changes\n\t\n\t canDuplicate: function (figures) {\n\t return this.are(figures, 'copyable');\n\t },\n\t canCopy: function (figures) {\n\t return this.are(figures, 'copyable');\n\t },\n\t canCut: function (figures) {\n\t return this.are(figures, 'copyable', 'removable');\n\t },\n\t canPaste: function () {\n\t return !_clipboard.Clipboard.isEmpty;\n\t },\n\t canRemove: function (figures) {\n\t return this.are(figures, 'removable');\n\t },\n\t canBump: function (figures) {\n\t return this.are(figures, 'movable');\n\t },\n\t canGroup: function (figures) {\n\t return this.are(figures, 'groupable');\n\t },\n\t canUngroup: function (figures) {\n\t return this.are(figures, 'ungroupable');\n\t },\n\t copy: function (figures) {\n\t _clipboard.Clipboard.copy(figures);\n\t if (_config.Config.localStorageFiguresClipboard) {\n\t this.focus();\n\t }\n\t },\n\t cut: function (figures) {\n\t _clipboard.Clipboard.cut(figures);\n\t if (_config.Config.localStorageFiguresClipboard) {\n\t this.focus();\n\t }\n\t },\n\t paste: function () {\n\t var offset = 10 / this.zoom;\n\t _clipboard.Clipboard.paste(this, function (f) {\n\t return f.fastTranslate(offset, offset);\n\t });\n\t },\n\t pasteAt$: function (point) {\n\t var figures = _clipboard.Clipboard.paste(this);\n\t return _cdl.Figures.center$(figures, point);\n\t },\n\t\n\t\n\t // Let views have a word on what events are forwarded\n\t fireDocEvent: function (type, doc) {\n\t for (var _len = arguments.length, params = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n\t params[_key - 2] = arguments[_key];\n\t }\n\t\n\t this.fireEvent.apply(this, [type, this].concat(_toConsumableArray(params)));\n\t },\n\t init: function (config) {\n\t\n\t this.addEvents(_cdl.documentEvents, 'newdocument', 'change', 'draw', 'redraw',\n\t\n\t // [TODO] Check were these events should be, probably they are fine here\n\t 'figuresdrag', 'figuresdrop', 'textedit', 'duplicated');\n\t\n\t this._bind('preview$');\n\t this._bind('render$');\n\t this._bind('commit$');\n\t this._bind('revert$');\n\t\n\t this._lastState = null;\n\t this._stateChanged = false;\n\t\n\t this.callParent(config);\n\t },\n\t linkDoc: function (doc) {\n\t linkDocumentEvents(this, doc);\n\t },\n\t unlinkDoc: function (doc) {\n\t doc.un(this);\n\t },\n\t showDocument$: function (doc) {\n\t this.doc = doc;\n\t return this.zoomToFit$().then(this.commit$);\n\t },\n\t zoomToFitFigures$: function (figures, margin, fit) {\n\t var _this3 = this;\n\t\n\t var p = arguments[0];\n\t if (p && (0, _lodash.isPlainObject)(p)) {\n\t figures = p.figures;\n\t margin = p.margin;\n\t fit = p.fit;\n\t }\n\t figures = figures || this.getZoomToFitFigures();\n\t\n\t if (margin === undefined) {\n\t margin = this._defaultMargin();\n\t }\n\t if (fit === undefined) {\n\t fit = 'Min';\n\t }\n\t\n\t if (figures.length === 0) {\n\t return (0, _gear.resolve)();\n\t }\n\t\n\t return _cdl.Figures.bounds$(figures).then(function (bounds) {\n\t return _this3.zoomAround(bounds, margin, fit);\n\t });\n\t },\n\t duplicate: function (figures) {\n\t if (!(0, _gear.isArray)(figures)) {\n\t figures = [figures];\n\t }\n\t var clones = (0, _gear.cloneDeep)(figures);\n\t var offset = this.viewDeltaToDoc(10);\n\t _cdl.Figures.fastTranslate(clones, offset, offset, this.textureZoom);\n\t this.fireEvent('duplicated', this, clones, figures);\n\t this.add(clones);\n\t return this;\n\t },\n\t bump: function (figures, x, y) {\n\t if (!(0, _gear.isArray)(figures)) {\n\t figures = [figures];\n\t }\n\t _cdl.Figures.fastTranslate(figures, this.viewDeltaToDoc(x), this.viewDeltaToDoc(y), this.textureZoom);\n\t return this;\n\t },\n\t colorAt$: function (docPoint /*, figures*/) {\n\t var viewPoint = this.docToView(docPoint);\n\t var color = this.colorAtViewPoint(viewPoint);\n\t return (0, _gear.resolve)(color);\n\t },\n\t\n\t\n\t // [TODO] These methods are calling functions from InteractiveView\n\t\n\t canEditContent: function (figure) {\n\t return this.is(figure, 'contentEditable');\n\t },\n\t editContent: function (figure, point) {\n\t var _this4 = this;\n\t\n\t var doc = this.doc;\n\t\n\t // Hack for the moment, lookign for the right abstraction\n\t\n\t if (figure.isShape && figure._polyregions.length === 1 && figure._powerClipContents.length === 0) {\n\t return this.nodeEdit(figure);\n\t }\n\t\n\t doc.spawnContentLayersFor(figure, point);\n\t\n\t return doc.update$().then(function () {\n\t _this4.selectedFigures = doc.activeLayer.initialSelectedFigures(point);\n\t\n\t _this4.updateEditContentStatus();\n\t // ...\n\t return doc.commit$();\n\t });\n\t },\n\t editingContent: function () {\n\t return this.doc.editingContent();\n\t },\n\t commitContent$: function () {\n\t var _this5 = this;\n\t\n\t var doc = this.doc;\n\t\n\t return this.commitEditionTools$().then(function () {\n\t return doc._commitContent$().then(function (figure) {\n\t _this5.selectedFigures = [figure];\n\t _this5.status(null);\n\t return doc.commit$();\n\t });\n\t });\n\t },\n\t updateEditContentStatus: function () {\n\t if (this.editingContent()) {\n\t this.status({\n\t message: 'Editing ' + this.activeLayer.statusMessage(),\n\t commit: this.commitContent$.bind(this)\n\t });\n\t } else {\n\t this.status(null);\n\t }\n\t }\n\t}))));\n\t\n\t// Forward document, getters and properties from Views to Document\n\t// We avoid writting by hand these functions so we do not need to\n\t// maintain the parameters in sync in both the Document and View prototypes\n\t\n\tfunction forwardDocumentFunctions(keys, proto) {\n\t (0, _lodash.forEach)(keys, function (key) {\n\t proto[key] = function () {\n\t var _document;\n\t\n\t return (_document = this._document)[key].apply(_document, arguments);\n\t };\n\t });\n\t return proto;\n\t}\n\t\n\tfunction forwardDocumentGetters(keys, proto) {\n\t (0, _lodash.forEach)(keys, function (key) {\n\t Object.defineProperty(proto, key, {\n\t get: function () {\n\t return this._document[key];\n\t },\n\t\n\t enumerable: true\n\t });\n\t });\n\t return proto;\n\t}\n\t\n\tfunction forwardDocumentProperties(keys, proto) {\n\t (0, _lodash.forEach)(keys, function (key) {\n\t Object.defineProperty(proto, key, {\n\t get: function () {\n\t return this._document[key];\n\t },\n\t set: function (value) {\n\t this._document[key] = value;\n\t },\n\t\n\t enumerable: true\n\t });\n\t });\n\t return proto;\n\t}\n\t\n\tfunction linkDocumentEvents(view, doc) {\n\t (0, _lodash.forEach)(_cdl.documentEvents, function (event) {\n\t // Important, pass view as scope so unlinkDoc will work properly\n\t // removing all events. When changing from background to mainDocument in\n\t // the 2D canvas the current doc is unlinked and the other one linked\n\t doc.on(event, view['on_' + event], view);\n\t });\n\t}\n\t\n\tfunction forwardDocumentEvents(events, proto) {\n\t (0, _lodash.forEach)(events, function (event) {\n\t var route = 'on_' + event;\n\t if (!proto[route]) {\n\t // console.log('creating '+route);\n\t proto[route] = function () {\n\t for (var _len2 = arguments.length, params = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n\t params[_key2] = arguments[_key2];\n\t }\n\t\n\t return this.fireDocEvent.apply(this, [event].concat(params));\n\t };\n\t }\n\t });\n\t return proto;\n\t}\n\n/***/ },\n\n/***/ 99:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.Clipboard = undefined;\n\t\n\tvar _config = __webpack_require__(2);\n\t\n\tvar _lodash = __webpack_require__(4);\n\t\n\tvar _gear = __webpack_require__(8);\n\t\n\tvar _cdl = __webpack_require__(15);\n\t\n\tvar _util = __webpack_require__(85);\n\t\n\t// Wrap up Clipboard library so we can directly use SystemClipboard.copy(string);\n\t\n\tvar ClipboardWrapper = function () {\n\t\n\t var copyButtonId = 'cx-grafika-clipboard-hidden-button';\n\t\n\t var toCopy = '',\n\t clipboard = null;\n\t\n\t var init = function () {\n\t\n\t _util.g$.append((0, _util.g$)('body'), '');\n\t\n\t // Check clipboard.js library\n\t clipboard = new window.Clipboard('#' + copyButtonId, {\n\t text: function () {\n\t return toCopy;\n\t }\n\t });\n\t clipboard.on('success', function () {\n\t console.log('Copy to system clipboard');\n\t });\n\t };\n\t\n\t this.copy = function (text) {\n\t if (!clipboard) {\n\t init();\n\t }\n\t toCopy = text;\n\t (0, _util.g$)('#' + copyButtonId).click();\n\t toCopy = '';\n\t };\n\t};\n\tvar SystemClipboard = new ClipboardWrapper();\n\t\n\tvar localStorageClipboard = {\n\t metadata: 'grafika-clipboard-metadata',\n\t figures: 'grafika-clipboard-figures'\n\t};\n\t\n\tvar ClipboardImp = _gear.Base.extend({\n\t\n\t get isEmpty() {\n\t return !this._state();\n\t },\n\t\n\t init: function () {\n\t this._pageState = null;\n\t this.addEvents('change', 'copy', 'cut', 'clear', 'paste');\n\t },\n\t copy: function (figures) {\n\t this._store((0, _gear.cloneDeep)(figures), 'copy');\n\t },\n\t cut: function (figures) {\n\t this._store((0, _gear.clone)(figures), 'cut');\n\t },\n\t paste: function (where, filter) {\n\t where = where.add ? where : where.figures;\n\t if (filter === undefined) {\n\t filter = function (f) {\n\t return f;\n\t };\n\t }\n\t var state = this._get();\n\t if (!state) {\n\t return [];\n\t }\n\t\n\t var figures = state.figures;\n\t\n\t // cut, only for same page copies\n\t var cut = state.type === 'cut';\n\t\n\t if (cut) {\n\t (0, _lodash.forEach)(figures, function (figure) {\n\t var owner = figure._owner;\n\t if (owner) {\n\t owner._figures.remove(figure);\n\t }\n\t });\n\t }\n\t\n\t var pastedFigures = where.add((0, _lodash.compact)((0, _lodash.map)(figures, filter)));\n\t\n\t if (cut) {\n\t this._clear();\n\t this.fireEvent('change');\n\t }\n\t\n\t this.fireEvent('paste', where, pastedFigures);\n\t\n\t return pastedFigures;\n\t },\n\t clear: function () {\n\t this._clear();\n\t this.fireEvent('change');\n\t this.fireEvent('clear');\n\t },\n\t\n\t\n\t get figures() {\n\t var state = this._get();\n\t return state ? state.figures : [];\n\t },\n\t\n\t state: function () {\n\t var state = this._state();\n\t return state ? state.type : 'empty';\n\t },\n\t _clear: function () {\n\t this._pageState = null;\n\t localStorage.removeItem(localStorageClipboard.metadata);\n\t localStorage.removeItem(localStorageClipboard.figures);\n\t },\n\t _state: function () {\n\t var pageState = this._pageState;\n\t if (_config.Config.localStorageFiguresClipboard) {\n\t var stateString = localStorage.getItem(localStorageClipboard.metadata);\n\t if (stateString !== null) {\n\t var state = JSON.parse(stateString);\n\t if (!pageState || state.timestamp > pageState.timestamp) {\n\t return state;\n\t }\n\t }\n\t }\n\t return pageState;\n\t },\n\t _get: function () {\n\t var state = this._state();\n\t if (!state.figures) {\n\t var figuresString = localStorage.getItem(localStorageClipboard.figures);\n\t if (figuresString) {\n\t var sameConfig = state.config === _config.Config.GlobalResourceManager.id;\n\t var originalFigures = _cdl.Figures.fromXmlString(figuresString);\n\t var figures = sameConfig ? originalFigures : (0, _lodash.filter)(originalFigures, function (figure) {\n\t return !figure.containsLinkedResources();\n\t });\n\t return (0, _lodash.defaults)({ figures: figures }, state);\n\t } else {\n\t return null;\n\t }\n\t } else if (state.copy) {\n\t return (0, _lodash.defaults)({ figures: (0, _gear.cloneDeep)(state.figures) }, state);\n\t } else {\n\t return state;\n\t }\n\t },\n\t _store: function (figures, type) {\n\t var timestamp = (0, _lodash.now)();\n\t var config = _config.Config.GlobalResourceManager.id;\n\t this._pageState = {\n\t figures: figures,\n\t type: type,\n\t timestamp: timestamp,\n\t config: config\n\t };\n\t if (_config.Config.localStorageFiguresClipboard) {\n\t var figuresXml = _cdl.Figures.toXmlString(figures);\n\t\n\t // Figures are in a separate item for performance\n\t localStorage.setItem(localStorageClipboard.figures, figuresXml);\n\t localStorage.setItem(localStorageClipboard.metadata, JSON.stringify({\n\t type: 'copy',\n\t timestamp: timestamp,\n\t config: config }));\n\t\n\t if (_config.Config.debug) {\n\t SystemClipboard.copy(figuresXml);\n\t }\n\t }\n\t this.fireEvent('change');\n\t this.fireEvent(type);\n\t }\n\t});\n\t\n\tvar Clipboard = exports.Clipboard = new ClipboardImp();\n\n/***/ },\n\n/***/ 100:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.SelectedFigures_Mixin = undefined;\n\t\n\tvar _config = __webpack_require__(2);\n\t\n\tvar _lodash = __webpack_require__(4);\n\t\n\tvar _gear = __webpack_require__(8);\n\t\n\tvar _cdl = __webpack_require__(15);\n\t\n\tvar Selection = _gear.Base.extend({ typeName: 'Selection',\n\t\n\t Properties: {\n\t\n\t // [TODO] Review, this assumes that the selectableFigures will be defined by only one view\n\t // Maybe we should use the conditions of every view\n\t view: { type: 'View', def: null, owned: false },\n\t\n\t selectedFigures: { type: 'Figure[]', def: [], owned: false, onChange: function () {\n\t this.onSelectionChanged();\n\t }\n\t },\n\t\n\t autoSelection: { type: 'boolean', def: true },\n\t\n\t destinationLayerSelector: { type: 'selector', def: null, owned: false },\n\t\n\t allowCrossLayerSelection: { type: 'boolean', def: true, onChange: function () {\n\t this.onSelectionChanged();\n\t }\n\t },\n\t\n\t allowMultiLayerSelection: { type: 'boolean', def: false, onChange: function () {\n\t this.onSelectionChanged();\n\t }\n\t }\n\t },\n\t\n\t init: function () {\n\t this._document = null;\n\t this._createdFigures = [];\n\t this._crossLayerSelection = false;\n\t this._keepSelection = false;\n\t this._selectionChanged = false;\n\t },\n\t\n\t\n\t // [TODO] CrossPage selection\n\t\n\t fixUpSelectedFigures: function () {\n\t // The selection should:\n\t // - Respect the Z order.\n\t // - Avoid figure repetition.\n\t // - Belong to the document.\n\t // - Only have figures in the same layer (if cross layer selection is not allowed)\n\t //\n\t // We may want to be more fine grained to gain performance, but for now\n\t // it seems enough to do a complete check at every change.\n\t\n\t var _this = this,\n\t doc = _this._document,\n\t figuresMap = {},\n\t figures = [],\n\t selectedFigures = _this.selectedFigures;\n\t\n\t var layer = null,\n\t layerFigures = void 0,\n\t fixedFigures = void 0;\n\t\n\t // [TODO] Check this, we may want to add another condition\n\t // selectableFigures = filter( selectedFigures, figure => _this.is(figure,'selectable') );\n\t\n\t var selectableFigures = selectedFigures;\n\t\n\t if (_this._allowCrossLayerSelection) {\n\t\n\t _this._crossLayerSelection = false;\n\t (0, _lodash.forEach)(selectableFigures, function (f) {\n\t // Avoid figure repetition\n\t var f_localId = f._localId;\n\t if (!figuresMap[f_localId]) {\n\t figuresMap[f_localId] = true;\n\t\n\t // Belong to the document\n\t if (f.document === doc) {\n\t var f_layer = f.layer;\n\t if (!layer) {\n\t layer = f_layer;\n\t }\n\t if (layer !== f_layer) {\n\t _this._crossLayerSelection = true;\n\t }\n\t figures.push({\n\t figure: f,\n\t layer_zOrder: (0, _lodash.indexOf)(f.page._layers, f_layer),\n\t zOrder: (0, _lodash.indexOf)(f_layer._figures, f)\n\t });\n\t }\n\t }\n\t });\n\t\n\t // Respect Z order\n\t figures.sort(function (a, b) {\n\t var a_layer_zOrder = a.layer_zOrder,\n\t b_layer_zOrder = b.layer_zOrder;\n\t return a_layer_zOrder > b_layer_zOrder || a_layer_zOrder === b_layer_zOrder && a.zOrder >= b.zOrder ? 1 : -1;\n\t });\n\t\n\t fixedFigures = (0, _lodash.map)(figures, 'figure');\n\t selectedFigures._set(fixedFigures);\n\t } else {\n\t\n\t (0, _lodash.forEach)(selectableFigures, function (f) {\n\t // Avoid figure repetition\n\t var f_localId = f._localId;\n\t if (!figuresMap[f_localId]) {\n\t figuresMap[f_localId] = true;\n\t if (!layer) {\n\t // Belong to the document\n\t var f_layer = f.layer;\n\t if ((0, _lodash.includes)(doc.activePageLayers, f_layer)) {\n\t layer = f_layer;\n\t layerFigures = layer._figures;\n\t }\n\t }\n\t // Only have figures in the same layer.\n\t if (f._owner === layer) {\n\t figures.push({ figure: f, zOrder: (0, _lodash.indexOf)(layerFigures, f) });\n\t }\n\t }\n\t });\n\t // Respect Z order\n\t fixedFigures = (0, _lodash.map)((0, _lodash.sortBy)(figures, 'zOrder'), 'figure');\n\t selectedFigures._set(fixedFigures);\n\t }\n\t\n\t // Force the active layer to be the one where figures are selected\n\t // This is needed to be able to use document shorcuts like:\n\t //\n\t // doc.add( figure );\n\t //\n\t // Because that is equivalent to:\n\t //\n\t // doc.activeLayerFigures.add( figure );\n\t //\n\t var sf = (0, _lodash.last)(fixedFigures);\n\t if (sf && sf.layer !== doc.activeLayer) {\n\t doc.activeLayer = sf.layer;\n\t }\n\t },\n\t onSelectionChanged: function () {\n\t this.fixUpSelectedFigures();\n\t this._selectionChanged = true;\n\t },\n\t\n\t\n\t // MainDocument\n\t //----------------------------------------------------------------------------\n\t\n\t linkDoc: function (doc) {\n\t if (this._document !== doc) {\n\t this._document = doc;\n\t this.fixUpSelectedFigures();\n\t doc.on({\n\t commitrun: this.on_commitrun,\n\t commit: this.on_commit,\n\t render: this.on_render,\n\t activelayerchanged: this.on_activelayerchanged,\n\t revert: this.on_revert,\n\t figureschanged: this.on_figureschanged,\n\t layerschanged: this.on_layerschanged,\n\t pageschanged: this.on_pageschanged,\n\t activepagechanged: this.on_activepagechanged\n\t }, this);\n\t }\n\t },\n\t unlinkDoc: function (doc) {\n\t if (this._document === doc) {\n\t this._document = null;\n\t doc.un(this);\n\t }\n\t },\n\t consumeCreatedFigures: function () {\n\t var _createdFigures = this._createdFigures;\n\t\n\t this._createdFigures = [];\n\t return _createdFigures;\n\t },\n\t canSelect: function (figure) {\n\t return this.view.is(figure, 'selectable');\n\t },\n\t on_commit: function () {\n\t this.consumeCreatedFigures();\n\t this.on_render();\n\t },\n\t on_render: function () {\n\t this._selectionChanged = false;\n\t },\n\t on_commitrun: function () {\n\t var _this2 = this;\n\t\n\t var createdFigures = this.consumeCreatedFigures();\n\t if (createdFigures.length > 0) {\n\t (function () {\n\t\n\t // [Optimize] This is only needed to enforce activeLayer selection\n\t var selectableFigures = _this2.view.activeSelectableFigures();\n\t var autoSelectionFigures = (0, _lodash.filter)(createdFigures, function (figure) {\n\t return _this2.view.is(figure, 'selectable') && (0, _lodash.includes)(selectableFigures, figure);\n\t });\n\t\n\t if (autoSelectionFigures.length > 0) {\n\t if (_this2._autoSelection && !_this2._selectionChanged && !_this2._keepSelection) {\n\t // We only select the newly created figures if the selection has not been changed\n\t _this2.selectedFigures.set(autoSelectionFigures);\n\t }\n\t }\n\t })();\n\t }\n\t this._keepSelection = false;\n\t },\n\t on_activelayerchanged: function (doc, layer) {\n\t if (!this._allowCrossLayerSelection) {\n\t var selectedFigures = this.selectedFigures;\n\t var figure = selectedFigures[0];\n\t if (figure && figure.layer !== layer) {\n\t // If there are selected figures from a different layer, clear the selection\n\t selectedFigures._clear();\n\t }\n\t }\n\t },\n\t on_revert: function () {\n\t this._createdFigures = [];\n\t },\n\t on_figureschanged: function (doc, added /*, removed */) {\n\t var _this3 = this;\n\t\n\t (0, _lodash.forEach)(added, function (figure) {\n\t _this3._createdFigures.push(figure);\n\t });\n\t this.fixUpSelectedFigures();\n\t },\n\t on_layerschanged: function (doc, added /*, removed */) {\n\t var _this4 = this;\n\t\n\t (0, _lodash.forEach)(added, function (layer) {\n\t (0, _lodash.forEach)(layer.figures, function (figure) {\n\t _this4._createdFigures.push(figure);\n\t });\n\t });\n\t this.fixUpSelectedFigures();\n\t },\n\t on_pageschanged: function () /* doc, added, removed */{\n\t this.fixUpSelectedFigures();\n\t },\n\t on_activepagechanged: function () /* doc, page */{\n\t this.fixUpSelectedFigures();\n\t }\n\t});\n\t\n\t// Expects _document/doc, and calls to linkDoc(doc) and unlinkDoc(doc)\n\t\n\tvar SelectedFigures_Mixin = exports.SelectedFigures_Mixin = {\n\t\n\t get selectedFigures() {\n\t return this.selection.selectedFigures;\n\t },\n\t set selectedFigures(figures) {\n\t this.selection.selectedFigures = figures;\n\t },\n\t\n\t get autoSelection() {\n\t return this.selection.autoSelection;\n\t },\n\t set autoSelection(state) {\n\t this.selection.autoSelection = state;\n\t },\n\t\n\t get destinationLayerSelector() {\n\t return this.selection.destinationLayerSelector;\n\t },\n\t set destinationLayerSelector(selector) {\n\t this.selection.destinationLayerSelector = selector;\n\t },\n\t\n\t get allowCrossLayerSelection() {\n\t return this.selection.allowCrossLayerSelection;\n\t },\n\t set allowCrossLayerSelection(state) {\n\t this.selection.allowCrossLayerSelection = state;\n\t },\n\t\n\t get allowMultiLayerSelection() {\n\t return this.selection.allowMultiLayerSelection;\n\t },\n\t set allowMultiLayerSelection(state) {\n\t this.selection.allowMultiLayerSelection = state;\n\t },\n\t\n\t keepSelection: function () {\n\t this.selection._keepSelection = true;\n\t },\n\t\n\t\n\t get contextFigures() {\n\t var selectedFigures = this.selectedFigures;\n\t\n\t return selectedFigures.isEmpty ? this._document.activeLayerFigures : selectedFigures;\n\t },\n\t\n\t // [TODO][ToProp]\n\t activeSelectableLayers: function () {\n\t var doc = this.doc;\n\t // Hack a fix for a current bug that we need to investigate further\n\t\n\t if (doc.editingContent() || this.selection.allowMultiLayerSelection) {\n\t var activeLayer = doc.activeLayer;\n\t\n\t return !activeLayer._locked && !activeLayer._hidden ? [activeLayer] : [];\n\t } else {\n\t return (0, _cdl.filterTargetLayers)(doc.activePageLayers);\n\t }\n\t },\n\t filterSelectableFigures: function (figures) {\n\t var r = [];\n\t var selection = this.selection;\n\t\n\t for (var k = 0, kEnd = figures.length; k < kEnd; ++k) {\n\t var figure = figures[k];\n\t if (selection.canSelect(figure)) {\n\t r.push(figure);\n\t }\n\t }\n\t return r;\n\t },\n\t\n\t\n\t // [TODO][ToProp]\n\t activeSelectableFigures: function () {\n\t if (this.selection._allowCrossLayerSelection && !this.selection.allowMultiLayerSelection && !this.doc.editingContent()) {\n\t return this.activeSelectableFiguresForDoc(this.doc);\n\t } else {\n\t var layer = this.activeLayer;\n\t return layer._locked ? [] : this.filterSelectableFigures(layer.figures);\n\t }\n\t },\n\t\n\t\n\t // [TODO] page.locked, page.hidden\n\t activeSelectableFiguresForDoc: function (doc) {\n\t var _this5 = this;\n\t\n\t var figures = [];\n\t (0, _lodash.forEach)(doc.layers, function (layer) {\n\t if (!(layer.hidden || layer.locked)) {\n\t var layerFigures = _this5.filterSelectableFigures(layer.figures);\n\t figures = figures.concat(layerFigures);\n\t }\n\t });\n\t return figures;\n\t },\n\t selectAll: function () {\n\t this.selectedFigures.set(this.activeSelectableFigures());\n\t },\n\t clearSelection: function () {\n\t this.selectedFigures.clear();\n\t },\n\t\n\t\n\t // [TODO] isCrossLayerSelection, isActiveLayerSelection\n\t\n\t // @param {Number} move : +/- jump\n\t selectNext: function () {\n\t var move = arguments.length <= 0 || arguments[0] === undefined ? 1 : arguments[0];\n\t var selectedFigures = this.selectedFigures;\n\t\n\t var figures = this.activeSelectableFigures();\n\t\n\t var length = figures.length;\n\t\n\t if (length === 0) {\n\t return;\n\t }\n\t var next = selectedFigures.isEmpty ? 0 : (figures.indexOf(selectedFigures[0]) + move) % length;\n\t if (next < 0) {\n\t next += length;\n\t }\n\t selectedFigures.set(figures[next]);\n\t },\n\t crossLayerSelection: function () {\n\t return this.selection._crossLayerSelection;\n\t },\n\t\n\t\n\t // In TextureView, model and document coordinates are not the same, using\n\t // model coordiantes here allow us to share more code\n\t\n\t figureAtEvent: function (event) {\n\t var modelPoint = this.modelPoint(event);\n\t if (!modelPoint) {\n\t return null;\n\t }\n\t var tabFigures = event.altKey ? this.selectedFigures : null;\n\t return this.figureAtModelPoint(modelPoint, tabFigures);\n\t },\n\t figureHitAtEvent: function (event) {\n\t var modelPoint = this.modelPoint(event);\n\t if (!modelPoint) {\n\t return null;\n\t }\n\t var tabFigures = event.altKey ? this.selectedFigures : null;\n\t return this.figureAtModelPointEx(modelPoint, tabFigures);\n\t },\n\t rawFigureHitsAtEvent: function (event) {\n\t var modelPoint = this.modelPoint(event);\n\t if (!modelPoint) {\n\t return [];\n\t }\n\t return this.rawFigureHitsAtModelPoint(modelPoint);\n\t },\n\t\n\t\n\t // Overwriten by doc3d-model-mixin\n\t rawFigureHitsAtModelPoint: function (modelPoint) {\n\t return this.rawFigureHitsAt(this.modelToDoc(modelPoint));\n\t },\n\t\n\t\n\t // Return all the figures, even invisible and locked ones\n\t // Overwriten by doc3d-model-mixin\n\t rawFigureHitsAt: function (docPoint) {\n\t\n\t var candidates = [];\n\t var page = this.doc.activePage;\n\t\n\t var layers = page.layers;\n\t\n\t for (var l = layers.length - 1; l >= 0; --l) {\n\t var figures = layers[l].figures;\n\t\n\t for (var f = figures.length - 1; f >= 0; --f) {\n\t var figure = figures[f];\n\t\n\t if (figure.globalFrame_().contains(docPoint)) {\n\t var candidate = {\n\t figure: figure, docPoint: docPoint,\n\t tight: figure.containsPoint(docPoint) // like hitTest but also returns true if locked\n\t };\n\t candidates.push(candidate);\n\t }\n\t }\n\t }\n\t\n\t return candidates;\n\t },\n\t figureAtModelPoint: function (modelPoint, tabFigures, info) {\n\t return this.extractHitInfo(this.figureAtModelPointEx(modelPoint, tabFigures), info);\n\t },\n\t figureAtModelPointEx: function (modelPoint, tabFigures) {\n\t return this.figureAtPointEx(this.modelToDoc(modelPoint), tabFigures);\n\t },\n\t figureAtPoint: function (docPoint, tabFigures, info) {\n\t return this.extractHitInfo(this.figureAtPointEx(docPoint, tabFigures), info);\n\t },\n\t figureAtPointEx: function (docPoint, tabFigures) {\n\t return this.topFigureFromEx(this.activeSelectableFiguresForDoc(this.doc), docPoint, tabFigures);\n\t },\n\t\n\t\n\t // TextureView and Canvas3D adds more info for the hit\n\t extractHitInfo: function (hit, info) {\n\t if (hit) {\n\t if (info) {\n\t info.tight = hit.tight;\n\t }\n\t return hit.figure;\n\t }\n\t return undefined;\n\t },\n\t figuresBetweenEvents: function () /* eventDown, eventUp */{\n\t // [TODO]\n\t return [];\n\t },\n\t\n\t\n\t // Let descendant init this view before others to avoid initialization issues\n\t initSelection: function (config) {\n\t if (!this.selection) {\n\t this.addEvents('selectionchanged', 'selectionupdated');\n\t this.selection = config && config.selection || new Selection((0, _lodash.assign)({ view: this }, config));\n\t }\n\t },\n\t init: function (config) {\n\t this.initSelection(config);\n\t this.callParent(config);\n\t },\n\t linkDoc: function (doc) {\n\t this.callParent(doc);\n\t this.selection.linkDoc(doc);\n\t },\n\t unlinkDoc: function (doc) {\n\t this.callParent(doc);\n\t this.selection.unlinkDoc(doc);\n\t },\n\t\n\t\n\t // These methods uses figureViews, we never simplify it in case we need\n\t // to start using the figure drawn buffers to do pixel testing. We may\n\t // start doing it as an optimization at one point in the future\n\t\n\t topFigureFrom: function (selectableFigures, docPoint, tabFigures, info) {\n\t return this.extractHitInfo(this.topFigureFromEx(selectableFigures, docPoint, tabFigures), info);\n\t },\n\t topFigureFromEx: function (fromFigures, docPoint, tabFigures) {\n\t\n\t // Frame selection (Frame selection fallback)\n\t var figures = (0, _gear.filterRight)(fromFigures, function (figure) {\n\t return figure.frame_().contains(docPoint);\n\t });\n\t\n\t var candidates = (0, _lodash.map)(figures, function (figure) {\n\t return { figure: figure, docPoint: docPoint, tight: false };\n\t });\n\t\n\t return this.bestFigureCandidate(candidates, tabFigures);\n\t },\n\t candidateHitTest: function (candidate) {\n\t return this.figureView(candidate.figure).hitTest(candidate.docPoint);\n\t },\n\t filterHittedCandidates: function (candidates) {\n\t var r = [];\n\t for (var k = 0, kEnd = candidates.length; k < kEnd; ++k) {\n\t var candidate = candidates[k];\n\t if (this.candidateHitTest(candidate)) {\n\t r.push(candidate);\n\t }\n\t }\n\t return r;\n\t },\n\t findHittedCandidate: function (candidates) {\n\t for (var k = 0, kEnd = candidates.length; k < kEnd; ++k) {\n\t var candidate = candidates[k];\n\t if (this.candidateHitTest(candidate)) {\n\t return candidate;\n\t }\n\t }\n\t },\n\t\n\t\n\t // Check Doc3_Model_Mixin, to see why the docPoint is kept for each\n\t // candidate even if it is the same for all figures in 2D.}\n\t\n\t bestFigureCandidate: function (candidates, tabFigures) {\n\t\n\t // Shortcircuit, avoid expensive curves based selection if not needed\n\t\n\t if (candidates.length === 0) {\n\t return null; // Nothing around\n\t }\n\t\n\t if (candidates.length === 1) {\n\t var candidate = candidates[0];\n\t candidate.tight = this.candidateHitTest(candidate);\n\t return candidate; // Only one figure\n\t }\n\t\n\t var tab = tabFigures && tabFigures.length > 0;\n\t\n\t // direct selection of figure?\n\t if (_config.Config.useCurvesBasedSelection) {\n\t\n\t if (tab) {\n\t candidates = this.filterHittedCandidates(candidates);\n\t } else {\n\t var _candidate = this.findHittedCandidate(candidates);\n\t if (_candidate) {\n\t _candidate.tight = true;\n\t return _candidate;\n\t }\n\t }\n\t }\n\t\n\t if (tab) {\n\t // const current = findLastIndex( candidates, ({figure}) => includes(tabFigures,figure) );\n\t var current = candidates.length - 1;\n\t for (; current >= 0; --current) {\n\t if ((0, _lodash.includes)(tabFigures, candidates[current].figure)) {\n\t break;\n\t }\n\t }\n\t\n\t if (current === candidates.length - 1) {\n\t return candidates[0]; // Start over from the top most figure\n\t } else {\n\t return candidates[current + 1]; // tab over next figure in z order\n\t }\n\t } else {\n\t return candidates[0];\n\t }\n\t },\n\t fireChangeEvents: function (type, doc) {\n\t var change = this.callParent(type, doc);\n\t\n\t var selectionChanged = this.selection._selectionChanged;\n\t if (selectionChanged) {\n\t this.fireEvent('selectionchanged', this);\n\t // console.log('selectionchanged');\n\t change = true;\n\t }\n\t\n\t if (selectionChanged || type === 'commit') {\n\t this.fireEvent('selectionupdated', this);\n\t // console.log('selectionupdated');\n\t change = true;\n\t }\n\t\n\t return change;\n\t }\n\t};\n\n/***/ },\n\n/***/ 101:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.InteractiveView_Mixin = undefined;\n\t\n\tvar _lodash = __webpack_require__(4);\n\t\n\tvar _cdl = __webpack_require__(15);\n\t\n\tvar _util = __webpack_require__(85);\n\t\n\tvar _events = __webpack_require__(86);\n\t\n\tvar _tool = __webpack_require__(88);\n\t\n\tvar _plugin = __webpack_require__(87);\n\t\n\tvar InteractiveView_Mixin = exports.InteractiveView_Mixin = {\n\t\n\t Properties: {\n\t\n\t keyShortcuts: { type: 'boolean', def: false },\n\t\n\t stackViewTools: { type: 'boolean', def: true }\n\t },\n\t\n\t // [TODO]\n\t // Should this work over the passed domElement or the internal container\n\t\n\t get_cursor: function () {\n\t return this.container.style.cursor;\n\t },\n\t set_cursor: function (cursor) {\n\t this.container.style.cursor = cursor;\n\t },\n\t\n\t\n\t get cursor() {\n\t return this.get_cursor();\n\t },\n\t\n\t set cursor(cursor_) {\n\t this.set_cursor(cursor_);\n\t },\n\t\n\t hasFocus: function () {\n\t return this.container === document.activeElement;\n\t },\n\t focus: function () {\n\t _util.g$.focus(this.container);\n\t },\n\t init: function (config) {\n\t\n\t this.addEvents(_events.interactiveViewEvents, 'toolchanged', 'movetoclipboard', 'openclipboard');\n\t\n\t this.callParent(config);\n\t },\n\t linkDoc: function (doc) {\n\t this.callParent(doc);\n\t if (doc.activePage.activeLayer instanceof _cdl.ContentLayer) {\n\t this.updateEditContentStatus();\n\t }\n\t },\n\t fixUpPlugins: function (plugins) {\n\t // [TODO] Clean up... Horrible Hack :(\n\t var keyShortcuts = (0, _lodash.find)(plugins, function (p) {\n\t return p instanceof _plugin.Plugin.KeyShortcuts;\n\t });\n\t if (keyShortcuts) {\n\t plugins._remove(keyShortcuts);\n\t plugins._insert(0, keyShortcuts);\n\t }\n\t },\n\t afterInit: function () {\n\t var config = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\t\n\t // [TODO] Make this a property\n\t var captureKey = config.captureKey;\n\t if (captureKey) {\n\t this._iConfig = { captureKey: captureKey };\n\t }\n\t this.callParent(config);\n\t\n\t if (config.tool) {\n\t this.tool = config.tool;\n\t }\n\t },\n\t appendTo: function (domElement, id) {\n\t\n\t this.callParent(domElement, id);\n\t\n\t var container = this.container;\n\t\n\t\n\t container.setAttribute('tabindex', 0);\n\t _util.g$.addClass(container, 'grafika-canvas');\n\t\n\t this._eventsHelper = new _events.InteractiveHelper(this, container, this._iConfig);\n\t\n\t this.initStatus();\n\t\n\t this.initTooltip();\n\t\n\t return this;\n\t },\n\t triggerKeyboard: function (event) {\n\t this._eventsHelper.triggerKeyboard(event);\n\t },\n\t dispose: function () {\n\t var eh = this._eventsHelper;\n\t if (eh) {\n\t eh.dispose();\n\t }\n\t this.callParent();\n\t },\n\t\n\t\n\t // Tools Plugin shortcuts\n\t\n\t commitEditionTools$: function () {\n\t return this.tools.commitEditionTools$();\n\t },\n\t\n\t\n\t get tool() {\n\t return this.tools.tool;\n\t },\n\t set tool(tool_) {\n\t this.tools.tool = tool_;\n\t },\n\t\n\t popTool: function () {\n\t return this.tools.popTool();\n\t },\n\t toolhelp: function (string) {\n\t return this.tools.toolhelp(string);\n\t },\n\t\n\t\n\t // Easy access to common tools\n\t // This should be in a new InteractiveDocumentView_Mixin\n\t // We will see how it will evolve\n\t\n\t nodeEdit: function (figure, config) {\n\t this.tool = new _tool.Tool.NodeEdit(figure, config);\n\t return this;\n\t },\n\t nodeEditEnvelope: function (figure, config) {\n\t this.tool = new _tool.Tool.NodeEditEnvelope(figure, config);\n\t return this;\n\t },\n\t\n\t\n\t // [TODO] Plugin.Status\n\t //--------------------------------------------\n\t\n\t // [TODO] Remove need for container to have an id, create div with functions\n\t initStatus: function () {\n\t var _this = this;\n\t\n\t var statusId = this.container.id + '_status';\n\t _util.g$.append(this.container, '');\n\t var statusEl = this._statusEl = (0, _util.g$)(\"#\" + statusId);\n\t\n\t // [TODO] click ?\n\t _util.g$.on(statusEl, \"click\", function () {\n\t return _this.commitStatus();\n\t });\n\t this._status = null;\n\t },\n\t status: function (s) {\n\t if (s === undefined) {\n\t return this._status;\n\t } else {\n\t this._status = s;\n\t this.updateStatus();\n\t return this;\n\t }\n\t },\n\t commitStatus: function () {\n\t var status = this._status;\n\t if (status) {\n\t var commit = status.commit;\n\t if (commit) {\n\t commit.call(this);\n\t }\n\t }\n\t },\n\t updateStatus: function () {\n\t var status = this._status,\n\t el = this._statusEl;\n\t if (status) {\n\t var html = '

' + status.message;\n\t if (status.commit) {\n\t html += '';\n\t }\n\t html += '

';\n\t el.innerHTML = html;\n\t }\n\t\n\t el.style.display = status ? 'inline' : 'none';\n\t },\n\t\n\t //----------------------------------------------------------------\n\t\n\t\n\t // [TODO] Plugin.Tooltip, only used by the Head Up Display, move this there\n\t //----------------------------------------------------------------\n\t\n\t initTooltip: function () {\n\t var tooltipId = this.container.id + \"_tooltip\";\n\t _util.g$.append(this.container, '');\n\t this._tooltipEl = (0, _util.g$)(\"#\" + tooltipId);\n\t },\n\t showTooltip: function (message, point) {\n\t var tel = this._tooltipEl;\n\t if (tel) {\n\t this.hideTooltip();\n\t var cp = point.x < 300 ? _cdl.Point.add(point, new _cdl.Point(20, 10)) : _cdl.Point.add(point, new _cdl.Point(-message.length * 6 - 18, 0));\n\t if (point.y > 400) {\n\t cp.y -= 40;\n\t }\n\t tel.innerHTML = message;\n\t\n\t (0, _lodash.assign)(tel.style, {\n\t 'left': cp.x + 'px',\n\t 'top': cp.y + 'px',\n\t 'display': 'block'\n\t });\n\t\n\t this._tooltipVisible = true;\n\t }\n\t },\n\t hideTooltip: function () {\n\t if (this._tooltipVisible) {\n\t var tel = this._tooltipEl;\n\t if (tel) {\n\t tel.style.display = 'none';\n\t this._tooltipVisible = false;\n\t }\n\t }\n\t }\n\t};\n\n/***/ },\n\n/***/ 102:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _lodash = __webpack_require__(4);\n\t\n\tvar _gear = __webpack_require__(8);\n\t\n\tvar _view = __webpack_require__(84);\n\t\n\tvar _colorShowthrough = __webpack_require__(103);\n\t\n\t_view.Plugin.ActiveRenderer = _view.Plugin.extend({ typeName: 'ActiveRendererPlugin',\n\t name: 'renderer',\n\t\n\t target: 'document',\n\t\n\t drawTo_color: ['background', 'document', 'foreground'],\n\t\n\t redrawFigure: function (view, figure) {\n\t if ((0, _lodash.includes)(view._activeFigures, figure)) {\n\t view.redraw('document');\n\t } else {\n\t if (figure.document === view._mainDocument) {\n\t view.redraw('document');\n\t } else {\n\t view.redraw('background');\n\t }\n\t }\n\t },\n\t\n\t\n\t // Draw everything that is behind the first active figure\n\t draw_background: function (_ref) {\n\t var view = _ref.view;\n\t var context = _ref.context;\n\t var transform = _ref.transform;\n\t\n\t view.fillWithBackgroundColor(context);\n\t\n\t var firstActiveFigure = view._activeFigures[0];\n\t var lastFigure = firstActiveFigure || 'doc';\n\t\n\t this.drawFigures(view, context, transform, {\n\t until: lastFigure\n\t });\n\t },\n\t\n\t\n\t // draw active figures, or current document\n\t draw_document: function (_ref2) {\n\t var view = _ref2.view;\n\t var context = _ref2.context;\n\t var transform = _ref2.transform;\n\t\n\t var activeFigures = view._activeFigures;\n\t if (activeFigures.length > 0) {\n\t var alpha = this._activeAlpha;\n\t if (alpha === 0) {\n\t return;\n\t }\n\t if (alpha !== undefined && alpha < 1) {\n\t context.globalAlpha *= alpha;\n\t }\n\t }\n\t\n\t var firstActiveFigure = activeFigures[0] || 'doc';\n\t var lastActiveFigure = (0, _lodash.last)(activeFigures);\n\t\n\t (0, _colorShowthrough.draw_colorShowthrough_gl)(view, context, transform, this, firstActiveFigure, lastActiveFigure);\n\t\n\t if (activeFigures.length === 0) {\n\t this.drawSpecialPens(view, context, transform);\n\t }\n\t },\n\t\n\t\n\t // In case there are active figures, draw everything above them\n\t draw_foreground: function (_ref3) {\n\t var view = _ref3.view;\n\t var context = _ref3.context;\n\t var transform = _ref3.transform;\n\t\n\t var activeFigures = view._activeFigures;\n\t if (activeFigures.length === 0) {\n\t // clearContext(context);\n\t return;\n\t }\n\t\n\t var lastActiveFigure = (0, _lodash.last)(activeFigures);\n\t var firstFigure = lastActiveFigure || 'doc';\n\t\n\t this.drawFigures(view, context, transform, {\n\t from: firstFigure, skipFirst: true\n\t });\n\t\n\t this.drawSpecialPens(view, context, transform);\n\t },\n\t drawSpecialPens: function (view, context, transform) {\n\t var specialPens = view.specialPens;\n\t\n\t if (specialPens) {\n\t specialPens.drawForPage(view._mainDocument.activePage, context, transform);\n\t }\n\t },\n\t drawFigures: function (view, context, transform, span) {\n\t var clearBuffer = arguments.length <= 4 || arguments[4] === undefined ? false : arguments[4];\n\t var drawShowthroughMask = arguments.length <= 5 || arguments[5] === undefined ? false : arguments[5];\n\t var from = span.from;\n\t\n\t var drawing = { start: !from || from === 'doc', end: false };\n\t var config = { editingContent: view._mainDocument.editingContent() };\n\t\n\t var page = view._mainDocument.activePage;\n\t\n\t var backgroundPage = view.backgroundPageFor(page);\n\t if (backgroundPage && from !== 'doc') {\n\t this.drawPage(view, backgroundPage, context, transform, config, span, drawing, clearBuffer, drawShowthroughMask);\n\t }\n\t\n\t if (drawing.end || span.until === 'doc') {\n\t return false;\n\t }\n\t\n\t this.drawPage(view, page, context, transform, config, span, drawing, clearBuffer, drawShowthroughMask);\n\t },\n\t drawPage: function (view, page, context, transform, config, _ref4, drawing) {\n\t var from = _ref4.from;\n\t var skipFirst = _ref4.skipFirst;\n\t var until = _ref4.until;\n\t var includeLast = _ref4.includeLast;\n\t var clearBuffer = arguments.length <= 7 || arguments[7] === undefined ? false : arguments[7];\n\t var drawShowthroughMask = arguments.length <= 8 || arguments[8] === undefined ? false : arguments[8];\n\t\n\t\n\t config = (0, _lodash.assign)({ wireframe: view.wireframe }, config);\n\t config = (0, _lodash.assign)({ showthroughColor: view.showThroughColor }, config);\n\t (0, _lodash.forEach)(page.layers, function (layer) {\n\t\n\t // This is not the best for this pattern, but we may remove the\n\t // isolated figures pattern soon.\n\t layer.beforeDraw(context, config);\n\t\n\t (0, _lodash.forEach)(layer.figures, function (figure) {\n\t if (!skipFirst && from === figure) {\n\t drawing.start = true;\n\t }\n\t if (!includeLast && until === figure) {\n\t drawing.end = true;\n\t }\n\t\n\t if (drawing.start && !drawing.end) {\n\t\n\t var figureView = view.figureView(figure);\n\t if (figureView) {\n\t figureView.draw(context, transform, config, clearBuffer, drawShowthroughMask);\n\t } else {\n\t console.log('[Error] FigureView is undefined');\n\t }\n\t\n\t if (view._showPin) {\n\t (0, _gear.dot)(context, figure.pin, 3, transform, '#ffffff', '#222222', 4);\n\t }\n\t }\n\t\n\t if (skipFirst && from === figure) {\n\t drawing.start = true;\n\t }\n\t if (includeLast && until === figure) {\n\t drawing.end = true;\n\t }\n\t\n\t if (drawing.end) {\n\t return false;\n\t }\n\t });\n\t\n\t layer.afterDraw(context, config); // [TODO]\n\t\n\t if (drawing.end) {\n\t return false;\n\t }\n\t });\n\t }\n\t});\n\n/***/ },\n\n/***/ 103:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.draw_colorShowthrough_gl = undefined;\n\t\n\tvar _config = __webpack_require__(2);\n\t\n\tvar _lodash = __webpack_require__(4);\n\t\n\tvar _gear = __webpack_require__(8);\n\t\n\tvar _geometry = __webpack_require__(21);\n\t\n\tvar _color = __webpack_require__(31);\n\t\n\tvar _figure = __webpack_require__(35);\n\t\n\tvar _replaceST = __webpack_require__(104);\n\t\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\t\n\t// values between 0...255\n\t// map :: function(r,g,b,a){ return [ r*, g*, b*, a* ]; }\n\t\n\tvar modifyImageDataRGBA = function (imageData, map) {\n\t var extended = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2];\n\t\n\t var data = imageData.data,\n\t width = imageData.width,\n\t height = imageData.height;\n\t var y = void 0,\n\t x = void 0,\n\t inpos = void 0,\n\t outpos = void 0,\n\t r = void 0,\n\t g = void 0,\n\t b = void 0,\n\t a = void 0;\n\t\n\t for (y = 0; y < height; ++y) {\n\t inpos = y * width * 4; // *4 for 4 ints per pixel\n\t outpos = inpos;\n\t for (x = 0; x < width; ++x) {\n\t\n\t r = data[inpos++];\n\t g = data[inpos++];\n\t b = data[inpos++];\n\t a = data[inpos++]; // alpha\n\t\n\t // http://www.w3.org/TR/AERT#color-contrast\n\t var c = map(r, g, b, a);\n\t\n\t data[outpos++] = c[0];\n\t data[outpos++] = c[1];\n\t data[outpos++] = c[2];\n\t data[outpos++] = c[3];\n\t\n\t if (extended && !(c[0] == 10 && c[1] == 10 && c[2] == 10 && c[3] == 0)) {\n\t var currentPos = outpos - 4;\n\t var done = false;\n\t\n\t for (var i = 1; i < 3; ++i) {\n\t if (x < width - i) {\n\t var c2 = map(data[inpos++], data[inpos++], data[inpos++], data[inpos++]);\n\t if (c2[0] == 10 && c2[1] == 10 && c2[2] == 10 && c2[3] == 0) {\n\t outpos -= 4;\n\t data[outpos++] = 0;\n\t data[outpos++] = 0;\n\t data[outpos++] = 0;\n\t data[outpos++] = 0;\n\t done = true;\n\t break;\n\t }\n\t }\n\t }for (var _i = 1; _i < 3; ++_i) {\n\t if (!done && x >= _i) {\n\t inpos = currentPos - 4 * _i;\n\t var c3 = map(data[inpos++], data[inpos++], data[inpos++], data[inpos++]);\n\t if (c3[0] == 10 && c3[1] == 10 && c3[2] == 10 && c3[3] == 0) {\n\t outpos -= 4;\n\t data[outpos++] = 0;\n\t data[outpos++] = 0;\n\t data[outpos++] = 0;\n\t data[outpos++] = 0;\n\t break;\n\t }\n\t }\n\t }for (var _i2 = 1; _i2 < 3; ++_i2) {\n\t if (y < height - _i2) {\n\t inpos = currentPos + 4 * _i2 * width;\n\t var _c = map(data[inpos++], data[inpos++], data[inpos++], data[inpos++]);\n\t if (_c[0] == 10 && _c[1] == 10 && _c[2] == 10 && _c[3] == 0) {\n\t outpos -= 4;\n\t data[outpos++] = 0;\n\t data[outpos++] = 0;\n\t data[outpos++] = 0;\n\t data[outpos++] = 0;\n\t done = true;\n\t break;\n\t }\n\t }\n\t }for (var _i3 = 1; _i3 < 3; ++_i3) {\n\t if (y >= _i3) {\n\t inpos = currentPos - 4 * _i3 * width;\n\t var _c2 = map(data[inpos++], data[inpos++], data[inpos++], data[inpos++]);\n\t if (_c2[0] == 10 && _c2[1] == 10 && _c2[2] == 10 && _c2[3] == 0) {\n\t outpos -= 4;\n\t data[outpos++] = 0;\n\t data[outpos++] = 0;\n\t data[outpos++] = 0;\n\t data[outpos++] = 0;\n\t done = true;\n\t break;\n\t }\n\t }\n\t }outpos = currentPos + 4;\n\t inpos = currentPos + 4;\n\t }\n\t }\n\t }\n\t};\n\t\n\t// ColorShowthrough\n\t//======================================================================================\n\tvar draw_colorShowthrough = function (view, context, transform, renderer, firstActiveFigure, lastActiveFigure) {\n\t var _this = this;\n\t\n\t var lAvoidSlowST = _config.Config.avoidRenderingShowThroughNoGL;\n\t\n\t var lSTColors = [];\n\t\n\t if (!lAvoidSlowST) {\n\t var page = view._mainDocument.activePage;\n\t (0, _lodash.forEach)(page.layers, function (layer) {\n\t _figure.Figures.forEachColor(layer.figures, function (c) {\n\t if (c && c.showThrough && !lSTColors.indexOf(c) >= 0) {\n\t lSTColors.push(c);\n\t }\n\t });\n\t });\n\t }\n\t\n\t if (lSTColors.length > 0 && !lAvoidSlowST) {\n\t var canvas = document.createElement('canvas');\n\t canvas.width = view.width;\n\t canvas.height = view.height;\n\t var ctx = canvas.getContext('2d');\n\t\n\t renderer.drawFigures(view, ctx, transform, {\n\t from: firstActiveFigure,\n\t until: lastActiveFigure, includeLast: true\n\t });\n\t\n\t var lImageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n\t\n\t modifyImageDataRGBA(lImageData, function (r, g, b, a) {\n\t var lRet = [r, g, b, a];\n\t lSTColors.forEach(function (c) {\n\t if (c.r() == r && c.g() == g && c.b() == b) lRet = [10, 10, 10, 0];\n\t }, _this);\n\t return lRet;\n\t }, true);\n\t\n\t context.putImageData(lImageData, 0, 0);\n\t } else {\n\t renderer.drawFigures(view, context, transform, {\n\t from: firstActiveFigure,\n\t until: lastActiveFigure, includeLast: true\n\t });\n\t }\n\t};\n\t\n\t// ColorShowthrough\n\t//======================================================================================\n\tvar mGlCanvas = null;\n\tvar mGlCtx = null;\n\tvar mEffect = null;\n\tvar mCanvasST = null;\n\tvar mCanvasNormal = null;\n\t\n\tvar draw_colorShowthrough_gl = exports.draw_colorShowthrough_gl = function (view, context, transform, renderer, firstActiveFigure, lastActiveFigure) {\n\t var lHasST = false;\n\t var lNeedsBufferClear = false;\n\t var page = view._mainDocument.activePage;\n\t\n\t var lNrLayers = page.layers.length;\n\t\n\t for (var iLayer = 0; !lHasST && iLayer < lNrLayers; iLayer++) {\n\t var lLayer = page.layers[iLayer];\n\t var lFigures = lLayer.figures;\n\t var lNrFigures = lFigures.length;\n\t for (var k = 0; !lHasST && k < lNrFigures; k++) {\n\t var lColors = lFigures[k].getColors();\n\t var lNrColors = lColors.length;\n\t for (var i = 0; !lHasST && i < lNrColors; i++) {\n\t if (lColors[i].showThrough) {\n\t lHasST = true;\n\t }\n\t }\n\t }\n\t }\n\t\n\t var lShowThroughColor = view.showThroughColor;\n\t if (lShowThroughColor.alpha != 0.0) {\n\t lNeedsBufferClear = true;\n\t lHasST = false;\n\t }\n\t\n\t if (lHasST) {\n\t if (mGlCanvas == null) {\n\t mCanvasST = document.createElement('canvas');\n\t mCanvasNormal = document.createElement('canvas');\n\t mGlCanvas = document.createElement('canvas');\n\t mGlCtx = mGlCanvas.getContext('webgl', { premultipliedAlpha: false });\n\t\n\t if (mGlCtx != null) {\n\t mGlCtx.pixelStorei(mGlCtx.UNPACK_ALIGNMENT, 1);\n\t mEffect = new _replaceST.ReplaceSTEffect(mGlCtx);\n\t\n\t //pass in clipspace coordiantes to vertex shader\n\t var lPositionsBuffer = mGlCtx.createBuffer();\n\t mGlCtx.bindBuffer(mGlCtx.ARRAY_BUFFER, lPositionsBuffer);\n\t mGlCtx.bufferData(mGlCtx.ARRAY_BUFFER, new Float32Array([-1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0]), mGlCtx.STATIC_DRAW);\n\t\n\t //pass in texture coordinates to vertext shader\n\t var lTexCoordBuffer = mGlCtx.createBuffer();\n\t mGlCtx.bindBuffer(mGlCtx.ARRAY_BUFFER, lTexCoordBuffer);\n\t mGlCtx.bufferData(mGlCtx.ARRAY_BUFFER, new Float32Array([0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0]), mGlCtx.STATIC_DRAW);\n\t\n\t //pass in clipspace coordiantes to vertex shader\n\t mGlCtx.bindBuffer(mGlCtx.ARRAY_BUFFER, lPositionsBuffer);\n\t mGlCtx.enableVertexAttribArray(mEffect.a_position);\n\t mGlCtx.vertexAttribPointer(mEffect.a_position, 2, mGlCtx.FLOAT, false, 0, 0);\n\t\n\t //pass in texture coordinates to vertext shader\n\t mGlCtx.bindBuffer(mGlCtx.ARRAY_BUFFER, lTexCoordBuffer);\n\t mGlCtx.enableVertexAttribArray(mEffect.a_texCoord);\n\t mGlCtx.vertexAttribPointer(mEffect.a_texCoord, 2, mGlCtx.FLOAT, false, 0, 0);\n\t }\n\t }\n\t\n\t if (mGlCtx == null) {\n\t return draw_colorShowthrough(view, context, transform, renderer, firstActiveFigure, lastActiveFigure); //Fallback to slow implementation\n\t }\n\t var firstSemiTransparent = null;\n\t for (var _iLayer = 0; _iLayer < lNrLayers; _iLayer++) {\n\t var _lLayer = page.layers[_iLayer];\n\t var _lFigures = _lLayer.figures;\n\t var _lNrFigures = _lFigures.length;\n\t for (var _k = 0; _k < _lNrFigures; _k++) {\n\t var lFigure = _lFigures[_k];\n\t deepRasterOff(lFigure);\n\t\n\t if (firstSemiTransparent == null) {\n\t var _lColors = lFigure.getColors();\n\t _lColors = [].concat(_toConsumableArray(new Set(_lColors))); //remove duplicates\n\t var _lNrColors = _lColors.length;\n\t for (var _i4 = 0; _i4 < _lNrColors; _i4++) {\n\t if (_lColors[_i4].alpha > 0 && _lColors[_i4].alpha < 1) {\n\t firstSemiTransparent = lFigure;\n\t }\n\t }\n\t }\n\t }\n\t }\n\t var includeLast = firstSemiTransparent != null;\n\t var lastFigure = firstSemiTransparent != null ? firstSemiTransparent : lastActiveFigure;\n\t mCanvasST.width = view.width;\n\t mCanvasST.height = view.height;\n\t var ctxST = mCanvasST.getContext('2d');\n\t renderer.drawFigures(view, ctxST, transform, {\n\t from: firstActiveFigure,\n\t until: lastFigure, includeLast: includeLast\n\t }, true, true);\n\t\n\t for (var _iLayer2 = 0; _iLayer2 < lNrLayers; _iLayer2++) {\n\t var _lLayer2 = page.layers[_iLayer2];\n\t var _lFigures2 = _lLayer2.figures;\n\t var _lNrFigures2 = _lFigures2.length;\n\t for (var _k2 = 0; _k2 < _lNrFigures2; _k2++) {\n\t var _lFigure = _lFigures2[_k2];\n\t deepRasterOn(_lFigure);\n\t }\n\t }\n\t\n\t mCanvasNormal.width = view.width;\n\t mCanvasNormal.height = view.height;\n\t var ctx = mCanvasNormal.getContext('2d');\n\t ctx.imageSmoothingEnabled = false;\n\t renderer.drawFigures(view, ctx, transform, {\n\t from: firstActiveFigure,\n\t until: lastFigure, includeLast: includeLast\n\t }, true, false);\n\t\n\t ctx.imageSmoothingEnabled = true;\n\t\n\t mGlCanvas.width = view.width;\n\t mGlCanvas.height = view.height;\n\t mGlCtx.viewport(0, 0, mGlCanvas.width, mGlCanvas.height);\n\t\n\t var texture = mGlCtx.createTexture();\n\t mGlCtx.activeTexture(mGlCtx.TEXTURE0);\n\t mGlCtx.bindTexture(mGlCtx.TEXTURE_2D, texture);\n\t mGlCtx.texImage2D(mGlCtx.TEXTURE_2D, 0, mGlCtx.RGBA, mGlCtx.RGBA, mGlCtx.UNSIGNED_BYTE, mCanvasNormal);\n\t if (mGlCtx.getError() != mGlCtx.NO_ERROR) {\n\t return draw_colorShowthrough(view, context, transform, renderer, firstActiveFigure, lastActiveFigure); //Fallback to slow implementation\n\t }\n\t mGlCtx.texParameteri(mGlCtx.TEXTURE_2D, mGlCtx.TEXTURE_WRAP_S, mGlCtx.CLAMP_TO_EDGE);\n\t mGlCtx.texParameteri(mGlCtx.TEXTURE_2D, mGlCtx.TEXTURE_WRAP_T, mGlCtx.CLAMP_TO_EDGE);\n\t mGlCtx.texParameteri(mGlCtx.TEXTURE_2D, mGlCtx.TEXTURE_MIN_FILTER, mGlCtx.NEAREST);\n\t mGlCtx.texParameteri(mGlCtx.TEXTURE_2D, mGlCtx.TEXTURE_MAG_FILTER, mGlCtx.NEAREST);\n\t\n\t var textureST = mGlCtx.createTexture();\n\t mGlCtx.activeTexture(mGlCtx.TEXTURE1);\n\t mGlCtx.bindTexture(mGlCtx.TEXTURE_2D, textureST);\n\t mGlCtx.texImage2D(mGlCtx.TEXTURE_2D, 0, mGlCtx.RGBA, mGlCtx.RGBA, mGlCtx.UNSIGNED_BYTE, mCanvasST);\n\t if (mGlCtx.getError() != mGlCtx.NO_ERROR) {\n\t return draw_colorShowthrough(view, context, transform, renderer, firstActiveFigure, lastActiveFigure); //Fallback to slow implementation\n\t }\n\t mGlCtx.texParameteri(mGlCtx.TEXTURE_2D, mGlCtx.TEXTURE_WRAP_S, mGlCtx.CLAMP_TO_EDGE);\n\t mGlCtx.texParameteri(mGlCtx.TEXTURE_2D, mGlCtx.TEXTURE_WRAP_T, mGlCtx.CLAMP_TO_EDGE);\n\t mGlCtx.texParameteri(mGlCtx.TEXTURE_2D, mGlCtx.TEXTURE_MIN_FILTER, mGlCtx.NEAREST);\n\t mGlCtx.texParameteri(mGlCtx.TEXTURE_2D, mGlCtx.TEXTURE_MAG_FILTER, mGlCtx.NEAREST);\n\t\n\t mGlCtx.uniform2f(mEffect.u_textureSize, mGlCanvas.width, mGlCanvas.height);\n\t\n\t mGlCtx.drawArrays(mGlCtx.TRIANGLES, 0, 6);\n\t\n\t context.drawImage(mGlCanvas, 0, 0);\n\t\n\t //draw remaining semi transparent\n\t if (firstSemiTransparent != null) {\n\t renderer.drawFigures(view, context, transform, {\n\t from: firstSemiTransparent,\n\t until: lastActiveFigure, includeLast: true\n\t }, true, false);\n\t }\n\t\n\t if (view.figureAnnotations) {\n\t view.figureAnnotations.update$();\n\t }\n\t // Uncomment this for debugging intermediate steps\n\t // context.drawImage(mCanvasST, 0, 0);\n\t // context.drawImage(mCanvasNormal, 300, 0);\n\t // context.drawImage(mGlCanvas, 600, 0);\n\t } else {\n\t renderer.drawFigures(view, context, transform, {\n\t from: firstActiveFigure,\n\t until: lastActiveFigure, includeLast: true\n\t }, lNeedsBufferClear);\n\t if (lShowThroughColor.alpha != 0.0) {\n\t if (view.figureAnnotations) {\n\t view.figureAnnotations.update$();\n\t }\n\t }\n\t }\n\t};\n\t\n\tvar deepRasterOff = function (aFigure) {\n\t if (aFigure.isGroup) {\n\t for (var k = 0, kEnd = aFigure.figures.length; k < kEnd; ++k) {\n\t var f = aFigure.figures[k];\n\t deepRasterOff(f);\n\t }\n\t } else if (aFigure.isRaster && !aFigure.isMonochrome) {\n\t aFigure.oldLightShift = aFigure.lightShift;\n\t aFigure.lightShift = -1;\n\t } else if (aFigure.isMonochrome) {\n\t var lColors = aFigure.getColors();\n\t lColors = [].concat(_toConsumableArray(new Set(lColors))); //remove duplicates\n\t var lNrColors = lColors.length;\n\t for (var i = 0; i < lNrColors; i++) {\n\t lColors[i].oldRgb = lColors[i].rgb;\n\t if (lColors[i].showThrough) {\n\t lColors[i].rgb = 'FFFFFF';\n\t } else {\n\t lColors[i].rgb = '000000';\n\t }\n\t }\n\t }\n\t if (aFigure._powerClipContents.length > 0) {\n\t var pFigures = aFigure._powerClipContents[0]._figures;\n\t for (var _k3 = 0, _kEnd = pFigures.length; _k3 < _kEnd; ++_k3) {\n\t deepRasterOff(pFigures[_k3]);\n\t }\n\t }\n\t};\n\t\n\tvar deepRasterOn = function (aFigure) {\n\t if (aFigure.isGroup) {\n\t for (var k = 0, kEnd = aFigure.figures.length; k < kEnd; ++k) {\n\t var f = aFigure.figures[k];\n\t deepRasterOn(f);\n\t }\n\t } else if (aFigure.isRaster && !aFigure.isMonochrome) {\n\t aFigure.lightShift = aFigure.oldLightShift;\n\t } else if (aFigure.isMonochrome) {\n\t var lColors = aFigure.getColors();\n\t lColors = [].concat(_toConsumableArray(new Set(lColors))); //remove duplicates\n\t var lNrColors = lColors.length;\n\t for (var i = 0; i < lNrColors; i++) {\n\t lColors[i].rgb = lColors[i].oldRgb;\n\t }\n\t }\n\t if (aFigure._powerClipContents.length > 0) {\n\t var pFigures = aFigure._powerClipContents[0]._figures;\n\t for (var _k4 = 0, _kEnd2 = pFigures.length; _k4 < _kEnd2; ++_k4) {\n\t deepRasterOn(pFigures[_k4]);\n\t }\n\t }\n\t};\n\n/***/ },\n\n/***/ 104:\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.ReplaceSTEffect = undefined;\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _effect = __webpack_require__(64);\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar ReplaceSTEffect = exports.ReplaceSTEffect = function (_Effect) {\n\t _inherits(ReplaceSTEffect, _Effect);\n\t\n\t function ReplaceSTEffect(aGl) {\n\t _classCallCheck(this, ReplaceSTEffect);\n\t\n\t var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(ReplaceSTEffect).call(this, aGl));\n\t\n\t _this.fragmentShader = \"\\n precision mediump float;\\n\\n uniform sampler2D u_image0;\\n uniform sampler2D u_image1;\\n uniform vec2 u_textureSize;\\n\\n // the texCoords passed in from the vertex shader.\\n varying vec2 v_texCoord;\\n \\n\\n void main() {\\n vec2 onePixel = vec2(1.0, 1.0) / u_textureSize;\\n\\n vec4 bg = texture2D(u_image0, v_texCoord);\\n vec4 st = texture2D(u_image1, v_texCoord);\\n float alpha = st.b;\\n\\n if (alpha==1.0)\\n gl_FragColor = vec4( 0.0, 0.0, 0.0 , 0.0 );\\n else\\n gl_FragColor = vec4( bg.r, bg.g, bg.b , bg.a*(1.0-alpha) );\\n }\\n \";\n\t\n\t _this.vertexShader = \"\\n attribute vec2 a_position;\\n attribute vec2 a_texCoord;\\n varying vec2 v_texCoord;\\n void main() {\\n gl_Position = vec4(a_position * vec2(1,-1), 0, 1);\\n v_texCoord = a_texCoord;\\n }\\n \";\n\t\n\t _this.addShader(_this.vertexShader, _this.gl.VERTEX_SHADER);\n\t _this.addShader(_this.fragmentShader, _this.gl.FRAGMENT_SHADER);\n\t\n\t //link the program\n\t _this.gl.linkProgram(_this.program);\n\t\n\t //throw exception if program doesn't link\n\t if (!_this.gl.getProgramParameter(_this.program, _this.gl.LINK_STATUS)) {\n\t var lastError = _this.gl.getProgramInfoLog(_this.program);\n\t _this.gl.deleteProgram(_this.program);\n\t throw lastError;\n\t }\n\t\n\t _this.u_image0 = _this.gl.getUniformLocation(_this.program, \"u_image0\");\n\t _this.u_image1 = _this.gl.getUniformLocation(_this.program, \"u_image1\");\n\t _this.u_textureSize = _this.gl.getUniformLocation(_this.program, \"u_textureSize\");\n\t\n\t _this.a_position = _this.gl.getAttribLocation(_this.program, \"a_position\");\n\t _this.a_texCoord = _this.gl.getAttribLocation(_this.program, \"a_texCoord\");\n\t\n\t _this.activate();\n\t _this.gl.uniform1i(_this.u_image0, 0); // texture unit image\n\t _this.gl.uniform1i(_this.u_image1, 1); // texture unit image\n\t\n\t return _this;\n\t }\n\t\n\t _createClass(ReplaceSTEffect, [{\n\t key: \"update\",\n\t value: function update() {\n\t this.activate();\n\t }\n\t }]);\n\n\t return ReplaceSTEffect;\n\t}(_effect.Effect);\n\n/***/ },\n\n/***/ 105:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _lodash = __webpack_require__(4);\n\t\n\tvar _gear = __webpack_require__(8);\n\t\n\tvar _cdl = __webpack_require__(15);\n\t\n\tvar _view = __webpack_require__(84);\n\t\n\tfunction displayStroke(context) {\n\t (0, _gear.setLineDash)(context, [4, 4]);\n\t context.strokeStyle = 'rgba(0,0,0,1)';\n\t context.stroke();\n\t (0, _gear.setLineDash)(context, [0, 4, 4, 0]);\n\t context.strokeStyle = 'rgba(255,255,255,1)';\n\t context.stroke();\n\t}\n\t\n\t_view.Plugin.SpecialPens = _view.Plugin.extend({ typeName: 'SpecialPensPlugin',\n\t name: 'specialPens',\n\t drawTo: ['mask'],\n\t\n\t Properties: {\n\t // Show solid mask to get the exact mask color selected\n\t maskSolid: { type: 'boolean', def: true, onChange: _view.redraw_this },\n\t maskColor: { type: 'Color', def: _cdl.Color.Gray(), onChange: _view.redraw_this },\n\t maskAlpha: { type: 'number', def: '0.8', onChange: _view.redraw_this },\n\t maskVisible: { type: 'boolean', def: true, onChange: _view.redraw_this }\n\t },\n\t\n\t initPlugin: function () {\n\t this._maskDraw = false;\n\t },\n\t prepareMask: function () {\n\t if (this._maskDraw) {\n\t var maskCanvas = this.view.canvas('mask');\n\t (0, _gear.clearCanvas)(maskCanvas);\n\t }\n\t },\n\t drawForPage: function (page, context, transform) {\n\t var maskVisible = this._maskVisible;\n\t\n\t if (maskVisible) {\n\t this.prepareMask();\n\t }\n\t\n\t this.drawSpecialPensForPage(page, context, transform);\n\t\n\t if (maskVisible) {\n\t this.blitMask(context);\n\t }\n\t },\n\t drawMask: function (maskPolyregions, context, transform, box) {\n\t var maskContext = this.view.getContext('mask', '2d');\n\t if (maskPolyregions.length > 0) {\n\t maskContext.save();\n\t\n\t if (box) {\n\t maskContext.rect(box.lx, box.ly, box.width, box.height);\n\t maskContext.clip();\n\t }\n\t\n\t maskContext.fillStyle = this._maskColor.svgColor();\n\t\n\t (0, _lodash.forEach)(maskPolyregions, function (polyregion) {\n\t polyregion.draw(maskContext, transform, { customDraw: function (c) {\n\t return c.fill();\n\t } });\n\t });\n\t\n\t maskContext.restore();\n\t\n\t this._maskDraw = true;\n\t } else if (box === undefined && this._maskDraw) {\n\t this._maskDraw = false;\n\t (0, _gear.clearContext)(maskContext);\n\t }\n\t },\n\t drawSpecialPensForPage: function (page, context, transform, box) {\n\t var specialPensPolyregions = this.gatherSpecialPenPolyregionsFor(page);\n\t if (this._maskVisible) {\n\t this.drawMask(specialPensPolyregions.mask, context, transform, box);\n\t }\n\t this.drawDisplayPens(specialPensPolyregions.display, context, transform);\n\t },\n\t gatherSpecialPenPolyregionsFor: function (page) {\n\t var specialPenPolyregions = { mask: [], display: [] };\n\t page.forEachFigure(function (figure) {\n\t // We need to check if there are MaskPen or DisplayPen to collect them\n\t var output = figure._outputFigure;\n\t if (output) {\n\t output.deepForEachPolyregion(function (p) {\n\t var pen = p._pen;\n\t if (pen._type === 'DisplayPen') {\n\t specialPenPolyregions.display.push(p);\n\t } else if (pen._type === 'MaskPen') {\n\t specialPenPolyregions.mask.push(p);\n\t }\n\t });\n\t }\n\t });\n\t return specialPenPolyregions;\n\t },\n\t drawDisplayPens: function (displayPolyregions, context, transform) {\n\t if (displayPolyregions.length > 0) {\n\t\n\t context.save();\n\t\n\t context.lineWidth = 0;\n\t\n\t (0, _lodash.forEach)(displayPolyregions, function (polyregion) {\n\t polyregion.draw(context, transform, { customDraw: displayStroke });\n\t });\n\t\n\t context.restore();\n\t }\n\t },\n\t blitMask: function (context /*,transform*/) {\n\t if (this._maskDraw) {\n\t var maskContext = this.view.getContext('mask', '2d');\n\t maskContext.save();\n\t maskContext.fillStyle = this._maskColor.svgColor();\n\t maskContext.globalCompositeOperation = 'xor';\n\t (0, _gear.fillContext)(maskContext);\n\t maskContext.restore();\n\t\n\t context.save();\n\t context.globalAlpha = this._maskAlpha;\n\t context.drawImage(maskContext.canvas, 0, 0);\n\t context.restore();\n\t }\n\t }\n\t});\n\n/***/ },\n\n/***/ 106:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.UserLine = undefined;\n\t\n\tvar _lodash = __webpack_require__(4);\n\t\n\tvar _gear = __webpack_require__(8);\n\t\n\tvar _cdl = __webpack_require__(15);\n\t\n\tvar _view = __webpack_require__(84);\n\t\n\tvar UserLine = exports.UserLine = _gear.OwnedObject.extend({ typeName: 'UserLine',\n\t Properties: {\n\t snap: { type: 'boolean', def: true },\n\t position: { type: 'number', def: 0, onChange: _view.redraw_this },\n\t color: { type: 'Color', def: new _cdl.Color({ rgb: '805633', alpha: 0.75 }), onChange: _view.redraw_this }\n\t },\n\t clone: function () {\n\t return UserLine(this);\n\t },\n\t redraw: function () {\n\t var owner = this._owner;\n\t if (owner) {\n\t owner.redraw();\n\t }\n\t }\n\t});\n\t\n\t_view.Plugin.UserLines = _view.Plugin.extend({ typeName: 'UserLinesPlugin',\n\t\n\t drawTo: ['plugins'],\n\t\n\t name: 'userLines',\n\t\n\t Properties: {\n\t horizontalLines: { type: 'UserLine[]', def: [], onChange: _view.redraw_this },\n\t verticalLines: { type: 'UserLine[]', def: [], onChange: _view.redraw_this }\n\t },\n\t\n\t clone: function () {\n\t return _view.Plugin.UserLines(this);\n\t },\n\t draw: function (_ref) {\n\t var view = _ref.view;\n\t var context = _ref.context;\n\t var transformModel = _ref.transformModel;\n\t var _view$bounds = view.bounds;\n\t var lx = _view$bounds.lx;\n\t var ly = _view$bounds.ly;\n\t var hx = _view$bounds.hx;\n\t var hy = _view$bounds.hy;\n\t\n\t\n\t context.lineWidth = 1;\n\t\n\t (0, _lodash.forEach)(this._horizontalLines, function (userLine) {\n\t context.strokeStyle = userLine._color.rgba;\n\t var x = userLine.position;\n\t (0, _view.strokePixelCenterSegment)(context, new _cdl.Point(x, ly), new _cdl.Point(x, hy), transformModel);\n\t });\n\t\n\t (0, _lodash.forEach)(this._verticalLines, function (userLine) {\n\t context.strokeStyle = userLine._color.rgba;\n\t var y = userLine.position;\n\t (0, _view.strokePixelCenterSegment)(context, new _cdl.Point(lx, y), new _cdl.Point(hx, y), transformModel);\n\t });\n\t }\n\t});\n\t\n\t_view.Plugin.AlignmentLines = _view.Plugin.extend({ typeName: 'AlignmentLinesPlugin',\n\t\n\t drawTo: ['plugins'],\n\t name: 'alignmentLines',\n\t Properties: {\n\t snap: { type: 'boolean', def: false, onChange: _view.redraw_this }\n\t },\n\t clone: function () {\n\t return new _view.Plugin.AlignmentLines(this);\n\t },\n\t draw: function () /*{ view, context, transform }*/{\n\t // ... currently in Select Handles\n\t }\n\t});\n\n/***/ },\n\n/***/ 107:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _lodash = __webpack_require__(4);\n\t\n\tvar _gear = __webpack_require__(8);\n\t\n\tvar _cdl = __webpack_require__(15);\n\t\n\tvar _view = __webpack_require__(84);\n\t\n\t_view.Plugin.FigureAnnotations = _view.Plugin.extend({ typeName: 'FigureAnnotationsPlugin',\n\t\n\t name: 'figureAnnotations',\n\t drawTo: ['plugins'],\n\t\n\t target: 'document',\n\t\n\t clone: function () {\n\t return _view.Plugin.FigureAnnotations(this);\n\t },\n\t initPlugin: function (view) {\n\t this._annotations = [];\n\t this._annotationsAreDraw = false;\n\t view.addEvents('annotationsupdated');\n\t\n\t // Forward functions, should we allow this?\n\t var _this = this;\n\t (0, _lodash.assign)(view, {\n\t annotate: function () /* ...params */{\n\t return _this.annotate.apply(_this, arguments);\n\t },\n\t unannotate: function () /* ...params */{\n\t return _this.unannotate.apply(_this, arguments);\n\t },\n\t clearAnnotations: function () /* ...params */{\n\t return _this.clearAnnotations.apply(_this, arguments);\n\t }\n\t });\n\t },\n\t link: function (view) {\n\t view.on('commit', this.generate_, this);\n\t },\n\t unlink: function (view) {\n\t view.un(this);\n\t },\n\t\n\t\n\t // annotate( figure, { message: 'Message', pen: ... } );\n\t // annotate( figures, { grouped: true, message: ... } );\n\t // annotate( function( figure ) { }, { message( figure ) {}, ... });\n\t // annotate( function( figure ) { }, function( figure ) {} );\n\t // annotate( function( figure ) { }, function( figure ) {} );\n\t //\n\t // view.unannotate( annotation );\n\t // view.clearAnnotations();\n\t\n\t annotate: function (figures, config) {\n\t var ann = { figures: figures, config: config };\n\t this._annotations.push(ann);\n\t this.update$();\n\t return ann;\n\t },\n\t unannotate: function (annotation) {\n\t var i = this._annotations.indexOf(annotation);\n\t if (i >= 0) {\n\t this._annotations.splice(i, 1);\n\t }\n\t this.update$();\n\t return this;\n\t },\n\t clearAnnotations: function () {\n\t this._annotations = [];\n\t this.update$();\n\t return this;\n\t },\n\t update$: function () {\n\t var _this2 = this;\n\t\n\t return this.view.doc.update$().then(function () {\n\t _this2.generate_();\n\t });\n\t },\n\t\n\t\n\t // Called after each commit$, or triggered by the user using update$\n\t\n\t addAnnotation: function (ann) {\n\t var _this3 = this;\n\t\n\t ann.ready = false;\n\t this._processedAnnotations.push(ann);\n\t (0, _gear.whenAll)([ann.text, ann.color, ann.pen, ann.brush]).then(function () {\n\t ann.ready = true;\n\t _this3.redraw();\n\t });\n\t },\n\t generate_: function () {\n\t var _this4 = this;\n\t\n\t var view = this.view,\n\t mainDocument = view._mainDocument || view.doc,\n\t backgroundDocument = view._background;\n\t this._processedAnnotations = [];\n\t (0, _lodash.forEach)(this._annotations, function (ann) {\n\t var c = ann.config;\n\t var textIsFunc = (0, _lodash.isFunction)(c.text);\n\t var colorIsFunc = (0, _lodash.isFunction)(c.color);\n\t var penIsFunc = (0, _lodash.isFunction)(c.pen);\n\t var brushIsFunc = (0, _lodash.isFunction)(c.brush);\n\t var boxStyle = c.boxStyle || 'Rect';\n\t\n\t var figures = ann.figures;\n\t var background = c.backgroundFigures;\n\t\n\t if (figures === 'all') {\n\t figures = mainDocument.activePageFigures;\n\t if (background) {\n\t figures = (0, _lodash.concat)(backgroundDocument.activePageFigures, figures);\n\t }\n\t } else if ((0, _lodash.isFunction)(figures)) {\n\t var func = figures;\n\t figures = (0, _lodash.filter)(mainDocument.activePageFigures, func);\n\t if (background) {\n\t figures = (0, _lodash.concat)((0, _lodash.filter)(backgroundDocument.activePageFigures, func), figures);\n\t }\n\t } else if (figures.isFigure) {\n\t figures = [figures];\n\t background = true;\n\t } else {\n\t ann.figures = (0, _gear.clone)(figures);\n\t background = true;\n\t }\n\t\n\t if (ann.grouped) {\n\t _this4.addAnnotation({\n\t figures: figures,\n\t text: textIsFunc ? c.text(figures) : c.text,\n\t color: colorIsFunc ? c.color(figures) : c.color,\n\t pen: penIsFunc ? c.pen(figures) : c.pen,\n\t brush: brushIsFunc ? c.brush(figures) : c.brush,\n\t boxStyle: boxStyle,\n\t background: background\n\t });\n\t } else {\n\t (0, _lodash.forEach)(figures, function (figure) {\n\t _this4.addAnnotation({\n\t figures: [figure],\n\t text: textIsFunc ? c.text(figure) : c.text,\n\t color: colorIsFunc ? c.color(figure) : c.color,\n\t pen: penIsFunc ? c.pen(figure) : c.pen,\n\t brush: brushIsFunc ? c.brush(figure) : c.brush,\n\t boxStyle: boxStyle,\n\t background: background\n\t });\n\t });\n\t }\n\t });\n\t this.redraw();\n\t },\n\t drawAnnotation: function (context, transform, ann, current, info) {\n\t var figures = ann.figures;\n\t var text = ann.text;\n\t var color = ann.color;\n\t var pen = ann.pen;\n\t var brush = ann.brush;\n\t var boxStyle = ann.boxStyle;\n\t\n\t var updated = false;\n\t\n\t var ready = (0, _lodash.every)(figures, function (figure) {\n\t return !figure.invalidated();\n\t });\n\t\n\t if (ready) {\n\t var bounds = _cdl.Figures.globalBounds_(figures).scalingTransformed(transform).inflated(1 + (pen ? pen.width : 0));\n\t if (pen || brush) {\n\t context.beginPath();\n\t if (boxStyle === 'Clean') {\n\t var lx = bounds.lx,\n\t ly = bounds.ly,\n\t hx = bounds.hx,\n\t hy = bounds.hy;\n\t var w = Math.min(10, bounds.width);\n\t\n\t context.moveTo(lx, ly + w);context.lineTo(lx, ly);context.lineTo(lx + w, ly);\n\t context.moveTo(hx - w, ly);context.lineTo(hx, ly);context.lineTo(hx, ly + w);\n\t context.moveTo(lx, hy - w);context.lineTo(lx, hy);context.lineTo(lx + w, hy);\n\t context.moveTo(hx, hy - w);context.lineTo(hx, hy);context.lineTo(hx - w, hy);\n\t } else {\n\t bounds.draw(context);\n\t }\n\t }\n\t if (pen) {\n\t pen.setupContext(context);\n\t context.stroke();\n\t }\n\t if (brush) {\n\t context.fillStyle = brush.color.rgba;\n\t context.fill();\n\t }\n\t if (text) {\n\t context.textBaseline = \"bottom\";\n\t context.textAlign = \"end\";\n\t context.fillStyle = color ? color.rgba : pen ? pen.color.rgba : '#000000';\n\t\n\t if (figures.length === 1) {\n\t // Allow several annotations per figure\n\t var figure = figures[0];\n\t var fa = current[figure._localId];\n\t if (!fa) {\n\t fa = current[figure._localId] = { count: 0 };\n\t }\n\t fa.count++;\n\t context.fillText(text, bounds.hx, bounds.ly - 2 * fa.count - (fa.count - 1) * 12, bounds.width);\n\t } else {\n\t context.fillText(text, bounds.hx, bounds.ly - 2, bounds.width);\n\t }\n\t\n\t updated = true;\n\t info.push({ annotation: ann, bounds: bounds, context: context });\n\t }\n\t }\n\t\n\t return updated;\n\t },\n\t draw: function (_ref) {\n\t var _this5 = this;\n\t\n\t var view = _ref.view;\n\t var context = _ref.context;\n\t var transform = _ref.transform;\n\t var docIsland = _ref.docIsland;\n\t\n\t\n\t var info = [];\n\t var current = {};\n\t\n\t var tool = view.tool;\n\t var doc = view.doc;\n\t\n\t // [TODO] transform context, so we can draw annotations in any surface\n\t\n\t // Do not show the annotations while dragging the figures around\n\t\n\t if (!doc._previewing && !(tool && tool.type === 'Final')) {\n\t\n\t context.font = view.viewDeltaToTexture(10) * (view.is3D ? 0.65 : 1) + \"pt Calibri\";\n\t (0, _lodash.forEach)(this.readyAnnotations(), function (ann) {\n\t if (!(docIsland && !_this5.needsToDrawAnnotation(ann, docIsland))) {\n\t _this5.drawAnnotation(context, transform, ann, current, info);\n\t }\n\t });\n\t\n\t view.fireEvent('annotationsupdated', view, info);\n\t }\n\t },\n\t readyAnnotations: function () {\n\t return (0, _lodash.filter)(this._processedAnnotations, 'ready');\n\t },\n\t somethingToDraw: function () {\n\t return this._annotationsAreDraw || this._annotations.length > 0;\n\t },\n\t\n\t\n\t // For 3D\n\t\n\t needsToDrawAnnotation: function (ann, docIsland) {\n\t var figures = ann.figures;\n\t\n\t var ready = (0, _lodash.every)(figures, function (figure) {\n\t return !figure.invalidated();\n\t });\n\t if (ready) {\n\t if (figures[0].page === docIsland.page) {\n\t var bounds = _cdl.Figures.bounds_(figures);\n\t return _cdl.Frame.areOverlapping(docIsland.frame_(), _cdl.Frame.fromBounds(bounds));\n\t }\n\t }\n\t return false;\n\t },\n\t needsToDrawFor: function (docIsland) {\n\t var _this6 = this;\n\t\n\t return (0, _lodash.some)(this.readyAnnotations(), function (ann) {\n\t return _this6.needsToDrawAnnotation(ann, docIsland);\n\t });\n\t }\n\t});\n\n/***/ },\n\n/***/ 109:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _viewControls = __webpack_require__(110);\n\t\n\tObject.keys(_viewControls).forEach(function (key) {\n\t if (key === \"default\") return;\n\t Object.defineProperty(exports, key, {\n\t enumerable: true,\n\t get: function () {\n\t return _viewControls[key];\n\t }\n\t });\n\t});\n\t\n\tvar _alignmentLines = __webpack_require__(106);\n\t\n\tObject.keys(_alignmentLines).forEach(function (key) {\n\t if (key === \"default\") return;\n\t Object.defineProperty(exports, key, {\n\t enumerable: true,\n\t get: function () {\n\t return _alignmentLines[key];\n\t }\n\t });\n\t});\n\t\n\tvar _grid = __webpack_require__(113);\n\t\n\tObject.keys(_grid).forEach(function (key) {\n\t if (key === \"default\") return;\n\t Object.defineProperty(exports, key, {\n\t enumerable: true,\n\t get: function () {\n\t return _grid[key];\n\t }\n\t });\n\t});\n\t\n\tvar _keyShortcuts = __webpack_require__(114);\n\t\n\tObject.keys(_keyShortcuts).forEach(function (key) {\n\t if (key === \"default\") return;\n\t Object.defineProperty(exports, key, {\n\t enumerable: true,\n\t get: function () {\n\t return _keyShortcuts[key];\n\t }\n\t });\n\t});\n\t\n\tvar _wheelShortcuts = __webpack_require__(115);\n\t\n\tObject.keys(_wheelShortcuts).forEach(function (key) {\n\t if (key === \"default\") return;\n\t Object.defineProperty(exports, key, {\n\t enumerable: true,\n\t get: function () {\n\t return _wheelShortcuts[key];\n\t }\n\t });\n\t});\n\t\n\tvar _pagesSelector = __webpack_require__(116);\n\t\n\tObject.keys(_pagesSelector).forEach(function (key) {\n\t if (key === \"default\") return;\n\t Object.defineProperty(exports, key, {\n\t enumerable: true,\n\t get: function () {\n\t return _pagesSelector[key];\n\t }\n\t });\n\t});\n\t\n\tvar _toolHelp = __webpack_require__(117);\n\t\n\tObject.keys(_toolHelp).forEach(function (key) {\n\t if (key === \"default\") return;\n\t Object.defineProperty(exports, key, {\n\t enumerable: true,\n\t get: function () {\n\t return _toolHelp[key];\n\t }\n\t });\n\t});\n\t\n\tvar _figureAnnotations = __webpack_require__(107);\n\t\n\tObject.keys(_figureAnnotations).forEach(function (key) {\n\t if (key === \"default\") return;\n\t Object.defineProperty(exports, key, {\n\t enumerable: true,\n\t get: function () {\n\t return _figureAnnotations[key];\n\t }\n\t });\n\t});\n\t\n\tvar _specialPens = __webpack_require__(105);\n\t\n\tObject.keys(_specialPens).forEach(function (key) {\n\t if (key === \"default\") return;\n\t Object.defineProperty(exports, key, {\n\t enumerable: true,\n\t get: function () {\n\t return _specialPens[key];\n\t }\n\t });\n\t});\n\t\n\tvar _activeRenderer = __webpack_require__(102);\n\t\n\tObject.keys(_activeRenderer).forEach(function (key) {\n\t if (key === \"default\") return;\n\t Object.defineProperty(exports, key, {\n\t enumerable: true,\n\t get: function () {\n\t return _activeRenderer[key];\n\t }\n\t });\n\t});\n\n/***/ },\n\n/***/ 110:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _view = __webpack_require__(84);\n\t\n\tvar _zoom = __webpack_require__(111);\n\t\n\tvar _pan = __webpack_require__(112);\n\t\n\t_view.Plugin.ViewControls = _view.Plugin.extend({ typeName: 'ViewControls',\n\t\n\t target: 'view',\n\t name: 'controls',\n\t drawTo: ['plugins'],\n\t\n\t on_pointerdown: function (_ref) {\n\t var view = _ref.view;\n\t var event = _ref.event;\n\t var cmdKey = _ref.cmdKey;\n\t var shiftKey = _ref.shiftKey;\n\t var docPoint = _ref.docPoint;\n\t var pointers = _ref.pointers;\n\t\n\t\n\t if (pointers.length === 2) {\n\t this.helper = new _zoom.TouchZoomHelper(event);\n\t } else if (cmdKey) {\n\t if (shiftKey) {\n\t this.helper = new _zoom.ZoomHelper(event);\n\t } else if (cmdKey) {\n\t this.helper = new _pan.PanHelper(event);\n\t }\n\t }\n\t }\n\t});\n\n/***/ },\n\n/***/ 111:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.ZoomTool = exports.ZoomHelper = exports.TouchZoomHelper = undefined;\n\t\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\t\n\tvar _cdl = __webpack_require__(15);\n\t\n\tvar _view = __webpack_require__(84);\n\t\n\tvar _pan = __webpack_require__(112);\n\t\n\tfunction twoFingersTransform(sp1, cp1, sp2, cp2, center) {\n\t\n\t // Adapted from https://github.com/erica/iphone-3.0-cookbook-/blob/master/C08-Gestures/14-Resize%20And%20Rotate/main.m\n\t var cx = center.x,\n\t cy = center.y;\n\t\n\t var x1 = sp1.x - cx,\n\t y1 = sp1.y - cy,\n\t x2 = sp2.x - cx,\n\t y2 = sp2.y - cy,\n\t x3 = cp1.x - cx,\n\t y3 = cp1.y - cy,\n\t x4 = cp2.x - cx,\n\t y4 = cp2.y - cy;\n\t\n\t // Solve the system:\n\t // [a b t1, -b a t2, 0 0 1] * [x1, y1, 1] = [x3, y3, 1]\n\t // [a b t1, -b a t2, 0 0 1] * [x2, y2, 1] = [x4, y4, 1]\n\t\n\t var d = (y1 - y2) * (y1 - y2) + (x1 - x2) * (x1 - x2);\n\t if (d < 0.1) {\n\t return _cdl.Matrix.translate(x3 - x1, y3 - y1);\n\t }\n\t\n\t var a = (y1 - y2) * (y3 - y4) + (x1 - x2) * (x3 - x4),\n\t b = (y1 - y2) * (x3 - x4) - (x1 - x2) * (y3 - y4),\n\t tx = (y1 * x2 - x1 * y2) * (y4 - y3) - (x1 * x2 + y1 * y2) * (x3 + x4) + x3 * (y2 * y2 + x2 * x2) + x4 * (y1 * y1 + x1 * x1),\n\t ty = (x1 * x2 + y1 * y2) * (-y4 - y3) + (y1 * x2 - x1 * y2) * (x3 - x4) + y3 * (y2 * y2 + x2 * x2) + y4 * (y1 * y1 + x1 * x1);\n\t\n\t return new _cdl.Matrix({ s00: a / d, s01: b / d, s10: -b / d, s11: a / d, dx: tx / d, dy: ty / d });\n\t}\n\t\n\tvar TouchZoomHelper = exports.TouchZoomHelper = function (_ref) {\n\t var view = _ref.view;\n\t var pointers = _ref.pointers;\n\t\n\t this._s = false; // [TODO]\n\t\n\t var _pointers = _slicedToArray(pointers, 2);\n\t\n\t var touch1 = _pointers[0];\n\t var touch2 = _pointers[1];\n\t\n\t view.redraw('tools');\n\t this._d = {\n\t t1: touch1, t2: touch2, transform: new _cdl.Matrix(),\n\t center: view.viewToDoc(_cdl.Point.interpolate(touch1.start, touch2.start, 0.5)),\n\t vt: view.viewTransform.clone() // We need a better abstraction here\n\t };\n\t};\n\tTouchZoomHelper.prototype = {\n\t move: function (_ref2) {\n\t var view = _ref2.view;\n\t\n\t\n\t this._s = true;\n\t\n\t // this.toolhelp('Zoom and pan with two touches movement');\n\t\n\t var td = this._d;\n\t var touch1 = td.t1,\n\t touch2 = td.t2,\n\t center = td.center,\n\t vt = td.vt;\n\t var sp1 = vt.viewToDoc(view, touch1.start);\n\t var cp1 = vt.viewToDoc(view, touch1.current);\n\t var sp2 = vt.viewToDoc(view, touch2.start);\n\t var cp2 = vt.viewToDoc(view, touch2.current);\n\t var transform = twoFingersTransform(sp1, cp1, sp2, cp2, center);\n\t\n\t var scale = transform.scaleFactor();\n\t view.center = _cdl.Matrix.transformAround(center, transform.inverted()).apply(vt.center);\n\t view.zoom = vt.zoom * scale;\n\t view.update$().then(function () {\n\t setTimeout(function () {\n\t view.render$();\n\t }, 40);\n\t });\n\t },\n\t end: function (_ref3) {\n\t var view = _ref3.view;\n\t\n\t view.redraw('tools');\n\t }\n\t};\n\t\n\tvar ZoomHelper = exports.ZoomHelper = function (_ref4) {\n\t var modelPoint = _ref4.modelPoint;\n\t\n\t this.from = modelPoint;\n\t this.to = modelPoint;\n\t this.rectLimit = 0.1 * 96;\n\t};\n\t\n\tZoomHelper.prototype = {\n\t\n\t get bounds() {\n\t return _cdl.Bounds.ofPoints([this.from, this.to]);\n\t },\n\t\n\t draw: function (_ref5) {\n\t var context = _ref5.context;\n\t var transformModel = _ref5.transformModel;\n\t var bounds = this.bounds;\n\t\n\t\n\t context.save();\n\t context.strokeStyle = '#0055FF';\n\t bounds.scalingTransformed(transformModel).draw(context);\n\t context.stroke();\n\t context.restore();\n\t },\n\t move: function (_ref6) {\n\t var modelPoint = _ref6.modelPoint;\n\t\n\t this.to = modelPoint;\n\t },\n\t end: function (_ref7) {\n\t var view = _ref7.view;\n\t var shiftKey = _ref7.shiftKey;\n\t var bounds = this.bounds;\n\t\n\t var limit = view.viewDeltaToDoc(this.rectLimit) * _view.padScaling;\n\t if (bounds.width > limit && bounds.height > limit) {\n\t view.zoomAround(bounds);\n\t } else {\n\t // clicking\n\t if (shiftKey) {\n\t view.zoom /= 2;\n\t } else {\n\t view.zoom *= 2;\n\t }\n\t }\n\t view.update$().then(function () {\n\t setTimeout(function () {\n\t view.render$();\n\t }, 40);\n\t });\n\t }\n\t};\n\t\n\tvar ZoomTool = exports.ZoomTool = _view.Tool.extend({ typeName: 'ZoomTool',\n\t\n\t type: 'View',\n\t\n\t toolbarName: 'zoomTool',\n\t\n\t target: 'model',\n\t\n\t initTool: function () {\n\t this.toolhelp('Draw rectangle to zoom', 'Shift Click to zoom out', 'Hold Ctrl to pan');\n\t },\n\t link: function (view) {\n\t view.cursor = 'zoom-in';\n\t },\n\t unlink: function (view) {\n\t view.cursor = 'default';\n\t },\n\t on_pointerdown: function (_ref8) {\n\t var view = _ref8.view;\n\t var event = _ref8.event;\n\t var which = _ref8.which;\n\t var cmdKey = _ref8.cmdKey;\n\t var pointers = _ref8.pointers;\n\t\n\t\n\t if (pointers.length === 2) {\n\t this.helper = new TouchZoomHelper(event);\n\t return;\n\t }\n\t\n\t var leftClick = which === 1;\n\t\n\t if (leftClick) {\n\t if (cmdKey) {\n\t this.helper = new _pan.PanHelper(event);\n\t } else {\n\t // Bounds based zoom\n\t this.helper = new ZoomHelper(event);\n\t }\n\t } else {\n\t view.zoom /= 2;\n\t view.update$().then(function () {\n\t setTimeout(function () {\n\t view.render$();\n\t }, 40);\n\t });\n\t }\n\t }\n\t});\n\t\n\t_view.Tool.Zoom = ZoomTool;\n\n/***/ },\n\n/***/ 112:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.PanTool = exports.PanHelper = undefined;\n\t\n\tvar _gear = __webpack_require__(8);\n\t\n\tvar _view = __webpack_require__(84);\n\t\n\tvar PanHelper = exports.PanHelper = function (_ref) {\n\t var view = _ref.view;\n\t var viewPoint = _ref.viewPoint;\n\t\n\t this.viewPoint = viewPoint;\n\t this.viewPointDown = viewPoint;\n\t this.centerDown = view.center.clone();\n\t view.redraw('tools');\n\t};\n\tPanHelper.prototype = {\n\t draw: function (_ref2) {\n\t var context = _ref2.context;\n\t\n\t context.save();\n\t context.strokeStyle = '#0055FF';\n\t (0, _gear.strokeDot)(context, this.viewPoint, 8);\n\t context.restore();\n\t },\n\t\n\t\n\t move: (0, _view.fastThrottle)(function (_ref3) {\n\t var view = _ref3.view;\n\t var event = _ref3.event;\n\t var viewPoint = _ref3.viewPoint;\n\t var isPrimary = _ref3.isPrimary;\n\t\n\t if (!isPrimary) {\n\t return;\n\t }\n\t\n\t this.viewPoint = viewPoint;\n\t\n\t var zoom = view.zoom;\n\t var offset = viewPoint.minus(this.viewPointDown);\n\t view.center = this.centerDown.minus_(offset.x / zoom, -offset.y / zoom);\n\t view.update$();\n\t }, 20),\n\t\n\t end: function (_ref4) {\n\t var view = _ref4.view;\n\t\n\t view.redraw('tools');\n\t }\n\t};\n\t\n\tvar PanTool = exports.PanTool = _view.Tool.extend({ typeName: 'PanTool',\n\t type: 'View',\n\t toolbarName: 'panTool',\n\t\n\t initTool: function () {\n\t this.toolhelp('Click and drag to pan');\n\t },\n\t link: function (view) {\n\t view.cursor = 'pointer';\n\t },\n\t unlink: function (view) {\n\t view.cursor = 'default';\n\t },\n\t on_pointerdown: function (_ref5) {\n\t var event = _ref5.event;\n\t var which = _ref5.which;\n\t var isPrimary = _ref5.isPrimary;\n\t\n\t if (!isPrimary) {\n\t return; // ignore multitouch\n\t }\n\t var leftClick = which === 1;\n\t if (leftClick) {\n\t this.helper = new PanHelper(event);\n\t }\n\t },\n\t on_pointerup: function (event) {\n\t event.view.render$();\n\t }\n\t});\n\t\n\t_view.Tool.Pan = PanTool;\n\n/***/ },\n\n/***/ 113:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _cdl = __webpack_require__(15);\n\t\n\tvar _view = __webpack_require__(84);\n\t\n\tvar floor = Math.floor;\n\t\n\tvar snapValue = function (x, step) {\n\t return floor(x / step) * step;\n\t};\n\t\n\t_view.Plugin.Grid = _view.Plugin.extend({ typeName: 'GridPlugin',\n\t\n\t drawTo: ['plugins'],\n\t name: 'grid',\n\t target: 'model',\n\t\n\t Properties: {\n\t color: { type: 'Color', def: new _cdl.Color({ rgb: '5680CC', alpha: 0.5 }), owned: true, onChange: _view.redraw_this },\n\t step: { type: 'number', def: 25.4, onChange: _view.redraw_this }\n\t },\n\t\n\t clone: function () {\n\t return _view.Plugin.Grid(this);\n\t },\n\t draw: function (_ref) {\n\t var view = _ref.view;\n\t var context = _ref.context;\n\t var transform = _ref.transform;\n\t\n\t var bounds = view.bounds,\n\t step = this._step,\n\t lx = snapValue(bounds.lx, step),\n\t ly = snapValue(bounds.ly, step),\n\t hx = snapValue(bounds.hx, step) + step,\n\t hy = snapValue(bounds.hy, step) + step;\n\t\n\t context.lineWidth = 1;\n\t context.strokeStyle = this._color.rgba;\n\t\n\t for (var x = lx; x <= hx; x += step) {\n\t (0, _view.strokePixelCenterSegment)(context, new _cdl.Point(x, ly), new _cdl.Point(x, hy), transform);\n\t }\n\t\n\t for (var y = ly; y <= hy; y += step) {\n\t (0, _view.strokePixelCenterSegment)(context, new _cdl.Point(lx, y), new _cdl.Point(hx, y), transform);\n\t }\n\t }\n\t});\n\n/***/ },\n\n/***/ 114:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _lodash = __webpack_require__(4);\n\t\n\tvar _view = __webpack_require__(84);\n\t\n\tvar _config = __webpack_require__(2);\n\t\n\tfunction preventDefault(event) {\n\t event.preventDefault();\n\t}\n\tfunction bump(e, canvas, figures, x, y) {\n\t preventDefault(e);\n\t canvas.bump(figures, x, y);\n\t canvas.commit$();\n\t}\n\t\n\t_view.Plugin.KeyShortcuts = _view.Plugin.extend({ typeName: 'KeyShortcutsPlugin',\n\t\n\t name: 'keyShortcuts',\n\t\n\t target: 'view',\n\t\n\t link: function (view) {\n\t view.on({ 'selectionchanged': this.onSelectionChanged }, this);\n\t },\n\t clone: function () {\n\t return _view.Plugin.KeyShortcuts(this);\n\t },\n\t on_keyup: function (_ref) {\n\t var view = _ref.view;\n\t var event = _ref.event;\n\t var altKey = _ref.altKey;\n\t\n\t if (!altKey) {\n\t preventDefault(event);\n\t return this.on_keyup_alt(event);\n\t }\n\t },\n\t\n\t\n\t // [TODO] This should be part of the view API\n\t startTransparentMode: function () {\n\t var _this = this;\n\t\n\t if (!this._transparentMode) {\n\t (function () {\n\t var view = _this.view;\n\t\n\t var tf = _this._transparentFigureViews = (0, _lodash.map)(view.selectedFigures, function (figure) {\n\t return view.figureView(figure);\n\t });\n\t (0, _lodash.invokeMap)(tf, 'mask');\n\t _this._transparentMode = true;\n\t view.render$();\n\t })();\n\t }\n\t },\n\t endTransparentMode: function () {\n\t if (this._transparentMode) {\n\t (0, _lodash.forEach)(this._transparentFigureViews, function (fv) {\n\t fv.hideMask();\n\t });\n\t this._transparentFigureViews = null;\n\t this._transparentMode = false;\n\t this.view.render$();\n\t }\n\t },\n\t on_keydown_alt: function () {\n\t this.startTransparentMode();\n\t },\n\t on_focusout: function () {\n\t this.endTransparentMode();\n\t },\n\t on_keyup_alt: function () {\n\t this.endTransparentMode();\n\t },\n\t onSelectionChanged: function () {\n\t if (this._transparentMode) {\n\t this.endTransparentMode();\n\t this.startTransparentMode();\n\t }\n\t },\n\t on_keydown: function (_ref2) {\n\t var view = _ref2.view;\n\t var event = _ref2.event;\n\t var which = _ref2.which;\n\t var char = _ref2.char;\n\t var shiftKey = _ref2.shiftKey;\n\t var altKey = _ref2.altKey;\n\t var cmdKey = _ref2.cmdKey;\n\t\n\t\n\t // console.log('keyShortcuts - keydown');\n\t\n\t if (altKey) {\n\t preventDefault(event);\n\t return this.on_keydown_alt(event);\n\t }\n\t\n\t char = char.toLowerCase();\n\t\n\t if (cmdKey && !altKey && !shiftKey) {\n\t var lKeyValues = Array.from(_config.Config.hotKeys.values());\n\t switch (char) {\n\t case 'z':\n\t if (!lKeyValues.includes('Undo')) {\n\t preventDefault(event);\n\t if (view.canUndo()) {\n\t view.undo();\n\t }\n\t return;\n\t }\n\t case 'y':\n\t if (!lKeyValues.includes('Redo')) {\n\t preventDefault(event);\n\t if (view.canRedo()) {\n\t view.redo();\n\t }\n\t return;\n\t }\n\t }\n\t }\n\t\n\t var hk_char = (cmdKey ? 'CTRL+' : '') + (altKey ? 'ALT+' : '') + (shiftKey ? 'SHIFT+' : '') + char;\n\t var hk = _config.Config.hotKeys.get(hk_char);\n\t\n\t switch (hk) {\n\t case 'Undo':\n\t preventDefault(event);\n\t if (view.canUndo()) {\n\t view.undo();\n\t }\n\t return;\n\t case 'Redo':\n\t preventDefault(event);\n\t if (view.canRedo()) {\n\t view.redo();\n\t }\n\t return;\n\t case 'Pan':\n\t view.tool = view.tool == _view.Tool.Pan() ? 'Select' : _view.Tool.Pan();\n\t break;\n\t case 'Select':\n\t view.tool = 'Select';\n\t break;\n\t case 'ZoomIn':\n\t view.tool = view.tool == _view.Tool.Zoom() ? 'Select' : _view.Tool.Zoom();\n\t view.zoom *= 1.10;\n\t break;\n\t case 'ZoomOut':\n\t view.tool = view.tool == _view.Tool.Zoom() ? 'Select' : _view.Tool.Zoom();\n\t view.zoom /= 1.10;\n\t break;\n\t default:\n\t break;\n\t }\n\t\n\t var tool = view.tool;\n\t\n\t if (tool && tool.isCommitable) {\n\t switch (which) {\n\t case 13: // Enter\n\t case 27:\n\t // Esc\n\t preventDefault(event);\n\t tool.commit$();\n\t break;\n\t }\n\t } else if (!tool || tool.allowKeyShortcuts) {\n\t\n\t var selectedFigures = view.selectedFigures;\n\t\n\t if (cmdKey) {\n\t\n\t switch (char) {\n\t\n\t // Select all\n\t //========================================================\n\t case 'a':\n\t preventDefault(event);\n\t view.selectAll();\n\t return view.render$();\n\t\n\t // Duplicate\n\t //========================================================\n\t case 'd':\n\t preventDefault(event);\n\t if (view.canDuplicate(selectedFigures)) {\n\t view.duplicate(selectedFigures);\n\t view.commit$();\n\t }\n\t break;\n\t\n\t // Copy\n\t //========================================================\n\t case 'c':\n\t preventDefault(event);\n\t if (view.canCopy(selectedFigures)) {\n\t view.copy(selectedFigures);\n\t }\n\t break;\n\t\n\t // Cut\n\t //========================================================\n\t case 'x':\n\t preventDefault(event);\n\t if (view.canCut(selectedFigures)) {\n\t view.cut(selectedFigures);\n\t return view.commit$();\n\t }\n\t break;\n\t\n\t // Paste\n\t //========================================================\n\t case 'v':\n\t preventDefault(event);\n\t if (view.canPaste()) {\n\t view.pasteAt$(view.center).then(function () {\n\t return view.commit$();\n\t });\n\t }\n\t break;\n\t\n\t // Group\n\t //========================================================\n\t case 'g':\n\t preventDefault(event);\n\t if (view.canGroup(selectedFigures)) {\n\t view.group(selectedFigures);\n\t return view.commit$();\n\t }\n\t break;\n\t\n\t // Ungroup\n\t //========================================================\n\t case 'u':\n\t preventDefault(event);\n\t if (view.canUngroup(selectedFigures)) {\n\t view.ungroup(selectedFigures);\n\t return view.commit$();\n\t }\n\t break;\n\t\n\t default:\n\t // Undo/redo are managed directly by Canvas\n\t }\n\t }\n\t\n\t // console.log(which);\n\t switch (which) {\n\t case 46:\n\t // Del\n\t preventDefault(event);\n\t if (view.canRemove(selectedFigures)) {\n\t view.remove(selectedFigures);\n\t return view.commit$();\n\t }\n\t break;\n\t\n\t case 8:\n\t // Backspace (Mac) => Del\n\t if (/Mac/.test(navigator.platform)) {\n\t preventDefault(event);\n\t if (view.canRemove(selectedFigures)) {\n\t view.remove(selectedFigures);\n\t return view.commit$();\n\t }\n\t }\n\t break;\n\t\n\t case 9:\n\t // Tab\n\t preventDefault(event);\n\t view.selectNext(shiftKey ? -1 : 1);\n\t return view.render$();\n\t\n\t case 32: // Space\n\t case 113:\n\t // F2\n\t preventDefault(event);\n\t if (selectedFigures.length === 1) {\n\t var figure = selectedFigures[0];\n\t if (view.canEditContent(figure)) {\n\t return view.editContent(figure);\n\t }\n\t }\n\t break;\n\t\n\t case 27:\n\t // Esc\n\t preventDefault(event);\n\t if (view.editingContent()) {\n\t return view.commitContent$();\n\t } else if (selectedFigures.length > 0) {\n\t selectedFigures.clear();\n\t view.render$();\n\t }\n\t break;\n\t\n\t case 13:\n\t // Enter\n\t preventDefault(event);\n\t if (view.editingContent()) {\n\t return view.commitContent$();\n\t }\n\t break;\n\t }\n\t\n\t if (view.canBump(selectedFigures)) {\n\t switch (which) {\n\t case 40:\n\t // Down\n\t return bump(event, view, selectedFigures, 0, -1);\n\t case 37:\n\t // Left\n\t return bump(event, view, selectedFigures, -1, 0);\n\t case 39:\n\t // Right\n\t return bump(event, view, selectedFigures, 1, 0);\n\t case 38:\n\t // Up\n\t return bump(event, view, selectedFigures, 0, 1);\n\t }\n\t }\n\t }\n\t }\n\t});\n\n/***/ },\n\n/***/ 115:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _lodash = __webpack_require__(4);\n\t\n\tvar _view = __webpack_require__(84);\n\t\n\tvar _config = __webpack_require__(2);\n\t\n\tfunction preventDefault(event) {\n\t event.preventDefault();\n\t}\n\tfunction bump(e, canvas, figures, x, y) {\n\t preventDefault(e);\n\t canvas.bump(figures, x, y);\n\t canvas.commit$();\n\t}\n\t\n\t_view.Plugin.WheelShortcuts = _view.Plugin.extend({ typeName: 'WheelShortcutsPlugin',\n\t\n\t name: 'wheelShortcuts',\n\t\n\t target: 'view',\n\t speed: 0.002,\n\t zoomMin: 1,\n\t zoomMax: 10,\n\t\n\t clone: function () {\n\t return _view.Plugin.WheelShortcuts(this);\n\t },\n\t on_mousewheel: function (_ref) {\n\t var view = _ref.view;\n\t var event = _ref.event;\n\t var wheelDelta = _ref.wheelDelta;\n\t var detail = _ref.detail;\n\t\n\t var delta = 0;\n\t\n\t if (wheelDelta !== undefined) {\n\t // WebKit / Opera / Explorer 9\n\t delta = event.wheelDelta;\n\t } else if (detail !== undefined) {\n\t // Firefox\n\t delta = -event.detail;\n\t }\n\t\n\t var lZoom = view.zoom;\n\t\n\t if (delta > 0) lZoom *= 1 + this.speed * wheelDelta;else lZoom /= 1 - this.speed * wheelDelta;\n\t\n\t if (lZoom < this.zoomMin) lZoom = this.zoomMin;\n\t if (lZoom > this.zoomMax) lZoom = this.zoomMax;\n\t\n\t view.zoom = lZoom;\n\t }\n\t});\n\n/***/ },\n\n/***/ 116:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _lodash = __webpack_require__(4);\n\t\n\tvar _cdl = __webpack_require__(15);\n\t\n\tvar _view = __webpack_require__(84);\n\t\n\tvar ceil = Math.ceil;\n\tvar floor = Math.floor;\n\tvar sqrt = Math.sqrt;\n\t\n\t\n\t_view.Plugin.PagesSelector = _view.Plugin.extend({ typeName: 'PagesSelectorPlugin',\n\t\n\t name: 'pagesSelector',\n\t\n\t drawTo: ['plugins'],\n\t\n\t target: 'view',\n\t\n\t init: function (config) {\n\t this.callParent(config);\n\t this._visible = false;\n\t },\n\t clone: function () {\n\t return new _view.Plugin.PagesSelector();\n\t },\n\t show$: function () {\n\t var view = this.view;\n\t if (view._mainDocument._pages.length > 1) {\n\t view._stateChanged = true;\n\t view.selectedFigures.clear();\n\t this.takeControl();\n\t }\n\t return view.render$();\n\t },\n\t on_click: function (_ref) {\n\t var view = _ref.view;\n\t var event = _ref.event;\n\t var viewPoint = _ref.viewPoint;\n\t\n\t event.preventDefault();\n\t var doc = view._mainDocument;\n\t var _view$scene = view.scene;\n\t var width = _view$scene.width;\n\t var height = _view$scene.height;\n\t var pages = doc.pages;\n\t\n\t\n\t var columns = Math.ceil(Math.sqrt(pages.length)),\n\t rows = Math.ceil(pages.length / columns),\n\t columnsWidth = width * (1.0 / columns),\n\t rowsHeight = height * (1.0 / rows),\n\t columnsInLastRow = (pages.length - 1) % columns + 1,\n\t columnsWidthForLastRow = width * (1.0 / columnsInLastRow);\n\t\n\t var x = viewPoint.x;\n\t var y = viewPoint.y;\n\t\n\t\n\t if (x > 0 && x < width && y > 0 && y < height) {\n\t\n\t var selectedRow = floor(y / rowsHeight);\n\t var lastRow = selectedRow === rows - 1;\n\t var selectedColumn = floor(x / (lastRow ? columnsWidthForLastRow : columnsWidth));\n\t\n\t var selectedPage = selectedRow * columns + selectedColumn;\n\t doc.activePage = pages[selectedPage];\n\t\n\t view._stateChanged = true;\n\t\n\t this.visible = false;\n\t view.renderer.visible = true;\n\t\n\t view.redrawAll();\n\t\n\t view._pagesSelector = false;\n\t view._pagesSelectorDraw = false;\n\t\n\t view.render$();\n\t this.releaseControl();\n\t }\n\t\n\t event.stopPropagation();\n\t },\n\t draw: function (_ref2) {\n\t var view = _ref2.view;\n\t var context = _ref2.context;\n\t\n\t\n\t // Support for Mask plugin\n\t var specialPens = view.specialPens;\n\t if (specialPens && specialPens._maskVisible) {\n\t specialPens.prepareMask();\n\t }\n\t\n\t var _context$canvas = context.canvas;\n\t var width = _context$canvas.width;\n\t var height = _context$canvas.height;\n\t\n\t\n\t var pages = view._mainDocument._pages,\n\t length = pages.length,\n\t columns = ceil(sqrt(length)),\n\t rows = ceil(length / columns),\n\t scale = 1 / Math.max(columns, rows),\n\t columnsWidth = width * (1.0 / columns),\n\t rowsHeight = height * (1.0 / rows),\n\t xOffset = (columnsWidth - width * scale) / 2,\n\t yOffset = (rowsHeight - height * scale) / 2,\n\t columnsInLastRow = (length - 1) % columns + 1,\n\t columnsWidthForLastRow = width * (1.0 / columnsInLastRow),\n\t xOffsetForLastRow = (columnsWidthForLastRow - width * scale) / 2;\n\t\n\t (0, _lodash.forEach)(pages, function (page, i) {\n\t\n\t var col = i % columns,\n\t row = floor(i / columns),\n\t lastRow = row === rows - 1,\n\t cWidth = lastRow ? columnsWidthForLastRow : columnsWidth,\n\t rHeight = rowsHeight,\n\t lcx = col * cWidth,\n\t lcy = row * rowsHeight,\n\t lx = lcx + (lastRow ? xOffsetForLastRow : xOffset),\n\t ly = lcy + yOffset;\n\t\n\t context.save();\n\t\n\t context.beginPath();\n\t context.rect(lcx, lcy, cWidth, rHeight);\n\t context.clip();\n\t\n\t var transform = _cdl.Matrix.concat(_cdl.Matrix.translate(lx, ly), _cdl.Matrix.scale(scale), view.pageViewTransform(page).matrixFor(view));\n\t\n\t var backgroundPage = view.backgroundPageFor(page);\n\t\n\t view.drawPage(backgroundPage, context, transform, { viewport: transform });\n\t\n\t view.drawPage(page, context, transform, { wireframe: view._wireframe, viewport: transform });\n\t\n\t if (specialPens) {\n\t specialPens.drawForPage(page, context, transform, { lx: lcx, ly: lcy, width: cWidth, height: rHeight });\n\t }\n\t\n\t context.restore();\n\t });\n\t\n\t if (specialPens && specialPens._maskVisible) {\n\t specialPens.blitMask(context);\n\t }\n\t }\n\t});\n\n/***/ },\n\n/***/ 117:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _config = __webpack_require__(2);\n\t\n\tvar _lodash = __webpack_require__(4);\n\t\n\tvar _cdl = __webpack_require__(15);\n\t\n\tvar _view = __webpack_require__(84);\n\t\n\t_view.Plugin.ToolHelp = _view.Plugin.extend({ typeName: 'ToolHelpPlugin',\n\t\n\t drawTo: ['plugins'],\n\t\n\t name: 'toolHelp',\n\t\n\t target: 'view',\n\t\n\t Properties: {\n\t collapsed: { type: 'boolean', def: true, onChange: _view.redraw_this }\n\t },\n\t\n\t on_click: function (_ref) {\n\t var view = _ref.view;\n\t var event = _ref.event;\n\t var viewPoint = _ref.viewPoint;\n\t var height = view.height;\n\t\n\t var toolhelpBounds = new _cdl.Bounds(0, height - (_config.Config.debug ? 60 : 30), 80, height - (_config.Config.debug ? 33 : 0));\n\t if (toolhelpBounds.contains(viewPoint)) {\n\t this.collapsed = !this._collapsed;\n\t event.stopPropagation();\n\t }\n\t },\n\t draw: function (_ref2) {\n\t var _this = this;\n\t\n\t var view = _ref2.view;\n\t var context = _ref2.context;\n\t\n\t\n\t if (view.hasFocus()) {\n\t (function () {\n\t\n\t context.font = 'italic 11pt Calibri';\n\t context.textBaseline = 'bottom';\n\t context.textAlign = 'left';\n\t context.fillStyle = '#333';\n\t\n\t var ls = 16;\n\t var width = view.width;\n\t var height = view.height;\n\t\n\t var hy = height - (_config.Config.debug ? 40 : 6);\n\t\n\t if (_this._visible) {\n\t\n\t var toolhelp = view._toolhelp;\n\t if (toolhelp) {\n\t (function () {\n\t var lines = toolhelp.split('\\n');\n\t var h = hy - (lines.length - 1) * ls;\n\t (0, _lodash.forEach)(lines, function (line) {\n\t context.fillText(line, 6, h, width);\n\t h += ls;\n\t });\n\t })();\n\t } else {\n\t context.fillText('Need help?', 6, hy, width);\n\t }\n\t }\n\t })();\n\t }\n\t }\n\t});\n\n/***/ },\n\n/***/ 167:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _lodash = __webpack_require__(4);\n\t\n\tvar _view = __webpack_require__(84);\n\t\n\tvar View = _interopRequireWildcard(_view);\n\t\n\tvar _plugin = __webpack_require__(109);\n\t\n\tvar Plugin = _interopRequireWildcard(_plugin);\n\t\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\t\n\tvar _window = window;\n\tvar Cx = _window.Cx;\n\t\n\t\n\t(0, _lodash.assign)(Cx, View);\n\n/***/ }\n\n})\n});\n;\n\n\n/** WEBPACK FOOTER **\n ** ui.js\n **/","export * from './util';\r\nexport * from './events';\r\nexport * from './plugin';\r\nexport * from './tool';\r\nexport * from './composition';\r\nexport * from './texture-composition';\r\nexport * from './view';\r\nexport * from './view2d';\r\nexport * from './figure-view';\r\nexport * from './synced-figure-views';\r\nexport * from './document-view-mixin';\r\nexport * from './selected-figures-mixin';\r\nexport * from './interactive-view';\r\nexport * from './clipboard';\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/view/index.js\n **/","import { assign, isString, now } from 'lodash';\r\nimport { strokeSegment } from 'gear';\r\nimport { Point } from 'cdl';\r\n\r\nexport function createDomContainer( id ) {\r\n\r\n const container = window.document.createElement('div');\r\n if( id ) {\r\n container.id = id; // This is not needed, maybe just good for debugging\r\n }\r\n assign( container.style, {\r\n width: '100%', height: '100%',\r\n position: 'relative',\r\n overflow: 'hidden'\r\n });\r\n return container;\r\n}\r\n\r\nconst floor = Math.floor;\r\n\r\nexport function pixelCenter(point,t) {\r\n let p = t ? t.apply(point) : point;\r\n return new Point( floor(p.x) + 0.5, floor(p.y) + 0.5 );\r\n}\r\n\r\nexport function strokePixelCenterSegment(context,from,to,transform) {\r\n strokeSegment(context,pixelCenter(from,transform),pixelCenter(to,transform));\r\n}\r\n\r\n// [TODO] We can simplify this, IE10+ supports requestAnimationFrame\r\n\r\nlet requestAnimFrame = (function() {\r\n return window.requestAnimationFrame ||\r\n window.webkitRequestAnimationFrame ||\r\n window.mozRequestAnimationFrame ||\r\n window.oRequestAnimationFrame ||\r\n window.msRequestAnimationFrame ||\r\n function(callback) {\r\n return setTimeout(callback, 1000/60);\r\n };\r\n})();\r\n\r\n// Shared Animation Loop, we may directly eliminate this\r\n// It is adding complexity (and leaks), and it may not be giving as\r\n// anything\r\n// Maybe we do not even need a loop and we can just ask animation frames\r\n// when needed\r\n\r\nlet drawCalls = [];\r\nconst animationLoop = function() {\r\n for( let i = 0, iEnd = drawCalls.length; i < iEnd; ++i ) {\r\n drawCalls[i]();\r\n }\r\n requestAnimFrame( animationLoop );\r\n};\r\nanimationLoop();\r\n\r\nexport const AnimationLoop = {\r\n register( call) {\r\n drawCalls.push( call );\r\n },\r\n unregister( call) {\r\n drawCalls.splice( drawCalls.indexOf(call), 1 );\r\n }\r\n};\r\n\r\n\r\n// A simple throttle that call the function the first time is\r\n// issued and after that only if it is called after a certain timeout\r\n// lo-dash uses setTimeout, clearTimeout for doing the same thing\r\n// Equivalent to _.throttle(func,timeout,{leading:true})\r\nexport const fastThrottle = function(func,timeout) {\r\n const last = { t: 0, r: null };\r\n return function() {\r\n const t = now();\r\n if( last.t < t - timeout ) {\r\n last.r = func.apply(this,arguments);\r\n last.t = t;\r\n }\r\n return last.r;\r\n };\r\n};\r\n\r\n\r\n// Browser like shortcuts and utils from http://youmightnotneedjquery.com/\r\n//=============================================================================\r\n\r\nexport const g$ = function(selector) {\r\n return document.querySelector(selector);\r\n};\r\n\r\nexport const g$$ = function(selector) {\r\n return document.querySelectorAll(selector);\r\n};\r\n\r\n// [TODO] Use offsetWidth, offsetHeight\r\n\r\nconst dim = function(d) {\r\n return function(el,value) {\r\n if( value === undefined ) {\r\n return el.getBoundingClientRect()[d];\r\n }\r\n else {\r\n el.style[d] = value+'px';\r\n }\r\n };\r\n};\r\n\r\n\r\nassign( g$, {\r\n\r\n addClass( el, className ) {\r\n if( el.classList ) {\r\n el.classList.add(className);\r\n }\r\n else {\r\n el.className += ' ' + className;\r\n }\r\n },\r\n\r\n append( el, child ) {\r\n if( isString(child) ) {\r\n\r\n //Ensure we are working with a Node and then we can always just use appendChild\r\n //Cross browser trick (except old IE) to get DOM element from string\r\n const tempDiv = document.createElement('div');\r\n tempDiv.innerHTML = child;\r\n child = tempDiv.firstChild;\r\n }\r\n\r\n el.appendChild(child);\r\n },\r\n\r\n remove( el ) {\r\n if(el) {\r\n el.parentNode.removeChild(el);\r\n }\r\n },\r\n\r\n show( el ) {\r\n el.style.display = '';\r\n },\r\n\r\n hide( el ) {\r\n el.style.display = 'none';\r\n },\r\n\r\n width : dim('width'),\r\n height: dim('height'),\r\n\r\n setSize( el, width, height ) {\r\n el.style.width = width+'px';\r\n el.style.height = height+'px';\r\n },\r\n\r\n on( el, eventName, handler ) {\r\n el.addEventListener(eventName,handler,false);\r\n },\r\n\r\n off( el, eventName, handler ) {\r\n el.removeEventListener(eventName,handler,false);\r\n },\r\n\r\n focus( el ) {\r\n if( el !== document.activeElement ) {\r\n el.focus();\r\n }\r\n },\r\n\r\n // [TODO] Unused, we can remove this\r\n getBox( el ) {\r\n const rect = el.getBoundingClientRect();\r\n\r\n // retrieve the current position of an element relative to the document\r\n // el.offset();\r\n const top = rect.top + document.body.scrollTop,\r\n left = rect.left + document.body.scrollLeft,\r\n height = rect.height,\r\n width = rect.width;\r\n\r\n return {\r\n x: left, y: top,\r\n width: width, height: height,\r\n bottom: height + top,\r\n right: width + left\r\n };\r\n }\r\n});\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/view/util.js\n **/","import { Config } from 'config';\r\n\r\nimport { forEach, map, pull, keys, now, indexOf } from 'lodash';\r\n\r\nimport { Point } from 'cdl';\r\n\r\nimport { g$, fastThrottle } from './util';\r\n\r\nexport let padScaling = 1.0;\r\nexport let usingTouch = false;\r\n\r\nconst specialKeys = [ 'altKey', 'shiftKey', 'ctrlKey', 'metaKey' ];\r\n\r\n// Use view.triggerKeyboard() to get the virtual keyboard in mobile\r\nlet textInputEl, textInputButtonEl;\r\nfunction initGlobalTextInputEl() {\r\n const textInputId = 'grafika-hidden-text-input',\r\n textInputButtonId = textInputId + '-button';\r\n g$.append( g$('body'), ``);\r\n g$.append( g$('body'), `` );\r\n textInputEl = g$(\"#\"+textInputId);\r\n textInputButtonEl = g$(\"#\"+textInputButtonId);\r\n}\r\n\r\n\r\nconst eventBasePrototype = {\r\n\r\n preventDefault() {\r\n return this._e.preventDefault();\r\n },\r\n\r\n get view() {\r\n return this._v;\r\n },\r\n\r\n get event() {\r\n return this;\r\n },\r\n\r\n get type() {\r\n return this._t;\r\n },\r\n\r\n get route() {\r\n return 'on_' + this._t;\r\n },\r\n\r\n get originalEvent() {\r\n return this._e;\r\n },\r\n\r\n get cmdKey() {\r\n const e = this._e;\r\n return e.ctrlKey || e.metaKey;\r\n },\r\n\r\n get stopped() {\r\n return this._s;\r\n },\r\n stopPropagation() {\r\n this._s = true;\r\n }\r\n};\r\n\r\nfunction createEventPrototype( getters, proto ){\r\n return extendProto( forwardEventGetters(specialKeys.concat(getters), proto), eventBasePrototype );\r\n}\r\n\r\n// focus, focusout\r\n\r\nexport const ViewEvent = function(view,type,originalEvent){\r\n this._v = view;\r\n this._t = type;\r\n this._s = false; // stopped\r\n this._e = originalEvent;\r\n};\r\nViewEvent.prototype = createEventPrototype([],{\r\n\r\n});\r\n\r\n// keypress, keydown, keyup\r\n\r\nexport const ViewKeyEvent = function(view,type,originalEvent){\r\n this._v = view;\r\n this._t = type;\r\n this._s = false; // stopped\r\n this._e = originalEvent;\r\n\r\n};\r\nViewKeyEvent.prototype = createEventPrototype([\r\n 'which', 'keyCode', 'key', 'charCode'\r\n],{\r\n get char() {\r\n const { _e } = this, which = _e.which || _e.keyCode;\r\n return which !== undefined ? String.fromCharCode(which) : undefined ;\r\n },\r\n});\r\n\r\n\r\n// keypress, keydown, keyup\r\n\r\nexport const ViewMouseWheelEvent = function(view,type,originalEvent){\r\n this._v = view;\r\n this._t = type;\r\n this._s = false; // stopped\r\n this._e = originalEvent;\r\n\r\n};\r\nViewMouseWheelEvent.prototype = createEventPrototype([],{\r\n get wheelDelta() {\r\n const { _e } = this;\r\n if( _e.wheelDelta !== undefined ) {\r\n // WebKit / Opera / Explorer 9\r\n return _e.wheelDelta;\r\n }\r\n else {\r\n // Firefox\r\n return - _e.detail;\r\n }\r\n },\r\n});\r\n\r\n// 3D views uses a ray tracing tracker\r\n\r\nconst DefaultPointerTracker = function() {\r\n};\r\nDefaultPointerTracker.prototype.track = function({ view, originalEvent }) {\r\n\r\n const modelPoint = view.modelPoint(originalEvent),\r\n docPoint = view.docPoint(originalEvent);\r\n\r\n return {\r\n\r\n modelPoint,\r\n docPoint,\r\n\r\n // In 3D, this points are allowed to jump between texture islands\r\n modelPointRaw: modelPoint,\r\n docPointRaw : docPoint,\r\n };\r\n};\r\n\r\n\r\nconst defaultPointerTracker = new DefaultPointerTracker();\r\n\r\n// pointerdown, pointermove, pointerup, click, dblclick\r\n\r\nexport const ViewPointerEvent = function(view,type,originalEvent,pointers,eventDown,tracker) {\r\n this._v = view;\r\n this._t = type;\r\n this._e = originalEvent;\r\n this._p = pointers;\r\n this._s = false; // stopped\r\n this._vp = view.viewPoint(originalEvent);\r\n this._ed = eventDown || this;\r\n this._target = null;\r\n this._tracker = tracker || defaultPointerTracker;\r\n // Cached properties that doesn't change during retargetting\r\n this._cache = new Map();\r\n};\r\n\r\nViewPointerEvent.prototype = createEventPrototype([\r\n\r\n 'pageX', 'pageY',\r\n 'clientX', 'clientY',\r\n 'screenX', 'screenY',\r\n 'offsetX', 'offsetY',\r\n 'which', 'pointerType',\r\n 'button', 'buttons'\r\n\r\n], forwardTrackerGetters([\r\n\r\n 'modelPoint',\r\n 'docPoint',\r\n 'modelIsland',\r\n 'docIsland',\r\n\r\n 'modelPointRaw',\r\n 'docPointRaw',\r\n 'modelIslandRaw',\r\n 'docIlsandRaw',\r\n\r\n],{\r\n\r\n retarget(eventDown,target) {\r\n const { _v, _t, _e, _p } = this;\r\n const re = new ViewPointerEvent(_v,_t,_e,_p,eventDown,target);\r\n // Copy common properties, that are expensive to recompute\r\n re._cache = this._cache;\r\n return re;\r\n },\r\n\r\n get viewPoint() {\r\n return this._vp;\r\n },\r\n\r\n get figureHit() {\r\n const { _cache } = this;\r\n if( ! _cache.has('figureHit') ) {\r\n _cache.set('figureHit', this._v.figureHitAtEvent(this._e) );\r\n }\r\n return _cache.get('figureHit');\r\n },\r\n get figure() {\r\n const { figureHit } = this;\r\n if( figureHit ) {\r\n return figureHit.figure;\r\n }\r\n },\r\n\r\n get rawFigureHits() {\r\n const { _cache } = this;\r\n if( ! _cache.has('rawFigureHits') ) {\r\n _cache.set( 'rawFigureHits', this._v.rawFigureHitsAtEvent(this._e) );\r\n }\r\n return _cache.get('rawFigureHits');\r\n },\r\n\r\n get rawFigures() {\r\n const { rawFigureHits } = this;\r\n return map(rawFigureHits,'figure');\r\n },\r\n\r\n get clientPoint() {\r\n const event = this._e;\r\n return Point(event.clientX,event.clientY);\r\n },\r\n\r\n get pagePoint() {\r\n const event = this._e;\r\n return Point(event.pageX,event.pageY);\r\n },\r\n\r\n // [CHECK]\r\n // There are offsetX, offsetY properties that seems to be inconsistent\r\n // Maybe we can try them at one point\r\n\r\n // [TODO]\r\n // We may want to clone the points, but users shouldn't be modifiying this\r\n\r\n get offsetPoint() {\r\n return this.viewPoint;\r\n },\r\n\r\n get pointers() {\r\n return this._p;\r\n },\r\n\r\n get pointerId() {\r\n const { _e } = this;\r\n return _e.pointerId || _e.touchId;\r\n },\r\n\r\n get isPrimary() {\r\n const { _e } = this;\r\n return _e.isPrimary === undefined ? true : _e.isPrimary;\r\n },\r\n}));\r\n\r\nexport const interactiveViewEvents = [\r\n 'contextmenu',\r\n 'click',\r\n 'dblclick',\r\n 'keydown',\r\n 'keyup',\r\n 'keypress',\r\n 'focus',\r\n 'focusout',\r\n 'pointerdown',\r\n 'pointermove',\r\n 'pointerup',\r\n 'mousemove',\r\n 'mousewheel',\r\n];\r\n\r\n\r\nexport const InteractiveHelper = function( view, domElement, config = {} ) {\r\n\r\n this.view = view;\r\n\r\n const el = this.el = domElement;\r\n\r\n const captureKey = this.captureKey = config.captureKey; // function(object, event ) { return capture... };\r\n\r\n\r\n this.enabled = true;\r\n this.focused = false;\r\n\r\n const elK = this.elK = captureKey ? document : el;\r\n\r\n this.consume_click = 0;\r\n\r\n this.pointersMap = new Map();\r\n this.pointers = [];\r\n\r\n this.primaryId = null;\r\n\r\n this.mouseisdown = false;\r\n\r\n this.lastClick = { t: 0, x: 0, y: 0 };\r\n\r\n // Keep track of added handlers to remove them on dispose\r\n const unList = this.unList = [];\r\n const on = function( element, event, handler ) {\r\n unList.push({ element, event, handler });\r\n g$.on( element, event, handler );\r\n };\r\n\r\n // Using the container to pick up mouse events\r\n on( el, 'click', this.click.bind(this) );\r\n\r\n // Handling dblclick by hand so we can support touch\r\n on( el, 'dblclick', event => { event.preventDefault(); } );\r\n\r\n // We are going to generate an equivalent but simplified API to PointerEvents\r\n // The polyfills that I found were not good enough to be able to just replace\r\n // listenning to mouse events and touch events, they included timers and other\r\n // things that were just getting in our way.\r\n\r\n if( window.PointerEvent ) { // IE11\r\n\r\n el.style['touch-action'] = 'none';\r\n\r\n on( el, 'pointerdown', this.pointerdown.bind(this) );\r\n on( document, 'pointermove', this.pointermove.bind(this) );\r\n on( document, 'pointerup' , this.pointerup.bind(this) );\r\n\r\n on( el, 'mousedown', event => { event.preventDefault(); } );\r\n // Forward mouse move to provide hover feedback\r\n on( el, 'mousemove', this.mousemove.bind(this) );\r\n }\r\n else if( window.navigator.msPointerEnabled ) { // IE10\r\n\r\n el.style['touch-action'] = 'none';\r\n\r\n on( el, 'MSPointerDown', this.pointerdown.bind(this) );\r\n on( document, 'MSPointerMove', this.pointermove.bind(this) );\r\n on( document, 'MSPointerUp' , this.pointerup.bind(this) );\r\n\r\n on( el, 'mousedown', event => { event.preventDefault(); } );\r\n // Forward mouse move to provide hover feedback\r\n on( el, 'mousemove', this.mousemove.bind(this) );\r\n }\r\n else {\r\n // Mouse + Touch for other cases\r\n\r\n on( el, 'mousedown', this.mousedown.bind(this) );\r\n on( el, 'mousemove', this.mousemove.bind(this) );\r\n\r\n // Mouse move and mouseup attached to the document so we can drag\r\n // even when out of the Canvas\r\n on( document, 'mousemove', this.doc_mousemove.bind(this) );\r\n on( document, 'mouseup' , this.doc_mouseup .bind(this) );\r\n\r\n on( el, 'touchstart' , this.touchstart.bind(this) );\r\n on( el, 'touchmove' , this.touchmove.bind(this) );\r\n on( el, 'touchend' , this.touchend.bind(this) );\r\n on( el, 'touchleave' , this.touchend.bind(this) );\r\n on( el, 'touchcancel', this.touchend.bind(this) );\r\n }\r\n\r\n on( el, 'mousewheel', this.mousewheel.bind(this) );\r\n\ton( el, 'MozMousePixelScroll', this.mousewheel.bind(this) ); // firefox\r\n\r\n // Cancel context menu\r\n g$.on( el, 'contextmenu', event => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n });\r\n\r\n g$.on( elK, 'keydown' , this.keydown.bind(this) );\r\n g$.on( elK, 'keyup' , this.keyup.bind(this) );\r\n g$.on( elK, 'keypress', this.keypress.bind(this) );\r\n\r\n if( textInputEl ) {\r\n // TextInputEl is delayed til needed\r\n this.bindToTextInputEl();\r\n }\r\n\r\n g$.on( el, 'focus' , this.focus.bind(this) );\r\n g$.on( el, 'focusout', this.focusout.bind(this) );\r\n};\r\n\r\nInteractiveHelper.prototype = {\r\n\r\n bindToTextInputEl() {\r\n if( textInputEl ) {\r\n g$.on( textInputEl, 'keydown' , this.keydown.bind(this) );\r\n g$.on( textInputEl, 'keyup' , this.keyup.bind(this) );\r\n g$.on( textInputEl, 'keypress', this.keypress.bind(this) );\r\n\r\n // g$.on( textInputEl, 'keydown' , () => { console.log('...');} );\r\n }\r\n },\r\n\r\n fireViewEvent( type, originalEvent ) {\r\n this.fireDomEvent( type, new ViewEvent( this.view, type, originalEvent ) );\r\n },\r\n\r\n fireKeyEvent( type, originalEvent ) {\r\n this.fireDomEvent( type, new ViewKeyEvent( this.view, type, originalEvent ) );\r\n },\r\n\r\n fireMouseWheelEvent( type, originalEvent ) {\r\n this.fireDomEvent( type, new ViewMouseWheelEvent( this.view, type, originalEvent ) );\r\n },\r\n\r\n firePointerEvent( type, originalEvent ) {\r\n const event = new ViewPointerEvent( this.view, type, originalEvent, this.pointers, this.eventDown );\r\n if( type === 'pointerdown' && event.isPrimary ) {\r\n this.eventDown = event;\r\n }\r\n if( type === 'pointerup' && event.isPrimary ) {\r\n this.eventDown = null;\r\n }\r\n\r\n this.fireDomEvent( type, event );\r\n\r\n if( type === 'pointerdown' && event.stopped ){\r\n this.stopClick();\r\n }\r\n },\r\n\r\n // Keep separate...\r\n\r\n fireMouseMoveEvent: fastThrottle(function( type, originalEvent ){\r\n this.firePointerEvent(type,originalEvent);\r\n },12),\r\n\r\n firePointerMoveEvent: fastThrottle(function( type, originalEvent ){\r\n this.firePointerEvent(type,originalEvent);\r\n },12),\r\n\r\n /*\r\n fireMouseMoveEvent( type, originalEvent ) {\r\n this.firePointerEvent(type,originalEvent);\r\n },\r\n\r\n firePointerMoveEvent( type, originalEvent ) {\r\n this.firePointerEvent(type,originalEvent);\r\n },\r\n */\r\n\r\n fireDomEvent( type, event ) {\r\n const { view } = this;\r\n view.fireEvent(type,event);\r\n if( ! event.stopped ) {\r\n view.on_domEvent(event);\r\n }\r\n },\r\n\r\n triggerKeyboard(event) {\r\n if( Config.mobileKeyboard ) {\r\n\r\n // This is work in progress, the idea is trigger the virtual keyboard\r\n // in mobile. The approach was clicking through a button and showing\r\n // an invisible input. This is disabled at this point, as I couldn't\r\n // make it work.\r\n\r\n if( ! textInputEl ) {\r\n initGlobalTextInputEl();\r\n this.bindToTextInputEl();\r\n }\r\n\r\n if( event ) {\r\n // Avoid jumps\r\n textInputEl.style.left = event.pageX + 'px';\r\n textInputEl.style.top = event.pageY + 'px';\r\n }\r\n\r\n textInputButtonEl.click();\r\n }\r\n },\r\n\r\n dispose() {\r\n forEach( this.unList, ({ element, event, handler }) => {\r\n g$.off( element, event, handler );\r\n });\r\n },\r\n\r\n stopClick() {\r\n this.consume_click = now();\r\n },\r\n\r\n clickConsumed() {\r\n const cc = this.consume_click;\r\n if( cc ) {\r\n if( (now()-cc) < 400 ) {\r\n return true;\r\n }\r\n else {\r\n this.consume_click = 0;\r\n }\r\n }\r\n return false;\r\n },\r\n\r\n focus(event) {\r\n this.focused = true;\r\n this.fireViewEvent('focus',event);\r\n },\r\n\r\n focusout(event) {\r\n this.pointersMap.clear();\r\n this.pointers = [];\r\n\r\n this.focused = false;\r\n this.fireViewEvent('focusout',event);\r\n },\r\n\r\n click( event ) {\r\n if( this.clickConsumed() ) {\r\n event.preventDefault();\r\n return;\r\n }\r\n if( this.enabled ) {\r\n event.preventDefault();\r\n this.firePointerEvent('click',event);\r\n }\r\n },\r\n checkDblclick( event ) {\r\n if( event.isPrimary === false ) {\r\n return; // Ignore multi touch\r\n }\r\n let t = now();\r\n const x = event.clientX, y = event.clientY;\r\n const lc = this.lastClick;\r\n const epsilon = 20;\r\n if( t - lc.t < 300 && Math.abs(x-lc.x) < epsilon && Math.abs(y-lc.y) < epsilon ) {\r\n this.dblclick(event);\r\n t = 0; // avoid firing extra dblclick when clicking several times\r\n }\r\n lc.t = t;\r\n lc.x = x;\r\n lc.y = y;\r\n },\r\n dblclick( event ) {\r\n if( this.enabled ) {\r\n event.preventDefault();\r\n this.firePointerEvent('dblclick',event);\r\n }\r\n },\r\n mousedown( event ) {\r\n if( this.enabled ) {\r\n this.mouseisdown = true;\r\n g$.focus(this.el);\r\n event.preventDefault();\r\n padScaling = 1.0;\r\n this.firePointerEvent('pointerdown',event);\r\n\r\n // if right click then also fire contextmenu event\r\n if( event.which === 3 ) {\r\n this.firePointerEvent('contextmenu',event);\r\n }\r\n }\r\n },\r\n // mousemove\r\n // If the mouse is down, forward events from everywhere in the page\r\n // If the mouse is not being pressed, just use the container events for hover to make the app faster\r\n mousemove( event ) {\r\n if( ( ! this.mouseisdown && this.pointers.length === 0 ) && this.enabled ) {\r\n padScaling = 1.0;\r\n event.preventDefault();\r\n this.firePointerMoveEvent('pointermove',event);\r\n this.fireMouseMoveEvent('mousemove',event);\r\n }\r\n },\r\n\r\n doc_mousemove( event ) {\r\n if( this.mouseisdown && this.enabled ) {\r\n event.preventDefault();\r\n this.fireMouseMoveEvent('pointermove',event);\r\n }\r\n },\r\n\r\n doc_mouseup( event ) {\r\n if( ! this.mouseisdown ) {\r\n return;\r\n }\r\n this.mouseisdown = false;\r\n if( this.enabled ) {\r\n event.preventDefault();\r\n this.firePointerEvent('pointerup',event);\r\n\r\n if( event.which === 1 ) {\r\n this.checkDblclick(event);\r\n }\r\n }\r\n },\r\n\r\n pointerdown( event ) {\r\n // We can not prevent the default here, if not mousedown is not triggered\r\n // We need to call preventDefault directly for mousedown in IE\r\n // event.preventDefault();\r\n this.pointerdown_ongoing(event);\r\n if( this.enabled ) {\r\n g$.focus(this.el);\r\n padScaling = ( event.pointerType === 'touch' || event.pointerType === 2 ) ? 2.2 : 1.0;\r\n this.firePointerEvent('pointerdown',event);\r\n\r\n // if right click then also fire contextmenu event\r\n if( event.which === 3 ) {\r\n this.fireViewEvent('contextmenu',event);\r\n }\r\n }\r\n },\r\n\r\n pointermove( event ) {\r\n if( this.pointermove_ongoing(event) && this.enabled ) {\r\n event.preventDefault();\r\n this.firePointerMoveEvent('pointermove',event);\r\n }\r\n },\r\n\r\n pointerup( event ) {\r\n const valid = this.pointerup_ongoing(event);\r\n if( valid && this.enabled ) {\r\n event.preventDefault();\r\n this.firePointerEvent('pointerup',event);\r\n\r\n // dblclick\r\n this.checkDblclick(event);\r\n }\r\n },\r\n\r\n pointerdown_ongoing( event ) {\r\n const { pointers, pointersMap } = this;\r\n const { pointerId } = event;\r\n\r\n const start = this.view.viewPoint(event);\r\n\r\n const oldPointerInfo = pointersMap.get(pointerId);\r\n if( oldPointerInfo ) {\r\n pull(pointers,oldPointerInfo);\r\n }\r\n\r\n const pointerInfo = { id: pointerId, start, current: start.clone() };\r\n\r\n pointers.push(pointerInfo);\r\n pointersMap.set(pointerId,pointerInfo);\r\n\r\n if( pointers.length >= 2 ) {\r\n // Prevent browser pinch to zoom\r\n // console.log('pointers '+pointers.length);\r\n event.preventDefault();\r\n }\r\n },\r\n\r\n pointermove_ongoing( event ) {\r\n const pointerInfo = this.pointersMap.get( event.pointerId );\r\n if( pointerInfo ) {\r\n\t pointerInfo.current = this.view.viewPoint(event);\r\n return true;\r\n }\r\n else {\r\n return false;\r\n }\r\n },\r\n\r\n pointerup_ongoing( event ) {\r\n const { pointers, pointersMap } = this;\r\n const { pointerId } = event;\r\n\r\n const n = indexOf( pointers, pointersMap.get(pointerId) );\r\n if( n >= 0 ) {\r\n pointers.splice(n,1);\r\n pointersMap.delete(pointerId);\r\n return true;\r\n }\r\n else {\r\n return false;\r\n }\r\n },\r\n\r\n touchstart( event ) {\r\n event.preventDefault();\r\n const touches = event.changedTouches;\r\n for(let i=0, iEnd=touches.length; i < iEnd; ++i) {\r\n const touch = touches.item(i),\r\n id = touch.identifier,\r\n isPrimary = ( this.pointers.length === 0 );\r\n\r\n if( isPrimary ) {\r\n this.primaryId = id;\r\n }\r\n const pointerEvent = simulatePointerEvent(event,touch,id,isPrimary);\r\n this.pointerdown(pointerEvent);\r\n }\r\n },\r\n\r\n touchmove( event ) {\r\n const touches = event.changedTouches;\r\n for(let i=0,iEnd=touches.length; i < iEnd; ++i) {\r\n const touch = touches.item(i);\r\n\t const id = touch.identifier;\r\n if( this.pointersMap.get(id) ) {\r\n event.preventDefault();\r\n const isPrimary = ( id === this.primaryId );\r\n const pointerEvent = simulatePointerEvent(event,touch,id,isPrimary);\r\n this.pointermove(pointerEvent);\r\n }\r\n }\r\n },\r\n\r\n touchend( event ) {\r\n const touches = event.changedTouches;\r\n for(let i=0,iEnd=touches.length; i < iEnd; ++i) {\r\n const touch = touches.item(i);\r\n \t const id = touch.identifier;\r\n const isPrimary = ( id === this.primaryId );\r\n if( isPrimary ) {\r\n this.primaryId = null;\r\n }\r\n if( this.pointersMap.get(id) ) {\r\n event.preventDefault();\r\n const pointerEvent = simulatePointerEvent(event,touch,id,isPrimary);\r\n this.pointerup(pointerEvent);\r\n }\r\n }\r\n },\r\n\r\n mousewheel( event ) {\r\n this.fireMouseWheelEvent('mousewheel',event);\r\n },\r\n\r\n keydown( event ) {\r\n const captureKey = this.captureKey;\r\n if( ( !captureKey || captureKey(this,event) ) && this.enabled ) {\r\n this.fireKeyEvent('keydown', event);\r\n }\r\n },\r\n\r\n keyup( event ) {\r\n const captureKey = this.captureKey;\r\n if( ( !captureKey || captureKey(this,event) ) && this.enabled ) {\r\n this.fireKeyEvent('keyup', event);\r\n }\r\n },\r\n\r\n keypress( event ) {\r\n const captureKey = this.captureKey;\r\n if( ( !captureKey || captureKey(this,event) ) && this.enabled ) {\r\n this.fireKeyEvent('keypress', event);\r\n }\r\n }\r\n};\r\n\r\n// Utilities\r\n//------------------------------------------------------------------------------\r\n\r\nfunction simulatePointerEvent(event,touch,touchId,isPrimary) {\r\n usingTouch = true;\r\n\r\n const pointerEvent = document.createEvent(\"MouseEvents\");\r\n let type = null;\r\n\r\n switch( event.type ) {\r\n case \"touchstart\" : type = \"mousedown\"; break;\r\n case \"touchmove\" : type = \"mousemove\"; break;\r\n case \"touchend\" :\r\n case \"touchleave\" :\r\n case \"touchcancel\": type = \"mouseup\" ; break;\r\n default: type = \"mousedown\";\r\n }\r\n pointerEvent.initMouseEvent(type, true, true, event.target.ownerDocument.defaultView, 0,\r\n touch.screenX, touch.screenY, touch.clientX, touch.clientY,\r\n event.ctrlKey, event.altKey, event.shiftKey, event.metaKey, 0, null);\r\n pointerEvent.pointerType = 'touch';\r\n pointerEvent.pointerId = touchId;\r\n pointerEvent.isPrimary = isPrimary;\r\n return pointerEvent;\r\n}\r\n\r\n\r\nfunction forwardTrackerGetters( getters, proto ) {\r\n forEach( getters, getter => {\r\n Object.defineProperty(proto,getter,{\r\n get() {\r\n if( ! this._target ) {\r\n this._target = this._tracker.track(this);\r\n }\r\n return this._target[getter];\r\n }\r\n });\r\n });\r\n return proto;\r\n}\r\n\r\nfunction forwardEventGetters( getters, proto ) {\r\n forEach( getters, getter => {\r\n Object.defineProperty(proto,getter,{\r\n get() {\r\n return this._e[getter];\r\n }\r\n });\r\n });\r\n return proto;\r\n}\r\n\r\nfunction extendProto( proto, config ){\r\n forEach( keys(config), key => {\r\n const descriptor = Object.getOwnPropertyDescriptor(config,key);\r\n if( descriptor.get || descriptor.set ) {\r\n Object.defineProperty(proto,key,descriptor);\r\n }\r\n else {\r\n proto[key] = config[key];\r\n }\r\n });\r\n return proto;\r\n}\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/view/events.js\n **/","import { forEach } from 'lodash';\r\nimport { OwnedObject } from 'gear';\r\n\r\n// A non interactive plugin that just render\r\nexport const RenderPlugin = OwnedObject.extend({ typeName: 'RenderPlugin',\r\n\r\n drawTo: [],\r\n\r\n target: 'document',\r\n\r\n Properties: {\r\n\r\n visible: { type: 'boolean', def: true, onChange() {\r\n this[ this._visible ? 'show' : 'hide' ](this);\r\n this.redraw();\r\n }}\r\n },\r\n\r\n initPlugin( /*view, ...init params*/ ) { },\r\n\r\n draw( /*{ view, context, transform }*/ ) { },\r\n\r\n show( /*view*/) { },\r\n hide( /*view*/) { },\r\n\r\n link( /*view*/) { },\r\n\r\n unlink( view ) {\r\n view.un(this);\r\n },\r\n\r\n updateSize( /*view,box*/) { },\r\n\r\n // Forward params to initPlugin\r\n init( ...params ) {\r\n this._params = params;\r\n this.view = null;\r\n },\r\n\r\n initView( view ) {\r\n this.view = view;\r\n this.initPlugin(view,...this._params);\r\n this.link(view);\r\n },\r\n\r\n initLayer(/* layer */) {\r\n // Used by 3D to hook a THREE.WebGLRenderer to a layer\r\n },\r\n\r\n dispose() {\r\n this.unlink(this.view);\r\n },\r\n\r\n redraw() {\r\n this.view.redraw(...this.drawTo);\r\n },\r\n\r\n has_try_pointerdown() {\r\n return this.try_pointerdown;\r\n },\r\n has_try_click() {\r\n return this.try_click;\r\n },\r\n has_try_dblclick() {\r\n return this.try_dblclick;\r\n },\r\n has_try_contextmenu() {\r\n return this.try_contextmenu;\r\n }\r\n\r\n});\r\n\r\nexport const Plugin = RenderPlugin.extend({ typeName: 'Plugin',\r\n\r\n isInteractive: true,\r\n\r\n Properties: {\r\n enabled: { type: 'boolean', def: true, onChange() {\r\n this.redraw();\r\n }}\r\n },\r\n\r\n takeControl() {\r\n const state = this._state = {};\r\n forEach( this.view._plugins, plugin => {\r\n state[ plugin.name ] = { visible: plugin._visible, enabled: plugin._enabled };\r\n const isThis = plugin === this;\r\n plugin.visible = isThis;\r\n plugin.enabled = isThis;\r\n });\r\n this.redraw();\r\n },\r\n releaseControl() {\r\n forEach( this.view._plugins, plugin => {\r\n const pluginState = this._state[plugin.name];\r\n if( pluginState ) {\r\n plugin.visible = pluginState.visible;\r\n plugin.enabled = pluginState.enabled;\r\n }\r\n });\r\n this.redraw();\r\n },\r\n\r\n draw( config ) {\r\n const { helper } = this;\r\n if( helper && helper.draw ){\r\n helper.draw(config);\r\n }\r\n },\r\n\r\n somethingToDraw() {\r\n return true;\r\n },\r\n\r\n needsToDrawFor(/* figure */) {\r\n return true;\r\n },\r\n\r\n handleDomEvent({ event, type, route, isPrimary }){\r\n\r\n const { helper } = this;\r\n if( helper ){\r\n if( type === 'pointermove' ) {\r\n helper.move(event);\r\n this.redraw();\r\n }\r\n else if( type === 'pointerup' ) {\r\n helper.end(event);\r\n this.helper = null;\r\n this.redraw();\r\n }\r\n else if( type === 'pointerdown' && isPrimary ) {\r\n console.log('Missing pointerup');\r\n helper.end(event);\r\n this.helper = null;\r\n this.redraw();\r\n }\r\n }\r\n\r\n if( event.stopped ) {\r\n return;\r\n }\r\n\r\n if( this._visible && this._enabled ) {\r\n if( this[route] ) {\r\n this[route](event);\r\n }\r\n this.on_domEvent(event);\r\n }\r\n },\r\n\r\n on_domEvent(/* event */) {},\r\n\r\n /*\r\n on_focus ( event ) { },\r\n on_focusout ( event ) { },\r\n on_click ( event ) { },\r\n on_dblclick ( event ) { },\r\n on_pointerdown ( event ) { },\r\n on_pointerup ( event ) { },\r\n on_pointermove ( event ) { },\r\n on_mousemove ( event ) { },\r\n on_keypress ( event ) { },\r\n on_keyup ( event ) { },\r\n on_keydown ( event ) { },\r\n on_contextmenu ( event ) { },\r\n on_mousewheel ( event ) { }\r\n */\r\n});\r\n\r\nPlugin.PluginsLayer = Plugin.extend({ typeName: 'PluginsLayerPlugin',\r\n name: 'pluginsLayer',\r\n drawTo: [ 'plugins' ],\r\n target: 'view'\r\n});\r\n\r\nexport function redraw_this() {\r\n this.redraw();\r\n}\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/view/plugin.js\n **/","import { forEach, last, flatten, isPlainObject } from 'lodash';\r\n\r\nimport { OwnedObject, Deferred, resolve } from 'gear';\r\n\r\nimport { Brush, Pen } from 'cdl';\r\n\r\nimport { Plugin } from './plugin';\r\n\r\n/*\r\nToolType = [\r\n 'Select', // Special tool used for selecting and transforming figures\r\n 'Flat', // Tools that should forward commits (Zoom,Pan)\r\n 'View', // Tools for changing view properties (Zoom,Pan)\r\n 'Normal', // Tools that allow the use of View tools on top of them (NodeEdit)\r\n 'Final', // Tools that doesn't support any kind of stacking (Draw)\r\n 'Stackable' // Tools that creates an edition context (Deprecated, using ContentLayer now)\r\n]\r\n*/\r\n\r\n//\r\n// Rules\r\n\r\nexport const Tool = OwnedObject.extend({ typeName: 'Tool',\r\n\r\n type: 'Final',\r\n isCommitable: true,\r\n\r\n // initTool( view, ...init params ) {},\r\n\r\n link( /*view*/ ) {},\r\n unlink( /*view*/ ) {},\r\n\r\n start( /*view*/ ) { },\r\n pause( /*view*/ ) { },\r\n resume( /*view*/ ) { },\r\n finish( /*view*/ ) { },\r\n\r\n // _commit$( view ) {},\r\n // _cancel$( view ) {},\r\n\r\n draw( /* config */ ) { },\r\n\r\n commit$() { const view = this.view; const doc = view._document;\r\n if( this._commit$ ) {\r\n return resolve(this._commit$(view,doc)) .then( () => {\r\n return this.stop('commit$');\r\n });\r\n }\r\n else {\r\n return this.stop('commit$');\r\n }\r\n },\r\n\r\n cancel$() {\r\n const { view } = this;\r\n const { doc } = view;\r\n if( this._cancel$ ) {\r\n return resolve( this._cancel$(view,doc) ) .then( () => {\r\n return this.stop('cancel$');\r\n });\r\n }\r\n else {\r\n return this.stop('cancel$');\r\n }\r\n },\r\n\r\n redraw() {\r\n this.view.redraw('tools');\r\n },\r\n\r\n // Forward helper ( move, end, draw ) to the plugin\r\n get helper() {\r\n return this.view.tools.helper;\r\n },\r\n set helper( h ) {\r\n this.view.tools.helper = h;\r\n },\r\n\r\n init( a, b, c ) {\r\n this._sleeping = false;\r\n this._params = {a:a,b:b,c:c};\r\n this._deferred = new Deferred();\r\n\r\n // [TODO] Eliminate this...\r\n const config = isPlainObject(a) ? a\r\n : isPlainObject(b) ? b\r\n : isPlainObject(c) ? c : {};\r\n\r\n if( config !== a ) {\r\n this.initProperties(config);\r\n }\r\n\r\n forEach(['start','finish','pause','resume'], func =>\r\n config[func] && ( this[func] = config[func] )\r\n );\r\n\r\n this._bind('commit$')\r\n ._bind('cancel$')\r\n ._bind('stop' );\r\n },\r\n\r\n initView( view ) {\r\n this.view = view;\r\n const p = this._params;\r\n resolve( this.initTool(view,p.a,p.b,p.c) ).then( () => {\r\n this.link(view);\r\n this.start();\r\n this.redraw();\r\n });\r\n },\r\n\r\n promise() {\r\n return this._deferred.promise;\r\n },\r\n\r\n sleep() {\r\n this.unlink(this.view);\r\n this.pause();\r\n this._sleeping = true;\r\n },\r\n\r\n wakeup() {\r\n this._sleeping = false;\r\n this.link(this.view);\r\n this.resume();\r\n },\r\n\r\n stop( event ) {\r\n const { view } = this;\r\n this._stopped = true;\r\n this._deferred.resolve();\r\n return resolve( view.popTool() ) .then( () => {\r\n if( event && this.type === 'View' ) {\r\n // Forward commit and cancel event to the underlying tool\r\n return view.tool[event]();\r\n }\r\n });\r\n },\r\n\r\n dispose() {\r\n this.unlink(this.view);\r\n this.finish();\r\n },\r\n\r\n get cursor() {\r\n return this.view.cursor;\r\n },\r\n set cursor( cursor_ ) {\r\n this.view.cursor = cursor_;\r\n },\r\n\r\n toolhelp(/* ...params */) {\r\n this.view.toolhelp(...arguments);\r\n },\r\n\r\n triggerKeyboard(event) {\r\n this.view.triggerKeyboard(event);\r\n },\r\n\r\n /*\r\n on_focus( event ) { },\r\n on_focusout( event ) { },\r\n on_click( event ) { },\r\n on_dblclick( event ) { },\r\n on_pointerdown( event ) { },\r\n on_pointerup( event ) { },\r\n on_pointermove( event ) { },\r\n on_mousemove( event ) { },\r\n on_keypress( event ) { },\r\n on_keyup( event ) { },\r\n on_keydown( event ) { },\r\n on_contextmenu( event ) { }\r\n */\r\n\r\n canUndo() {\r\n return false;\r\n },\r\n undo() {},\r\n\r\n canRedo() {\r\n return false;\r\n },\r\n redo() {},\r\n\r\n supportsClipboard() {\r\n return false;\r\n },\r\n\r\n somethingToDraw() {\r\n return true;\r\n },\r\n\r\n needsToDrawFor(/* docIsland */) {\r\n return true;\r\n }\r\n});\r\n\r\nTool.defaultPen = function() {\r\n return Pen({color:{rgb:'000000'},width:2});\r\n};\r\n\r\nTool.defaultBrush = function() {\r\n return Brush({color:{rgb:'2533AA'}});\r\n};\r\n\r\nPlugin.Tools = Plugin.extend({ typeName: 'ToolsPlugin',\r\n\r\n name: 'tools',\r\n\r\n drawTo: [ 'tools' ],\r\n\r\n initPlugin( view ) {\r\n this._tools = [];\r\n this._toolhelp = '';\r\n this._trackPointer = false;\r\n view.on({ 'change' : this.redraw }, this );\r\n },\r\n\r\n toolhelp( string ) {\r\n if( string === null ) {\r\n this._toolhelp = null;\r\n }\r\n else {\r\n const th = flatten(arguments);\r\n this._toolhelp = th[0];\r\n for(let k=1,kEnd=th.length;k {\r\n return this.commitEditionTools$();\r\n });\r\n }\r\n }\r\n return resolve();\r\n },\r\n\r\n get tool() {\r\n return last(this._tools);\r\n },\r\n\r\n set tool( tool_ ) {\r\n const tools = this._tools;\r\n const { view } = this;\r\n\r\n this._trackPointer = false;\r\n\r\n // Remove the tools that are of type View\r\n let toolsRemoved = false;\r\n for( let k = tools.length-1; k > 0 ; --k ) {\r\n const t = tools[k];\r\n if( t.type === 'View' ) {\r\n t.dispose();\r\n tools.pop();\r\n toolsRemoved = true;\r\n }\r\n }\r\n\r\n if( tool_ === 'Edit' || tool_ === 'Select' ) {\r\n // Special (hack?) case\r\n // We need to leave the tool in a select based tool\r\n const ct = this.tool;\r\n if( ct ) {\r\n if( tool_ === 'Select' && ct.type === 'Final' ) {\r\n return this.popTool();\r\n }\r\n else if( toolsRemoved ) {\r\n ct.wakeup();\r\n view.fireEvent('toolchanged',view,ct);\r\n this.redraw();\r\n return this.render$ ? this.render$() : null; // hack for the moment\r\n }\r\n return;\r\n }\r\n else {\r\n tool_ = Tool.Select();\r\n }\r\n }\r\n\r\n const addNewTool =() => {\r\n this.toolhelp(null);\r\n const currentTool = this.tool;\r\n if( currentTool ) {\r\n currentTool.sleep();\r\n }\r\n tools.push(tool_);\r\n tool_.initView(view);\r\n view.fireEvent('toolchanged',view,tool_);\r\n // When adding a new tool, clear the selection\r\n if( tool_.type !== 'View' ) {\r\n view.selectedFigures.clear();\r\n }\r\n this.redraw();\r\n if( this.render$ ) {\r\n this.render$(); // hack for the moment\r\n }\r\n };\r\n\r\n const ft = this.tool;\r\n if( ! ft || ( view._stackViewTools && tool_.type === 'View' ) || tools.length === 1 /* only the select tool */ ) {\r\n addNewTool();\r\n }\r\n else {\r\n resolve( ft.commit$() ).then(addNewTool);\r\n }\r\n },\r\n\r\n popTool() {\r\n const view = this.view, tools = this._tools;\r\n if( tools.length > 0 ) {\r\n\r\n // Commit the tool if it is not stopped\r\n const t = last(tools);\r\n if( ! t._stopped ) {\r\n return t.commit$();\r\n }\r\n tools.pop().dispose();\r\n\r\n this.toolhelp(null);\r\n const { tool } = this;\r\n if( tool ) {\r\n tool.wakeup();\r\n }\r\n view.fireEvent('toolchanged',view,tool);\r\n this.redraw();\r\n\r\n // [TODO] Why is this render$ needed?\r\n return view.render$ ? view.render$() : null; // hack for the moment\r\n }\r\n },\r\n\r\n draw( config ) {\r\n this.callParent(config);\r\n const { tool } = this;\r\n if( tool && ! tool._sleeping ) {\r\n tool.draw(config);\r\n }\r\n },\r\n\r\n has_try_pointerdown() {\r\n const { tool } = this;\r\n if( tool && ! tool._sleeping ) {\r\n return tool.try_pointerdown;\r\n }\r\n },\r\n try_pointerdown( event ) {\r\n this.tool.try_pointerdown(event);\r\n if( event.stopped ) {\r\n this._trackPointer = true;\r\n }\r\n },\r\n\r\n has_try_contextmenu() {\r\n const { tool } = this;\r\n if( tool && ! tool._sleeping ) {\r\n return tool.try_contextmenu;\r\n }\r\n },\r\n\r\n /* [TODO] ?\r\n try_pointerup( event ) {\r\n const { tool } = this;\r\n if( tool && ! tool._sleeping ) {\r\n tool.try_pointerup(event);\r\n }\r\n },\r\n */\r\n has_try_click(){\r\n const { tool } = this;\r\n if( tool && ! tool._sleeping ) {\r\n return tool.try_click;\r\n }\r\n },\r\n try_click( event ) {\r\n this.tool.try_click(event);\r\n },\r\n\r\n has_try_dblclick(){\r\n const { tool } = this;\r\n if( tool && ! tool._sleeping ) {\r\n return tool.try_dblclick;\r\n }\r\n },\r\n try_dblclick( event ) {\r\n this.tool.try_dblclick(event);\r\n },\r\n\r\n on_domEvent({ event, type, route }) {\r\n\r\n // Avoid initial 'pointermove' and 'pointerup' events in case the tool was\r\n // added in a 'pointerdown' event that was consumed\r\n if( type === 'pointerdown' ) {\r\n this._trackPointer = true;\r\n }\r\n else if( ( type === 'pointermove' || type === 'pointerup' ) && ! this._trackPointer ) {\r\n return;\r\n }\r\n\r\n\r\n const { tool } = this;\r\n if( tool && ! tool._sleeping ) {\r\n if( tool[route] ) {\r\n tool[route](event);\r\n }\r\n }\r\n },\r\n\r\n somethingToDraw() {\r\n const { tool } = this;\r\n return tool ? tool.somethingToDraw() : false;\r\n },\r\n\r\n needsToDrawFor( docIsland ) {\r\n const { tool } = this;\r\n return tool ? tool.needsToDrawFor(docIsland) : true;\r\n }\r\n});\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/view/tool.js\n **/","import { Helper } from 'config';\r\n\r\nimport { forEach, find, assign } from 'lodash';\r\n\r\nimport { OwnedObject, setForEach, clearCanvas } from 'gear';\r\n\r\nimport { Matrix } from 'cdl';\r\n\r\nimport { createDomContainer } from './util';\r\n\r\n\r\nexport const CompositionLayer = OwnedObject.extend({ typeName: 'CompositionLayer',\r\n\r\n Properties: {\r\n\r\n canvas: { type: 'canvas', owned: false, def: null },\r\n\r\n autoClear: { type: 'boolean', def: true },\r\n needsRedraw: { type: 'boolean', def: true },\r\n needsBatchRedraw: { type: 'boolean', def: true },\r\n name: { type: 'string', def: 'document' }\r\n }\r\n\r\n});\r\n\r\n\r\nexport const Composition = OwnedObject.extend({ typeName: 'Composition',\r\n\r\n Properties: {\r\n\r\n layers: { type: 'CompositionLayer[]', def: [], onChange( added, removed ) {\r\n if( ! added && ! removed ) {\r\n this.updateLayersOrder();\r\n }\r\n }},\r\n\r\n // document color, normal, specular\r\n textureType: { type: 'string', def: 'color' },\r\n\r\n // Also include webGL, tools and annotation layers\r\n main: { type: 'boolean', def: false }\r\n },\r\n\r\n getDrawToLayers( plugin ) {\r\n const textureLayers = ( plugin['drawTo_'+this.textureType] || [] );\r\n return this.main ? textureLayers.concat(plugin.drawTo) : textureLayers;\r\n },\r\n\r\n clone() {\r\n return new Composition(this);\r\n },\r\n\r\n init() {\r\n this.layer = {};\r\n this.container = null;\r\n this.layersContainer = null;\r\n },\r\n\r\n addLayersFor( plugin ) {\r\n forEach( this.getDrawToLayers(plugin), ( name, zOrder ) => {\r\n plugin.initLayer( this.addLayer(name,zOrder) );\r\n });\r\n },\r\n\r\n addLayer( name, zOrder ) {\r\n let layer = this.layer[name];\r\n if( layer ) {\r\n return layer; // Already added\r\n }\r\n\r\n layer = this.layer[name] = this.createLayer(name,zOrder);\r\n\r\n this.layers.add( layer );\r\n\r\n return layer;\r\n },\r\n\r\n createCanvas(/* name */) {\r\n return Helper.createCanvas(this.width,this.height);\r\n },\r\n\r\n createLayer( name ) {\r\n\r\n const layer = new CompositionLayer({ name,\r\n canvas: this.createCanvas(name)\r\n });\r\n\r\n // In initialization delay canvas creation until initScene is issued\r\n const { layersContainer } = this;\r\n if( layersContainer && layer.canvas ){\r\n layersContainer.appendChild(layer.canvas);\r\n }\r\n\r\n return layer;\r\n },\r\n\r\n get width() {\r\n return this._owner.width;\r\n },\r\n get height() {\r\n return this._owner.height;\r\n },\r\n\r\n updateSize( width, height ) {\r\n forEach( this.layers, layer => {\r\n if( layer.canvas ) {\r\n assign( layer.canvas, { width, height } );\r\n }\r\n });\r\n },\r\n\r\n needsBatchRedraw( name, state ) {\r\n const layer = this.layer[name];\r\n if( ! layer ) {\r\n // scene.log(`Composition Layer ${name} doesn't exist`);\r\n return false;\r\n }\r\n if( state === undefined ) {\r\n return layer.needsBatchRedraw;\r\n }\r\n else {\r\n layer.needsBatchRedraw = state;\r\n // scene.log(`... batch redraw ${name}`)\r\n return this;\r\n }\r\n },\r\n\r\n needsRedraw( name, state ) {\r\n const layer = this.layer[name];\r\n if( ! layer ) {\r\n // scene.log(`Composition Layer ${name} doesn't exist`);\r\n return false;\r\n }\r\n if( state === undefined ) {\r\n return layer.needsRedraw;\r\n }\r\n else {\r\n layer.needsRedraw = state;\r\n // scene.log(`... redraw ${name}`)\r\n return this;\r\n }\r\n },\r\n\r\n redrawAll() {\r\n setForEach(this.layers,'needsRedraw',true);\r\n },\r\n\r\n canvas( layer ) {\r\n return this.layer[layer].canvas;\r\n },\r\n\r\n getContext( layer, type ) {\r\n return this.canvas(layer).getContext(type);\r\n },\r\n\r\n drawPlugin2D( view, plugin, name, config ) {\r\n const specializedFunc = 'draw_'+name;\r\n if( plugin[specializedFunc] ) {\r\n plugin[specializedFunc](config);\r\n }\r\n else {\r\n plugin.draw(config);\r\n }\r\n },\r\n\r\n drawPlugin( view, plugin, name, context ) {\r\n const { target } = plugin;\r\n\r\n const config = assign({ view, context },view.drawConfig());\r\n\r\n if( target === 'view' ) {\r\n // The plugin will just use view coordinates ( HUD )\r\n this.drawPlugin2D(view,plugin,name,assign({\r\n transform: new Matrix()\r\n },config));\r\n }\r\n else {\r\n const transformModel = view.getViewPortTransform();\r\n\r\n if( target === 'model' ){\r\n this.drawPlugin2D(view,plugin,name,assign({\r\n transformModel,\r\n transform: transformModel\r\n },config));\r\n }\r\n else { // target document\r\n\r\n this.drawPlugin2D(view,plugin,name,assign({\r\n transformModel,\r\n transformDoc: transformModel,\r\n transform: transformModel\r\n },config));\r\n }\r\n }\r\n },\r\n\r\n drawPlugins( view, plugins ) {\r\n\r\n for( let k = 0, kEnd = plugins.length; k < kEnd; ++k ) {\r\n const plugin = plugins[k];\r\n if( plugin.visible ) {\r\n\r\n const layersToDraw = this.getDrawToLayers(plugin);\r\n for( let n = 0, nEnd = layersToDraw.length; n < nEnd; ++n ) {\r\n const name = layersToDraw[n];\r\n const layer = this.layer[name];\r\n\r\n if( layer.needsRedraw || layer.needsBatchRedraw ) {\r\n const context = layer.canvas.getContext('2d');\r\n this.drawPlugin( view, plugin, name, context );\r\n }\r\n }\r\n }\r\n }\r\n },\r\n\r\n shouldRedraw() {\r\n return !! find( this.layers, 'needsRedraw' );\r\n },\r\n\r\n draw( view, plugins ) {\r\n\r\n forEach( this.layers, clearLayerIfNeeded );\r\n\r\n this.drawPlugins( view, plugins );\r\n\r\n this.clearLayersRedrawFlags();\r\n },\r\n\r\n clearLayersRedrawFlags() {\r\n forEach( this.layers, cleanRedrawFlags );\r\n },\r\n\r\n // DOM manipulation, unused in node\r\n\r\n updateLayersOrder() {\r\n if( this.layersContainer ){\r\n forEach( this.layers, (layer,n) => {\r\n if( layer.canvas ) {\r\n layer.canvas.style['z-index'] = n;\r\n }\r\n });\r\n }\r\n },\r\n\r\n dispose() {\r\n this.remove();\r\n },\r\n remove() {\r\n if( this.container ) {\r\n this.container.removeChild(this.layersContainer);\r\n }\r\n this.layersContainer = null;\r\n this.container = null;\r\n },\r\n appendTo( container, id = container.id ) {\r\n\r\n this.container = container;\r\n\r\n const layersContainer = this.layersContainer = createDomContainer( id && ( id + '_scene' ) );\r\n\r\n forEach( this.layers, layer => {\r\n const { canvas } = layer;\r\n if( canvas ) {\r\n layersContainer.appendChild(canvas);\r\n\r\n if( id ) {\r\n canvas.id = `${id}_${layer.name}`;\r\n }\r\n\r\n assign( canvas.style, {\r\n position: 'absolute',\r\n top : 0,\r\n left: 0\r\n });\r\n }\r\n });\r\n\r\n container.appendChild(layersContainer);\r\n\r\n return this;\r\n }\r\n\r\n});\r\n\r\n\r\nfunction clearLayerIfNeeded( layer ) {\r\n if( layer.autoClear && ( layer.needsRedraw || layer.needsBatchRedraw ) ) {\r\n clearCanvas( layer.canvas );\r\n }\r\n}\r\n\r\nfunction cleanRedrawFlags( layer ) {\r\n layer.needsRedraw = false;\r\n layer.needsBatchRedraw = false;\r\n}\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/view/composition.js\n **/","/* globals THREE */\r\n\r\nimport { Config, Helper } from 'config';\r\n\r\nimport { clearCanvas, fillContext } from 'gear';\r\n\r\nimport { Matrix, Color } from 'cdl';\r\n\r\nimport { Plugin } from './plugin';\r\nimport { Composition } from './composition';\r\n\r\n\r\nfunction nextPowerOf2( N ) {\r\n let size = 256;\r\n while( size < N ) {\r\n size *= 2;\r\n }\r\n return size;\r\n}\r\n\r\n// Creates a THREE.WebGLRenderer in the '3D' layer of the composition\r\n// Forwards drawing calls to the view.draw3D(renderer) function\r\n\r\nPlugin.Renderer3D = Plugin.extend({ typeName: 'Renderer3D',\r\n\r\n name: 'renderer',\r\n target: 'view',\r\n\r\n Properties: {\r\n preserveDrawingBuffer: { type: 'boolean', def: true }\r\n },\r\n drawTo: [ '3D' ],\r\n\r\n redrawFigure() { // [TODO]\r\n this.redraw('3D');\r\n },\r\n\r\n initLayer( layer ){\r\n layer.autoClear = false;\r\n\r\n // Create a Three.js renderer that will render to the 3D scene layer\r\n const renderer = this.renderer = new THREE.WebGLRenderer({ canvas: layer.canvas,\r\n preserveDrawingBuffer: this.preserveDrawingBuffer,\r\n alpha: true, antialias: true\r\n });\r\n renderer.setPixelRatio( Config.useDevicePixelRatio ? window.devicePixelRatio : 1 );\r\n },\r\n\r\n updateSize( width, height ) {\r\n this.renderer.setSize(width, height);\r\n },\r\n\r\n draw({ view }){\r\n view.draw3D( this.renderer );\r\n }\r\n});\r\n\r\n\r\nfunction fillDefaultTextureMapContext( view, textureType, context ) {\r\n switch( textureType ) {\r\n\r\n case 'normal':\r\n context.fillStyle = '#7F7FFF';\r\n fillContext(context);\r\n break;\r\n\r\n case 'specular':\r\n case 'bump':\r\n case 'displacement':\r\n context.fillStyle = '#7F7F7F';\r\n fillContext(context);\r\n break;\r\n\r\n case 'alpha':\r\n context.fillStyle = '#FFFFFF';\r\n fillContext(context);\r\n break;\r\n\r\n case 'color':\r\n view.fillWithBackgroundColor( context, Color.White() );\r\n }\r\n}\r\n\r\n\r\nPlugin.TextureMap = Plugin.extend({ typeName: 'TextureMapPlugin',\r\n\r\n target: 'model',\r\n\r\n Properties: {\r\n textureSize: { type: 'integer', def: 2048 },\r\n textureType: { type: 'string', def: 'normal' }\r\n },\r\n\r\n get layerName() {\r\n return this.textureType + 'Background';\r\n },\r\n\r\n init( config ) {\r\n const { textureType } = this;\r\n this['drawTo_'+textureType] = [ this.layerName ];\r\n this.callParent(config);\r\n },\r\n\r\n initPlugin( view ) {\r\n this.updateMap();\r\n view.on({\r\n 'model3dchanged': this.updateMap\r\n }, this );\r\n },\r\n\r\n updateMap() {\r\n const { view } = this;\r\n const textureMap = view.getFixedTextureMap(this.textureType);\r\n if( textureMap && textureMap.wrap === 'Stretch' ) {\r\n textureMap.loadImage$( this.textureSize ) .then( image => {\r\n this.image = image;\r\n // console.log('texture loaded');\r\n view.redraw(this.layerName); // [TODO] redraw() should also invalidate drawTo_xxx\r\n });\r\n }\r\n else {\r\n if( this.image ) {\r\n this.image = null;\r\n view.redraw(this.layerName); // [TODO] redraw() should also invalidate drawTo_xxx\r\n }\r\n }\r\n },\r\n\r\n draw({ view, context, transform }) {\r\n context.save();\r\n const { image } = this;\r\n if( image ) {\r\n // console.log('draw '+this.textureType+' with image');\r\n if( ! transform.isIdentity() ) {\r\n transform.transformContext(context);\r\n }\r\n const scale = view.model.textureWidth / this.textureSize;\r\n const imageMatrix = Matrix.multiply( Matrix.scale(scale,-scale), Matrix.translate(0,-image.height) );\r\n imageMatrix.transformContext(context);\r\n context.drawImage(image,0,0);\r\n }\r\n else {\r\n\r\n // console.log('draw '+this.textureType+' with solid color');\r\n fillDefaultTextureMapContext(view,this.textureType,context);\r\n\r\n }\r\n context.restore();\r\n }\r\n});\r\n\r\nfunction createTexture( canvas ) {\r\n const texture = new THREE.Texture( canvas );\r\n texture.needsUpdate = true;\r\n return texture;\r\n}\r\n\r\n/*\r\nfunction createQuadRTT( plane, canvas, zOrder ) {\r\n\r\n const texture = new THREE.Texture( canvas );\r\n texture.needsUpdate = true;\r\n\r\n const material = new THREE.MeshBasicMaterial({ color: 0xffffff, map: texture });\r\n\r\n const quad = new THREE.Mesh( plane, material );\r\n quad.position.z = 100 * zOrder;\r\n\r\n return { quad, material, texture };\r\n}\r\n*/\r\n\r\nexport const TextureComposition = Composition.extend({ typeName: 'TextureComposition',\r\n\r\n // Force all drawing to be done in the 'document' layer\r\n // Ignore needsRedraw, everything is redrawn at every draw request\r\n // The idea when this abstraction was built was that it will be better to\r\n // use layers and GPU buffer, but the CPU => GPU transfer of the image is\r\n // really slow, so we will forced to work in a completely different way\r\n // [TODO] Do not extend from Composition anymore?\r\n //===========================================================================================\r\n\r\n createCanvas( name ) {\r\n if( ! this.composedCanvas ) {\r\n const composedCanvas = this.composedCanvas = this.callParent( name );\r\n return composedCanvas;\r\n }\r\n },\r\n\r\n clearComposedCanvas() {\r\n const { composedCanvas } = this;\r\n if( composedCanvas ) {\r\n clearCanvas(composedCanvas);\r\n }\r\n },\r\n\r\n draw( view, plugins ) {\r\n\r\n /*\r\n let layers = '';\r\n forEach( this._layers, layer => {\r\n if( layer.needsRedraw ) {\r\n layers += layer.name + ' ';\r\n }\r\n });\r\n console.log(layers);\r\n */\r\n\r\n this.clearComposedCanvas();\r\n\r\n this.drawPlugins( view, plugins );\r\n\r\n this.clearLayersRedrawFlags();\r\n\r\n const { _threeTexture } = this;\r\n if( _threeTexture ) {\r\n _threeTexture.needsUpdate = true;\r\n }\r\n },\r\n\r\n drawPlugins( view, plugins ) {\r\n const composedCanvas = this.composedCanvas;\r\n const context = composedCanvas.getContext('2d');\r\n\r\n for( let k = 0, kEnd = plugins.length; k < kEnd ; ++k ) {\r\n const plugin = plugins[k];\r\n if( plugin.visible ) {\r\n const drawToLayers = this.getDrawToLayers(plugin);\r\n\r\n for( let l = 0, lEnd = drawToLayers.length; l < lEnd; ++l ) {\r\n const name = drawToLayers[l];\r\n // const layer = this.layer[name];\r\n this.drawPlugin( view, plugin, name, context );\r\n }\r\n }\r\n }\r\n },\r\n\r\n get threeTexture() {\r\n // return ( this._threeTexture = createTexture( this.composedCanvas ) );\r\n\r\n let threeTexture = this._threeTexture;\r\n if( ! this._threeTexture ) {\r\n threeTexture = this._threeTexture = createTexture( this.composedCanvas );\r\n }\r\n return threeTexture;\r\n },\r\n\r\n updateSize( width, height ) {\r\n this.callParent( nextPowerOf2(width), nextPowerOf2(height) );\r\n },\r\n\r\n //===========================================================================================\r\n\r\n // [TODO]\r\n // Use WebGLRenderTarget to directly create a GPU buffer texture\r\n\r\n /*\r\n init(...params) {\r\n this.sceneRTT = new THREE.Scene();\r\n this.planeRTT = new THREE.PlaneBufferGeometry( 512, 512 ); // PlaneBufferGeometry\r\n this.callParent(...params);\r\n },\r\n\r\n initRTT( width, height ) {\r\n\r\n const { sceneRTT } = this;\r\n\r\n this.textureRTT = new THREE.WebGLRenderTarget( width, height, {\r\n minFilter: THREE.LinearFilter,\r\n magFilter: THREE.NearestFilter,\r\n format: THREE.RGBFormat\r\n });\r\n\r\n this.cameraRTT = new THREE.OrthographicCamera( width / - 2, width / 2, height / 2, height / - 2, -10000, 10000 );\r\n this.cameraRTT.position.z = 1000;\r\n\r\n const light = new THREE.DirectionalLight( 0xffffff );\r\n \tlight.position.set( 0, 0, 1 ).normalize();\r\n \tsceneRTT.add( light );\r\n\r\n const composedCanvas = this.composedCanvas = Helper.createCanvas(width,height);\r\n const rendererRTT = this.rendererRTT = new THREE.WebGLRenderer({\r\n canvas: composedCanvas,\r\n preserveDrawingBuffer: this.preserveDrawingBuffer,\r\n alpha: true, antialias: true\r\n });\r\n rendererRTT.setPixelRatio( window.devicePixelRatio );\r\n rendererRTT.setSize(width,height);\r\n },\r\n\r\n updateSize( width, height ) {\r\n console.log(`resizing ${width} - ${height}`);\r\n\r\n this.callParent(width,height);\r\n\r\n if( !this._owner.canvas3D ) {\r\n return;\r\n }\r\n\r\n if( ! this.rendererRTT ){\r\n this.initRTT(width,height);\r\n }\r\n\r\n console.log('resizing');\r\n\r\n const { composedCanvas, textureRTT, rendererRTT, cameraRTT, sceneRTT } = this;\r\n\r\n textureRTT.setSize(width,height);\r\n\r\n rendererRTT.setSize(width,height);\r\n\r\n composedCanvas.width = width;\r\n composedCanvas.height = height;\r\n\r\n cameraRTT.left = width / - 2;\r\n cameraRTT.right = width / 2;\r\n cameraRTT.top = height / 2;\r\n cameraRTT.bottom = height / - 2;\r\n cameraRTT.updateProjectionMatrix();\r\n\r\n // Replace the old Plane with a new one with the correct size,\r\n // [TODO] check how to resize, maybe do not use buffer geometry\r\n\r\n const planeRTT = this.planeRTT = new THREE.PlaneBufferGeometry( width, height );\r\n forEach( this.layers, ({ rtt }) => {\r\n const oldQuad = rtt.quad;\r\n const zOrder = oldQuad.position.z; // [TODO] add layer.zOrder\r\n sceneRTT.remove(oldQuad);\r\n const quad = rtt.quad = new THREE.Mesh( planeRTT, rtt.material );\r\n quad.position.z = 100 * zOrder;\r\n sceneRTT.add(quad);\r\n });\r\n\r\n },\r\n\r\n createLayer( name, zOrder ) {\r\n const layer = this.callParent(name,zOrder);\r\n const rtt = layer.rtt = createQuadRTT( this.planeRTT, layer.canvas, zOrder );\r\n this.sceneRTT.add( rtt.quad );\r\n return layer;\r\n },\r\n\r\n draw( view, plugins ) {\r\n\r\n let updateTexture = false;\r\n if( this._owner.canvas3D ) {\r\n forEach( this.layers, layer => {\r\n if( layer.needsRedraw ) {\r\n layer.rtt.texture.needsUpdate = true;\r\n layer.rtt.material.needsUpdate = true;\r\n updateTexture = true;\r\n }\r\n });\r\n }\r\n\r\n this.callParent(view,plugins);\r\n\r\n if( updateTexture ) {\r\n console.log('rendering');\r\n this.rendererRTT.render(this.sceneRTT,this.cameraRTT); // [TODO], this.textureRTT, true );\r\n }\r\n },\r\n\r\n get threeTexture() {\r\n return createTexture(this.composedCanvas);// this.textureRTT;\r\n },\r\n */\r\n\r\n});\r\n\r\n\r\n\r\nexport const TextureTile = function( view, textureType, textureMap ) {\r\n // Temporal canvas to avoid render glitches\r\n const waitingCanvas = Helper.createCanvas(256,256);\r\n const context = waitingCanvas.getContext('2d');\r\n fillDefaultTextureMapContext(view,textureType,context);\r\n\r\n this.threeTexture = new window.THREE.Texture(waitingCanvas);\r\n this.threeTexture.needsUpdate = true;\r\n this.id = textureMap.id;\r\n this.promise = textureMap.loadTextureTile$() .then( image => {\r\n this.image = image;\r\n this.threeTexture.image = image;\r\n this.threeTexture.needsUpdate = true;\r\n view.fireEvent('drawcomplete');\r\n });\r\n};\r\nTextureTile.prototype = {\r\n ready$() {\r\n return this.promise;\r\n }\r\n};\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/view/texture-composition.js\n **/","\r\nimport { forEach, invokeMap, now } from 'lodash';\r\n\r\nimport { Base, fillContext } from 'gear';\r\n\r\nimport { Point, Color } from 'cdl';\r\n\r\nimport { AnimationLoop, createDomContainer } from './util';\r\n\r\nimport { Composition } from './composition';\r\n\r\nvar Stats = function () {\r\n this.fps = 60;\r\n this.prevTime = 0;\r\n this.frames = 0;\r\n};\r\nStats.prototype.update = function() {\r\n var time = now();\r\n this.frames ++;\r\n if( time > this.prevTime + 1000 ) {\r\n this.fps = Math.round( ( this.frames * 1000 ) / ( time - this.prevTime ) );\r\n\r\n this.prevTime = time;\r\n this.frames = 0;\r\n\r\n //console.log(this.fps);\r\n }\r\n};\r\n\r\n\r\nlet _viewCount = 0;\r\n\r\nexport const View = Base.extend({ typeName: 'View',\r\n\r\n Properties: {\r\n\r\n autoDraw: { type: 'boolean', def: true },\r\n\r\n enabled: { type: 'boolean', def: true },\r\n\r\n backgroundColor: { type: 'Color', def: null, onChange() { this.onBackgroundColorChange(); } },\r\n\r\n\r\n // Main scene that will be shown to the user\r\n scene: { type: 'Composition', def: null }, // Initialized in the init() function\r\n\r\n // A scene could use textures (color, normal, bump, specular) and combine them using WebGL\r\n // Each texture is a composition (background, document, foreground, plugins)\r\n textures: { type: 'Composition[]', def: [] },\r\n\r\n // Plugins defines the layers that should be created (both in the main scene and the textures)\r\n // and handle events respecting their z-order.\r\n plugins: { type: 'Plugin[]', def: [], owned: false, onChange( added, removed ) {\r\n if( added ) {\r\n forEach( added, plugin => this.linkPlugin(plugin) );\r\n }\r\n if( removed ) {\r\n forEach( removed, plugin => this.disposePlugin(plugin) );\r\n }\r\n }},\r\n\r\n\r\n width: { type: 'number', def: 512, set(v) { this.updateSize(v,this.height); } },\r\n\r\n height: { type: 'number', def: 512, set(v) { this.updateSize(this.width,v); } },\r\n\r\n // Access point used by apps to identify the component Canvas is rendered to\r\n // For example, the Ext.js component\r\n widget: { type: 'object', owned: false },\r\n\r\n debug: { type: 'object', owned: false, def: {} }\r\n },\r\n\r\n get compositions() {\r\n return this.textures .concat( this.scene );\r\n },\r\n\r\n get pageTopLeft() {\r\n // [PERFORMANCE]\r\n // We cache this, as it was forcing re-calculation of styles in firefox\r\n // There is a performance hit to do this while moving the mouse around\r\n // User should call view.updateSize() after repositioning\r\n const p = this._pageTopLeft;\r\n if( p ) {\r\n return p.clone();\r\n }\r\n else {\r\n const rect = this.container.getBoundingClientRect();\r\n const { body } = window.document;\r\n return ( this._pageTopLeft = new Point( rect.left + body.scrollLeft, rect.top + body.scrollTop ) );\r\n }\r\n },\r\n\r\n get clientTopLeft() {\r\n const rect = this.container.getBoundingClientRect();\r\n return new Point( rect.left, rect.top );\r\n },\r\n\r\n get viewCenter() {\r\n return new Point(this.width/2,this.height/2);\r\n },\r\n\r\n viewPoint( event ) {\r\n const topLeft = this.pageTopLeft;\r\n return new Point( event.pageX - topLeft.x, event.pageY - topLeft.y );\r\n },\r\n\r\n colorAtViewPoint( viewPoint ) {\r\n // [TODO] extend to obtain the color of the foreground and background?\r\n const context = this.getContext('document','2d'); // [TODO]\r\n return Color.fromImageData( context.getImageData( viewPoint.x, viewPoint.y, 1,1 ).data );\r\n },\r\n\r\n image( layer ) {\r\n return this.canvas(layer).toDataURL();\r\n },\r\n\r\n batchRedraw(/* ...params */) {\r\n for( let k = 0, kEnd = arguments.length; k < kEnd; ++k ) {\r\n const name = arguments[k];\r\n this.needsBatchRedraw(name,true);\r\n }\r\n },\r\n\r\n redraw(/* ...params */) {\r\n for( let k = 0, kEnd = arguments.length; k < kEnd; ++k ) {\r\n const name = arguments[k];\r\n this.needsRedraw(name,true);\r\n }\r\n },\r\n\r\n drawDone(/* ...params */) {\r\n for( let k = 0, kEnd = arguments.length; k < kEnd; ++k ) {\r\n const name = arguments[k];\r\n this.needsRedraw(name,false);\r\n }\r\n },\r\n\r\n needsRedraw( name, state ) {\r\n const { compositions } = this;\r\n for( let k = 0, kEnd = compositions.length; k < kEnd; ++k ) {\r\n compositions[k].needsRedraw(name,state);\r\n }\r\n },\r\n\r\n needsBatchRedraw( name, state ) {\r\n const { compositions } = this;\r\n for( let k = 0, kEnd = compositions.length; k < kEnd; ++k ) {\r\n compositions[k].needsBatchRedraw(name,state);\r\n }\r\n },\r\n\r\n redrawAll() {\r\n const { compositions } = this;\r\n for( let k = 0, kEnd = compositions.length; k < kEnd; ++k ) {\r\n compositions[k].redrawAll();\r\n }\r\n },\r\n\r\n\r\n canvas( layer ) {\r\n return this.scene.canvas(layer||'document');\r\n },\r\n\r\n getContext( layer, type ) {\r\n return this.canvas(layer).getContext(type);\r\n },\r\n\r\n texture( textureType ) {\r\n return findByTextureType( this.textures, textureType );\r\n },\r\n\r\n drawConfig() {\r\n return {};\r\n },\r\n\r\n pluginsToDraw() {\r\n return this._plugins;\r\n },\r\n\r\n figureTextureTypes() {\r\n return [ 'color' ];\r\n },\r\n\r\n draw() {\r\n\r\n if( this.width === 0 || this.height === 0 ) {\r\n // Guard in case the view is not ready or has been collapsed\r\n return;\r\n }\r\n\r\n this.stats.update();\r\n\r\n let drawn = false;\r\n\r\n const { compositions } = this;\r\n for( let k = 0, kEnd = compositions.length; k < kEnd; ++k ) {\r\n const composition = compositions[k];\r\n if( composition.shouldRedraw() ) {\r\n composition.draw( this, this.pluginsToDraw(composition) );\r\n drawn = true;\r\n }\r\n }\r\n\r\n if( drawn ) {\r\n this.fireEvent('drawcomplete',this);\r\n }\r\n\r\n /*\r\n if( this.delayedEnabling && ! this.waitingEnabling ) {\r\n this.waitingEnabling = true;\r\n setTimeout( () => {\r\n const helper = this._eventsHelper;\r\n if( helper ) {\r\n helper.enabled = true;\r\n }\r\n this.waitingEnabling = false;\r\n this.delayedEnabling = false;\r\n console.log('wait');\r\n },0);\r\n }\r\n */\r\n },\r\n\r\n init( config ) {\r\n\r\n this.addEvents(\r\n 'ready',\r\n 'resize',\r\n 'zoomupdated',\r\n 'drawcomplete'\r\n );\r\n\r\n this.stats = new Stats();\r\n\r\n // DOM nodes, only if appended\r\n this.domElement = null; // Dom Element given by the app\r\n this.container = null; // Container where internals are appended\r\n this._pageTopLeft = null;\r\n\r\n this._internalId = ++_viewCount;\r\n this.disabledTemporally = 0;\r\n\r\n this.plugin = {};\r\n\r\n this.callParent(config);\r\n\r\n this.textures = this.createTextures(config);\r\n this.scene = this.createScene(config);\r\n\r\n this.linkPlugins();\r\n },\r\n\r\n // Allow each View to define their own Scene type, the default is a\r\n // simple Composition where all plugins are drawn\r\n createScene() {\r\n return new Composition({ main: true });\r\n },\r\n\r\n // Scenes can use WebGL surfaces that compose textures\r\n createTextures() {\r\n return [];\r\n },\r\n\r\n dispose() {\r\n invokeMap(this.plugins,'dispose');\r\n invokeMap(this.compositions,'dispose');\r\n if( this.container ) {\r\n this.domElement.removeChild( this.container );\r\n }\r\n },\r\n\r\n pushDisabledTemporally() {\r\n this.disabledTemporally++;\r\n this.enabled = false;\r\n },\r\n\r\n popDisabledTemporally() {\r\n if( this.disabledTemporally > 0 ) {\r\n this.disabledTemporally--;\r\n if( this.disabledTemporally === 0 ) {\r\n this.enabled = true;\r\n }\r\n }\r\n },\r\n\r\n updateSize( width, height ) {\r\n\r\n // Drop pageTopLeft cache\r\n this._pageTopLeft = null;\r\n\r\n if( ! ( width && height ) ) {\r\n\r\n if( this.container ){\r\n const rect = this.container.getBoundingClientRect();\r\n width = rect.width;\r\n height = rect.height;\r\n }\r\n else {\r\n width = 1024;\r\n height = 1024;\r\n }\r\n }\r\n\r\n if( this.width === width && this.height === height ) {\r\n return false; // nothing to do...\r\n }\r\n\r\n this._width = width;\r\n this._height = height;\r\n\r\n this.redrawAll();\r\n\r\n // The textures and the scene are updated to the same size\r\n // A View3D uses an TextureView to make the size of textures\r\n // independent of the view size. We couls allow to textures\r\n // to have different sizes and maybe fusion TextureView as\r\n // a mixin in Canvas3D.\r\n forEach( this.compositions, composition => {\r\n composition.updateSize(width,height);\r\n });\r\n\r\n forEach( this.plugins, plugin => {\r\n plugin.updateSize( width, height );\r\n });\r\n\r\n this.postResize();\r\n this.fireResizeEvent();\r\n },\r\n\r\n // Hooks for derived views\r\n postResize() {\r\n // Resize is done, update camera and other params\r\n },\r\n fireResizeEvent() {\r\n this.fireEvent('resize', this, this.width, this.height);\r\n },\r\n\r\n // state\r\n //----------------------------------------------------------------------------\r\n // Returns a copy of the current view state, viewTransform, wireframe\r\n // and other properties are populated by each view\r\n\r\n getState() {\r\n const { backgrondColor } = this;\r\n return {\r\n backgroundColor: backgrondColor ? backgrondColor.clone() : null\r\n };\r\n },\r\n\r\n setState( state ) {\r\n const { backgroundColor } = state;\r\n this.backgroundColor = backgroundColor ? backgroundColor.clone() : null;\r\n },\r\n\r\n get state() {\r\n return this.getState();\r\n },\r\n set state( s ) {\r\n this.setState(s);\r\n },\r\n\r\n\r\n onBackgroundColorChange() {\r\n this.redraw('background');\r\n },\r\n\r\n fillWithBackgroundColor( context, def = null ) {\r\n const backgroundColor = this._backgroundColor || def;\r\n if( backgroundColor ) {\r\n context.save();\r\n context.fillStyle = backgroundColor.rgba;\r\n fillContext( context );\r\n context.restore();\r\n }\r\n },\r\n\r\n\r\n // Plugins\r\n //-----------------------------------------------------------------------------\r\n\r\n addPlugin( plugin ) {\r\n this._plugins.add(plugin);\r\n },\r\n\r\n removePlugin( plugin ) {\r\n this._plugins.remove(plugin);\r\n },\r\n\r\n linkPlugin( plugin ) {\r\n const { name } = plugin;\r\n this.plugin[name] = plugin;\r\n this[name] = plugin;\r\n this.initPlugin(plugin);\r\n },\r\n\r\n initPlugin(plugin) {\r\n forEach( this.compositions, composition => {\r\n composition.addLayersFor(plugin);\r\n });\r\n plugin.initView(this);\r\n },\r\n\r\n disposePlugin( plugin ) {\r\n plugin.dispose();\r\n const { name } = plugin;\r\n delete this.plugin[name];\r\n delete this[name];\r\n },\r\n\r\n linkPlugins() {\r\n const { plugins } = this;\r\n this.insertViewPlugins(plugins);\r\n this.fixUpPlugins(plugins);\r\n\r\n forEach( plugins, plugin => {\r\n if( ! this.plugin[plugin.name] ) {\r\n this.linkPlugin(plugin);\r\n }\r\n });\r\n },\r\n\r\n fixUpPlugins(/* plugins */) {\r\n\r\n },\r\n\r\n // Append to DOM\r\n\r\n afterInit( config = {} ) {\r\n const { appendTo } = config;\r\n if( appendTo ) {\r\n this.appendTo( appendTo );\r\n }\r\n\r\n if( this.autoDraw ) {\r\n AnimationLoop.register( this.draw.bind(this) );\r\n }\r\n },\r\n\r\n appendTo( domElement, id = domElement.id ) {\r\n\r\n this.domElement = domElement;\r\n\r\n // Create a relative inner container to avoid touching the passed domElement\r\n // By doing this, we let Apps decide how to position the original domElement\r\n // using any position attribute\r\n\r\n const container = this.container = createDomContainer( id && ( id + '_container' ) );\r\n\r\n this.scene.appendTo( container, id );\r\n\r\n domElement.appendChild( container );\r\n\r\n this.updateSize();\r\n\r\n this.fireEvent('ready',this);\r\n },\r\n\r\n showTexture( texture ) {\r\n texture.appendTo( this.scene.layersContainer );\r\n texture.layersContainer.style.opacity = 0.5;\r\n },\r\n\r\n // This should conceptually be in Interactive_Mixin, but it makes hard to work\r\n // because we want to place the Interactive_Mixin at the end to provide static\r\n // versions\r\n\r\n handlePluginDomEvent( plugin, event ) {\r\n\r\n plugin.handleDomEvent(event);\r\n },\r\n\r\n on_domEvent({ event, route }) {\r\n\r\n if( ! event.stopped ) {\r\n const plugins = this._plugins;\r\n for( let k = plugins.length-1; k >= 0 && ! event.stopped; --k ) {\r\n const plugin = plugins[k];\r\n // console.log(plugin.typeName);\r\n this.handlePluginDomEvent(plugin,event);\r\n }\r\n }\r\n\r\n if( event.stopped ) {\r\n return; // stop propagation\r\n }\r\n\r\n if( this[route] ) {\r\n this[route](event);\r\n }\r\n },\r\n\r\n});\r\n\r\nexport function findByTextureType( textures, textureType ) {\r\n for( let k = 0, kEnd = textures.length; k < kEnd; ++k ) {\r\n const texture = textures[k];\r\n if( texture.textureType === textureType ) {\r\n return texture;\r\n }\r\n }\r\n}\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/view/view.js\n **/","import { Config } from 'config';\r\n\r\nimport { assign, isPlainObject } from 'lodash';\r\n\r\nimport { Base } from 'gear';\r\n\r\nimport { Point, Matrix, Bounds, Figures } from 'cdl';\r\n\r\nconst { floor, ceil } = Math;\r\n\r\nexport function pagePoint(event ) {\r\n return new Point(event.pageX,event.pageY);\r\n}\r\n\r\n// This functions are in sync with server side functions\r\n//---------------------------------------------------------------------------\r\nfunction scaledRenderBounds( bounds, scaleX, scaleY ) {\r\n return new Bounds( scaleX * (scaleX > 0 ? bounds.lx : bounds.hx) ,\r\n scaleY * (scaleY > 0 ? bounds.ly : bounds.hy) ,\r\n scaleX * (scaleX > 0 ? bounds.hx : bounds.lx) ,\r\n scaleY * (scaleY > 0 ? bounds.hy : bounds.ly) );\r\n}\r\n\r\nfunction pixelWidenedRenderBounds( bounds ) {\r\n return new Bounds( floor(bounds.lx),\r\n floor(bounds.ly),\r\n ceil(bounds.hx) + 1 ,\r\n ceil(bounds.hy) + 1 );\r\n}\r\n//---------------------------------------------------------------------------\r\n\r\n\r\nexport const ViewTransform = Base.extend({ typeName: 'ViewTransform',\r\n\r\n init( zoom = 1, center = new Point(0,0) ) {\r\n this.zoom = zoom;\r\n this.center = center; // View coordinates\r\n },\r\n\r\n clone() {\r\n return new ViewTransform(this.zoom,this.center.clone());\r\n },\r\n\r\n matrixFor( view ) {\r\n const offset = view.viewOffsetFor(this);\r\n return Matrix.m(\r\n Matrix.translate(offset.x,offset.y),\r\n Matrix.scale(this.zoom,-this.zoom)\r\n );\r\n },\r\n\r\n zoomAroundViewBounds( view, viewBounds, margin, fit ) {\r\n const bounds = viewBounds.scalingTransformed( this.matrixFor(view) );\r\n this.zoomAround(view,bounds,margin,fit);\r\n },\r\n\r\n // Bounds in model coordinates\r\n\r\n zoomAround( view, bounds, margin, fit ) {\r\n const p = arguments[0];\r\n if( p && isPlainObject(p) ) {\r\n bounds = p.bounds;\r\n margin = p.margin;\r\n fit = p.fit;\r\n }\r\n\r\n if( margin === undefined ) {\r\n margin = 0;\r\n }\r\n const docMargin = Math.abs(this.viewDeltaToDoc(view,margin));\r\n\r\n const currentBounds = view.boundsWith(this);\r\n\r\n const scaleWidth = ( currentBounds.width - 2*docMargin ) / bounds.width ;\r\n const scaleHeight = ( currentBounds.height - 2*docMargin ) / bounds.height ;\r\n\r\n if( scaleWidth <= 0 || scaleHeight <= 0 ) {\r\n // Guard against viewport inversion\r\n return this;\r\n }\r\n\r\n const scale = ( fit === 'Max' ? ( (scaleWidth > scaleHeight) ? scaleWidth : scaleHeight )\r\n : ( (scaleWidth < scaleHeight) ? scaleWidth : scaleHeight ) );\r\n\r\n this.zoom *= scale;\r\n this.center = bounds.center;\r\n return this;\r\n },\r\n\r\n // Returns the point in the browser view.\r\n // @param {Object} point The point in the document.\r\n docToView( view, docPoint ) {\r\n const offset = view.viewOffsetFor(this), zoom = this.zoom;\r\n return new Point( zoom * docPoint.x + offset.x ,\r\n -zoom * docPoint.y + offset.y );\r\n },\r\n\r\n viewToDoc( view, viewPoint ) {\r\n const offset = view.viewOffsetFor(this), zoom = this.zoom;\r\n return new Point( ( viewPoint.x - offset.x ) / zoom ,\r\n ( viewPoint.y - offset.y ) / -zoom );\r\n },\r\n\r\n docDeltaToView( view, docDelta ) {\r\n return docDelta * this.zoom;\r\n },\r\n\r\n viewDeltaToDoc( view, viewDelta ) {\r\n return viewDelta / this.zoom;\r\n },\r\n});\r\n\r\n\r\nexport const View2D_Mixin = {\r\n\r\n get is2D() {\r\n return true;\r\n },\r\n\r\n getState() {\r\n const { zoom, center } = this.viewTransform;\r\n return assign(this.callParent(),{ zoom, center });\r\n },\r\n setState(state) {\r\n this.callParent(state);\r\n const { zoom, center } = state;\r\n this.zoom = zoom;\r\n this.center = center;\r\n },\r\n\r\n init(/* ...params */) {\r\n this.viewTransform = new ViewTransform();\r\n this.callParent(...arguments);\r\n },\r\n\r\n get textureZoom() {\r\n return this.viewTransform.zoom;\r\n },\r\n\r\n getRenderArgs() {\r\n return { zoom: this.zoom, wireframe: this.wireframe };\r\n },\r\n\r\n zoomBy( delta, fireEvent = true ) {\r\n const { viewTransform } = this;\r\n viewTransform.zoom += delta;\r\n if( fireEvent ) {\r\n this.on_zoomupdated();\r\n }\r\n return this;\r\n },\r\n\r\n zoomIn( factor ) {\r\n this.zoom *= factor;\r\n return this;\r\n },\r\n\r\n zoomOut( factor ) {\r\n return this.zoomIn( 1 / factor );\r\n },\r\n\r\n zoomAroundViewBounds( viewBounds, margin, fit ) {\r\n this.viewTransform.zoomAroundViewBounds(this,viewBounds,margin,fit);\r\n this.on_zoomupdated();\r\n return this;\r\n },\r\n\r\n zoomAround( bounds, margin, fit ) {\r\n this.viewTransform.zoomAround(this,bounds,margin,fit);\r\n this.on_zoomupdated();\r\n return this;\r\n },\r\n\r\n zoomTo( zoom, center ) {\r\n if( center ) {\r\n const { viewTransform } = this;\r\n viewTransform.zoom = zoom;\r\n viewTransform.center = center.clone();\r\n this.on_zoomupdated();\r\n }\r\n else {\r\n this.zoom = zoom;\r\n }\r\n },\r\n\r\n _defaultMargin() {\r\n return Math.min( this.width, this.height ) / 10;\r\n },\r\n\r\n get zoom() {\r\n return this.viewTransform.zoom;\r\n },\r\n\r\n set zoom( zoom_ ) {\r\n let center = this.center.clone();\r\n let originalZoom = this.zoom;\r\n\r\n if( zoom_ > 0 ) {\r\n this.viewTransform.zoom = zoom_;\r\n if (Config.keepLowerLeftCornerAsOrigin) {\r\n //If we want to keep the lower left as origin, then we need to fix position when zooming.\r\n let originalOffset = this.viewCenter.clone();\r\n originalOffset.x /= originalZoom;\r\n originalOffset.y /= originalZoom;\r\n \r\n let newOffset = this.viewCenter.clone();\r\n newOffset.x /= this.zoom;\r\n newOffset.y /= this.zoom;\r\n \r\n center.x = center.x - originalOffset.x + newOffset.x;\r\n center.y = center.y - originalOffset.y + newOffset.y; \r\n this.viewTransform.center = center.center;\r\n } \r\n this.on_zoomupdated();\r\n }\r\n\r\n\r\n },\r\n\r\n get center() {\r\n return this.viewTransform.center;\r\n },\r\n set center( c ) {\r\n this.viewTransform.center = c.center;\r\n this.on_zoomupdated();\r\n },\r\n\r\n center$( c ) {\r\n return Figures.center$(c) .then( center => {\r\n this.center = center;\r\n });\r\n },\r\n\r\n getViewPortTransform() {\r\n return this.viewTransform.matrixFor(this);\r\n },\r\n\r\n on_zoomupdated() {\r\n this.redrawAll();\r\n this.fireEvent('zoomupdated',this,this.zoom);\r\n },\r\n\r\n\r\n docToView( docPoint ) {\r\n return this.viewTransform.docToView(this,docPoint);\r\n },\r\n docDeltaToView( docDelta ) {\r\n return this.viewTransform.docDeltaToView(this,docDelta);\r\n },\r\n\r\n // In a 3D View, the texture coordinates are different than\r\n // the view coordinates. This is used by tools and plugins\r\n // know how big they should draw handles for UI\r\n viewDeltaToTexture( viewDelta ) {\r\n return viewDelta;\r\n },\r\n\r\n viewToDoc( viewPoint ) {\r\n return this.viewTransform.viewToDoc(this,viewPoint);\r\n },\r\n viewDeltaToDoc( viewDelta ) {\r\n return this.viewTransform.viewDeltaToDoc(this,viewDelta);\r\n },\r\n\r\n viewToModel( viewPoint ) {\r\n return this.viewTransform.viewToDoc(this,viewPoint);\r\n },\r\n viewDeltaToModel( viewDelta ) {\r\n return this.viewTransform.viewDeltaToDoc(this,viewDelta);\r\n },\r\n\r\n // In the TextureView, the model and document coordinates are different\r\n modelToDoc( modelPoint ) {\r\n return modelPoint;\r\n },\r\n\r\n asFastOffset( offset ) {\r\n return Point.asFastOffset( offset, this.zoom );\r\n },\r\n\r\n // View Extent in Document Coordinates\r\n boundsWith( viewTransform ) {\r\n const { center, zoom } = viewTransform;\r\n return new Bounds.around( center, this.width / zoom, this.height / zoom );\r\n },\r\n\r\n get bounds() {\r\n return this.boundsWith(this.viewTransform);\r\n },\r\n\r\n viewOffsetFor( viewTransform ) {\r\n const { zoom, center } = viewTransform;\r\n const { viewCenter } = this;\r\n\r\n const offset = new Point(\r\n Math.round( viewCenter.x - ( center.x * zoom ) ),\r\n Math.round( viewCenter.y - ( center.y * -zoom ) )\r\n );\r\n return offset;\r\n },\r\n\r\n get viewOffset() {\r\n return this.viewOffsetFor(this.viewTransform);\r\n },\r\n\r\n // Transforms figure RenderInfo bounds rectangle in a browser view compatible Box.\r\n // This is only intended to be used to get the correct position of the images returned by\r\n // the server. In case you just need to convert bounds to the view use the function above\r\n // @param {Object} bounds : {lx,ly,hx,hy} >> box : {x,y,width,height}\r\n\r\n boundsToViewBox( bounds ) {\r\n\r\n // This function works coherently with the transformation that the server\r\n // use to find the pixel box of the raster returned in the web service\r\n // RenderCacheFigure: the zoomed and y inverted version of the bounds of the\r\n // figure is integer widened.\r\n\r\n // The params that goes to the server are fixed with a certain resolution, we\r\n // need to use the same resolution to be able to obtain the same results here\r\n\r\n const zoom = this.zoom;\r\n const pixelsBounds = pixelWidenedRenderBounds( scaledRenderBounds(bounds, zoom, -zoom) );\r\n\r\n const offset = this.viewOffset;\r\n\r\n return {\r\n x: pixelsBounds.lx + offset.x,\r\n y: pixelsBounds.ly + offset.y,\r\n width : pixelsBounds.width,\r\n height: pixelsBounds.height\r\n };\r\n },\r\n\r\n modelPoint( event ) {\r\n return this.viewToModel( this.viewPoint(event) );\r\n },\r\n\r\n docPoint( event ) {\r\n return this.viewToDoc( this.viewPoint(event) );\r\n }\r\n\r\n};\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/view/view2d.js\n **/","import { forEach, map, invokeMap, some, defaults } from 'lodash';\r\n\r\nimport { Base, invokeMap$ } from 'gear';\r\n\r\nimport { GroupProcessor, InvalidationStates } from 'cdl';\r\n\r\nimport { EmptyFigureRepresentation, LocalFigureRepresentation } from './representation';\r\nimport { ServerFigureRepresentation } from './server-rendering/server-representation';\r\n\r\nconst hitTestViewDistance = 4;\r\n\r\nfunction withWireframe( config, wireframe ) {\r\n return ( !config || ( wireframe && ! config.wireframe ) ) ? defaults({ wireframe: wireframe }, config) : config;\r\n}\r\n\r\nexport const FigureView = Base.extend({ typeName: 'FigureView',\r\n\r\n init( view, figure ) {\r\n this.view = view;\r\n this.figure = figure;\r\n this._wireframe = false;\r\n this.representation = new EmptyFigureRepresentation(view,figure) ;\r\n this.initEvents();\r\n },\r\n\r\n ready$() {\r\n return this.representation.ready$();\r\n },\r\n\r\n updateRepresentation() {\r\n const { representation, view, figure } = this;\r\n const representationType = this.figure.representationType();\r\n if( representation.type !== representationType ) {\r\n //console.log(this.representation.type + ' > ' + representationType);\r\n const newRep =\r\n ( representationType === 'server' ) ? new ServerFigureRepresentation(view,figure)\r\n : ( representationType === 'local' ) ? new LocalFigureRepresentation(view,figure)\r\n : new EmptyFigureRepresentation(view,figure) ;\r\n\r\n const masked = representation._masked;\r\n const wireframe = representation._wireframe;\r\n\r\n const newRepresentation = this.representation = newRep ;\r\n\r\n if( masked ) {\r\n newRepresentation.mask();\r\n }\r\n newRepresentation._wireframe = wireframe;\r\n\r\n return true ;\r\n }\r\n return false ;\r\n },\r\n\r\n draw( context, transform, config, clearBuffer = false, drawShowthroughMask = false ) {\r\n if( ! this.figure.hidden ) { // [TODO] This should be in the renderer\r\n if ( clearBuffer && this.representation.invalidateBuffer ) {\r\n this.representation.invalidateBuffer();\r\n }\r\n config = withWireframe(config, this._wireframe);\r\n config.showthroughMask = drawShowthroughMask;\r\n this.representation.draw(context,transform,config);\r\n }\r\n },\r\n\r\n initEvents() {\r\n this.figure.on({\r\n 'rendercomplete': this.onRenderComplete,\r\n 'redrawneeded' : this.onRedrawNeeded\r\n }, this);\r\n },\r\n\r\n onRenderComplete( response ) {\r\n\r\n this.updateRepresentation() ;\r\n\r\n let invalidationState = response.broadcastInfo.viewsInvalidationState;\r\n\r\n const renderArgs = this.view.getRenderArgs();\r\n if( this._wireframe ) {\r\n renderArgs.wireframe = true;\r\n }\r\n\r\n const viewPortTransform = this.view.getViewPortTransform().toMatrixString();\r\n const { previousParams } = this;\r\n\r\n if( previousParams ) {\r\n // We are using the same representation as before, check if the renderArgs have changed\r\n // and updgrade the event to invalidateRenderArgs so the figure is updated to reflect them\r\n if( previousParams.renderArgs.layercolor !== renderArgs.layerColor ||\r\n previousParams.renderArgs.wireframe !== renderArgs.wireframe ) {\r\n\r\n invalidationState = InvalidationStates.upgrade('views',invalidationState,'all') ;\r\n }\r\n if( previousParams.viewPortTransform !== viewPortTransform ) {\r\n // This is triggered when the zoom, the pan offset or any other viewport geometry parameters are changed\r\n // g.log('ViewPort transform changed ' + viewPortTransform);\r\n invalidationState = InvalidationStates.upgrade('views',invalidationState,'viewport');\r\n }\r\n }\r\n\r\n this.previousParams = { renderArgs, viewPortTransform: viewPortTransform };\r\n\r\n // console.log('FigureView.update( ' + invalidationState + ' )');\r\n this.representation.update(invalidationState, response, viewPortTransform);\r\n },\r\n\r\n onRedrawNeeded() {\r\n this.view.redrawFigure(this.figure);\r\n },\r\n\r\n unlink() {\r\n this.figure.un(this);\r\n },\r\n dispose() {\r\n this.unlink();\r\n },\r\n\r\n wireframe( state ) {\r\n if( state === undefined ) {\r\n return this._wireframe;\r\n }\r\n else{\r\n this._wireframe = state;\r\n this.representation._wireframe = state;\r\n return this;\r\n }\r\n },\r\n mask() {\r\n this.representation.mask();\r\n },\r\n hideMask() {\r\n this.representation.hideMask();\r\n },\r\n\r\n hitTest( point, options = {} ) {\r\n if( ! options.distance ) {\r\n options.distance = this.view.viewDeltaToDoc(hitTestViewDistance);\r\n }\r\n return this.representation.hitTest(point,options);\r\n }\r\n});\r\n\r\n// ============================================================================================\r\n// move away\r\n\r\nconst GroupedFiguresView = Base.extend({ typeName: 'GroupedFiguresView',\r\n\r\n init( view, group ) {\r\n this.view = view;\r\n this.figure = group;\r\n this._figureViews = map( group.figures, figure => FigureView.create(view,figure) );\r\n this.initEvents();\r\n },\r\n\r\n ready$() {\r\n return invokeMap$(this._figureViews,'ready$');\r\n },\r\n\r\n draw( context, transform, config, clearBuffer = false, drawShowthroughMask = false ) {\r\n const { figure } = this;\r\n if( figure._hidden ) {\r\n return;\r\n }\r\n\r\n const figure_alpha = figure._alpha;\r\n const changeGlobalAlpha = ( figure_alpha !== 1 );\r\n if( changeGlobalAlpha ) {\r\n context.save();\r\n context.globalAlpha *= figure_alpha;\r\n }\r\n forEach( this._figureViews, fv => {\r\n fv.draw(context,transform,config,clearBuffer,drawShowthroughMask);\r\n });\r\n\r\n if( changeGlobalAlpha ) {\r\n context.restore();\r\n }\r\n },\r\n\r\n initEvents() {\r\n this.figure.on({\r\n 'serverinvalidate': this.onServerInvalidate,\r\n 'rendercomplete' : this.onRenderComplete\r\n }, this);\r\n },\r\n\r\n onServerInvalidate() {},\r\n\r\n onRenderComplete() {},\r\n\r\n unlink() {\r\n this.figure.un(this);\r\n invokeMap(this._figureViews,'unlink');\r\n },\r\n dispose() {\r\n this.unlink();\r\n invokeMap(this._figureViews,'dispose');\r\n },\r\n\r\n mask() {\r\n invokeMap(this._figureViews,'mask');\r\n },\r\n hideMask() {\r\n invokeMap(this._figureViews,'hideMask');\r\n },\r\n wireframe( state ) {\r\n const figureViews = this._figureViews;\r\n for(let k = 0, kEnd = figureViews.length; k < kEnd; ++k ) {\r\n figureViews[k].wireframe = state;\r\n }\r\n },\r\n\r\n hitTest( point, options = {} ) {\r\n const { view, figure } = this;\r\n const minSize = view.viewDeltaToDoc(20), minSize2 = minSize*minSize;\r\n const frame = figure.globalFrame_();\r\n if (options.frameBased === undefined)\r\n options.frameBased = frame.width2 < minSize2 || frame.height2 < minSize2;\r\n if( ! options.distance ) {\r\n options.distance = this.view.viewDeltaToDoc(hitTestViewDistance);\r\n }\r\n return figure.hitTest(point,options) &&\r\n some( this._figureViews, fv => fv.hitTest(point,options) );\r\n }\r\n});\r\n\r\n\r\nexport const GroupView = Base.extend({ typeName: 'GroupView',\r\n\r\n init( view, group ) {\r\n this.view = view;\r\n this.figure = group;\r\n group.on({\r\n 'processingstarted': this.onProcessingStarted,\r\n 'rendercomplete' : this.onRenderComplete,\r\n 'redrawneeded' : this.onRedrawNeeded\r\n }, this );\r\n\r\n this._figureViewsToDispose = [];\r\n this._figureView = null;\r\n this._wireframe = false;\r\n this._updateViewType();\r\n },\r\n\r\n ready$() {\r\n return this._figureView.ready$();\r\n },\r\n\r\n draw( context, transform, config, clearBuffer = false, drawShowthroughMask = false ) {\r\n this._figureView.draw(context,transform,withWireframe(config,this._wireframe),clearBuffer,drawShowthroughMask);\r\n },\r\n\r\n onProcessingStarted() {\r\n this._updateViewType();\r\n },\r\n\r\n onRenderComplete() {\r\n invokeMap( this._figureViewsToDispose, 'dispose' );\r\n this._figureViewsToDispose = [];\r\n },\r\n\r\n onRedrawNeeded() {\r\n this.view.redrawFigure(this.figure);\r\n },\r\n\r\n unlink() {\r\n this.figure.un(this);\r\n },\r\n dispose() {\r\n this.unlink();\r\n if( this._figureView ) {\r\n this._figureView.dispose();\r\n }\r\n },\r\n\r\n mask() {\r\n this._figureView.mask();\r\n },\r\n hideMask() {\r\n this._figureView.hideMask();\r\n },\r\n\r\n wireframe( state ) {\r\n if( state === undefined ) {\r\n return this._wireframe;\r\n }\r\n else{\r\n this._wireframe = state;\r\n this._figureView.wireframe = state;\r\n return this;\r\n }\r\n },\r\n\r\n hitTest( point, options ) {\r\n return this._figureView.hitTest(point,options);\r\n },\r\n\r\n _updateViewType() {\r\n const { view, figure, _figureView } = this;\r\n\r\n const groupedFigures = ( figure._processor instanceof GroupProcessor );\r\n\r\n if( groupedFigures ) {\r\n if( ! ( _figureView instanceof GroupedFiguresView ) ) {\r\n if( _figureView ) {\r\n _figureView.unlink();\r\n this._figureViewsToDispose.push(_figureView);\r\n }\r\n this._figureView = new GroupedFiguresView(view,figure);\r\n }\r\n }\r\n else {\r\n if( ! ( _figureView instanceof FigureView ) ) {\r\n if( _figureView ) {\r\n _figureView.unlink();\r\n this._figureViewsToDispose.push(_figureView);\r\n }\r\n this._figureView = new FigureView(view,figure);\r\n }\r\n }\r\n }\r\n});\r\n\r\n\r\nFigureView.create = function(view,figure ) {\r\n return figure.isGroup ? new GroupView(view,figure)\r\n : new FigureView(view,figure);\r\n};\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/view/figure-view.js\n **/","import { forEach, includes, defaults } from 'lodash';\r\n\r\nimport { Base, resolve } from 'gear';\r\n\r\nimport { Matrix } from 'cdl';\r\n\r\nexport const FigureRepresentation = Base.extend({ typeName: 'FigureRepresentation',\r\n type: 'unknown',\r\n init( view, figure ) {\r\n this.rendered = false;\r\n this.view = view;\r\n this.figure = figure;\r\n this._masked = false;\r\n this._wireframe = false;\r\n this._previewing = false;\r\n },\r\n\r\n ready$() {\r\n return resolve();\r\n },\r\n\r\n mask() {\r\n this._masked = true ;\r\n },\r\n hideMask() {\r\n this._masked = false ;\r\n },\r\n\r\n boundsToViewBox() {\r\n const bounds = this.figure.globalBounds_();\r\n return this.view.boundsToViewBox(bounds);\r\n },\r\n hitTest( point, options = {} ) {\r\n const { temporalRep, view, figure } = this;\r\n if( temporalRep ) {\r\n return temporalRep.hitTest(point,options);\r\n }\r\n const minSize = view.viewDeltaToDoc(20), minSize2 = minSize*minSize;\r\n const frame = figure.globalFrame_();\r\n if (options.frameBased === undefined)\r\n options.frameBased = frame.width2 < minSize2 || frame.height2 < minSize2 ;\r\n return figure.hitTest(point,options);\r\n }\r\n});\r\n\r\n\r\nexport const EmptyFigureRepresentation = FigureRepresentation.extend({ typeName: 'EmptyFigureRepresentation',\r\n type: 'empty',\r\n draw() {},\r\n update() {}\r\n});\r\n\r\nexport const LocalFigureRepresentation = FigureRepresentation.extend({ typeName: 'LocalFigureRepresentation',\r\n type: 'local',\r\n\r\n init( view, figure ) {\r\n this.callParent(view,figure) ;\r\n this.buffers = null;\r\n this._preRendered = false;\r\n },\r\n\r\n draw( context, transform, config ) {\r\n const { figure, rendered } = this;\r\n\r\n if( rendered ) {\r\n context.save();\r\n\r\n this._lastMasked = this._masked;\r\n if( this._masked ) {\r\n context.globalAlpha *= 0.5;\r\n }\r\n\r\n if( this._preRendered && this.buffers ) {\r\n\r\n const figureAlpha = figure._alpha;\r\n if( figureAlpha !== 1 ) {\r\n context.globalAlpha *= figureAlpha;\r\n }\r\n\r\n const box = this._bufferBox,\r\n matrix = Matrix.concat( transform, figure.globalMatrix_(), this._invBufferTransform );\r\n\r\n matrix.transformContext(context);\r\n\r\n context.drawImage( this.buffers.get(config.textureType||'color'), box.x, box.y );\r\n // render.log('draw with buffer');\r\n }\r\n else {\r\n\r\n const wireframe = this._wireframe;\r\n figure.draw( context, transform, ( wireframe && !config.wireframe ) ? defaults({ wireframe },config) : config );\r\n }\r\n context.restore();\r\n }\r\n },\r\n invalidateBuffer(){\r\n this.buffers = null;\r\n this._preRendered = false;\r\n },\r\n drawBuffer() {\r\n const { view, figure } = this;\r\n\r\n const box = this._bufferBox = this.boundsToViewBox();\r\n\r\n // [TODO] To be able to do buffering for transformMode=\"Fixed\" in textureBrush we\r\n // need a revamp in the .draw spec.\r\n\r\n const w = box.width, h = box.height;\r\n if( figure.quickToDraw() ) {\r\n // Too easy to pre-render, avoid buffer\r\n this.buffers = null;\r\n this._preRendered = false;\r\n return;\r\n }\r\n\r\n // render.log('Draw buffer for: ' + this.figure._localId );\r\n // Draw to a buffer, so we can quickly redraw the whole document\r\n\r\n const vpTransform = view.getViewPortTransform();\r\n const bufferVpTransform = Matrix.m( Matrix.translate(-box.x,-box.y),vpTransform );\r\n const bufferTransform = Matrix.m( vpTransform, figure.globalMatrix_() );\r\n this._invBufferTransform = bufferTransform.inverted();\r\n this._bufferScale = bufferTransform.scaleFactor();\r\n\r\n const figureTextureTypes = view.figureTextureTypes();\r\n let buffers = this.buffers;\r\n if( ! buffers ) {\r\n buffers = this.buffers = new Map();\r\n }\r\n\r\n // Right now, only color buffers are rendered. But the machinery is here\r\n // to also render bump buffers to simulate materials. This is why there isn't\r\n // only one buffer.\r\n\r\n // Only keep the canvases that are going to be used\r\n forEach( figureTextureTypes, textureType => {\r\n if( figure.shouldDrawTextureType(textureType) ) {\r\n if( ! buffers.has( textureType ) ) {\r\n // render.log('create buffer');\r\n buffers.set( textureType, document.createElement('canvas') );\r\n }\r\n }\r\n else {\r\n buffers.delete(textureType);\r\n }\r\n });\r\n let removeKeys = [];\r\n buffers.forEach((v,textureType) => {\r\n if( ! includes(figureTextureTypes,textureType) ) {\r\n removeKeys.push(textureType);\r\n }\r\n });\r\n removeKeys.forEach( textureType => {\r\n buffers.delete(textureType);\r\n });\r\n buffers.forEach( (buffer,textureType) => {\r\n\r\n buffer.width = w;\r\n buffer.height = h;\r\n const config = {\r\n wireframe: view._wireframe || this._wireframe,\r\n transformDoc: bufferVpTransform\r\n };\r\n const ignoreAlpha = true;\r\n figure.draw( buffer.getContext('2d'), bufferVpTransform, defaults({ textureType },config), ignoreAlpha );\r\n\r\n });\r\n\r\n this._preRendered = true;\r\n },\r\n\r\n bufferNeedsRedraw() {\r\n const { view, buffers, _bufferScale } = this;\r\n if( ! buffers ) {\r\n return false;\r\n }\r\n\r\n const needsRedraw = ( this.figure.globalMatrix_().scaleFactor() * view.zoom ) / _bufferScale > 1.35;\r\n return needsRedraw;\r\n },\r\n\r\n update( invalidationState, process ) {\r\n const { type } = process;\r\n\r\n const forceRedraw = this.figure.needsFixedDrawing();\r\n if( forceRedraw ) {\r\n this.buffers = null;\r\n }\r\n\r\n const actionToTake = this.rendered ? invalidationState : 'all';\r\n\r\n // render.log(`${process.type}, state: ${invalidationState} => action: ${actionToTake}`);\r\n\r\n switch(actionToTake) {\r\n\r\n case 'all':\r\n if( type !== 'preview' && this._previewing ) {\r\n this._previewing = false;\r\n }\r\n // representation.log('all');\r\n this.drawBuffer(); // [TODO] Add drawBuffer('preview') for contour? Probably not\r\n // and this will be handled at processing time\r\n break;\r\n\r\n case 'transform':\r\n case 'viewport':\r\n if( type === 'preview' ) {\r\n\r\n if( ( ! this._previewing && ! this.buffers ) || this.bufferNeedsRedraw() ) {\r\n // representation.log('preview buffer');\r\n this.drawBuffer();\r\n }\r\n this._previewing = true;\r\n }\r\n else {\r\n // representation.log('preview');\r\n this.drawBuffer();\r\n }\r\n break;\r\n\r\n case 'none':\r\n if( type !== 'preview' && this._previewing ) {\r\n // representation.log('draw Buffer end of preview');\r\n this._previewing = false;\r\n this.drawBuffer();\r\n }\r\n return;\r\n }\r\n\r\n this.rendered = true;\r\n }\r\n\r\n});\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/view/representation.js\n **/","import { Config } from 'config';\r\n\r\nimport { now, find } from 'lodash';\r\n\r\nimport { Deferred, resolve, supportsCrossOriginImages } from 'gear';\r\n\r\nimport { Matrix } from 'cdl';\r\n\r\nimport { FigureRepresentation, LocalFigureRepresentation } from '../representation';\r\n\r\nimport { ServerImagesManager, getRenderCacheUrl, getRenderPinOffset } from './server-images';\r\nimport { Color } from '../../../cdl/style';\r\n\r\nexport const ServerFigureRepresentation = FigureRepresentation.extend({ typeName: 'ServerFigureRepresentation',\r\n type: 'server',\r\n\r\n init( view, figure ) {\r\n this.callParent(view,figure) ;\r\n this._readyDeferreds = [];\r\n\r\n this.renderImage = new Image();\r\n this.renderSTImage = null;\r\n\r\n if( supportsCrossOriginImages ) {\r\n this.renderImage.crossOrigin = \"Anonymous\";\r\n }\r\n\r\n this.lastRequestedRenderUrl = null;\r\n this.lastRequestedSourceTimeStamp = 0;\r\n this.lastUsedTargetSourceTimeStamp = 0;\r\n\r\n this.currentInfo = null;\r\n\r\n this.rendered = false ;\r\n this.temporalRep = null;\r\n\r\n this._previewing = false;\r\n },\r\n\r\n boundsToViewBox() {\r\n // The Pin of the figure is fixed to send its value to the renderer, if we want the same image\r\n // size we need to account for the small change here that could produce a wrong rounding\r\n const view = this.view;\r\n const bounds = this.figure.globalBounds_();\r\n const offset = getRenderPinOffset(view.zoom,this.figure._pin);\r\n bounds.translate(offset.x,offset.y);\r\n return view.boundsToViewBox(bounds);\r\n },\r\n\r\n update( invalidationState, process ) {\r\n\r\n const { figure } = this;\r\n\r\n const { type } = process;\r\n\r\n if( this.temporalRep ) {\r\n this.temporalRep.update(invalidationState,process);\r\n }\r\n\r\n if( type === 'preview' ) {\r\n this._previewing = true;\r\n // console.log('previewing');\r\n return;\r\n }\r\n\r\n // Temporal local rendered representation to provide visual feedback before the images\r\n // are loaded from the server.\r\n if( ! this.temporalRep && ! this.rendered ) {\r\n if( Config.showLocalPreviewRepresentation && figure.hasPreview() ) {\r\n const temporalRep = this.temporalRep = new LocalFigureRepresentation(this.view,figure,'loading') ;\r\n temporalRep.update(invalidationState,process);\r\n }\r\n }\r\n\r\n // It can happen that the figure was quickly invalidated, in this case, we can not trust\r\n // the current bounds. This only happen because we are letting the user play with the selection\r\n // without waiting til things are properly updated. We may want to review this\r\n if( figure.invalidated() ) {\r\n return;\r\n }\r\n\r\n const renderArgs = this.view.getRenderArgs();\r\n renderArgs.processST = true;\r\n renderArgs.isShowthrough = false;\r\n const stRenderArgs = this.view.getRenderArgs();\r\n stRenderArgs.processST = true;\r\n stRenderArgs.isShowthrough = true;\r\n\r\n const renderUrl = getRenderCacheUrl(figure,renderArgs);\r\n\r\n if( this.lastRequestedRenderUrl === renderUrl ) {\r\n return;\r\n }\r\n\r\n if( this.rendered && invalidationState === 'none' && ! this._previewing ) {\r\n // Nothing to do, the view was already up-to-date\r\n return;\r\n }\r\n\r\n this._previewing = false;\r\n\r\n // render.log('Figure view update: ' + invalidationState);\r\n\r\n // Ask for a new image to the server\r\n let targetTimeStamp = now();\r\n if( targetTimeStamp <= this.lastRequestedTargetSourceTimeStamp ) {\r\n targetTimeStamp = this.lastRequestedTargetSourceTimeStamp+1;\r\n }\r\n\r\n this.lastRequestedSourceTimeStamp = targetTimeStamp;\r\n\r\n const info = {\r\n timeStamp : targetTimeStamp,\r\n transform : figure.globalMatrix_(),\r\n box : this.boundsToViewBox(),\r\n vpTransform : this.view.getViewPortTransform(),\r\n };\r\n\r\n this.lastRequestedRenderUrl = renderUrl;\r\n\r\n\r\n ServerImagesManager.request$(figure,renderArgs) \r\n .then( image => {\r\n this.onRenderImageLoad(image,info,false);\r\n ServerImagesManager.request$(figure,stRenderArgs)\r\n .then( image => {\r\n this.onRenderImageLoad(image,info,true);\r\n }); \r\n });\r\n\r\n },\r\n\r\n onRenderImageLoad( image,info,isShowthrough) {\r\n\r\n const { timeStamp } = info;\r\n\r\n if( timeStamp >= this.lastUsedTargetSourceTimeStamp ) {\r\n\r\n // render.log('onRenderImageLoad ' + timeStamp);\r\n\r\n this.renderImage = isShowthrough?this.renderImage:image;\r\n this.renderSTImage = isShowthrough?image:null;\r\n\r\n this.lastUsedTargetSourceTimeStamp = timeStamp;\r\n\r\n this.currentInfo = info;\r\n\r\n this._invBufferTransform = Matrix.m( info.vpTransform, info.transform ).inverted();\r\n\r\n this.rendered = true;\r\n\r\n this.view.redrawFigure(this.figure);\r\n }\r\n\r\n this.temporalRep = null;\r\n this.targetRenderCacheUrl = null;\r\n },\r\n\r\n ready$() {\r\n if( this.rendered ) {\r\n return resolve();\r\n }\r\n else {\r\n const deferred = new Deferred();\r\n this._readyDeferreds.push(deferred);\r\n return deferred.promise;\r\n }\r\n },\r\n\r\n draw( context, transform, config, overlayedNoClip = false ) {\r\n const { temporalRep } = this;\r\n if( temporalRep ) {\r\n temporalRep.draw(context,transform,config);\r\n }\r\n else if( this.rendered ) {\r\n context.save();\r\n\r\n // render.log('draw image');\r\n\r\n const figureAlpha = this.figure._alpha;\r\n if( figureAlpha !== 1.0 ) {\r\n context.globalAlpha *= figureAlpha;\r\n }\r\n if( this._masked ) {\r\n context.globalAlpha *= 0.5;\r\n }\r\n \r\n const { box } = this.currentInfo;\r\n \r\n let lFigure = this.figure;\r\n\r\n if (!overlayedNoClip) {\r\n const [lClipContent, lClipParent] = lFigure.getClippedBy();\r\n if (lClipContent) {\r\n if (lClipContent.editingClip) {\r\n this.draw(context, transform, config, true);\r\n }\r\n let lOldTransform = transform;\r\n if (!lClipContent.clipAbsolute && !lClipContent.editingClip) {\r\n transform = Matrix.m(transform, lClipParent.globalMatrix_());\r\n }\r\n lClipContent.clipContext(context, transform);\r\n //DEBUG\r\n // const ps = lClipContent._polyregions;\r\n // for(let k=0,kEnd=ps.length;k { pre: [], done: [] }\r\n this._cacheSize = 100;\r\n this._doBatch = this._doBatch.bind(this);\r\n this._batch = [];\r\n },\r\n\r\n request$( figure,renderArgs,stamp) {\r\n\r\n const fm = { cacheId: figure._cacheId,\r\n matrix: figure.globalMatrix_().toMatrix22(),\r\n pin: figure._pin.clone() };\r\n\r\n assign(fm,renderArgs);\r\n\r\n // Fix pin inside for figures inside groups\r\n const owner = figure._owner;\r\n if( owner && owner.isGroup ) {\r\n const p = owner.globalMatrix_().apply( figure.pin );\r\n fm.pin.x = p.x; fm.pin.y = p.y;\r\n }\r\n\r\n const pz = fixZoomAndPin(fm.zoom,fm.pin);\r\n fm.fzoom = pz.zoom;\r\n fm.fpin = pz.pin;\r\n fm.fpin.use = fm.pin.use;\r\n\r\n let cm;\r\n\r\n // (1) Exact match of an image we already have\r\n //---------------------------------------------------------------------------------------------------\r\n\r\n cm = this._match('done',fm);\r\n if( cm ) {\r\n return resolve(cm.image);\r\n }\r\n\r\n // (3) Are we asking for the same image right now?\r\n //---------------------------------------------------------------------------------------------------\r\n cm = this._match('pre',fm);\r\n if( cm ) {\r\n return cm.promise;\r\n }\r\n\r\n // (5) Ask the requested image to the server\r\n //---------------------------------------------------------------------------------------------------\r\n const promise = this._requestImage$(figure,renderArgs,stamp,fm);\r\n\r\n return cm ? cm.promise : promise;\r\n },\r\n _requestImage$( figure,renderArgs,stamp,fm) {\r\n\r\n let promise = fm.promise = createPromise( resolve => {\r\n\r\n this._preCache(fm);\r\n\r\n const image = fm.image = new Image();\r\n \r\n if( supportsCrossOriginImages ) {\r\n image.crossOrigin = \"Anonymous\";\r\n }\r\n \r\n const onLoad = fm.onLoad = function() {\r\n resolve(image);\r\n this._cache(fm);\r\n };\r\n attachImageLoadEvent(image,onLoad,this);\r\n\r\n if( Config.base64Images ) {\r\n\r\n const request = { figure: figure, renderArgs: renderArgs, stamp: stamp, image: image };\r\n if( ! Config.batchRender ) {\r\n this._base64Request(request);\r\n }\r\n else {\r\n // We are going to wait a few milliseconds to try to batch rendering calls\r\n this._batch.push(request);\r\n setTimeout(this._doBatch,10);\r\n }\r\n }\r\n else{\r\n image.src = getRenderCacheUrl(figure,renderArgs,stamp);\r\n }\r\n });\r\n return promise;\r\n },\r\n _base64Request( request) {\r\n return Cx.Core.Figure.render$(figureRenderModel(request.figure,request.renderArgs,request.stamp)) .then( src => {\r\n request.image.src = src;\r\n });\r\n },\r\n _batchRequest( requests) {\r\n return Cx.Core.Figure.batchRender$({\r\n Renders: map( requests, r => figureRenderModel(r.figure,r.renderArgs,r.stamp) ),\r\n Compress: Config.serverImagesCompression === 'true',\r\n PngCompressionParams: { Speed: 10 }\r\n }).then( images => {\r\n for(let k = 0, kEnd = images.length; k < kEnd; ++k ) {\r\n requests[k].image.src = images[k];\r\n }\r\n });\r\n },\r\n _doBatch() {\r\n const batch = this._batch;\r\n const batch_length = batch.length;\r\n if( batch_length === 0 ) {\r\n return; // Nothing to do... batch already processing\r\n }\r\n\r\n this._batch = []; // Start new batch\r\n\r\n if( batch_length === 1 ) {\r\n this._base64Request(batch[0]);\r\n }\r\n else {\r\n const maxConnections = 6;\r\n const chunks = fairSpread( batch, maxConnections );\r\n forEach( chunks, this._batchRequest, this );\r\n }\r\n },\r\n _match( type,fm) {\r\n const res = 0.00005;\r\n const { cacheId, fpin, fzoom, wireframe, isShowthrough, matrix } = fm;\r\n const c = this._cacheMap[cacheId];\r\n if( ! c ) {\r\n return;\r\n }\r\n const list = c[type];\r\n for(let k=list.length-1;k>=0;--k) {\r\n const ck = list[k];\r\n const cpin = ck.fpin;\r\n if( ck.wireframe === wireframe &&\r\n ck.isShowthrough === isShowthrough &&\r\n Math.abs(ck.fzoom-fzoom) < res &&\r\n Math.abs(cpin.x-fpin.x) < res && Math.abs(cpin.y-fpin.y) < res &&\r\n ( cpin.use === fpin.use || ( Math.abs(cpin.relX-fpin.relX) < res && Math.abs(cpin.relY-fpin.relY) < res ) ) &&\r\n ck.matrix.isNear(matrix,res) ) {\r\n return ck;\r\n }\r\n }\r\n return null;\r\n },\r\n _storeInCache( type,fm) {\r\n const c = this._cacheMap;\r\n const id = fm.cacheId;\r\n \r\n let cid = c[id];\r\n if( ! cid ) {\r\n cid = c[id] = { pre: [], done: [] };\r\n }\r\n cid[type].push(fm);\r\n },\r\n _removeFromCache( type,fm) {\r\n const c = this._cacheMap;\r\n const id = fm.cacheId;\r\n const cid = c[id];\r\n if( cid ) {\r\n const cidt = cid[type];\r\n cidt.splice(cidt.indexOf(fm),1);\r\n if( cid.pre.length === 0 && cid.done.length === 0 ) {\r\n delete c[id];\r\n }\r\n }\r\n },\r\n _cache( fm) {\r\n this._storeInCache('done',fm);\r\n this._removeFromCache('pre',fm);\r\n // Remove old images from the cache\r\n this._cacheList.push(fm);\r\n if( this._cacheList.length > this._cacheSize ) {\r\n const rc = this._cacheList.splice(0,1)[0];\r\n this._removeFromCache('done',rc);\r\n detachImageLoadEvent(rc.image,rc.onLoad);\r\n }\r\n },\r\n _preCache( fm) {\r\n this._storeInCache('pre',fm);\r\n }\r\n}))();\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/view/server-rendering/server-images.js\n **/","import { forEach, map } from 'lodash';\r\n\r\nimport { Base, remove } from 'gear';\r\n\r\nimport { FigureView } from '../view';\r\n\r\nexport const SyncedFigureViews = Base.extend({ typeName: 'SyncedFigureViews',\r\n\r\n Properties: {\r\n view: { type: 'View', def: null, owned: false }\r\n },\r\n\r\n get( figure ) {\r\n // figureView.log('get '+figure._localId);\r\n return this._figureToView.get(figure);\r\n },\r\n\r\n mapToFigureViews( figures ) {\r\n return map( figures, f => this.get(f) );\r\n },\r\n\r\n init() {\r\n this._figureToView = new WeakMap();\r\n this._linkedDocuments = [];\r\n this._disposedFigureViews = [];\r\n },\r\n\r\n //===================================================================\r\n\r\n link( doc ) {\r\n\r\n doc.on({\r\n figureschanged : this.onFiguresChanged,\r\n layerschanged : this.onLayersChanged,\r\n pageschanged : this.onPagesChanged,\r\n\r\n commit : this.onCommit,\r\n revert : this.onUndoRedo,\r\n undo : this.onUndoRedo,\r\n redo : this.onUndoRedo\r\n }, this );\r\n\r\n this.createPagesFigureViews(doc._pages);\r\n\r\n this._linkedDocuments.push(doc);\r\n },\r\n\r\n unlink( doc ) {\r\n remove(this._linkedDocuments,doc);\r\n\r\n doc.forEachFigure( figure => this.disposeFigureView( figure ) );\r\n },\r\n\r\n //=======================================================================\r\n\r\n createFigureView( figure ) {\r\n // figureView.log('set '+figure._localId);\r\n\r\n const figureView = FigureView.create(this.view,figure);\r\n this._figureToView.set( figure, figureView );\r\n\r\n // Remove it from disposed views (i.e. moved between layers)\r\n const disposed = this._disposedFigureViews,\r\n disposedIndex = disposed.indexOf(figure);\r\n if( disposedIndex !== -1 ) {\r\n disposed.splice(disposedIndex,1);\r\n }\r\n\r\n return figureView;\r\n },\r\n\r\n createFigureViews( figures ) {\r\n return map( figures, figure => this.createFigureView(figure) );\r\n },\r\n createLayersFigureViews( layers) {\r\n forEach( layers, layer => this.createFigureViews(layer._figures) );\r\n },\r\n createPagesFigureViews( pages) {\r\n forEach( pages, page => this.createLayersFigureViews(page._layers) );\r\n },\r\n\r\n disposeFigureView( figure ) {\r\n // figureView.log('del '+figure._localId);\r\n\r\n const figureToView = this._figureToView;\r\n figureToView.get( figure ).dispose();\r\n figureToView.delete( figure );\r\n },\r\n disposeFigureViews( figures ) {\r\n forEach( figures, figure => this.disposeFigureView(figure) );\r\n },\r\n\r\n dispose() {\r\n forEach( this._linkedDocuments, doc => this.unlink(doc) );\r\n },\r\n\r\n _disposeTemporalFigures() {\r\n this.disposeFigureViews( this._disposedFigureViews );\r\n this._disposedFigureViews = [];\r\n },\r\n\r\n onCommit( /*doc, event*/ ) {\r\n this._disposeTemporalFigures();\r\n },\r\n\r\n onUndoRedo() {\r\n this._disposeTemporalFigures(); // [CHECK]\r\n },\r\n\r\n delayedDisposeFigureViews( figures ) {\r\n forEach( figures, figure => this._disposedFigureViews.push(figure) );\r\n },\r\n delayedDisposeLayersFigureViews( layers ) {\r\n forEach( layers, layer => this.delayedDisposeFigureViews(layer._figures) );\r\n },\r\n delayedDisposePagesFigureViews( pages ) {\r\n forEach( pages, page => this.delayedDisposeLayersFigureViews(page._layers) );\r\n },\r\n\r\n // Order is important, first remove then add, this allows moving of figures\r\n\r\n onFiguresChanged( doc, added, removed ) {\r\n // figureView.log(`figures changed, added: ${ added && added.length } removed: ${ removed && removed.length }`);\r\n if( removed ) {\r\n this.delayedDisposeFigureViews(removed);\r\n }\r\n if( added ) {\r\n this.createFigureViews(added);\r\n }\r\n },\r\n\r\n onLayersChanged( doc, added, removed ) {\r\n // figureView.log(`layers changed, added: ${ added && added.length } removed: ${ removed && removed.length }`);\r\n if( removed ) {\r\n this.delayedDisposeLayersFigureViews(removed);\r\n }\r\n if( added ) {\r\n this.createLayersFigureViews(added);\r\n }\r\n },\r\n\r\n onPagesChanged( doc, added, removed ) {\r\n // figureView.log(`pages changed, added: ${ added && added.length } removed: ${ removed && removed.length }`);\r\n if( removed ) {\r\n this.delayedDisposePagesFigureViews(removed);\r\n }\r\n if( added ) {\r\n this.createPagesFigureViews(added);\r\n }\r\n }\r\n\r\n});\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/view/synced-figure-views.js\n **/","import { Config } from 'config';\r\n\r\nimport { forEach, assign, bindKey, isEqual, isPlainObject } from 'lodash';\r\n\r\nimport { cloneDeep, isArray, resolve } from 'gear';\r\n\r\nimport { Matrix, documentEvents, Figures } from 'cdl';\r\n\r\nimport { Clipboard } from './clipboard';\r\n\r\nimport { Color } from 'cdl/style/color';\r\n\r\n\r\n// Expects\r\n// this._document\r\n//\r\n// and calls to\r\n// this.linkDoc(doc)\r\n// this.unlinkDoc(doc)\r\n\r\nexport const DocumentView_Mixin =\r\n\r\nforwardDocumentFunctions([\r\n\r\n 'add',\r\n 'remove',\r\n 'replace',\r\n 'clear',\r\n\r\n 'release',\r\n 'releaseLayers',\r\n 'releasePages',\r\n\r\n 'backOne',\r\n 'toBack',\r\n 'forwardOne',\r\n 'toFront',\r\n\r\n 'visualForwardOne$',\r\n 'visualBackOne$',\r\n\r\n 'canVisualForwardOne$',\r\n 'canVisualBackOne$',\r\n\r\n 'update$',\r\n 'preview$',\r\n 'render$',\r\n 'commit$',\r\n 'revert$',\r\n\r\n 'lock',\r\n 'unlock',\r\n\r\n 'changing', // [TODO] This should be a getter, isChanging?\r\n\r\n 'saveCopy$',\r\n 'save$',\r\n\r\n 'dropPreviousHistory',\r\n 'dropPreviousHistoryOnNextCommit',\r\n\r\n 'addClipart$',\r\n 'replaceClipart$',\r\n 'autoCreateMultiPartText$',\r\n 'breakMultiPartText',\r\n 'group',\r\n 'ungroup',\r\n 'extractPowerClipContents',\r\n 'addPowerClipContents',\r\n 'reshape$',\r\n 'optimize$',\r\n 'isSaved',\r\n\r\n // canUndo,\r\n // undo,\r\n // canRedo,\r\n // redo\r\n],\r\n\r\nforwardDocumentGetters([\r\n\r\n 'activePageFigures',\r\n 'activePageLayers',\r\n 'activeLayerFigures',\r\n],\r\n\r\nforwardDocumentProperties([\r\n\r\n 'pages',\r\n 'figures',\r\n\r\n 'activePage',\r\n 'activePageIndex',\r\n\r\n 'activeLayer',\r\n 'activeLayerIndex',\r\n\r\n],\r\n\r\nforwardDocumentEvents( documentEvents, {\r\n\r\n Properties: {\r\n\r\n showThroughColor: { type: 'Color', def: Color.Transparent(), onChange() { this.onShowThroughChange(); } },\r\n\r\n wireframe: { type: 'boolean', def: false },\r\n\r\n undoRedoDisabled: { type: 'boolean', def: false },\r\n\r\n activeFigures: { type: 'Figure[]', def: [], owned: false, onChange() { this.redrawAll(); } },\r\n\r\n showPin: { type: 'boolean', def: false },\r\n },\r\n\r\n get doc() {\r\n return this._document;\r\n },\r\n set doc( doc_ ) {\r\n this._setDoc(doc_);\r\n },\r\n\r\n onShowThroughChange() {\r\n Config.showThroughColor = this._showThroughColor; \r\n this.figures.forEach( figure => {\r\n this.deepInvalidate(figure);\r\n });\r\n this.commit$();\r\n },\r\n \r\n deepInvalidate ( aFigure ) {\r\n aFigure.invalidate();\r\n if (aFigure.isGroup) {\r\n for(let k=0,kEnd=aFigure.figures.length;k {\r\n if (lPC.figures) {\r\n lPC.figures.forEach(lPCF => {\r\n if (lPCF.isProxyGroup && lPCF._colorMap) {\r\n lPCF.invalidate();\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n },\r\n \r\n startIsolatedFiguresEdition(figures) {\r\n this._activeFigures.set(figures);\r\n },\r\n stopIsolatedFiguresEdition() {\r\n this._activeFigures.clear();\r\n },\r\n drawIsolatedFigures: function(alpha){\r\n var figures = this._activeFigures,\r\n canvas, context, drawConfig, transform;\r\n\r\n if( figures ){\r\n transform = this.getViewPortTransform();\r\n canvas = this.canvas();\r\n context = canvas.getContext('2d');\r\n canvas.width = canvas.width;\r\n\r\n if( alpha === 0 ){\r\n return;\r\n }\r\n\r\n if( alpha !== undefined && alpha < 1 ){\r\n context.globalAlpha *= alpha;\r\n }\r\n\r\n // Do not use figure view caching mechanism...\r\n drawConfig = { wireframe: this._wireframe, viewport: transform };\r\n forEach( figures, figure => {\r\n figure.draw(context,transform,drawConfig);\r\n });\r\n }\r\n },\r\n\r\n figuresThumbnailElement$( figures, width, height ) {\r\n\r\n if( height === undefined ) {\r\n height = width;\r\n }\r\n if( ! isArray(figures) ) {\r\n figures = [figures];\r\n }\r\n return Figures.bounds$(figures) .then( bounds => {\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = width;\r\n canvas.height = height;\r\n const context = canvas.getContext('2d');\r\n\r\n const bounds_width = bounds.width, bounds_height = bounds.height;\r\n const scaleX = width / bounds_width;\r\n const scaleY = height / bounds_height;\r\n const scale = Math.min(scaleX,scaleY);\r\n\r\n const transform = Matrix.concat( Matrix.translate( (width-bounds_width*scale)/2, (height-bounds_height*scale)/2 ),\r\n Matrix.scale(scale,-scale),\r\n Matrix.translate(-bounds.lx,-bounds.hy) );\r\n\r\n const drawConfig = {\r\n transformDoc: transform\r\n };\r\n forEach( this.mapToFigureViews(figures), figureView => {\r\n if( figureView ) {\r\n figureView.draw(context,transform,drawConfig);\r\n }\r\n });\r\n\r\n return canvas;\r\n });\r\n },\r\n\r\n drawConfig() {\r\n return assign({\r\n wireframe: this.wireframe\r\n },this.callParent());\r\n },\r\n\r\n getRenderArgs() {\r\n return {\r\n zoom: this.zoom,\r\n wireframe: this.wireframe\r\n };\r\n },\r\n\r\n figuresThumbnail$( figures, sizeX, sizeY ) {\r\n return this.figuresThumbnailElement$(figures,sizeX,sizeY) .then( el => {\r\n return el.toDataURL();\r\n });\r\n },\r\n\r\n fireRenderEvents( type, doc ) {\r\n\r\n // console.log(type);\r\n\r\n const commiting = type === 'commit';\r\n\r\n let change = this.fireChangeEvents( type, doc );\r\n\r\n const { state } = this;\r\n\r\n if( commiting || ! isEqual(state,this._lastState) ) {\r\n change = true;\r\n\r\n this.fireEvent('draw',this);\r\n\r\n if( ! commiting ) {\r\n this.fireEvent('redraw',this);\r\n }\r\n }\r\n this._lastState = state;\r\n\r\n if( change ) {\r\n this.fireEvent('change',this);\r\n }\r\n\r\n this.redrawDoc();\r\n },\r\n\r\n // Overwritten to redraw the proper layers\r\n redrawDoc() {\r\n this.redraw('document');\r\n },\r\n\r\n fireChangeEvents( type, doc ) {\r\n const { _stateChanged } = this; // [TODO] Move to a better place?\r\n this._stateChanged = false;\r\n\r\n return _stateChanged || doc._activePageChanged || doc._activeLayerChanged ;\r\n },\r\n\r\n on_renderstarted( doc, type ) {\r\n this.fireEvent('renderstarted',this,type);\r\n },\r\n\r\n on_rendercomplete( doc, type ) {\r\n this.fireRenderEvents(type,doc);\r\n this.fireEvent('rendercomplete',this,type);\r\n },\r\n\r\n on_commit(/* doc */) {\r\n if( Config.commitLog ) {\r\n console.log('commit');\r\n }\r\n this.fireEvent('commit',this);\r\n },\r\n\r\n // [TODO] Review view.lock, could we remove it?\r\n\r\n on_lock( doc, originator ) {\r\n this.pushDisabledTemporally();\r\n this.fireEvent('lock',this,originator);\r\n },\r\n\r\n on_unlock( doc, originator ) {\r\n this.popDisabledTemporally();\r\n this.fireEvent('unlock',this,originator);\r\n },\r\n\r\n getState() {\r\n const { wireframe } = this;\r\n return assign(this.callParent(),{ wireframe });\r\n },\r\n setState(state) {\r\n this.callParent(state);\r\n this.wireframe = state.wireframe;\r\n this.redraw('document');\r\n },\r\n\r\n // [TODO] This shouldn't be here, move to InteractiveDocView\r\n\r\n canUndo() {\r\n return ! this._undoRedoDisabled && ( this.tool || this.doc ).canUndo();\r\n },\r\n undo() {\r\n return ! this._undoRedoDisabled && ( this.tool || this.doc ).undo();\r\n },\r\n canRedo() {\r\n return ! this._undoRedoDisabled && ( this.tool || this.doc ).canRedo();\r\n },\r\n redo() {\r\n return ! this._undoRedoDisabled && ( this.tool || this.doc ).redo();\r\n },\r\n\r\n // [TODO] Remove in favor of direct use of conditions\r\n // We need to revamp conditions to be dynamic\r\n // bumpable depends on movable, and if movable changes,\r\n // bumpbable changes\r\n\r\n canDuplicate( figures ) {\r\n return this.are(figures,'copyable');\r\n },\r\n\r\n canCopy( figures ) {\r\n return this.are(figures,'copyable');\r\n },\r\n\r\n canCut( figures ) {\r\n return this.are(figures,'copyable','removable');\r\n },\r\n\r\n canPaste() {\r\n return ! Clipboard.isEmpty;\r\n },\r\n\r\n canRemove( figures ) {\r\n return this.are(figures,'removable');\r\n },\r\n\r\n canBump( figures ) {\r\n return this.are(figures,'movable');\r\n },\r\n\r\n canGroup( figures ) {\r\n return this.are(figures,'groupable');\r\n },\r\n\r\n canUngroup( figures ) {\r\n return this.are(figures,'ungroupable');\r\n },\r\n\r\n copy( figures ) {\r\n Clipboard.copy(figures);\r\n if( Config.localStorageFiguresClipboard ) {\r\n this.focus();\r\n }\r\n },\r\n\r\n cut( figures ) {\r\n Clipboard.cut(figures);\r\n if( Config.localStorageFiguresClipboard ) {\r\n this.focus();\r\n }\r\n },\r\n\r\n paste() {\r\n const offset = 10/this.zoom;\r\n Clipboard.paste( this, f => {\r\n return f.fastTranslate(offset, offset);\r\n });\r\n },\r\n\r\n pasteAt$( point ) {\r\n const figures = Clipboard.paste(this);\r\n return Figures.center$( figures, point );\r\n },\r\n\r\n // Let views have a word on what events are forwarded\r\n fireDocEvent( type, doc, ...params ) {\r\n this.fireEvent(type,this,...params);\r\n },\r\n\r\n init( config ) {\r\n\r\n this.addEvents(\r\n\r\n documentEvents,\r\n\r\n 'newdocument',\r\n\r\n 'change',\r\n 'draw',\r\n 'redraw',\r\n\r\n // [TODO] Check were these events should be, probably they are fine here\r\n 'figuresdrag',\r\n 'figuresdrop',\r\n 'textedit',\r\n 'duplicated'\r\n );\r\n\r\n this._bind('preview$');\r\n this._bind('render$');\r\n this._bind('commit$');\r\n this._bind('revert$');\r\n\r\n this._lastState = null;\r\n this._stateChanged = false;\r\n\r\n this.callParent(config);\r\n },\r\n\r\n linkDoc( doc ) {\r\n linkDocumentEvents(this,doc);\r\n },\r\n\r\n unlinkDoc( doc ) {\r\n doc.un(this);\r\n },\r\n\r\n showDocument$( doc ) {\r\n this.doc = doc;\r\n return this.zoomToFit$().then( this.commit$ );\r\n },\r\n\r\n zoomToFitFigures$( figures, margin, fit ) {\r\n const p = arguments[0];\r\n if( p && isPlainObject(p) ) {\r\n figures = p.figures;\r\n margin = p.margin;\r\n fit = p.fit;\r\n }\r\n figures = figures || this.getZoomToFitFigures();\r\n\r\n if( margin === undefined ){\r\n margin = this._defaultMargin();\r\n }\r\n if( fit === undefined ){\r\n fit = 'Min';\r\n }\r\n\r\n if( figures.length === 0 ) {\r\n return resolve();\r\n }\r\n\r\n return Figures.bounds$(figures) .then( bounds => {\r\n return this.zoomAround( bounds, margin, fit );\r\n });\r\n },\r\n\r\n duplicate( figures ) {\r\n if( ! isArray(figures) ) {\r\n figures = [figures];\r\n }\r\n const clones = cloneDeep(figures);\r\n const offset = this.viewDeltaToDoc(10);\r\n Figures.fastTranslate(clones,offset,offset,this.textureZoom);\r\n this.fireEvent('duplicated',this,clones,figures);\r\n this.add(clones);\r\n return this;\r\n },\r\n\r\n bump( figures, x, y ) {\r\n if( ! isArray(figures) ) {\r\n figures = [figures];\r\n }\r\n Figures.fastTranslate(figures,this.viewDeltaToDoc(x),this.viewDeltaToDoc(y),this.textureZoom);\r\n return this;\r\n },\r\n\r\n colorAt$( docPoint /*, figures*/ ) {\r\n const viewPoint = this.docToView(docPoint);\r\n const color = this.colorAtViewPoint(viewPoint);\r\n return resolve( color );\r\n },\r\n\r\n // [TODO] These methods are calling functions from InteractiveView\r\n\r\n canEditContent( figure ) {\r\n return this.is(figure,'contentEditable');\r\n },\r\n\r\n editContent( figure, point ) {\r\n const { doc } = this;\r\n\r\n // Hack for the moment, lookign for the right abstraction\r\n if( figure.isShape && figure._polyregions.length === 1 &&\r\n figure._powerClipContents.length === 0 ){\r\n return this.nodeEdit(figure);\r\n }\r\n\r\n doc.spawnContentLayersFor(figure,point);\r\n\r\n return doc.update$() .then( () => {\r\n this.selectedFigures = doc.activeLayer.initialSelectedFigures(point);\r\n\r\n this.updateEditContentStatus();\r\n // ...\r\n return doc.commit$();\r\n });\r\n },\r\n\r\n editingContent() {\r\n return this.doc.editingContent();\r\n },\r\n\r\n commitContent$() {\r\n const { doc } = this;\r\n return this.commitEditionTools$() .then( () => {\r\n return doc._commitContent$() .then( figure => {\r\n this.selectedFigures = [figure];\r\n this.status(null);\r\n return doc.commit$();\r\n }); });\r\n },\r\n\r\n updateEditContentStatus() {\r\n if( this.editingContent() ){\r\n this.status({\r\n message: 'Editing '+this.activeLayer.statusMessage(),\r\n commit: this.commitContent$.bind(this)\r\n });\r\n }\r\n else {\r\n this.status(null);\r\n }\r\n },\r\n\r\n}))));\r\n\r\n\r\n// Forward document, getters and properties from Views to Document\r\n// We avoid writting by hand these functions so we do not need to\r\n// maintain the parameters in sync in both the Document and View prototypes\r\n\r\nfunction forwardDocumentFunctions( keys, proto ) {\r\n forEach( keys, key => {\r\n proto[key] = function( ...params ) {\r\n return this._document[key](...params);\r\n };\r\n });\r\n return proto;\r\n}\r\n\r\nfunction forwardDocumentGetters( keys, proto ) {\r\n forEach( keys, key => {\r\n Object.defineProperty( proto, key, {\r\n get() {\r\n return this._document[key];\r\n },\r\n enumerable: true\r\n });\r\n });\r\n return proto;\r\n}\r\n\r\nfunction forwardDocumentProperties( keys, proto ) {\r\n forEach( keys, key => {\r\n Object.defineProperty( proto, key, {\r\n get() {\r\n return this._document[key];\r\n },\r\n set( value ){\r\n this._document[key] = value;\r\n },\r\n enumerable: true\r\n });\r\n });\r\n return proto;\r\n}\r\n\r\nfunction linkDocumentEvents( view, doc ) {\r\n forEach( documentEvents, event => {\r\n // Important, pass view as scope so unlinkDoc will work properly\r\n // removing all events. When changing from background to mainDocument in\r\n // the 2D canvas the current doc is unlinked and the other one linked\r\n doc.on( event, view['on_'+event], view );\r\n });\r\n}\r\n\r\nfunction forwardDocumentEvents( events, proto ) {\r\n forEach( events, event => {\r\n const route = 'on_'+event;\r\n if( ! proto[route] ){\r\n // console.log('creating '+route);\r\n proto[route] = function( ...params ) {\r\n return this.fireDocEvent(event,...params);\r\n };\r\n }\r\n });\r\n return proto;\r\n}\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/view/document-view-mixin.js\n **/","import { Config } from 'config';\r\n\r\nimport { forEach, filter, map, defaults, now, compact } from 'lodash';\r\nimport { Base, clone, cloneDeep } from 'gear';\r\nimport { Figures } from 'cdl';\r\n\r\nimport { g$ } from './util';\r\n\r\n// Wrap up Clipboard library so we can directly use SystemClipboard.copy(string);\r\n\r\nlet ClipboardWrapper = function() {\r\n\r\n const copyButtonId = 'cx-grafika-clipboard-hidden-button';\r\n\r\n let toCopy = '',\r\n clipboard = null;\r\n\r\n const init = function() {\r\n\r\n g$.append(g$('body'),'');\r\n\r\n // Check clipboard.js library\r\n clipboard = new window.Clipboard('#'+copyButtonId,{\r\n text() {\r\n return toCopy;\r\n }\r\n });\r\n clipboard.on('success', () => {\r\n console.log('Copy to system clipboard');\r\n });\r\n };\r\n\r\n this.copy = function( text ) {\r\n if( ! clipboard ) {\r\n init();\r\n }\r\n toCopy = text;\r\n g$('#'+copyButtonId).click();\r\n toCopy = '';\r\n };\r\n};\r\nconst SystemClipboard = new ClipboardWrapper();\r\n\r\nconst localStorageClipboard = {\r\n metadata: 'grafika-clipboard-metadata',\r\n figures : 'grafika-clipboard-figures'\r\n};\r\n\r\nconst ClipboardImp = Base.extend({\r\n\r\n get isEmpty() { return ! this._state(); },\r\n\r\n init() {\r\n this._pageState = null;\r\n this.addEvents('change','copy','cut','clear','paste');\r\n },\r\n copy( figures ) {\r\n this._store(cloneDeep(figures),'copy');\r\n },\r\n cut( figures ) {\r\n this._store(clone(figures),'cut');\r\n },\r\n paste( where,filter) {\r\n where = where.add ? where : where.figures;\r\n if( filter === undefined ) {\r\n filter = function(f) { return f; };\r\n }\r\n const state = this._get();\r\n if( ! state ) {\r\n return [];\r\n }\r\n\r\n const figures = state.figures;\r\n\r\n // cut, only for same page copies\r\n const cut = state.type === 'cut';\r\n\r\n if( cut ) {\r\n forEach( figures, figure => {\r\n const owner = figure._owner;\r\n if( owner ) {\r\n owner._figures.remove(figure);\r\n }\r\n });\r\n }\r\n\r\n const pastedFigures = where.add( compact( map( figures, filter ) ) );\r\n\r\n if( cut ) {\r\n this._clear();\r\n this.fireEvent('change');\r\n }\r\n\r\n this.fireEvent('paste',where,pastedFigures);\r\n\r\n return pastedFigures;\r\n },\r\n clear() {\r\n this._clear();\r\n this.fireEvent('change');\r\n this.fireEvent('clear');\r\n },\r\n\r\n get figures() {\r\n const state = this._get();\r\n return state ? state.figures : [];\r\n },\r\n\r\n state() {\r\n const state = this._state();\r\n return state ? state.type : 'empty';\r\n },\r\n\r\n _clear() {\r\n this._pageState = null;\r\n localStorage.removeItem(localStorageClipboard.metadata);\r\n localStorage.removeItem(localStorageClipboard.figures);\r\n },\r\n _state() {\r\n const pageState = this._pageState;\r\n if( Config.localStorageFiguresClipboard ) {\r\n const stateString = localStorage.getItem(localStorageClipboard.metadata);\r\n if( stateString !== null ) {\r\n const state = JSON.parse(stateString);\r\n if( !pageState || state.timestamp > pageState.timestamp ) {\r\n return state;\r\n }\r\n }\r\n }\r\n return pageState;\r\n },\r\n _get() {\r\n const state = this._state();\r\n if( ! state.figures ) {\r\n const figuresString = localStorage.getItem(localStorageClipboard.figures);\r\n if( figuresString ) {\r\n const sameConfig = state.config === Config.GlobalResourceManager.id;\r\n const originalFigures = Figures.fromXmlString(figuresString);\r\n const figures = sameConfig ? originalFigures : filter( originalFigures, figure => ! figure.containsLinkedResources() );\r\n return defaults({ figures: figures }, state );\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n else if( state.copy ) {\r\n return defaults({ figures: cloneDeep(state.figures) }, state );\r\n }\r\n else {\r\n return state;\r\n }\r\n },\r\n _store( figures, type ) {\r\n const timestamp = now();\r\n const config = Config.GlobalResourceManager.id;\r\n this._pageState = {\r\n figures : figures,\r\n type : type,\r\n timestamp : timestamp,\r\n config : config\r\n };\r\n if( Config.localStorageFiguresClipboard ) {\r\n const figuresXml = Figures.toXmlString(figures);\r\n\r\n // Figures are in a separate item for performance\r\n localStorage.setItem(localStorageClipboard.figures ,figuresXml);\r\n localStorage.setItem(localStorageClipboard.metadata,JSON.stringify({\r\n type: 'copy',\r\n timestamp: timestamp,\r\n config: config }));\r\n\r\n if( Config.debug ) {\r\n SystemClipboard.copy(figuresXml);\r\n }\r\n }\r\n this.fireEvent('change');\r\n this.fireEvent(type);\r\n }\r\n});\r\n\r\nexport const Clipboard = new ClipboardImp();\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/view/clipboard.js\n **/","import { Config } from 'config';\r\n\r\nimport { forEach, map, filter, includes, assign,\r\n sortBy, indexOf, last } from 'lodash';\r\n\r\nimport { Base, filterRight } from 'gear';\r\n\r\nimport { filterTargetLayers } from 'cdl';\r\n\r\nconst Selection = Base.extend({ typeName: 'Selection',\r\n\r\n Properties: {\r\n\r\n // [TODO] Review, this assumes that the selectableFigures will be defined by only one view\r\n // Maybe we should use the conditions of every view\r\n view: { type: 'View', def: null, owned: false },\r\n\r\n selectedFigures: { type: 'Figure[]', def: [], owned: false, onChange() { this.onSelectionChanged(); } },\r\n\r\n autoSelection: { type: 'boolean', def:true },\r\n\r\n destinationLayerSelector: { type: 'selector', def: null, owned: false },\r\n\r\n allowCrossLayerSelection: { type: 'boolean', def: true, onChange() { this.onSelectionChanged(); } },\r\n\r\n allowMultiLayerSelection: { type: 'boolean', def: false, onChange() { this.onSelectionChanged(); } },\r\n },\r\n\r\n init() {\r\n this._document = null;\r\n this._createdFigures = [];\r\n this._crossLayerSelection = false;\r\n this._keepSelection = false;\r\n this._selectionChanged = false;\r\n },\r\n\r\n // [TODO] CrossPage selection\r\n\r\n fixUpSelectedFigures() {\r\n // The selection should:\r\n // - Respect the Z order.\r\n // - Avoid figure repetition.\r\n // - Belong to the document.\r\n // - Only have figures in the same layer (if cross layer selection is not allowed)\r\n //\r\n // We may want to be more fine grained to gain performance, but for now\r\n // it seems enough to do a complete check at every change.\r\n\r\n const _this = this, doc = _this._document,\r\n figuresMap = {}, figures = [],\r\n selectedFigures = _this.selectedFigures;\r\n\r\n let layer = null, layerFigures, fixedFigures;\r\n\r\n // [TODO] Check this, we may want to add another condition\r\n // selectableFigures = filter( selectedFigures, figure => _this.is(figure,'selectable') );\r\n\r\n const selectableFigures = selectedFigures;\r\n\r\n if( _this._allowCrossLayerSelection ) {\r\n\r\n _this._crossLayerSelection = false;\r\n forEach( selectableFigures, f => {\r\n // Avoid figure repetition\r\n const f_localId = f._localId;\r\n if( ! figuresMap[f_localId] ) {\r\n figuresMap[f_localId] = true;\r\n\r\n // Belong to the document\r\n if( f.document === doc ) {\r\n const f_layer = f.layer;\r\n if( ! layer ) {\r\n layer = f_layer;\r\n }\r\n if( layer !== f_layer ) {\r\n _this._crossLayerSelection = true;\r\n }\r\n figures.push({\r\n figure: f,\r\n layer_zOrder: indexOf( f.page._layers, f_layer ),\r\n zOrder: indexOf( f_layer._figures, f )\r\n });\r\n }\r\n }\r\n });\r\n\r\n // Respect Z order\r\n figures.sort( (a,b) => {\r\n const a_layer_zOrder = a.layer_zOrder, b_layer_zOrder = b.layer_zOrder;\r\n return ( a_layer_zOrder > b_layer_zOrder || ( a_layer_zOrder === b_layer_zOrder && a.zOrder >= b.zOrder ) ) ? 1 : -1;\r\n });\r\n\r\n fixedFigures = map( figures, 'figure' );\r\n selectedFigures._set( fixedFigures );\r\n }\r\n else {\r\n\r\n forEach( selectableFigures, f => {\r\n // Avoid figure repetition\r\n const f_localId = f._localId;\r\n if( ! figuresMap[f_localId] ) {\r\n figuresMap[f_localId] = true;\r\n if( ! layer ) {\r\n // Belong to the document\r\n const f_layer = f.layer;\r\n if( includes( doc.activePageLayers, f_layer ) ) {\r\n layer = f_layer;\r\n layerFigures = layer._figures;\r\n }\r\n }\r\n // Only have figures in the same layer.\r\n if( f._owner === layer ) {\r\n figures.push( { figure: f, zOrder: indexOf( layerFigures, f ) } );\r\n }\r\n }\r\n });\r\n // Respect Z order\r\n fixedFigures = map( sortBy(figures,'zOrder'), 'figure' );\r\n selectedFigures._set( fixedFigures );\r\n }\r\n\r\n // Force the active layer to be the one where figures are selected\r\n // This is needed to be able to use document shorcuts like:\r\n //\r\n // doc.add( figure );\r\n //\r\n // Because that is equivalent to:\r\n //\r\n // doc.activeLayerFigures.add( figure );\r\n //\r\n const sf = last( fixedFigures );\r\n if( sf && sf.layer !== doc.activeLayer ) {\r\n doc.activeLayer = sf.layer;\r\n }\r\n },\r\n\r\n onSelectionChanged() {\r\n this.fixUpSelectedFigures();\r\n this._selectionChanged = true;\r\n },\r\n\r\n // MainDocument\r\n //----------------------------------------------------------------------------\r\n\r\n linkDoc( doc ) {\r\n if( this._document !== doc ) {\r\n this._document = doc;\r\n this.fixUpSelectedFigures();\r\n doc.on({\r\n commitrun : this.on_commitrun,\r\n commit : this.on_commit,\r\n render : this.on_render,\r\n activelayerchanged : this.on_activelayerchanged,\r\n revert : this.on_revert,\r\n figureschanged : this.on_figureschanged,\r\n layerschanged : this.on_layerschanged,\r\n pageschanged : this.on_pageschanged,\r\n activepagechanged : this.on_activepagechanged\r\n },this);\r\n }\r\n },\r\n\r\n unlinkDoc( doc ) {\r\n if( this._document === doc ) {\r\n this._document = null;\r\n doc.un(this);\r\n }\r\n },\r\n\r\n consumeCreatedFigures() {\r\n const { _createdFigures } = this;\r\n this._createdFigures = [];\r\n return _createdFigures;\r\n },\r\n\r\n canSelect( figure ) {\r\n return this.view.is(figure,'selectable');\r\n },\r\n\r\n on_commit() {\r\n this.consumeCreatedFigures();\r\n this.on_render();\r\n },\r\n on_render() {\r\n this._selectionChanged = false;\r\n },\r\n\r\n on_commitrun() {\r\n const createdFigures = this.consumeCreatedFigures();\r\n if( createdFigures.length > 0 ) {\r\n\r\n // [Optimize] This is only needed to enforce activeLayer selection\r\n const selectableFigures = this.view.activeSelectableFigures();\r\n const autoSelectionFigures = filter( createdFigures, figure => {\r\n return this.view.is(figure,'selectable') && includes(selectableFigures,figure);\r\n });\r\n\r\n if( autoSelectionFigures.length > 0 ) {\r\n if( this._autoSelection && ! this._selectionChanged && ! this._keepSelection ) {\r\n // We only select the newly created figures if the selection has not been changed\r\n this.selectedFigures.set(autoSelectionFigures);\r\n }\r\n }\r\n }\r\n this._keepSelection = false;\r\n },\r\n\r\n on_activelayerchanged( doc, layer ) {\r\n if( ! this._allowCrossLayerSelection ){\r\n const selectedFigures = this.selectedFigures;\r\n const figure = selectedFigures[0];\r\n if( figure && figure.layer !== layer ) {\r\n // If there are selected figures from a different layer, clear the selection\r\n selectedFigures._clear();\r\n }\r\n }\r\n },\r\n\r\n on_revert() {\r\n this._createdFigures = [];\r\n },\r\n\r\n on_figureschanged( doc, added /*, removed */ ) {\r\n forEach( added, figure => {\r\n this._createdFigures.push( figure );\r\n });\r\n this.fixUpSelectedFigures();\r\n },\r\n\r\n on_layerschanged( doc, added /*, removed */ ) {\r\n forEach( added, layer => {\r\n forEach( layer.figures, figure => {\r\n this._createdFigures.push( figure );\r\n });\r\n });\r\n this.fixUpSelectedFigures();\r\n },\r\n\r\n on_pageschanged( /* doc, added, removed */ ){\r\n this.fixUpSelectedFigures();\r\n },\r\n\r\n on_activepagechanged( /* doc, page */ ) {\r\n this.fixUpSelectedFigures();\r\n },\r\n});\r\n\r\n\r\n// Expects _document/doc, and calls to linkDoc(doc) and unlinkDoc(doc)\r\n\r\nexport const SelectedFigures_Mixin = {\r\n\r\n get selectedFigures() {\r\n return this.selection.selectedFigures;\r\n },\r\n set selectedFigures( figures ) {\r\n this.selection.selectedFigures = figures;\r\n },\r\n\r\n get autoSelection() {\r\n return this.selection.autoSelection;\r\n },\r\n set autoSelection( state ) {\r\n this.selection.autoSelection = state;\r\n },\r\n\r\n get destinationLayerSelector() {\r\n return this.selection.destinationLayerSelector;\r\n },\r\n set destinationLayerSelector( selector ) {\r\n this.selection.destinationLayerSelector = selector;\r\n },\r\n\r\n get allowCrossLayerSelection() {\r\n return this.selection.allowCrossLayerSelection;\r\n },\r\n set allowCrossLayerSelection( state ) {\r\n this.selection.allowCrossLayerSelection = state;\r\n },\r\n\r\n get allowMultiLayerSelection() {\r\n return this.selection.allowMultiLayerSelection;\r\n },\r\n set allowMultiLayerSelection( state ) {\r\n this.selection.allowMultiLayerSelection = state;\r\n },\r\n\r\n keepSelection() {\r\n this.selection._keepSelection = true;\r\n },\r\n\r\n get contextFigures() {\r\n const { selectedFigures } = this;\r\n return selectedFigures.isEmpty ? this._document.activeLayerFigures\r\n : selectedFigures ;\r\n },\r\n\r\n\r\n // [TODO][ToProp]\r\n activeSelectableLayers() {\r\n const { doc } = this;\r\n // Hack a fix for a current bug that we need to investigate further\r\n if( doc.editingContent() || this.selection.allowMultiLayerSelection ) {\r\n const { activeLayer } = doc;\r\n return ( ! activeLayer._locked && ! activeLayer._hidden ) ? [ activeLayer ] : [];\r\n }\r\n else {\r\n return filterTargetLayers( doc.activePageLayers );\r\n }\r\n },\r\n\r\n filterSelectableFigures( figures ) {\r\n const r = [];\r\n const { selection } = this;\r\n for( let k = 0, kEnd = figures.length; k < kEnd; ++k ) {\r\n const figure = figures[k];\r\n if( selection.canSelect(figure) ) {\r\n r.push( figure );\r\n }\r\n }\r\n return r;\r\n },\r\n\r\n // [TODO][ToProp]\r\n activeSelectableFigures() {\r\n if( this.selection._allowCrossLayerSelection && ! this.selection.allowMultiLayerSelection && ! this.doc.editingContent() ) {\r\n return this.activeSelectableFiguresForDoc(this.doc);\r\n }\r\n else {\r\n const layer = this.activeLayer;\r\n return layer._locked ? [] : this.filterSelectableFigures( layer.figures );\r\n }\r\n },\r\n\r\n // [TODO] page.locked, page.hidden\r\n activeSelectableFiguresForDoc( doc ) {\r\n let figures = [];\r\n forEach( doc.layers, layer => {\r\n if( ! ( layer.hidden || layer.locked ) ) {\r\n const layerFigures = this.filterSelectableFigures( layer.figures );\r\n figures = figures.concat( layerFigures );\r\n }\r\n });\r\n return figures;\r\n },\r\n\r\n selectAll() {\r\n this.selectedFigures.set( this.activeSelectableFigures() );\r\n },\r\n\r\n clearSelection() {\r\n this.selectedFigures.clear();\r\n },\r\n\r\n // [TODO] isCrossLayerSelection, isActiveLayerSelection\r\n\r\n // @param {Number} move : +/- jump\r\n selectNext( move = 1 ) {\r\n const { selectedFigures } = this;\r\n const figures = this.activeSelectableFigures();\r\n\r\n const { length } = figures;\r\n if( length === 0 ) {\r\n return;\r\n }\r\n let next = selectedFigures.isEmpty ? 0 : ( figures.indexOf( selectedFigures[0] ) +move) % length;\r\n if( next < 0 ) {\r\n next += length;\r\n }\r\n selectedFigures.set( figures[next] );\r\n },\r\n\r\n crossLayerSelection() {\r\n return this.selection._crossLayerSelection;\r\n },\r\n\r\n // In TextureView, model and document coordinates are not the same, using\r\n // model coordiantes here allow us to share more code\r\n\r\n figureAtEvent( event ) {\r\n const modelPoint = this.modelPoint(event);\r\n if( ! modelPoint ) {\r\n return null;\r\n }\r\n const tabFigures = event.altKey ? this.selectedFigures : null;\r\n return this.figureAtModelPoint( modelPoint, tabFigures );\r\n },\r\n figureHitAtEvent( event ) {\r\n const modelPoint = this.modelPoint(event);\r\n if( ! modelPoint ) {\r\n return null;\r\n }\r\n const tabFigures = event.altKey ? this.selectedFigures : null;\r\n return this.figureAtModelPointEx( modelPoint, tabFigures );\r\n },\r\n\r\n rawFigureHitsAtEvent( event ) {\r\n const modelPoint = this.modelPoint(event);\r\n if( ! modelPoint ) {\r\n return [];\r\n }\r\n return this.rawFigureHitsAtModelPoint( modelPoint );\r\n },\r\n\r\n // Overwriten by doc3d-model-mixin\r\n rawFigureHitsAtModelPoint( modelPoint ) {\r\n return this.rawFigureHitsAt( this.modelToDoc(modelPoint) );\r\n },\r\n\r\n // Return all the figures, even invisible and locked ones\r\n // Overwriten by doc3d-model-mixin\r\n rawFigureHitsAt( docPoint ) {\r\n\r\n const candidates = [];\r\n const page = this.doc.activePage;\r\n\r\n const { layers } = page;\r\n for( let l = layers.length-1; l >= 0; --l ) {\r\n const { figures } = layers[l];\r\n for( let f = figures.length-1; f >= 0 ; --f ) {\r\n const figure = figures[f];\r\n\r\n if( figure.globalFrame_().contains(docPoint) ) {\r\n const candidate = {\r\n figure, docPoint,\r\n tight: figure.containsPoint(docPoint) // like hitTest but also returns true if locked\r\n };\r\n candidates.push(candidate);\r\n }\r\n }\r\n }\r\n\r\n return candidates;\r\n },\r\n\r\n figureAtModelPoint( modelPoint, tabFigures, info ) {\r\n return this.extractHitInfo( this.figureAtModelPointEx(modelPoint,tabFigures), info );\r\n },\r\n figureAtModelPointEx( modelPoint, tabFigures ) {\r\n return this.figureAtPointEx( this.modelToDoc(modelPoint), tabFigures );\r\n },\r\n\r\n figureAtPoint( docPoint, tabFigures, info ) {\r\n return this.extractHitInfo( this.figureAtPointEx(docPoint,tabFigures), info );\r\n },\r\n figureAtPointEx( docPoint, tabFigures ) {\r\n return this.topFigureFromEx( this.activeSelectableFiguresForDoc(this.doc), docPoint, tabFigures );\r\n },\r\n\r\n // TextureView and Canvas3D adds more info for the hit\r\n extractHitInfo( hit, info ) {\r\n if( hit ) {\r\n if( info ) {\r\n info.tight = hit.tight;\r\n }\r\n return hit.figure;\r\n }\r\n return undefined;\r\n },\r\n\r\n figuresBetweenEvents(/* eventDown, eventUp */) { // [TODO]\r\n return [];\r\n },\r\n\r\n // Let descendant init this view before others to avoid initialization issues\r\n initSelection( config ) {\r\n if( ! this.selection ) {\r\n this.addEvents(\r\n 'selectionchanged',\r\n 'selectionupdated'\r\n );\r\n this.selection = ( config && config.selection ) || new Selection( assign({ view: this }, config ) );\r\n }\r\n },\r\n\r\n init( config ) {\r\n this.initSelection(config);\r\n this.callParent(config);\r\n },\r\n\r\n linkDoc( doc ) {\r\n this.callParent(doc);\r\n this.selection.linkDoc(doc);\r\n },\r\n\r\n unlinkDoc( doc ) {\r\n this.callParent(doc);\r\n this.selection.unlinkDoc(doc);\r\n },\r\n\r\n // These methods uses figureViews, we never simplify it in case we need\r\n // to start using the figure drawn buffers to do pixel testing. We may\r\n // start doing it as an optimization at one point in the future\r\n\r\n topFigureFrom( selectableFigures, docPoint, tabFigures, info ) {\r\n return this.extractHitInfo( this.topFigureFromEx(selectableFigures,docPoint,tabFigures), info );\r\n },\r\n\r\n topFigureFromEx( fromFigures, docPoint, tabFigures ) {\r\n\r\n // Frame selection (Frame selection fallback)\r\n const figures = filterRight( fromFigures, figure => {\r\n return figure.frame_().contains(docPoint);\r\n });\r\n\r\n const candidates = map( figures, figure => {\r\n return { figure, docPoint, tight: false };\r\n });\r\n\r\n return this.bestFigureCandidate(candidates,tabFigures);\r\n },\r\n\r\n candidateHitTest( candidate ) {\r\n return this.figureView(candidate.figure).hitTest(candidate.docPoint);\r\n },\r\n\r\n filterHittedCandidates( candidates ) {\r\n const r = [];\r\n for( let k = 0, kEnd = candidates.length; k < kEnd; ++k ) {\r\n const candidate = candidates[k];\r\n if( this.candidateHitTest(candidate) ) {\r\n r.push( candidate );\r\n }\r\n }\r\n return r;\r\n },\r\n\r\n findHittedCandidate( candidates ) {\r\n for( let k = 0, kEnd = candidates.length; k < kEnd; ++k ) {\r\n const candidate = candidates[k];\r\n if( this.candidateHitTest(candidate) ) {\r\n return candidate;\r\n }\r\n }\r\n },\r\n\r\n // Check Doc3_Model_Mixin, to see why the docPoint is kept for each\r\n // candidate even if it is the same for all figures in 2D.}\r\n\r\n bestFigureCandidate( candidates, tabFigures ) {\r\n\r\n // Shortcircuit, avoid expensive curves based selection if not needed\r\n\r\n if( candidates.length === 0 ) {\r\n return null; // Nothing around\r\n }\r\n\r\n if( candidates.length === 1 ) {\r\n const candidate = candidates[0];\r\n candidate.tight = this.candidateHitTest(candidate);\r\n return candidate; // Only one figure\r\n }\r\n\r\n const tab = tabFigures && tabFigures.length > 0;\r\n\r\n // direct selection of figure?\r\n if( Config.useCurvesBasedSelection ) {\r\n\r\n if( tab ) {\r\n candidates = this.filterHittedCandidates( candidates );\r\n }\r\n else {\r\n const candidate = this.findHittedCandidate( candidates );\r\n if( candidate ) {\r\n candidate.tight = true;\r\n return candidate;\r\n }\r\n }\r\n }\r\n\r\n if( tab ) {\r\n // const current = findLastIndex( candidates, ({figure}) => includes(tabFigures,figure) );\r\n let current = candidates.length-1;\r\n for( ; current >= 0; --current ) {\r\n if( includes(tabFigures,candidates[current].figure) ) {\r\n break;\r\n }\r\n }\r\n\r\n if( current === candidates.length-1 ) {\r\n return candidates[0]; // Start over from the top most figure\r\n }\r\n else {\r\n return candidates[current+1]; // tab over next figure in z order\r\n }\r\n }\r\n else {\r\n return candidates[0];\r\n }\r\n },\r\n\r\n fireChangeEvents( type, doc ) {\r\n let change = this.callParent(type,doc);\r\n\r\n const selectionChanged = this.selection._selectionChanged;\r\n if( selectionChanged ) {\r\n this.fireEvent('selectionchanged',this);\r\n // console.log('selectionchanged');\r\n change = true;\r\n }\r\n\r\n if( selectionChanged || type === 'commit' ) {\r\n this.fireEvent('selectionupdated',this);\r\n // console.log('selectionupdated');\r\n change = true;\r\n }\r\n\r\n return change;\r\n },\r\n\r\n};\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/view/selected-figures-mixin.js\n **/","import { find, assign } from 'lodash';\r\n\r\nimport { Point, ContentLayer } from 'cdl';\r\n\r\nimport { g$ } from './util';\r\nimport { InteractiveHelper, interactiveViewEvents } from './events';\r\nimport { Tool } from './tool';\r\nimport { Plugin } from './plugin';\r\n\r\nexport const InteractiveView_Mixin = {\r\n\r\n Properties: {\r\n\r\n keyShortcuts: { type: 'boolean', def: false },\r\n\r\n stackViewTools: { type: 'boolean', def: true }\r\n },\r\n\r\n // [TODO]\r\n // Should this work over the passed domElement or the internal container\r\n\r\n get_cursor() {\r\n return this.container.style.cursor;\r\n },\r\n\r\n set_cursor( cursor ) {\r\n this.container.style.cursor = cursor;\r\n },\r\n\r\n get cursor() {\r\n return this.get_cursor();\r\n },\r\n\r\n set cursor( cursor_ ){\r\n this.set_cursor(cursor_);\r\n },\r\n\r\n hasFocus() {\r\n return this.container === document.activeElement;\r\n },\r\n\r\n focus() {\r\n g$.focus(this.container);\r\n },\r\n\r\n init( config ) {\r\n\r\n this.addEvents(\r\n interactiveViewEvents,\r\n 'toolchanged',\r\n 'movetoclipboard',\r\n 'openclipboard'\r\n );\r\n\r\n this.callParent(config);\r\n },\r\n\r\n linkDoc( doc ) {\r\n this.callParent(doc);\r\n if( doc.activePage.activeLayer instanceof ContentLayer ) {\r\n this.updateEditContentStatus();\r\n }\r\n },\r\n\r\n fixUpPlugins( plugins ) {\r\n // [TODO] Clean up... Horrible Hack :(\r\n const keyShortcuts = find( plugins, p => p instanceof Plugin.KeyShortcuts );\r\n if( keyShortcuts ) {\r\n plugins._remove(keyShortcuts);\r\n plugins._insert(0,keyShortcuts);\r\n }\r\n },\r\n\r\n afterInit( config = {} ){\r\n // [TODO] Make this a property\r\n const captureKey = config.captureKey;\r\n if( captureKey ) {\r\n this._iConfig = { captureKey: captureKey };\r\n }\r\n this.callParent(config);\r\n\r\n if( config.tool ) {\r\n this.tool = config.tool;\r\n }\r\n },\r\n\r\n appendTo( domElement, id ) {\r\n\r\n this.callParent(domElement,id);\r\n\r\n const { container } = this;\r\n\r\n container.setAttribute('tabindex',0);\r\n g$.addClass( container, 'grafika-canvas' );\r\n\r\n this._eventsHelper = new InteractiveHelper(this,container,this._iConfig);\r\n\r\n this.initStatus();\r\n\r\n this.initTooltip();\r\n\r\n return this;\r\n },\r\n\r\n triggerKeyboard(event) {\r\n this._eventsHelper.triggerKeyboard(event);\r\n },\r\n\r\n dispose() {\r\n const eh = this._eventsHelper;\r\n if( eh ) {\r\n eh.dispose();\r\n }\r\n this.callParent();\r\n },\r\n\r\n // Tools Plugin shortcuts\r\n\r\n commitEditionTools$() {\r\n return this.tools.commitEditionTools$();\r\n },\r\n\r\n get tool() {\r\n return this.tools.tool;\r\n },\r\n set tool( tool_ ) {\r\n this.tools.tool = tool_;\r\n },\r\n\r\n popTool() {\r\n return this.tools.popTool();\r\n },\r\n toolhelp( string ) {\r\n return this.tools.toolhelp(string);\r\n },\r\n\r\n // Easy access to common tools\r\n // This should be in a new InteractiveDocumentView_Mixin\r\n // We will see how it will evolve\r\n\r\n nodeEdit( figure, config ) {\r\n this.tool = new Tool.NodeEdit(figure,config);\r\n return this;\r\n },\r\n\r\n nodeEditEnvelope( figure, config ) {\r\n this.tool = new Tool.NodeEditEnvelope(figure,config);\r\n return this;\r\n },\r\n\r\n // [TODO] Plugin.Status\r\n //--------------------------------------------\r\n\r\n // [TODO] Remove need for container to have an id, create div with functions\r\n initStatus() {\r\n const statusId = this.container.id + '_status';\r\n g$.append( this.container, ``);\r\n const statusEl = this._statusEl = g$(\"#\"+statusId);\r\n\r\n // [TODO] click ?\r\n g$.on( statusEl, \"click\", () => this.commitStatus() );\r\n this._status = null;\r\n },\r\n status( s ) {\r\n if( s === undefined ) {\r\n return this._status;\r\n }\r\n else {\r\n this._status = s;\r\n this.updateStatus();\r\n return this;\r\n }\r\n },\r\n commitStatus() {\r\n const status = this._status;\r\n if( status ) {\r\n const commit = status.commit;\r\n if( commit ) {\r\n commit.call(this);\r\n }\r\n }\r\n },\r\n updateStatus() {\r\n const status = this._status, el = this._statusEl;\r\n if( status ) {\r\n let html = '

'+status.message;\r\n if( status.commit ) {\r\n html += '';\r\n }\r\n html += '

';\r\n el.innerHTML = html;\r\n }\r\n\r\n el.style.display = status ? 'inline' : 'none';\r\n },\r\n //----------------------------------------------------------------\r\n\r\n\r\n // [TODO] Plugin.Tooltip, only used by the Head Up Display, move this there\r\n //----------------------------------------------------------------\r\n\r\n initTooltip() {\r\n const tooltipId = this.container.id+\"_tooltip\";\r\n g$.append( this.container,\r\n ``\r\n );\r\n this._tooltipEl = g$(\"#\"+tooltipId);\r\n },\r\n showTooltip( message, point ) {\r\n const tel = this._tooltipEl;\r\n if( tel ) {\r\n this.hideTooltip();\r\n const cp = point.x < 300 ? Point.add(point,new Point(20,10)) : Point.add(point,new Point(-message.length*6-18,0));\r\n if( point.y > 400 ) {\r\n cp.y -= 40;\r\n }\r\n tel.innerHTML = message;\r\n\r\n assign( tel.style, {\r\n 'left' : cp.x+'px',\r\n 'top' : cp.y+'px',\r\n 'display': 'block'\r\n });\r\n\r\n this._tooltipVisible = true;\r\n }\r\n },\r\n hideTooltip() {\r\n if( this._tooltipVisible ) {\r\n const tel = this._tooltipEl;\r\n if( tel ) {\r\n tel.style.display = 'none';\r\n this._tooltipVisible = false;\r\n }\r\n }\r\n }\r\n};\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/view/interactive-view.js\n **/","import { forEach, includes, last, assign } from 'lodash';\r\n\r\nimport { clearContext, dot } from 'gear';\r\n\r\nimport { Plugin } from '../view';\r\n\r\nimport { draw_colorShowthrough_gl } from '../../cdl/style/color-showthrough';\r\n\r\nPlugin.ActiveRenderer = Plugin.extend({ typeName: 'ActiveRendererPlugin',\r\n name: 'renderer',\r\n\r\n target: 'document',\r\n\r\n drawTo_color: [ 'background', 'document', 'foreground' ],\r\n\r\n redrawFigure( view,figure ) {\r\n if( includes( view._activeFigures, figure ) ) {\r\n view.redraw('document');\r\n }\r\n else {\r\n if( figure.document === view._mainDocument ) {\r\n view.redraw('document');\r\n }\r\n else {\r\n view.redraw('background');\r\n }\r\n }\r\n },\r\n\r\n // Draw everything that is behind the first active figure\r\n draw_background({ view, context, transform }) {\r\n view.fillWithBackgroundColor(context);\r\n\r\n const firstActiveFigure = view._activeFigures[0];\r\n const lastFigure = firstActiveFigure || 'doc';\r\n\r\n this.drawFigures(view,context,transform,{\r\n until: lastFigure\r\n });\r\n },\r\n\r\n // draw active figures, or current document\r\n draw_document({ view, context, transform }) {\r\n const activeFigures = view._activeFigures;\r\n if( activeFigures.length > 0 ) {\r\n const alpha = this._activeAlpha;\r\n if( alpha === 0 ) {\r\n return;\r\n }\r\n if( alpha !== undefined && alpha < 1 ) {\r\n context.globalAlpha *= alpha;\r\n }\r\n }\r\n\r\n const firstActiveFigure = activeFigures[0] || 'doc';\r\n const lastActiveFigure = last(activeFigures);\r\n \r\n draw_colorShowthrough_gl(view, context, transform, this, firstActiveFigure, lastActiveFigure);\r\n\r\n if( activeFigures.length === 0 ) {\r\n this.drawSpecialPens(view,context,transform);\r\n }\r\n },\r\n\r\n // In case there are active figures, draw everything above them\r\n draw_foreground({ view, context, transform }) {\r\n const activeFigures = view._activeFigures;\r\n if( activeFigures.length === 0 ) {\r\n // clearContext(context);\r\n return;\r\n }\r\n\r\n const lastActiveFigure = last(activeFigures);\r\n const firstFigure = lastActiveFigure || 'doc';\r\n\r\n this.drawFigures(view,context,transform,{\r\n from: firstFigure, skipFirst: true\r\n });\r\n\r\n this.drawSpecialPens(view,context,transform);\r\n },\r\n\r\n drawSpecialPens( view, context, transform ) {\r\n const { specialPens } = view;\r\n if( specialPens ) {\r\n specialPens.drawForPage(view._mainDocument.activePage,context,transform);\r\n }\r\n },\r\n\r\n drawFigures( view,context,transform,span,clearBuffer = false, drawShowthroughMask = false) {\r\n const { from } = span;\r\n const drawing = { start: ! from || from === 'doc', end: false };\r\n const config = { editingContent: view._mainDocument.editingContent() };\r\n\r\n const page = view._mainDocument.activePage;\r\n\r\n const backgroundPage = view.backgroundPageFor(page);\r\n if( backgroundPage && from !== 'doc' ) {\r\n this.drawPage( view, backgroundPage,\r\n context, transform, config, span, drawing, clearBuffer, drawShowthroughMask );\r\n }\r\n\r\n if( drawing.end || span.until === 'doc' ) {\r\n return false;\r\n }\r\n\r\n this.drawPage( view, page, context, transform, config, span, drawing, clearBuffer, drawShowthroughMask );\r\n\r\n },\r\n\r\n drawPage( view,page, context, transform, config,\r\n { from, skipFirst, until, includeLast }, drawing, clearBuffer = false, drawShowthroughMask = false ) {\r\n \r\n config = assign( { wireframe: view.wireframe }, config );\r\n config = assign( { showthroughColor: view.showThroughColor }, config);\r\n forEach( page.layers, layer => {\r\n\r\n // This is not the best for this pattern, but we may remove the\r\n // isolated figures pattern soon.\r\n layer.beforeDraw(context,config);\r\n\r\n forEach( layer.figures, figure => {\r\n if( ! skipFirst && from === figure ) {\r\n drawing.start = true;\r\n }\r\n if( ! includeLast && until === figure ) {\r\n drawing.end = true;\r\n }\r\n\r\n if( drawing.start && ! drawing.end ) {\r\n\r\n const figureView = view.figureView(figure);\r\n if( figureView ) {\r\n figureView.draw(context,transform,config,clearBuffer,drawShowthroughMask);\r\n }\r\n else {\r\n console.log('[Error] FigureView is undefined');\r\n }\r\n\r\n if( view._showPin ) {\r\n dot(context,figure.pin,3,transform,'#ffffff','#222222',4);\r\n }\r\n }\r\n\r\n if( skipFirst && from === figure ) {\r\n drawing.start = true;\r\n }\r\n if( includeLast && until === figure ) {\r\n drawing.end = true;\r\n }\r\n\r\n if( drawing.end ) {\r\n return false;\r\n }\r\n });\r\n\r\n layer.afterDraw(context,config); // [TODO]\r\n\r\n if( drawing.end ) {\r\n return false;\r\n }\r\n });\r\n }\r\n});\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/plugin/active-renderer.js\n **/","import { Config } from 'config';\r\nimport { forEach, map } from 'lodash';\r\nimport { OwnedObject, invalidateOwner } from 'gear';\r\nimport { Point } from '../geometry';\r\nimport { Color } from './color';\r\nimport { Figures } from '../figure';\r\nimport { ReplaceSTEffect } from './glEffects/replaceST';\r\n// values between 0...255\r\n// map :: function(r,g,b,a){ return [ r*, g*, b*, a* ]; }\r\n\r\nconst modifyImageDataRGBA = function(imageData,map, extended = false){\r\n const data = imageData.data, width = imageData.width, height = imageData.height;\r\n let y, x, inpos, outpos, r, g, b, a;\r\n\r\n for(y = 0; y < height; ++y) {\r\n inpos = y * width * 4; // *4 for 4 ints per pixel\r\n outpos = inpos;\r\n for(x = 0; x < width; ++x) {\r\n\r\n r = data[inpos++];\r\n g = data[inpos++];\r\n b = data[inpos++];\r\n a = data[inpos++]; // alpha\r\n\r\n // http://www.w3.org/TR/AERT#color-contrast\r\n const c = map(r,g,b,a);\r\n\r\n data[outpos++] = c[0];\r\n data[outpos++] = c[1];\r\n data[outpos++] = c[2];\r\n data[outpos++] = c[3];\r\n\r\n if (extended && !(c[0]==10 && c[1]==10 && c[2]==10 && c[3]==0))\r\n {\r\n let currentPos = outpos - 4;\r\n let done = false;\r\n \r\n for (let i = 1; i < 3; ++i)\r\n if (x < width - i)\r\n {\r\n const c2 = map(data[inpos++],data[inpos++],data[inpos++],data[inpos++]);\r\n if (c2[0]==10 && c2[1]==10 && c2[2]==10 && c2[3]==0)\r\n {\r\n outpos-=4;\r\n data[outpos++] = 0;\r\n data[outpos++] = 0;\r\n data[outpos++] = 0;\r\n data[outpos++] = 0;\r\n done = true;\r\n break;\r\n }\r\n }\r\n \r\n for (let i = 1; i < 3; ++i)\r\n if (!done && x >= i)\r\n {\r\n inpos = currentPos - 4*i;\r\n const c3 = map(data[inpos++],data[inpos++],data[inpos++],data[inpos++]);\r\n if (c3[0]==10 && c3[1]==10 && c3[2]==10 && c3[3]==0)\r\n {\r\n outpos-=4;\r\n data[outpos++] = 0;\r\n data[outpos++] = 0;\r\n data[outpos++] = 0;\r\n data[outpos++] = 0;\r\n break;\r\n }\r\n }\r\n\r\n for (let i = 1; i < 3; ++i)\r\n if (y < height - i)\r\n {\r\n inpos = currentPos + 4*i*width;\r\n const c2 = map(data[inpos++],data[inpos++],data[inpos++],data[inpos++]);\r\n if (c2[0]==10 && c2[1]==10 && c2[2]==10 && c2[3]==0)\r\n {\r\n outpos-=4;\r\n data[outpos++] = 0;\r\n data[outpos++] = 0;\r\n data[outpos++] = 0;\r\n data[outpos++] = 0;\r\n done = true;\r\n break;\r\n }\r\n }\r\n\r\n for (let i = 1; i < 3; ++i)\r\n if (y >= i)\r\n {\r\n inpos = currentPos - 4*i*width;\r\n const c2 = map(data[inpos++],data[inpos++],data[inpos++],data[inpos++]);\r\n if (c2[0]==10 && c2[1]==10 && c2[2]==10 && c2[3]==0)\r\n {\r\n outpos-=4;\r\n data[outpos++] = 0;\r\n data[outpos++] = 0;\r\n data[outpos++] = 0;\r\n data[outpos++] = 0;\r\n done = true;\r\n break;\r\n }\r\n }\r\n outpos = currentPos+4;\r\n inpos = currentPos+4;\r\n }\r\n }\r\n }\r\n};\r\n\r\n// ColorShowthrough\r\n//======================================================================================\r\nconst draw_colorShowthrough = function( view, context, transform, renderer, firstActiveFigure, lastActiveFigure ) {\r\n\r\n const lAvoidSlowST = Config.avoidRenderingShowThroughNoGL;\r\n\r\n const lSTColors = [];\r\n\r\n if (!lAvoidSlowST)\r\n {\r\n const page = view._mainDocument.activePage;\r\n forEach( page.layers, layer => {\r\n Figures.forEachColor( layer.figures, c => {\r\n if( c && c.showThrough && ! lSTColors.indexOf(c)>=0 ) {\r\n lSTColors.push(c);\r\n }\r\n })});\r\n }\r\n\r\n if (lSTColors.length > 0 && !lAvoidSlowST)\r\n {\r\n let canvas = document.createElement('canvas');\r\n canvas.width = view.width;\r\n canvas.height = view.height;\r\n let ctx = canvas.getContext('2d');\r\n\r\n renderer.drawFigures(view,ctx,transform,{\r\n from: firstActiveFigure,\r\n until: lastActiveFigure, includeLast: true,\r\n });\r\n\r\n let lImageData = ctx.getImageData(0,0,canvas.width,canvas.height);\r\n\r\n modifyImageDataRGBA( lImageData, (r,g,b,a) => {\r\n let lRet = [r,g,b,a];\r\n lSTColors.forEach(function(c) {\r\n if (c.r() == r && c.g() == g && c.b() == b )\r\n lRet = [10,10,10,0];\r\n }, this);\r\n return lRet;\r\n }, true);\r\n\r\n context.putImageData(lImageData,0,0);\r\n }\r\n else\r\n {\r\n renderer.drawFigures(view,context,transform,{\r\n from: firstActiveFigure,\r\n until: lastActiveFigure, includeLast: true,\r\n });\r\n }\r\n}\r\n\r\n// ColorShowthrough\r\n//======================================================================================\r\nlet mGlCanvas = null;\r\nlet mGlCtx = null;\r\nlet mEffect = null;\r\nlet mCanvasST = null;\r\nlet mCanvasNormal = null;\r\n\r\nexport const draw_colorShowthrough_gl = function( view, context, transform, renderer, firstActiveFigure, lastActiveFigure ) {\r\n let lHasST = false;\r\n let lNeedsBufferClear = false;\r\n const page = view._mainDocument.activePage;\r\n\r\n let lNrLayers = page.layers.length;\r\n\r\n for(let iLayer = 0; !lHasST && iLayer < lNrLayers; iLayer++) {\r\n let lLayer = page.layers[iLayer];\r\n let lFigures = lLayer.figures;\r\n let lNrFigures = lFigures.length;\r\n for(let k=0;!lHasST && k0 &&lColors[i].alpha<1 ) {\r\n firstSemiTransparent = lFigure;\r\n }\r\n }\r\n }\r\n \r\n }\r\n }\r\n let includeLast = firstSemiTransparent != null;\r\n var lastFigure = firstSemiTransparent != null ? firstSemiTransparent : lastActiveFigure;\r\n mCanvasST.width = view.width;\r\n mCanvasST.height = view.height;\r\n let ctxST = mCanvasST.getContext('2d');\r\n renderer.drawFigures(view,ctxST,transform,{\r\n from: firstActiveFigure,\r\n until: lastFigure, includeLast: includeLast\r\n }, true, true);\r\n \r\n for(let iLayer = 0;iLayer < lNrLayers; iLayer++) {\r\n let lLayer = page.layers[iLayer];\r\n let lFigures = lLayer.figures;\r\n let lNrFigures = lFigures.length;\r\n for(let k=0;k 0 ) {\r\n const pFigures = aFigure._powerClipContents[0]._figures;\r\n for(let k=0,kEnd=pFigures.length;k 0 ) {\r\n const pFigures = aFigure._powerClipContents[0]._figures;\r\n for(let k=0,kEnd=pFigures.length;k 0 ) {\r\n maskContext.save();\r\n\r\n if( box ) {\r\n maskContext.rect(box.lx,box.ly,box.width,box.height);\r\n maskContext.clip();\r\n }\r\n\r\n maskContext.fillStyle = this._maskColor.svgColor();\r\n\r\n forEach( maskPolyregions, polyregion => {\r\n polyregion.draw(maskContext,transform,{ customDraw: c => c.fill() });\r\n });\r\n\r\n maskContext.restore();\r\n\r\n this._maskDraw = true;\r\n }\r\n else if( box === undefined && this._maskDraw ) {\r\n this._maskDraw = false;\r\n clearContext(maskContext);\r\n }\r\n },\r\n\r\n drawSpecialPensForPage( page,context,transform,box) {\r\n const specialPensPolyregions = this.gatherSpecialPenPolyregionsFor(page);\r\n if( this._maskVisible ) {\r\n this.drawMask(specialPensPolyregions.mask,context,transform,box);\r\n }\r\n this.drawDisplayPens(specialPensPolyregions.display,context,transform);\r\n },\r\n\r\n gatherSpecialPenPolyregionsFor( page ) {\r\n const specialPenPolyregions = { mask: [], display: [] };\r\n page.forEachFigure( figure => {\r\n // We need to check if there are MaskPen or DisplayPen to collect them\r\n const output = figure._outputFigure;\r\n if( output ) {\r\n output.deepForEachPolyregion( p => {\r\n const pen = p._pen;\r\n if( pen._type === 'DisplayPen' ) {\r\n specialPenPolyregions.display.push(p);\r\n }\r\n else if( pen._type === 'MaskPen' ) {\r\n specialPenPolyregions.mask.push(p);\r\n }\r\n });\r\n }\r\n });\r\n return specialPenPolyregions;\r\n },\r\n\r\n drawDisplayPens( displayPolyregions, context, transform ) {\r\n if( displayPolyregions.length > 0 ) {\r\n\r\n context.save();\r\n\r\n context.lineWidth = 0;\r\n\r\n forEach( displayPolyregions, polyregion => {\r\n polyregion.draw(context,transform,{ customDraw: displayStroke });\r\n });\r\n\r\n context.restore();\r\n }\r\n },\r\n\r\n blitMask( context/*,transform*/) {\r\n if( this._maskDraw ) {\r\n const maskContext = this.view.getContext('mask','2d');\r\n maskContext.save();\r\n maskContext.fillStyle = this._maskColor.svgColor();\r\n maskContext.globalCompositeOperation = 'xor';\r\n fillContext(maskContext);\r\n maskContext.restore();\r\n\r\n context.save();\r\n context.globalAlpha = this._maskAlpha;\r\n context.drawImage(maskContext.canvas,0,0);\r\n context.restore();\r\n }\r\n }\r\n});\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/plugin/special-pens.js\n **/","import { forEach } from 'lodash';\r\nimport { OwnedObject } from 'gear';\r\nimport { Point, Color } from 'cdl';\r\n\r\nimport { Plugin, redraw_this, strokePixelCenterSegment } from '../view';\r\n\r\nexport const UserLine = OwnedObject.extend({ typeName: 'UserLine',\r\n Properties:{\r\n snap: { type: 'boolean', def: true },\r\n position: { type: 'number', def: 0, onChange: redraw_this },\r\n color: { type: 'Color', def: new Color({ rgb: '805633', alpha: 0.75 }), onChange: redraw_this },\r\n },\r\n clone() { return UserLine(this); },\r\n redraw() {\r\n const owner = this._owner;\r\n if( owner ) {\r\n owner.redraw();\r\n }\r\n }\r\n});\r\n\r\nPlugin.UserLines = Plugin.extend({ typeName: 'UserLinesPlugin',\r\n\r\n drawTo: ['plugins'],\r\n\r\n name: 'userLines',\r\n\r\n Properties: {\r\n horizontalLines : { type: 'UserLine[]', def: [], onChange: redraw_this },\r\n verticalLines : { type: 'UserLine[]', def: [], onChange: redraw_this }\r\n },\r\n\r\n clone() {\r\n return Plugin.UserLines(this);\r\n },\r\n\r\n draw({ view, context, transformModel }) {\r\n\r\n const { lx, ly, hx, hy } = view.bounds;\r\n\r\n context.lineWidth = 1;\r\n\r\n forEach( this._horizontalLines, userLine => {\r\n context.strokeStyle = userLine._color.rgba;\r\n const x = userLine.position;\r\n strokePixelCenterSegment(context,new Point(x,ly),new Point(x,hy),transformModel);\r\n });\r\n\r\n forEach( this._verticalLines, userLine => {\r\n context.strokeStyle = userLine._color.rgba;\r\n const y = userLine.position;\r\n strokePixelCenterSegment(context,new Point(lx,y),new Point(hx,y),transformModel);\r\n });\r\n }\r\n});\r\n\r\nPlugin.AlignmentLines = Plugin.extend({ typeName: 'AlignmentLinesPlugin',\r\n\r\n drawTo: ['plugins'],\r\n name: 'alignmentLines',\r\n Properties:{\r\n snap: { type: 'boolean', def: false, onChange: redraw_this }\r\n },\r\n clone() {\r\n return new Plugin.AlignmentLines(this);\r\n },\r\n draw( /*{ view, context, transform }*/ ) {\r\n // ... currently in Select Handles\r\n }\r\n});\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/plugin/alignment-lines.js\n **/","import { forEach, filter, some, every, concat, isFunction, assign } from 'lodash';\r\nimport { clone, whenAll } from 'gear';\r\nimport { Figures, Frame } from 'cdl';\r\nimport { Plugin } from '../view';\r\n\r\nPlugin.FigureAnnotations = Plugin.extend({ typeName: 'FigureAnnotationsPlugin',\r\n\r\n name: 'figureAnnotations',\r\n drawTo: ['plugins'],\r\n\r\n target: 'document',\r\n\r\n clone() { return Plugin.FigureAnnotations(this); },\r\n\r\n initPlugin( view ) {\r\n this._annotations = [];\r\n this._annotationsAreDraw = false;\r\n view.addEvents('annotationsupdated');\r\n\r\n // Forward functions, should we allow this?\r\n const _this = this;\r\n assign( view, {\r\n annotate(/* ...params */) {\r\n return _this.annotate(...arguments);\r\n },\r\n unannotate(/* ...params */) {\r\n return _this.unannotate(...arguments);\r\n },\r\n clearAnnotations(/* ...params */) {\r\n return _this.clearAnnotations(...arguments);\r\n }\r\n });\r\n },\r\n\r\n link( view ) {\r\n view.on('commit',this.generate_,this);\r\n },\r\n unlink( view ) {\r\n view.un(this);\r\n },\r\n\r\n // annotate( figure, { message: 'Message', pen: ... } );\r\n // annotate( figures, { grouped: true, message: ... } );\r\n // annotate( function( figure ) { }, { message( figure ) {}, ... });\r\n // annotate( function( figure ) { }, function( figure ) {} );\r\n // annotate( function( figure ) { }, function( figure ) {} );\r\n //\r\n // view.unannotate( annotation );\r\n // view.clearAnnotations();\r\n\r\n annotate( figures,config ) {\r\n const ann = { figures: figures, config: config };\r\n this._annotations.push(ann);\r\n this.update$();\r\n return ann;\r\n },\r\n\r\n unannotate( annotation) {\r\n const i = this._annotations.indexOf(annotation);\r\n if( i >= 0 ) { this._annotations.splice(i,1); }\r\n this.update$();\r\n return this;\r\n },\r\n\r\n clearAnnotations() {\r\n this._annotations = [];\r\n this.update$();\r\n return this;\r\n },\r\n\r\n update$() {\r\n return this.view.doc.update$() .then( () => {\r\n this.generate_();\r\n });\r\n },\r\n\r\n // Called after each commit$, or triggered by the user using update$\r\n\r\n addAnnotation( ann) {\r\n ann.ready = false;\r\n this._processedAnnotations.push(ann);\r\n whenAll([ ann.text, ann.color, ann.pen, ann.brush ]) .then( () => {\r\n ann.ready = true;\r\n this.redraw();\r\n });\r\n },\r\n\r\n generate_() {\r\n const view = this.view, mainDocument = view._mainDocument || view.doc, backgroundDocument = view._background;\r\n this._processedAnnotations = [];\r\n forEach( this._annotations, ann => {\r\n const c = ann.config;\r\n const textIsFunc = isFunction(c.text );\r\n const colorIsFunc = isFunction(c.color);\r\n const penIsFunc = isFunction(c.pen );\r\n const brushIsFunc = isFunction(c.brush);\r\n const boxStyle = c.boxStyle || 'Rect';\r\n\r\n let figures = ann.figures;\r\n let background = c.backgroundFigures;\r\n\r\n if( figures === 'all' ) {\r\n figures = mainDocument.activePageFigures;\r\n if( background ) {\r\n figures = concat(backgroundDocument.activePageFigures,figures);\r\n }\r\n }\r\n else if( isFunction(figures) ) {\r\n const func = figures;\r\n figures = filter( mainDocument.activePageFigures, func );\r\n if( background ) {\r\n figures = concat( filter( backgroundDocument.activePageFigures, func ), figures );\r\n }\r\n }\r\n else if( figures.isFigure ) {\r\n figures = [figures];\r\n background = true;\r\n }\r\n else {\r\n ann.figures = clone(figures);\r\n background = true;\r\n }\r\n\r\n if( ann.grouped ) {\r\n this.addAnnotation({\r\n figures : figures,\r\n text : textIsFunc ? c.text(figures) : c.text,\r\n color : colorIsFunc ? c.color(figures) : c.color,\r\n pen : penIsFunc ? c.pen(figures) : c.pen,\r\n brush : brushIsFunc ? c.brush(figures) : c.brush,\r\n boxStyle : boxStyle,\r\n background: background\r\n });\r\n\r\n }\r\n else {\r\n forEach( figures, figure => {\r\n this.addAnnotation({\r\n figures : [figure],\r\n text : textIsFunc ? c.text(figure) : c.text,\r\n color : colorIsFunc ? c.color(figure) : c.color,\r\n pen : penIsFunc ? c.pen(figure) : c.pen,\r\n brush : brushIsFunc ? c.brush(figure) : c.brush,\r\n boxStyle : boxStyle,\r\n background: background\r\n });\r\n });\r\n }\r\n });\r\n this.redraw();\r\n },\r\n\r\n drawAnnotation( context, transform, ann, current, info ) {\r\n\r\n const { figures, text, color, pen, brush, boxStyle } = ann;\r\n let updated = false;\r\n\r\n const ready = every( figures, figure => ! figure.invalidated() );\r\n\r\n if( ready ) {\r\n const bounds = Figures.globalBounds_(figures).scalingTransformed(transform).inflated( 1 + (pen?pen.width:0) );\r\n if( pen || brush ) {\r\n context.beginPath();\r\n if( boxStyle === 'Clean' ) {\r\n const lx = bounds.lx, ly = bounds.ly, hx = bounds.hx, hy = bounds.hy;\r\n const w = Math.min( 10, bounds.width );\r\n\r\n context.moveTo(lx ,ly+w); context.lineTo(lx ,ly ); context.lineTo(lx+w,ly );\r\n context.moveTo(hx-w,ly ); context.lineTo(hx ,ly ); context.lineTo(hx ,ly+w);\r\n context.moveTo(lx ,hy-w); context.lineTo(lx ,hy ); context.lineTo(lx+w,hy );\r\n context.moveTo(hx ,hy-w); context.lineTo(hx ,hy ); context.lineTo(hx-w,hy );\r\n }\r\n else {\r\n bounds.draw(context);\r\n }\r\n }\r\n if( pen ) {\r\n pen.setupContext(context);\r\n context.stroke();\r\n }\r\n if( brush ) {\r\n context.fillStyle = brush.color.rgba;\r\n context.fill();\r\n }\r\n if( text ) {\r\n context.textBaseline = \"bottom\";\r\n context.textAlign = \"end\";\r\n context.fillStyle = color ? color.rgba : pen ? pen.color.rgba : '#000000';\r\n\r\n if( figures.length === 1 ) {\r\n // Allow several annotations per figure\r\n const figure = figures[0];\r\n let fa = current[figure._localId];\r\n if( ! fa ) {\r\n fa = current[figure._localId] = { count: 0 };\r\n }\r\n fa.count++;\r\n context.fillText( text, bounds.hx, bounds.ly - 2 * fa.count - (fa.count-1) * 12, bounds.width );\r\n }\r\n else {\r\n context.fillText( text, bounds.hx, bounds.ly-2, bounds.width );\r\n }\r\n\r\n updated = true;\r\n info.push({ annotation: ann, bounds: bounds, context: context });\r\n }\r\n }\r\n\r\n return updated;\r\n },\r\n\r\n draw({ view, context, transform, docIsland }) {\r\n\r\n const info = [];\r\n const current = {};\r\n\r\n const { tool, doc } = view;\r\n\r\n // [TODO] transform context, so we can draw annotations in any surface\r\n\r\n // Do not show the annotations while dragging the figures around\r\n if( ! doc._previewing &&\r\n ! ( tool && tool.type === 'Final' ) ) {\r\n\r\n context.font = ( view.viewDeltaToTexture(10) * ( view.is3D ? 0.65 : 1 ) ) +\"pt Calibri\";\r\n forEach( this.readyAnnotations(), ann => {\r\n if( ! ( docIsland && ! this.needsToDrawAnnotation(ann,docIsland) ) ) {\r\n this.drawAnnotation(context,transform,ann,current,info);\r\n }\r\n });\r\n\r\n view.fireEvent('annotationsupdated',view,info);\r\n }\r\n },\r\n\r\n readyAnnotations() {\r\n return filter(this._processedAnnotations,'ready');\r\n },\r\n\r\n somethingToDraw() {\r\n return this._annotationsAreDraw || this._annotations.length > 0;\r\n },\r\n\r\n // For 3D\r\n\r\n needsToDrawAnnotation(ann,docIsland) {\r\n const { figures } = ann;\r\n const ready = every( figures, figure => ! figure.invalidated() );\r\n if( ready ) {\r\n if( figures[0].page === docIsland.page ) {\r\n const bounds = Figures.bounds_(figures);\r\n return Frame.areOverlapping( docIsland.frame_(), Frame.fromBounds(bounds) );\r\n }\r\n }\r\n return false;\r\n },\r\n\r\n needsToDrawFor( docIsland ) {\r\n return some( this.readyAnnotations(), ann => this.needsToDrawAnnotation(ann,docIsland) );\r\n }\r\n\r\n});\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/plugin/figure-annotations.js\n **/","export * from './view-controls';\r\nexport * from './alignment-lines';\r\nexport * from './grid';\r\nexport * from './key-shortcuts';\r\nexport * from './wheel-shortcuts';\r\nexport * from './pages-selector';\r\nexport * from './tool-help';\r\nexport * from './figure-annotations';\r\nexport * from './special-pens';\r\nexport * from './active-renderer';\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/plugin/index.js\n **/","\r\nimport { Plugin } from '../view';\r\n\r\nimport { ZoomHelper, TouchZoomHelper } from '../tool/zoom';\r\nimport { PanHelper } from '../tool/pan';\r\n\r\nPlugin.ViewControls = Plugin.extend({ typeName: 'ViewControls',\r\n\r\n target: 'view',\r\n name: 'controls',\r\n drawTo: [ 'plugins' ],\r\n\r\n on_pointerdown({ view, event, cmdKey, shiftKey, docPoint, pointers }) {\r\n\r\n if( pointers.length === 2 ) {\r\n this.helper = new TouchZoomHelper(event);\r\n }\r\n else if( cmdKey ) {\r\n if( shiftKey ) {\r\n this.helper = new ZoomHelper(event);\r\n }\r\n else if( cmdKey ) {\r\n this.helper = new PanHelper(event);\r\n }\r\n }\r\n }\r\n});\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/plugin/view-controls.js\n **/","import { Point, Matrix, Bounds } from 'cdl';\r\n\r\nimport { Tool, padScaling } from '../view';\r\n\r\nimport { PanHelper } from './pan';\r\n\r\nfunction twoFingersTransform( sp1, cp1, sp2, cp2, center ) {\r\n\r\n // Adapted from https://github.com/erica/iphone-3.0-cookbook-/blob/master/C08-Gestures/14-Resize%20And%20Rotate/main.m\r\n const cx = center.x,\r\n cy = center.y;\r\n\r\n const x1 = sp1.x - cx,\r\n y1 = sp1.y - cy,\r\n x2 = sp2.x - cx,\r\n y2 = sp2.y - cy,\r\n x3 = cp1.x - cx,\r\n y3 = cp1.y - cy,\r\n x4 = cp2.x - cx,\r\n y4 = cp2.y - cy;\r\n\r\n // Solve the system:\r\n // [a b t1, -b a t2, 0 0 1] * [x1, y1, 1] = [x3, y3, 1]\r\n // [a b t1, -b a t2, 0 0 1] * [x2, y2, 1] = [x4, y4, 1]\r\n\r\n const d = (y1-y2)*(y1-y2) + (x1-x2)*(x1-x2);\r\n if( d < 0.1 ) {\r\n return Matrix.translate(x3-x1, y3-y1);\r\n }\r\n\r\n const a = (y1-y2)*(y3-y4) + (x1-x2)*(x3-x4),\r\n b = (y1-y2)*(x3-x4) - (x1-x2)*(y3-y4),\r\n tx = (y1*x2 - x1*y2)*(y4-y3) - (x1*x2 + y1*y2)*(x3+x4) + x3*(y2*y2 + x2*x2) + x4*(y1*y1 + x1*x1),\r\n ty = (x1*x2 + y1*y2)*(-y4-y3) + (y1*x2 - x1*y2)*(x3-x4) + y3*(y2*y2 + x2*x2) + y4*(y1*y1 + x1*x1);\r\n\r\n return new Matrix({ s00: a/d, s01: b/d, s10: -b/d, s11: a/d, dx: tx/d, dy: ty/d });\r\n}\r\n\r\nexport const TouchZoomHelper = function({ view, pointers }) {\r\n this._s = false; // [TODO]\r\n\r\n const [ touch1, touch2 ] = pointers;\r\n view.redraw('tools');\r\n this._d = {\r\n t1: touch1, t2: touch2, transform: new Matrix(),\r\n center: view.viewToDoc(Point.interpolate(touch1.start,touch2.start,0.5)),\r\n vt: view.viewTransform.clone() // We need a better abstraction here\r\n };\r\n};\r\nTouchZoomHelper.prototype = {\r\n\r\n move({ view }) {\r\n\r\n this._s = true;\r\n\r\n // this.toolhelp('Zoom and pan with two touches movement');\r\n\r\n const td = this._d;\r\n const touch1 = td.t1, touch2 = td.t2, center = td.center, vt = td.vt;\r\n const sp1 = vt.viewToDoc(view,touch1.start);\r\n const cp1 = vt.viewToDoc(view,touch1.current);\r\n const sp2 = vt.viewToDoc(view,touch2.start);\r\n const cp2 = vt.viewToDoc(view,touch2.current);\r\n const transform = twoFingersTransform(sp1,cp1,sp2,cp2,center);\r\n\r\n const scale = transform.scaleFactor();\r\n view.center = Matrix.transformAround(center,transform.inverted()).apply(vt.center);\r\n view.zoom = vt.zoom * scale;\r\n view.update$().then( () => {\r\n setTimeout(() => {\r\n view.render$(); \r\n }, 40)});\r\n},\r\n\r\n end({ view }) {\r\n view.redraw('tools');\r\n }\r\n};\r\n\r\n\r\nexport const ZoomHelper = function({ modelPoint }) {\r\n this.from = modelPoint;\r\n this.to = modelPoint;\r\n this.rectLimit = 0.1 * 96;\r\n};\r\n\r\nZoomHelper.prototype = {\r\n\r\n get bounds() {\r\n return Bounds.ofPoints([ this.from, this.to ]);\r\n },\r\n\r\n draw({ context, transformModel }) {\r\n const { bounds } = this;\r\n\r\n context.save();\r\n context.strokeStyle = '#0055FF';\r\n bounds.scalingTransformed(transformModel).draw(context);\r\n context.stroke();\r\n context.restore();\r\n },\r\n\r\n move({ modelPoint }) {\r\n this.to = modelPoint;\r\n },\r\n\r\n end({ view, shiftKey }) {\r\n const { bounds } = this;\r\n const limit = view.viewDeltaToDoc(this.rectLimit) * padScaling;\r\n if( bounds.width > limit && bounds.height > limit ) {\r\n view.zoomAround( bounds );\r\n }\r\n else { // clicking\r\n if( shiftKey ) {\r\n view.zoom /= 2;\r\n }\r\n else {\r\n view.zoom *= 2;\r\n }\r\n }\r\n view.update$().then( () => {\r\n setTimeout(() => {\r\n view.render$(); \r\n }, 40);\r\n }); \r\n},\r\n};\r\n\r\n\r\n\r\nexport const ZoomTool = Tool.extend({ typeName: 'ZoomTool',\r\n\r\n type: 'View',\r\n\r\n toolbarName: 'zoomTool',\r\n\r\n target: 'model',\r\n\r\n initTool() {\r\n this.toolhelp(\r\n 'Draw rectangle to zoom',\r\n 'Shift Click to zoom out',\r\n 'Hold Ctrl to pan'\r\n );\r\n },\r\n\r\n link( view ) {\r\n view.cursor = 'zoom-in';\r\n },\r\n\r\n unlink( view ) {\r\n view.cursor = 'default';\r\n },\r\n\r\n on_pointerdown({ view, event, which, cmdKey, pointers }) {\r\n\r\n if( pointers.length === 2 ) {\r\n this.helper = new TouchZoomHelper(event);\r\n return;\r\n }\r\n\r\n const leftClick = which === 1;\r\n\r\n if( leftClick ) {\r\n if( cmdKey ) {\r\n this.helper = new PanHelper(event);\r\n }\r\n else {\r\n // Bounds based zoom\r\n this.helper = new ZoomHelper(event);\r\n }\r\n }\r\n else {\r\n view.zoom /= 2;\r\n view.update$().then( () => {\r\n setTimeout(() => {\r\n view.render$(); \r\n }, 40)});\r\n }\r\n }\r\n});\r\n\r\nTool.Zoom = ZoomTool;\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/tool/zoom.js\n **/","\r\nimport { strokeDot } from 'gear';\r\n\r\nimport { Tool, fastThrottle } from '../view';\r\n\r\nexport const PanHelper = function({ view, viewPoint }) {\r\n this.viewPoint = viewPoint;\r\n this.viewPointDown = viewPoint;\r\n this.centerDown = view.center.clone();\r\n view.redraw('tools');\r\n};\r\nPanHelper.prototype = {\r\n\r\n draw({ context }) {\r\n context.save();\r\n context.strokeStyle = '#0055FF';\r\n strokeDot(context,this.viewPoint,8);\r\n context.restore();\r\n },\r\n\r\n move: fastThrottle(function({ view, event, viewPoint, isPrimary }) {\r\n if( ! isPrimary ) {\r\n return;\r\n }\r\n\r\n this.viewPoint = viewPoint;\r\n\r\n const zoom = view.zoom;\r\n const offset = viewPoint .minus( this.viewPointDown );\r\n view.center = this.centerDown.minus_( offset.x / zoom, - offset.y / zoom );\r\n view.update$();\r\n\r\n },20),\r\n\r\n end({ view }) {\r\n view.redraw('tools');\r\n }\r\n};\r\n\r\n\r\nexport const PanTool = Tool.extend({ typeName: 'PanTool',\r\n type: 'View',\r\n toolbarName: 'panTool',\r\n\r\n initTool() {\r\n this.toolhelp('Click and drag to pan');\r\n },\r\n\r\n link( view ) {\r\n view.cursor = 'pointer';\r\n },\r\n unlink( view ) {\r\n view.cursor = 'default';\r\n },\r\n\r\n on_pointerdown({ event, which, isPrimary }) {\r\n if( ! isPrimary ) {\r\n return; // ignore multitouch\r\n }\r\n const leftClick = which === 1 ;\r\n if( leftClick ) {\r\n this.helper = new PanHelper(event);\r\n }\r\n },\r\n on_pointerup( event ) {\r\n event.view.render$();\r\n },\r\n});\r\n\r\nTool.Pan = PanTool;\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/tool/pan.js\n **/","import { Point, Color } from 'cdl';\r\nimport { Plugin, redraw_this, strokePixelCenterSegment } from '../view';\r\n\r\nconst floor = Math.floor;\r\n\r\nconst snapValue = function( x, step ) {\r\n return floor( x / step )*step;\r\n};\r\n\r\nPlugin.Grid = Plugin.extend({ typeName: 'GridPlugin',\r\n\r\n drawTo: ['plugins'],\r\n name: 'grid',\r\n target: 'model',\r\n\r\n Properties:{\r\n color: { type: 'Color', def: new Color({ rgb: '5680CC', alpha: 0.5 }), owned: true, onChange: redraw_this },\r\n step: { type: 'number', def: 25.4, onChange: redraw_this }\r\n },\r\n\r\n clone() {\r\n return Plugin.Grid(this);\r\n },\r\n\r\n draw({ view, context, transform }) {\r\n const bounds = view.bounds,\r\n step = this._step,\r\n lx = snapValue(bounds.lx,step),\r\n ly = snapValue(bounds.ly,step),\r\n hx = snapValue(bounds.hx,step) + step,\r\n hy = snapValue(bounds.hy,step) + step;\r\n\r\n context.lineWidth = 1;\r\n context.strokeStyle = this._color.rgba;\r\n\r\n for( let x = lx ; x <= hx ; x += step ) {\r\n strokePixelCenterSegment(context,new Point(x,ly),new Point(x,hy),transform);\r\n }\r\n\r\n for( let y = ly ; y <= hy ; y += step ) {\r\n strokePixelCenterSegment(context,new Point(lx,y),new Point(hx,y),transform);\r\n }\r\n }\r\n});\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/plugin/grid.js\n **/","import { forEach, map, invokeMap } from 'lodash';\r\nimport { Plugin, Tool } from '../view';\r\nimport { Config } from 'config'\r\n\r\nfunction preventDefault(event ) {\r\n event.preventDefault();\r\n}\r\nfunction bump(e,canvas,figures,x,y) {\r\n preventDefault(e);\r\n canvas.bump(figures, x, y);\r\n canvas.commit$();\r\n}\r\n\r\nPlugin.KeyShortcuts = Plugin.extend({ typeName: 'KeyShortcutsPlugin',\r\n\r\n name: 'keyShortcuts',\r\n\r\n target: 'view',\r\n\r\n link( view ) {\r\n view.on({'selectionchanged':this.onSelectionChanged},this);\r\n },\r\n\r\n clone() {\r\n return Plugin.KeyShortcuts(this);\r\n },\r\n\r\n on_keyup({ view, event, altKey }) {\r\n if( ! altKey ) {\r\n preventDefault(event);\r\n return this.on_keyup_alt(event);\r\n }\r\n },\r\n\r\n // [TODO] This should be part of the view API\r\n startTransparentMode() {\r\n if( ! this._transparentMode ) {\r\n const { view } = this;\r\n const tf = this._transparentFigureViews = map(view.selectedFigures, figure => view.figureView(figure) );\r\n invokeMap(tf,'mask');\r\n this._transparentMode = true;\r\n view.render$();\r\n }\r\n },\r\n endTransparentMode() {\r\n if( this._transparentMode ) {\r\n forEach( this._transparentFigureViews, fv => { fv.hideMask(); });\r\n this._transparentFigureViews = null;\r\n this._transparentMode = false;\r\n this.view.render$();\r\n }\r\n },\r\n\r\n\r\n on_keydown_alt() {\r\n this.startTransparentMode();\r\n },\r\n\r\n on_focusout() {\r\n this.endTransparentMode();\r\n },\r\n on_keyup_alt() {\r\n this.endTransparentMode();\r\n },\r\n\r\n onSelectionChanged() {\r\n if( this._transparentMode ) {\r\n this.endTransparentMode();\r\n this.startTransparentMode();\r\n }\r\n },\r\n\r\n on_keydown({ view, event, which, char, shiftKey, altKey, cmdKey }) {\r\n\r\n // console.log('keyShortcuts - keydown');\r\n\r\n if( altKey ) {\r\n preventDefault(event);\r\n return this.on_keydown_alt(event);\r\n }\r\n\r\n char = char.toLowerCase();\r\n\r\n if( cmdKey && !altKey && !shiftKey ) {\r\n var lKeyValues = Array.from(Config.hotKeys.values()); \r\n switch( char ) {\r\n case 'z':\r\n if (!lKeyValues.includes('Undo'))\r\n {\r\n preventDefault(event);\r\n if( view.canUndo() ) {\r\n view.undo();\r\n }\r\n return; \r\n }\r\n case 'y':\r\n if (!lKeyValues.includes('Redo'))\r\n {\r\n preventDefault(event);\r\n if( view.canRedo() ) {\r\n view.redo();\r\n }\r\n return;\r\n }\r\n }\r\n }\r\n\r\n var hk_char = ( ( cmdKey ) ? 'CTRL+' : '' ) + ( ( altKey ) ? 'ALT+' : '' ) + ( ( shiftKey ) ? 'SHIFT+' : '' ) + char ;\r\n var hk = Config.hotKeys.get(hk_char) ;\r\n\r\n switch( hk ) {\r\n case 'Undo':\r\n preventDefault(event);\r\n if( view.canUndo() ) {\r\n view.undo();\r\n }\r\n return;\r\n case 'Redo':\r\n preventDefault(event);\r\n if( view.canRedo() ) {\r\n view.redo();\r\n }\r\n return;\r\n case 'Pan':\r\n view.tool = ( view.tool == Tool.Pan() ) ? 'Select' : Tool.Pan();\r\n break;\r\n case 'Select':\r\n view.tool = 'Select';\r\n break;\r\n case 'ZoomIn':\r\n view.tool = ( view.tool == Tool.Zoom() ) ? 'Select' : Tool.Zoom();\r\n view.zoom *= 1.10 ;\r\n break;\r\n case 'ZoomOut':\r\n view.tool = ( view.tool == Tool.Zoom() ) ? 'Select' : Tool.Zoom();\r\n view.zoom /= 1.10 ;\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n const { tool } = view;\r\n if( tool && tool.isCommitable ) {\r\n switch( which ) {\r\n case 13: // Enter\r\n case 27: // Esc\r\n preventDefault(event);\r\n tool.commit$();\r\n break;\r\n }\r\n }\r\n else if( ! tool || tool.allowKeyShortcuts ) {\r\n\r\n const selectedFigures = view.selectedFigures;\r\n\r\n if( cmdKey ) {\r\n\r\n switch( char ) {\r\n\r\n // Select all\r\n //========================================================\r\n case 'a':\r\n preventDefault(event);\r\n view.selectAll();\r\n return view.render$();\r\n\r\n // Duplicate\r\n //========================================================\r\n case 'd':\r\n preventDefault(event);\r\n if( view.canDuplicate(selectedFigures) ) {\r\n view.duplicate( selectedFigures );\r\n view.commit$();\r\n }\r\n break;\r\n\r\n // Copy\r\n //========================================================\r\n case 'c':\r\n preventDefault(event);\r\n if( view.canCopy(selectedFigures) ) {\r\n view.copy(selectedFigures);\r\n }\r\n break;\r\n\r\n // Cut\r\n //========================================================\r\n case 'x':\r\n preventDefault(event);\r\n if( view.canCut(selectedFigures) ) {\r\n view.cut(selectedFigures);\r\n return view.commit$();\r\n }\r\n break;\r\n\r\n // Paste\r\n //========================================================\r\n case 'v':\r\n preventDefault(event);\r\n if( view.canPaste() ) {\r\n view.pasteAt$( view.center ) .then( () => {\r\n return view.commit$();\r\n });\r\n }\r\n break;\r\n\r\n // Group\r\n //========================================================\r\n case 'g':\r\n preventDefault(event);\r\n if( view.canGroup(selectedFigures) ) {\r\n view.group(selectedFigures);\r\n return view.commit$();\r\n }\r\n break;\r\n\r\n // Ungroup\r\n //========================================================\r\n case 'u':\r\n preventDefault(event);\r\n if( view.canUngroup(selectedFigures) ) {\r\n view.ungroup(selectedFigures);\r\n return view.commit$();\r\n }\r\n break;\r\n\r\n default:\r\n // Undo/redo are managed directly by Canvas\r\n }\r\n }\r\n\r\n // console.log(which);\r\n switch( which ) {\r\n case 46: // Del\r\n preventDefault(event);\r\n if( view.canRemove(selectedFigures) ) {\r\n view.remove(selectedFigures);\r\n return view.commit$();\r\n }\r\n break;\r\n\r\n case 8: // Backspace (Mac) => Del\r\n if (/Mac/.test(navigator.platform)) {\r\n preventDefault(event);\r\n if( view.canRemove(selectedFigures) ) {\r\n view.remove(selectedFigures);\r\n return view.commit$();\r\n }\r\n }\r\n break;\r\n\r\n case 9: // Tab\r\n preventDefault(event);\r\n view.selectNext( shiftKey ? -1 : 1 );\r\n return view.render$();\r\n\r\n case 32 : // Space\r\n case 113: // F2\r\n preventDefault(event);\r\n if( selectedFigures.length === 1 ) {\r\n const figure = selectedFigures[0];\r\n if( view.canEditContent(figure) ) {\r\n return view.editContent(figure);\r\n }\r\n }\r\n break;\r\n\r\n case 27: // Esc\r\n preventDefault(event);\r\n if( view.editingContent() ) {\r\n return view.commitContent$();\r\n }\r\n else if( selectedFigures.length > 0 ) {\r\n selectedFigures.clear();\r\n view.render$();\r\n }\r\n break;\r\n\r\n case 13: // Enter\r\n preventDefault(event);\r\n if( view.editingContent() ) {\r\n return view.commitContent$();\r\n }\r\n break;\r\n }\r\n\r\n if( view.canBump(selectedFigures) ) {\r\n switch( which ) {\r\n case 40: // Down\r\n return bump(event,view,selectedFigures, 0, -1);\r\n case 37: // Left\r\n return bump(event,view,selectedFigures, -1, 0);\r\n case 39: // Right\r\n return bump(event,view,selectedFigures, 1, 0);\r\n case 38: // Up\r\n return bump(event,view,selectedFigures, 0, 1);\r\n }\r\n }\r\n }\r\n }\r\n});\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/plugin/key-shortcuts.js\n **/","import { forEach, map, invokeMap } from 'lodash';\r\nimport { Plugin, Tool } from '../view';\r\nimport { Config } from 'config'\r\n\r\nfunction preventDefault(event ) {\r\n event.preventDefault();\r\n}\r\nfunction bump(e,canvas,figures,x,y) {\r\n preventDefault(e);\r\n canvas.bump(figures, x, y);\r\n canvas.commit$();\r\n}\r\n\r\nPlugin.WheelShortcuts = Plugin.extend({ typeName: 'WheelShortcutsPlugin',\r\n\r\n name: 'wheelShortcuts',\r\n\r\n target: 'view',\r\n speed: 0.002,\r\n zoomMin: 1,\r\n zoomMax: 10,\r\n\r\n clone() {\r\n return Plugin.WheelShortcuts(this);\r\n },\r\n\r\n on_mousewheel({view, event, wheelDelta, detail})\r\n {\r\n\t\tvar delta = 0;\r\n\r\n\t\tif( wheelDelta !== undefined ) {\r\n\t\t\t// WebKit / Opera / Explorer 9\r\n\t\t\tdelta = event.wheelDelta;\r\n\t\t} else if( detail !== undefined ) {\r\n\t\t\t// Firefox\r\n\t\t\tdelta = - event.detail;\r\n }\r\n\r\n var lZoom = view.zoom;\r\n \r\n if (delta > 0)\r\n lZoom *= (1 + this.speed * wheelDelta);\r\n else\r\n lZoom /= (1 - this.speed * wheelDelta);\r\n\r\n if (lZoomthis.zoomMax)\r\n lZoom = this.zoomMax;\r\n \r\n view.zoom = lZoom;\r\n }\r\n\r\n});\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/plugin/wheel-shortcuts.js\n **/","import { forEach } from 'lodash';\r\nimport { Matrix } from 'cdl';\r\nimport { Plugin } from '../view';\r\n\r\nconst { ceil, floor, sqrt } = Math;\r\n\r\nPlugin.PagesSelector = Plugin.extend({ typeName: 'PagesSelectorPlugin',\r\n\r\n name: 'pagesSelector',\r\n\r\n drawTo: [ 'plugins' ],\r\n\r\n target: 'view',\r\n\r\n init( config ) {\r\n this.callParent(config);\r\n this._visible = false;\r\n },\r\n\r\n clone() { return new Plugin.PagesSelector(); },\r\n\r\n show$() {\r\n const view = this.view;\r\n if( view._mainDocument._pages.length > 1 ) {\r\n view._stateChanged = true;\r\n view.selectedFigures.clear();\r\n this.takeControl();\r\n }\r\n return view.render$();\r\n },\r\n\r\n on_click({ view, event, viewPoint }) {\r\n event.preventDefault();\r\n const doc = view._mainDocument;\r\n const { width, height } = view.scene;\r\n\r\n const { pages } = doc;\r\n\r\n const columns = Math.ceil( Math.sqrt(pages.length) ),\r\n rows = Math.ceil( pages.length/columns ),\r\n columnsWidth = width * (1.0/columns),\r\n rowsHeight = height * (1.0/rows),\r\n columnsInLastRow = ((pages.length-1) % columns) + 1,\r\n columnsWidthForLastRow = width * (1.0/columnsInLastRow);\r\n\r\n const { x, y } = viewPoint;\r\n\r\n if( x > 0 && x < width &&\r\n y > 0 && y < height ) {\r\n\r\n const selectedRow = floor( y / rowsHeight );\r\n const lastRow = (selectedRow===rows-1);\r\n const selectedColumn = floor( x / (lastRow?columnsWidthForLastRow:columnsWidth) );\r\n\r\n const selectedPage = selectedRow * columns + selectedColumn;\r\n doc.activePage = pages[selectedPage];\r\n\r\n view._stateChanged = true;\r\n\r\n this.visible = false;\r\n view.renderer.visible = true;\r\n\r\n view.redrawAll();\r\n\r\n view._pagesSelector = false;\r\n view._pagesSelectorDraw = false;\r\n\r\n view.render$();\r\n this.releaseControl();\r\n }\r\n\r\n event.stopPropagation();\r\n },\r\n\r\n draw({ view, context }) {\r\n\r\n // Support for Mask plugin\r\n let specialPens = view.specialPens;\r\n if( specialPens && specialPens._maskVisible ) {\r\n specialPens.prepareMask();\r\n }\r\n\r\n const { width, height } = context.canvas;\r\n\r\n const pages = view._mainDocument._pages,\r\n length = pages.length,\r\n\r\n columns = ceil(sqrt(length)),\r\n rows = ceil(length/columns),\r\n\r\n scale = 1 / Math.max(columns,rows),\r\n\r\n columnsWidth = width * (1.0/columns),\r\n rowsHeight = height * (1.0/rows),\r\n\r\n xOffset = ( columnsWidth - width*scale ) / 2,\r\n yOffset = ( rowsHeight - height*scale ) / 2,\r\n\r\n columnsInLastRow = ( ( length-1) % columns ) + 1,\r\n columnsWidthForLastRow = width * (1.0/columnsInLastRow),\r\n xOffsetForLastRow = ( columnsWidthForLastRow - width*scale ) / 2;\r\n\r\n forEach( pages, (page,i) => {\r\n\r\n const col = i % columns,\r\n row = floor(i / columns),\r\n\r\n lastRow = row === rows-1,\r\n cWidth = ( lastRow ? columnsWidthForLastRow : columnsWidth ),\r\n rHeight = rowsHeight,\r\n\r\n lcx = col * cWidth,\r\n lcy = row * rowsHeight,\r\n\r\n lx = lcx + ( lastRow ? xOffsetForLastRow : xOffset ),\r\n ly = lcy + yOffset;\r\n\r\n context.save();\r\n\r\n context.beginPath();\r\n context.rect(lcx,lcy,cWidth,rHeight);\r\n context.clip();\r\n\r\n const transform = Matrix.concat( Matrix.translate(lx,ly), Matrix.scale(scale),\r\n view.pageViewTransform(page).matrixFor(view) );\r\n\r\n const backgroundPage = view.backgroundPageFor(page);\r\n\r\n view.drawPage(backgroundPage,context,transform,{ viewport: transform });\r\n\r\n view.drawPage(page,context,transform,{ wireframe: view._wireframe, viewport: transform });\r\n\r\n if( specialPens ) {\r\n specialPens.drawForPage(page,context,transform,{ lx: lcx, ly: lcy, width: cWidth, height: rHeight });\r\n }\r\n\r\n context.restore();\r\n });\r\n\r\n if( specialPens && specialPens._maskVisible ) {\r\n specialPens.blitMask(context);\r\n }\r\n }\r\n});\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/plugin/pages-selector.js\n **/","import { Config } from 'config';\r\nimport { forEach } from 'lodash';\r\nimport { Bounds } from 'cdl';\r\n\r\nimport { Plugin, redraw_this } from '../view';\r\n\r\nPlugin.ToolHelp = Plugin.extend({ typeName: 'ToolHelpPlugin',\r\n\r\n drawTo: ['plugins'],\r\n\r\n name: 'toolHelp',\r\n\r\n target: 'view',\r\n\r\n Properties: {\r\n collapsed: { type: 'boolean', def: true, onChange: redraw_this }\r\n },\r\n\r\n on_click({ view, event, viewPoint }) {\r\n const { height } = view;\r\n const toolhelpBounds = new Bounds( 0, height - ( Config.debug ? 60 : 30 ), 80, height - ( Config.debug ? 33 : 0 ) );\r\n if( toolhelpBounds.contains( viewPoint ) ) {\r\n this.collapsed = ! this._collapsed;\r\n event.stopPropagation();\r\n }\r\n },\r\n\r\n draw({ view, context }) {\r\n\r\n if( view.hasFocus() ) {\r\n\r\n context.font = 'italic 11pt Calibri';\r\n context.textBaseline = 'bottom';\r\n context.textAlign = 'left';\r\n context.fillStyle = '#333';\r\n\r\n const ls = 16;\r\n const { width, height } = view;\r\n const hy = height - ( Config.debug ? 40 : 6 );\r\n\r\n if( this._visible ) {\r\n\r\n let toolhelp = view._toolhelp;\r\n if( toolhelp ) {\r\n const lines = toolhelp.split('\\n');\r\n let h = hy - (lines.length-1) * ls;\r\n forEach( lines, line => {\r\n context.fillText( line, 6, h, width );\r\n h += ls;\r\n });\r\n }\r\n else {\r\n context.fillText( 'Need help?', 6, hy, width );\r\n }\r\n }\r\n }\r\n }\r\n});\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/ui/plugin/tool-help.js\n **/","import { assign } from 'lodash';\r\n\r\nimport * as View from '../ui/view';\r\nimport * as Plugin from '../ui/plugin';\r\n\r\nlet { Cx } = window;\r\n\r\nassign( Cx, View );\r\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/web/ui.js\n **/"],"sourceRoot":""}