<@doc alias="layout" hierarchy="GMLDOM"> Interactor Layout Aspect (c) SAP AG 2003-2006. All rights reserved. #INCLUDE[svg:defs.inc] #ALIAS[l=core.lyt:Layout] //NOTE: TEMP: This class is a temporary workaround - it will be removed!!! Aspect FormViewLayout for Layout; inherit InteractorLayout; //attach gml2:FormView; property oneColumnWidth = ''; metadata for oneColumnWidth = { editor: { type: 'user', readonly: true, label: '#TEXT[XFLD_DOM_COL_WIDTHS_LBL]', descr: '#TEXT[XTOL_DOM_COL_WIDTHS_DESC]', popup: '#URL[gml2:tools.editors.FormViewColumnsDlg.htm]', getter: 'data.getOneColumnWidth()', priority: 240, visible: 'return data.is1FixMode()', active: '$ENV.contextBoard.isa("lyt:Layout")', group: 'Layout' } } override virtual method layoutContents(focusWidget, operation) if ((base.formLayout != 'vflow') && (base.formLayout != 'hflow')) return; return this.supercall(); end override virtual method buildRearrangeParams(focusWidget, operation, contentsSize, syncElems) var board = this.board; var sessionCache = board.sessionCache; var bSize = SPLIT(base.size); var rootInfo = { object: base, // this object (interactor/group/control) w : this.calcContentsW(INT(bSize[0]||320)), h : this.calcContentsH(this.getContentsOffsetHeight(bSize)), focus : null, // if children contain focusWidget's ctlInfo, this points to it. scaleMode : base.scaleMode||'fix', columns : base.columns||1, operation : operation, children: [], // ctlInfo of child objects (groups/controls) currentFocus : null, syncElems : syncElems }; fillInfo(this, rootInfo); return rootInfo; function fillInfo(parentWidget, parentInfo) { var controls = parentWidget.base.controls||{}; for (var iter in controls) { var ctlWidget = board.getWidget(iter); var ctl = controls[iter]; var pos = SPLIT(sessionCache[ctl.id + '_pos'] ? sessionCache[ctl.id + '_pos'].value : ctl.pos); var size = SPLIT(sessionCache[ctl.id + '_size'] ? sessionCache[ctl.id + '_size'].value : ctl.size); var ctlInfo = { object : ctl, // group : false, melting : false, interactor : false, x : INT(pos[0]||-1), y : INT(pos[1]||-1), w : INT(size[0]||-100), h : INT(size[1]||-16), // label : ctlWidget.getLabelText(), labelWidth : ctlWidget&&ctlWidget.labelWidth||0, index : ctl.index, freeSize : ctlWidget&&ctlWidget.freeSize, minWidth : ctlWidget&&ctlWidget.minWidth||0, maxWidth : ctl.maxWidth, fixedWidth : ctlWidget&&ctlWidget.fixedWidth, colspan : ctl.colspan||1, focus : false, formCol : ctl.getProperty('#ASPECT[l:formCol]'), formRow : ctl.getProperty('#ASPECT[l:formRow]'), fixedSize : ctl.fixed, indent : BVAL(ctl.indent, true), operation : operation, children : null }; parentInfo.children.push(ctlInfo); if (focusWidget && ctlWidget && focusWidget.id == ctlWidget.id) { parentInfo.focus = ctlInfo; rootInfo.currentFocus = ctlInfo; } if (ISA(ctl, 'gml2:ImageLoader', 'gml2:Image', 'gml2:Gauge')) { var useRatio = true; if (!ISA(ctl, 'gml2:Gauge')) useRatio = ctl.scaleMode == 'aspect'; if (useRatio) ctlInfo.aspectRatio = ctl.origAspect; } if (ctlWidget && ctlWidget.isa('#NS[MeltingBoxLayout]')) { // ctlInfo.group = true; ctlInfo.melting = true; ctlInfo.children = []; fillInfo(ctlWidget, ctlInfo); } if (ctlWidget && ISA(ctl, 'gml2:GroupBox')) { // ctlInfo.group = true; ctlInfo.children = []; fillInfo(ctlWidget, ctlInfo); } }// for each control } // fillInfo end override virtual method adjustDndArrows(clientX, clientY, currentElement, checkParent) var data = this.supercall(); try { var board = this.board; var tbWidget = currentElement&&(board.getWidget(currentElement.parentElement)||board.getWidget(currentElement.parentElement.parentElement)); // currentElement from palette OR [from same form AND NOT from toolbar] if (!currentElement || (board.getWidget(currentElement).getBox() == this && tbWidget.Class.fullname != 'core.lyt:ToolbandLayout' && (board.selection.size == 1 || tbWidget == this))) { var r = this.getAbsoluteContentRect(); var leftShift = r.x, topShift = r.y; var map = base.getGridMap(); var columns = base.columns; var oneFix = base.is1FixMode(); var contents = this.contents;//this.getContentScroll().w clientX += board.editbox.scrollLeft - leftShift + contents.scrollLeft; clientY += board.editbox.scrollTop - topShift + contents.scrollTop; data.dropObjLeft = r.x + this.getDropLeftShift(); data.dropObjTop = r.y; data.dropObjWidth = r.w; data.dropObjHeight = r.h; for (var j=0, len1=map.length; j clientX && aData.y1 <= clientY && aData.y2 > clientY) { var newParent = true; if (checkParent && currentElement && currentElement.parentElement.parentElement && currentElement.parentElement.parentElement.id == this.id) newParent = undefined; data.formObjRow = aData.row; data.formObjCol = aData.col; data.formObjLeft = aData.x1; data.formObjTop = aData.y1; data.formObjWidth = (i == columns - 1 && !oneFix ? INT(contents.clientWidth) : aData.x2) - aData.x1; data.formObjHeight = aData.y2 - aData.y1; data.formObjVisible = true; data.newIndex = aData.index; data.newOffX = aData.x1; data.newOffY = aData.y1; data.newParent = newParent; data.dropObjVisible = true; data.cellObject = this.cellObject; return data; } } } data.dropObjVisible = false; } else return tbWidget.adjustParentArrows(currentElement); } catch (ex) {} return data; end override virtual method adjustParentArrows(currentElement) var data = this.supercall(); try { data.dropObjVisible = true; var r = this.getAbsoluteContentRect(); var leftShift = r.x, topShift = r.y; } catch(ex) {} return data; end <@method name="resizeFeatures"> Resizes box features after box resize or feature visibility change override virtual method resizeFeatures() this.addition = {}; this.supercall(); var addition = this.addition; var columns = base.columns||1; var map = base.getGridMap(); var oneFix = base.is1FixMode(); var oneColumnWidth = (map[0]&&map[0][0].x2)||INT(base.getOneColumnWidth()); var len1 = columns ? columns - (oneFix ? 0 : 1) : 0; var len2 = map.length ? map.length - 1 : 0; var height = '100%'; var contents = this.contents; //arranging horizontal rulers for(var i=0; i clientX && aData.y1 <= clientY && aData.y2 > clientY) { res.cell = aData; res.checkLastRow = j == len - 1 && !aData.free; break; } } } return res; end virtual method isRowAfterLast(point) var cell = this.getCellFromPoint(point).cell; if (!cell) return true; var lastRow = -1; var controls = base.controls; for (var iter in controls) lastRow = MAX(lastRow, controls[iter].getProperty('#ASPECT[l:formRow]')); return cell.row > lastRow; end virtual method addColumn(point) var batch = []; batch.push({element: base, parent:base.parent, action:'update', propName:'colDefs', value:undefined}); batch.push({element: base, parent:base.parent, action:'update', propName:'columns', value:base.columns + 1}); $ENV.batchSyncState(batch, {layout:true, prop:true}, true, true, 'add column'); end virtual method insertColumn(point, flag) //flag == after var batch = []; var cell = this.getCellFromPoint(point).cell; if (!cell) return; var column = cell.col; var controls = base.controls; for (var iter in controls) { var ctl = controls[iter]; var formCol = ctl.getProperty('#ASPECT[l:formCol]'); if (formCol > column || (flag ? false : formCol == column)) batch.push({element: ctl, parent:base, action:'update', propName:'#ASPECT[l:formCol]', value:formCol + 1}); } batch.push({element: base, parent:base.parent, action:'update', propName:'colDefs', value:undefined}); batch.push({element: base, parent:base.parent, action:'update', propName:'columns', value:base.columns + 1}); $ENV.batchSyncState(batch, {layout:true, prop:true}, true, true, 'insert column'); end virtual method removeColumn(point) var batch = []; var cell = this.getCellFromPoint(point).cell; if (!cell) return; var needConfirmation = false; var column = cell.col; //check mouse position before var controls = base.controls; for (var iter in controls) { var ctl = controls[iter]; var formCol = ctl.getProperty('#ASPECT[l:formCol]'); if (formCol == column) { needConfirmation = true; break; } } if (needConfirmation && !CONFIRM('#TEXT[XMSG_DOM_FORM_DELETE_COL_WARNING]', 'OK Cancel')) return; for (var iter in controls) { var ctl = controls[iter]; var formCol = ctl.getProperty('#ASPECT[l:formCol]'); if (formCol == column) batch.push({element: ctl, parent:base, action:'remove'}); else if (formCol > column) batch.push({element: ctl, parent:base, action:'update', propName:'#ASPECT[l:formCol]', value:formCol - 1}); } batch.push({element: base, parent:base.parent, action:'update', propName:'colDefs', value:undefined}); batch.push({element: base, parent:base.parent, action:'update', propName:'columns', value:base.columns - 1}); $ENV.batchSyncState(batch, {layout:true, prop:true}, true, true, 'remove column'); end virtual method insertRow(point, flag) //flag == before var batch = []; var cell = this.getCellFromPoint(point).cell; if (!cell) return; var row = cell.row; var controls = base.controls; for (var iter in controls) { var ctl = controls[iter]; var formRow = ctl.getProperty('#ASPECT[l:formRow]'); if (formRow > row || (flag ? formRow == row : false)) batch.push({element: ctl, parent:base, action:'update', propName:'#ASPECT[l:formRow]', value:formRow + 1}); } $ENV.batchSyncState(batch, {layout:true, prop:true}, true, true, 'insert row'); end virtual method removeRow(point) var batch = []; var cell = this.getCellFromPoint(point).cell; if (!cell) return; var needConfirmation = false; var row = cell.row; var controls = base.controls; for (var iter in controls) { var ctl = controls[iter]; var formRow = ctl.getProperty('#ASPECT[l:formRow]'); if (formRow == row) { needConfirmation = true; break; } } if (needConfirmation && !CONFIRM('#TEXT[XMSG_DOM_FORM_DELETE_ROW_WARNING]', 'OK Cancel')) return; for (var iter in controls) { var ctl = controls[iter]; var formRow = ctl.getProperty('#ASPECT[l:formRow]'); if (formRow == row) batch.push({element: ctl, parent:base, action:'remove'}); else if (formRow > row) batch.push({element: ctl, parent:base, action:'update', propName:'#ASPECT[l:formRow]', value:formRow - 1}); } $ENV.batchSyncState(batch, {layout:true, prop:true}, true, true, 'remove row'); end virtual method shiftUpColumn(point) var batch = []; var cell = this.getCellFromPoint(point).cell; if (!cell) return; var column = cell.col; //check mouse position before var controls = base.controls; var columnControls = []; for (var iter in controls) { var ctl = controls[iter]; var formCol = ctl.getProperty('#ASPECT[l:formCol]'); if (formCol == column) columnControls.push(ctl); } SORTN(columnControls, '#ASPECT[l:formRow]'); for (var i=0, row=0, len=columnControls.length ; i row) batch.push({element: ctl, parent:base, action:'update', propName:'#ASPECT[l:formRow]', value:row++}); else if (formRow == row) row++; } $ENV.batchSyncState(batch, {layout:true, prop:true}, true, true, 'shift up'); end virtual method shiftUpForm(point) var batch = []; var controls = base.controls; var _controls = []; var columns = []; for (var iter in controls) _controls.push(controls[iter]); SORTN(_controls, '#ASPECT[l:formRow]'); for (var i=0, len=_controls.length ; i columns[formCol]) batch.push({element: ctl, parent:base, action:'update', propName:'#ASPECT[l:formRow]', value:columns[formCol]++}); else if (formRow == columns[formCol]) columns[formCol]++; } $ENV.batchSyncState(batch, {layout:true, prop:true}, true, true, 'shift up'); end virtual method applyGridOperation() var data = base.getProperty('layoutDelegationObj'); var func = this[data.action]; var argKeys = ['point', 'flag', 'columns']; var args = []; for (var i=0, len=argKeys.length; i