@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