<@doc hierarchy="GMLDOM"> Layout Code (c) SAP AG 2003-2006. All rights reserved. Aspect ContainerLayout for Layout; inherit Box; constructor(board, parent) this.supercall(); var c = RULE('getChildWidgets', base); for (var iter in c) $DOM.createAspect('#NS[Layout]', c[iter], this.board, this); end override virtual method paint(parentElement) this.supercall(); var children = RULE('getChildWidgets', base); var board = this.board; for (var iter in children) { var child = board.getWidget(iter); if (child) child.paint();//TODO: DIMA - check it for inner scrollbar } if (this.selector) this.selector.htmlObject.syncSelection(); end override virtual method repaintContents(attr) if (this.features.resizeExpr) var policy = eval(this.features.resizeExpr); var children = RULE('getChildWidgets', base); var board = this.board; for (var iter in children) { var child = board.getWidget(iter); if (child) { child.repaint(attr); if (policy) child.setResizePolicy(policy); } } end override virtual method applyFrameStyle() if (!ISA(base, "gml2:Panel")) return; var ttlClassName = this.ttlbar.className; this.ttlbar.className = ttlClassName.replace(/FS\-\w+/, 'FS-' + UPPER(base.frameStyle)); var cntClassName = this.contents.className; this.contents.className = cntClassName.replace(/FS\-\w+/, 'FS-' + UPPER(base.frameStyle)); end override virtual method applyLayout(focusWidget, operation, repaint) if (this.isRendered) { this.isRendered = false; return false; } this.isRendered = true; try { if (this.applyToolbarLayout(focusWidget, operation).skipParent) return repaint; var board = this.board; var sessionCache = board.sessionCache; var baseID = base.id; var bSize = SPLIT(sessionCache[baseID + '_size'] ? sessionCache[baseID + '_size'].value : base.size); var cSize = {w:bSize[0], h:this.getContentsOffsetHeight(bSize)}; //this.getContentRect(); var rootInfo = this.buildRearrangeParams(focusWidget, operation, cSize); var changes = board.getChangesFromCache(rootInfo&&rootInfo.focus); // fixing window resize and cache problem if (focusWidget && focusWidget.id == baseID && sessionCache[baseID + '_size']) { changes[baseID + '_size'] = sessionCache[baseID + '_size']; delete sessionCache[baseID + '_size']; } var size = RULE('rearrangeWidgets', base, board, rootInfo, changes); if (!ISEMPTY(changes)) { RULE('doApplyLayout', base, changes); repaint = true; } if (operation != 'move') { var children = RULE('getChildWidgets', base); for (var iter in children) { var child = board.getWidget(iter); if (child) { if (changes[iter + '_size'] || (focusWidget && focusWidget.id == iter)) repaint |= child.applyLayout(focusWidget, operation, repaint); child.isRendered = false; } } } var parent = this.getParent(); if (!operation || (operation == 'resize' && rootInfo.focus && size)) { var dw = size.w - cSize.w; var dh = size.h - cSize.h; if (dw || dh) { var size = {w: INT(bSize[0]||320) + dw, h: INT(bSize[1]||240) + dh}; this.setBaseSize(size); if (parent) { if (parent.isa('core.lyt:Diagram')) { base.setProperty('size', size.w + ' ' + size.h, true); this.repaint('layout'); board.adjustSelection(); board.adjustGrid(); this.isRendered = false; } else { parent.applyLayout(this, operation, repaint); parent.isRendered = false; } return false; } } } if (repaint && !parent.isRendered) { this.repaint('layout'); board.adjustSelection(); return false; } } catch (e) { #LOG[2, 'Failed to applyLayout for ' + (base.name||base.Class.name)]; } return repaint; end override virtual method updateElements(operation, syncElems) if (this.toolbarID && base.showToolbar) this.getToolbar().updateElements(operation, syncElems); var board = this.board; var bSize = SPLIT(base.size); var rootInfo = this.buildRearrangeParams(null, operation, {w:bSize[0], h:this.getContentsOffsetHeight(bSize)}, syncElems); var changes = {}; RULE('rearrangeWidgets', base, board, rootInfo, changes); if (!ISEMPTY(changes)) RULE('doApplyLayout', base, changes); var children = RULE('getChildWidgets', base); for (var iter in children) { var child = board.getWidget(iter); if (child) child.updateElements(operation, syncElems); } end override virtual method buildRearrangeParams(focusWidget, operation, contentsSize, syncElems) var board = this.board; var sessionCache = board.sessionCache; var rootInfo = { object : base, w : contentsSize.w, h : contentsSize.h, minWidth : this.minWidth||30, minHeight : this.minHeight||30, focus : null, // if children contain focusWidget's childInfo, this points to it. scaleMode : base.scaleMode||'fit', operation : operation, children : [], // childInfo of child boxes syncElems : syncElems }; var children = RULE('getChildWidgets', base); for (var iter in children) { var boxWidget = board.getWidget(iter); var box = children[iter]; var pos = SPLIT(sessionCache[box.id + '_pos'] ? sessionCache[box.id + '_pos'].value : box.pos); var size = SPLIT(sessionCache[box.id + '_size'] ? sessionCache[box.id + '_size'].value : box.size); var childInfo = { object : box, x : INT(pos[0]||-1), y : INT(pos[1]||-1), w : INT(size[0]||-320), h : INT(size[1]||-240), minWidth : boxWidget&&boxWidget.minWidth||30, minHeight : boxWidget&&boxWidget.minHeight||30, index : box.index, // object's index in its parent. children : null // childInfo of child boxes }; rootInfo.children.push(childInfo); if (focusWidget && focusWidget.id == iter) rootInfo.focus = childInfo; } return rootInfo; end override virtual method adjustDndArrows(clientX, clientY, currentElement, checkParent) var data = {}; try { var r = this.getAbsoluteContentRect(); data.dropObjLeft = r.x; data.dropObjTop = r.y; data.dropObjWidth = r.w; data.dropObjHeight = r.h; data.dropObjVisible = true; } catch (ex) { #LOG[2, 'Failed to adjustDndArrows for ' + (base.name||base.Class.name)]; } return data; end // returns children in ordered array virtual method getOrderedChildren() var arr = []; var children = RULE('getChildWidgets', base); for (var iter in children) arr.push(children[iter]); return SORTN(arr, 'index'); end override virtual method onModelInsert(evt) var elem = evt.child; var C = RULE('getChildWidgets', base); if (!(elem.id in C)) return; var widget = $DOM.createAspect('#NS[Layout]', elem, this.board, this); widget.paint(); widget.repaint(); this.applyLayout(widget, 'insert'); this.isRendered = false; if (this.selector) this.selector.htmlObject.refresh(); // TODO; refactor this ugly thing together with all of ViewbarMgr end override virtual method onModelRemove(evt) var id = evt.child && evt.child.id; if (!id) return; //turn on layer removal flag if(ISA(this.base, 'gml2:TemporalContainer') && ISA(evt.child, 'gml2:Layer')) this.base.layerRemove = true; var child = this.board.getWidget(id); if (child) { var elem = child.elem, parent = elem && elem.parentElement; if (parent) parent.removeChild(elem); this.applyLayout(null, 'remove'); this.isRendered = false; if (this.selector) this.selector.htmlObject.refresh(); // TODO; refactor this ugly thing together with all of ViewbarMgr this.board.clearWidgetCache(child.base); } this.board.removeWidget(id); this.board.SELECT_NONE(); end