pane-axis-element.coffee
1 {CompositeDisposable} = require 'event-kit' 2 PaneResizeHandleElement = require './pane-resize-handle-element' 3 4 class PaneAxisElement extends HTMLElement 5 attachedCallback: -> 6 @subscriptions ?= @subscribeToModel() 7 @childAdded({child, index}) for child, index in @model.getChildren() 8 9 detachedCallback: -> 10 @subscriptions.dispose() 11 @subscriptions = null 12 @childRemoved({child}) for child in @model.getChildren() 13 14 initialize: (@model, @viewRegistry) -> 15 @subscriptions ?= @subscribeToModel() 16 @childAdded({child, index}) for child, index in @model.getChildren() 17 18 switch @model.getOrientation() 19 when 'horizontal' 20 @classList.add('horizontal', 'pane-row') 21 when 'vertical' 22 @classList.add('vertical', 'pane-column') 23 this 24 25 subscribeToModel: -> 26 subscriptions = new CompositeDisposable 27 subscriptions.add @model.onDidAddChild(@childAdded.bind(this)) 28 subscriptions.add @model.onDidRemoveChild(@childRemoved.bind(this)) 29 subscriptions.add @model.onDidReplaceChild(@childReplaced.bind(this)) 30 subscriptions.add @model.observeFlexScale(@flexScaleChanged.bind(this)) 31 subscriptions 32 33 isPaneResizeHandleElement: (element) -> 34 element?.nodeName.toLowerCase() is 'atom-pane-resize-handle' 35 36 childAdded: ({child, index}) -> 37 view = @viewRegistry.getView(child) 38 @insertBefore(view, @children[index * 2]) 39 40 prevElement = view.previousSibling 41 # if previous element is not pane resize element, then insert new resize element 42 if prevElement? and not @isPaneResizeHandleElement(prevElement) 43 resizeHandle = document.createElement('atom-pane-resize-handle') 44 @insertBefore(resizeHandle, view) 45 46 nextElement = view.nextSibling 47 # if next element isnot resize element, then insert new resize element 48 if nextElement? and not @isPaneResizeHandleElement(nextElement) 49 resizeHandle = document.createElement('atom-pane-resize-handle') 50 @insertBefore(resizeHandle, nextElement) 51 52 childRemoved: ({child}) -> 53 view = @viewRegistry.getView(child) 54 siblingView = view.previousSibling 55 # make sure next sibling view is pane resize view 56 if siblingView? and @isPaneResizeHandleElement(siblingView) 57 siblingView.remove() 58 view.remove() 59 60 childReplaced: ({index, oldChild, newChild}) -> 61 focusedElement = document.activeElement if @hasFocus() 62 @childRemoved({child: oldChild, index}) 63 @childAdded({child: newChild, index}) 64 focusedElement?.focus() if document.activeElement is document.body 65 66 flexScaleChanged: (flexScale) -> @style.flexGrow = flexScale 67 68 hasFocus: -> 69 this is document.activeElement or @contains(document.activeElement) 70 71 module.exports = PaneAxisElement = document.registerElement 'atom-pane-axis', prototype: PaneAxisElement.prototype