<@doc hierarchy="GMLDOM">
	Layout Code

	<copyright>(c) SAP AG 2003-2006. All rights reserved.</copyright>
</doc@>

#ALIAS[l=core.lyt:Layout]

// NOTE: Write decent help for all methods here
Class FormRuler inherit Ruler;
// implement ILayoutable; // NOTE: Uncomment, when ILayoutable will have only neccessary methods

property ruleImageShiftLeft = 3; //width = 7;
property correctX = 0;

static readonly property _hType = 'HR';
static readonly property _vType = 'SPAN';
static readonly property _hCSS = 'BOX-RULER H-BOX-RULER';
static readonly property _vCSS = 'BOX-RULER V-BOX-RULER';
static readonly property _rulerType = 'formruler';

constructor(board, parent, index, isVertical)
	this.supercall(board, parent, index, isVertical);
end

override method _getHType()
	return this._hType;
end

override method _getVType()
	return this._vType;
end

override method _getHCSS()
	return this._hCSS;
end

override method _getVCSS()
	return this._vCSS;
end

override method _getType()
	return this._rulerType;
end

override method _getParentElem(parent)
	return parent.contents;
end

override method canApplayRect(x, y, w, h)
    var index = this.index;
    var parent = this.getParent();
    var parentBase = parent.base;
    var columns = parentBase.columns;
    var vRulers = parent.vRulers;
    var ruleImageShiftLeft = this.ruleImageShiftLeft;
    var defs = RULE('defineWidget', null, parentBase);
    var minColumnWidth = defs['minColumnWidth'];
    var _minColumnWidth = (parentBase.scaleMode == 'fix' && columns == 1) ? minColumnWidth : 1;
	// use this value for compensate half column margin
	var addMargin = (parentBase.scaleMode == 'fix' && columns == 1) ? defs['margin1_5'] : 0;
	var parentWidth = MAX(parent.contents.clientWidth, parent.contents.scrollWidth);
    var leftBound = index > 0 ? INT(vRulers[index-1].elem.style.left) + defs['margin1_5'] : defs['margin'];
    var rightBound = index < columns - 2 ? INT(vRulers[index+1].elem.style.left) : parentWidth;
    if (leftBound + minColumnWidth - ruleImageShiftLeft > x) this.correctX = leftBound + minColumnWidth - ruleImageShiftLeft;
    else if (rightBound - minColumnWidth - defs['margin1_5'] - ruleImageShiftLeft < x) this.correctX = rightBound - minColumnWidth - defs['margin1_5'] - ruleImageShiftLeft;
    else this.correctX = x;
    x += ruleImageShiftLeft;
    return leftBound + _minColumnWidth + addMargin <= x && rightBound - _minColumnWidth - defs['margin1_5'] - addMargin >= x;
end

override method applyPos(dontChangeFoc) 
    var parent = this.getParent();
    var pBase = parent.base;
    if (pBase.is1FixMode())
        // Form right margin + Inter-Box Gap + Form left margin - half-gap - ruleImageShiftLeft
        pBase.setProperty('#ASPECT[l:oneColumnWidth]', (INT(this.elem.x) - 20 + this.ruleImageShiftLeft) + ' #TEXT[XFLD_CCD_PIXELS]');
    else {
        var map = pBase.getGridMap();
        if (!(map && map[0])) return;
        
        var columns = pBase.columns;
        var colDefs = pBase.colDefs2Object();
        var colW = colDefs.columns;
        var index = this.index;
        var vRulers = parent.vRulers;
        var twoColumnPercentWidth = 0;
        for (var i=index; i<=index + 1; i++) twoColumnPercentWidth += colW[i];
        var defs = RULE('defineWidget', null, pBase);
        var leftBound = map[0][index].x1 + (index == 0 ? defs['margin'] : defs['margin1_5']);
        var rightBound = map[0][index+1].x2 - (index == columns - 2 ? defs['formWidth'] : defs['margin1_5']) - leftBound - defs['gapW'];
        var current = INT(this.elem.x) - leftBound - defs['margin1_5'];

        //correct bounds
        if (current <= 0) current = 1;
        if (rightBound < current) current = rightBound - 1;

        //calculate new relation
        var factor = pBase.getFactor();
        colW[index] = ROUND(twoColumnPercentWidth * current / rightBound, 0.01 * factor);

        //correct minimums
        if (colW[index] < 0.01) colW[index] = 0.01;
        else if (colW[index] > 0.99) colW[index] = 0.99;
        colW[index + 1] = twoColumnPercentWidth - colW[index];
        if (colW[index + 1] < 0.01) {
            colW[index + 1] = 0.01;
            colW[index] = twoColumnPercentWidth - colW[index + 1];
        }
        pBase.setProperty('colDefs', pBase.colDefs2String(colW, colDefs.labels));
        if (this.correctX != 0 && this.correctX != this.elem.x) {
            this.elem.style.left = this.correctX;
            this.correctX = 0;
        }
    }
    if (dontChangeFoc == undefined) parent.board.selection.setSingle(parent.elem);
end