[ Nexacro.Component -  Object Position2 ]

 

 

 

// L = left, T =top, R = right, B = bottom, W = width, H = height

var _L = 0, _T = 1, _R = 2, _B = 3, _W = 4, _H = 5;

/*******************************************************************************
★ 설명
Modal Dialog실행 함수
★ parameter
NewChildFrame()과 동일
★ return
- 성공 = variant ( Dialog창에서 close()에 의해 Return된 값 )
- 실패 = null
******************************************************************************/

function Dialog(sID, sURL, sArg, nLeft, nTop, nWidth, nHeight, sStyle)

{

var rtn=null;

var newChild;

var MyFrame = this.getOwnerFrame();

 

newChild = _NewChildFrame(sID, sURL, sArg, nLeft, nTop, nWidth, nHeight, sStyle);

rtn = newChild.showModal(MyFrame, sArg);

this.removeChild(newChild.name);

newChild.destroy();

newChild = null;

return rtn;

}

 

/*******************************************************************************
★ 설명
Modaless Dialog실행 함수
★ parameter
NewChildFrame()과 동일
★ return
- 성공 = true ( 정상작동여부 )
- 실패 = false
******************************************************************************/

function Open(sID, sURL, sArg, nLeft, nTop, nWidth, nHeight, sStyle)

{

var rtn;

var newChild;

var MyFrame = this.getOwnerFrame();

 

newChild = _NewChildFrame(sID, sURL, sArg, nLeft, nTop, nWidth, nHeight, sStyle);

 

return newChild.showModeless(MyFrame, sArg);

}

 

/*******************************************************************************
★ 설명
Grid Header Click하면 Sorting하는 함수
★ parameter
1. obj:Grid : Grid Object ( 예 : Grid00 )
2. e:GridClickEventInfo : Click Event Object ( Grid Onclick Envent의 Argument e )
3. ASC_MARK : Ascending Mark (옵션 : Default = "▼")( 예 : "▼" )
4. DESC_MARK : Descending Mark (옵션 : Default = "▲")( 예 : "▲" )
★ return
- 성공 = true
- 실패 = false
******************************************************************************/

function GridSort(obj:Grid, e:GridClickEventInfo, ASC_MARK, DESC_MARK)

{

// 컬럼의 정렬방식을 'head'의 text에 "↑,↓"여부로 판단.

// 이미지로 대체 가능.

var bindDs = eval(obj.binddataset);

var i, cell_cnt;

 

if (bindDs.rowcount == 0) return false;

if( gf_isNull(ASC_MARK) ) ASC_MARK = "▼";

if( gf_isNull(DESC_MARK) ) DESC_MARK = "▲";

 

cell_cnt = obj.getCellCount("head");

var BodyColId = (obj.getCellProperty("body", e.col,"text")).toString().split(":"); // e.col : 바인드된 컬럼.

 

for( i = 0 ; i < cell_cnt ; i++ )

{

if(obj.getCellText(-1, i)=="undefined")

continue;

 

var strHeadText = obj.getCellText(-1, i);

 

if(i==e.cell)

{

if(strHeadText.substr(strHeadText.length-1) == ASC_MARK)

{

obj.setCellProperty( "head", i, "text", strHeadText.substr(0, strHeadText.length - 1)+DESC_MARK);

bindDs.keystring = "S:-"+BodyColId[1];

}

else if (strHeadText.substr(strHeadText.length-1) == DESC_MARK)

{

obj.setCellProperty( "head", i, "text", strHeadText.substr(0, strHeadText.length - 1)+ASC_MARK);

bindDs.keystring = "S:+"+BodyColId[1];

}

else

{

obj.setCellProperty( "head", i, "text", strHeadText+ASC_MARK);

bindDs.keystring = "S:+"+BodyColId[1];

}

}

else // 정렬표시 삭제

{

if (strHeadText.substr(strHeadText.length-1) == ASC_MARK || strHeadText.substr(strHeadText.length-1) == DESC_MARK)

{

obj.setCellProperty( "head", i, "text", strHeadText.substr(0, strHeadText.length - 1));

}

}

}

return true;

}

 

/*********************************************************************************************
** 나중에?????
** function name : gf_exportExcel()
** function description : Grid의 내용을 Excel로 Export 한다.
** argument : CUCO_ICPH 고객유입경로
** SHORTCUT 단축키
** CONTENTS 상담내용
** return Type : None
** return description :
*********************************************************************************************/

function GridExportExcel(objGrid, strTitle, strCondition, strSheetName)

{

/*

var objExport = new ExportHCardObject();

objExport.exporttype = ExportHCardTypes.EXCEL;

objExport.activepagename = strSheetName;

 

objExport.addExportItem(ExportHCardItemTypes.GRID, objGrid, "A5", "allband","allrecord","suppress","allstyle", "맑은 고딕,9", "맑은 고딕,11,bold",

strTitle, //title

strCondition, //condition

"A4", //conditionposition

true //removefirstcol

);

 

objExport.export();

objExport = null;

*/

}

 

/*******************************************************************************
★ 설명
Object의 type을 문자열로 얻어온다.
★ parameter
1. oObj : type을 얻어올 Object
(예 : mainframe, this.getOwnerFrame(), this, button,...)
★ return
- 성공 = Object의 type문자열(예 : "MainFrame", "ChildFrame", "Form", "Button",...)
- 실패 = null ( oObj가 null인 경우 )
******************************************************************************/

function GetObjType(oObj)

{

var sType;

 

if( gf_isNull(oObj) ) return null;

 

sType = oObj.toString().valueOf().substr(1,6);

if( sType.toLowerCase() == "object" )

return Mid(oObj.toString().valueOf(), " ", "]");

 

return null;

}

 

/*******************************************************************************
★ 설명
모든 Collection이 type을 이용하여 얻어오는 것이 없으므로 type을 이용하여
Collection을 얻어오는 함수임
단, type은 Object에 의해 나오는 Value값을 의미한다.
예를들어, gf_message(Button0)="[object Button]" 에서 "Button"을 Type이라 한다.
★ parameter
1. oCollection : Collection Object(예 : this.components, mainframe.all, ...)
2. sType : Type문자열 (예 : "ChildFrame", "Button")
★ return
- 성공 = Collection List중 sType에 적합한 Object만 Array로 Return한다.
- 실패 =
******************************************************************************/

function GetObjTypeCollection(oCollection, sType)

{

var sType, i, arr=new Array(), arr_no=0, sColType;

 

if( gf_isNull(oCollection) ) return arr;

if( gf_isNull(sType) )

{

arr = oCollection;

return arr;

}

for( i = 0 ; i < oCollection.length ; i++ )

{

sColType = GetObjType(oCollection[i]);

if( sColType == null ) continue;

if( sType.toLowerCase() == sColType.toLowerCase() )

{

arr[arr_no] = oCollection[i];

arr_no++;

}

}

 

return arr;

}

 

/*******************************************************************************
★ 설명
oObj가 Popup창(showModaless()에 의해 뜬창)인지 확인한다.
단, gf_showModal()에 의해 뜬 창은 해당되지 않는다.
★ parameter
1. oObj : Popup창 여부를 확인할 Object
★ return
- oObj가 Popup창인 경우 = true
- oObj가 Popup창이 아닌 경우 = false
★ 주의사항
단, gf_showModal()에 의해 뜬 창은 해당되지 않는다.
******************************************************************************/

function IsObjPopup(oObj)

{

if( gf_isNull(oObj) ) return false;

 

if( application.popupframes(oObj.name) == null )

return false;

else

return true;

}

 

/*******************************************************************************
★ 설명
oObj에 해당하는 좌표계가 Screen좌표계인지를 체크한다.
★ parameter
1. oObj : 체크할 Object(예 : mainframe, this.getOwnerFrame(), this, button,...)
★ return
- oObj가 Screenr기준 좌표계인 경우 = true
- oObj가 Screenr기준 좌표계가 아닌경우 = false
******************************************************************************/

function IsObjScreenPos(oObj)

{

var sType;

 

sType = GetObjType(oObj);

if( gf_isNull(sType) ) return false;

 

if( sType.toLowerCase() == "mainframe" )

return true;

if( sType.toLowerCase() == "childframe" )

{

if( IsObjPopup(oObj) == true )

return true;

}

 

return false;

}

 

/*******************************************************************************
★ 설명
oObj에 해당하는 Object가 Position을 갖지 않는 Object인지 판단한다.
★ parameter
1. oObj : 체크할 Object(예 : application, mainframe, this.getOwnerFrame(), this, button,...)
★ return
- oObj가 position property가 없는 경우 = true
- oObj가 position property가 있는 경우 = false
******************************************************************************/

function IsObjNoPos(oObj)

{

var sType;

 

sType = GetObjType(oObj);

if( gf_isNull(sType) ) return false;

 

if( sType.toLowerCase() == "application" )

return true;

 

return false;

}

 

/*******************************************************************************
★ 설명
system의 cursorx, cursory를 해당 Object의 영역좌표에 맞는 값으로 변경한다.
★ parameter
1. oObj : Object
(예 : mainframe, this.getOwnerFrame(), this, button,...)
★ return
- 성공 = oObj좌표계에 해당하는 Cursor position 문자열 ( 예 : "20 20" )
- 실패 = null
★ 주의사항
단, event에서 얻어지는 cursor좌표는 아니다.
******************************************************************************/

function GetObjCursorPos(oObj)

{

var sObjPos;

var cursorx, cursory;

var sCursorPos;

 

if( gf_isNull(oObj) ) return null;

if( IsObjNoPos(oObj) ) return null;

 

cursorx = system.cursorx;

cursory = system.cursory;

 

if( IsObjScreenPos(oObj) == true )

sCursorPos = cursorx + " " + cursory;

else

sCursorPos = (system.screenToClientX(oObj, cursorx)+oObj.position.left) + " " + (system.screenToClientY(oObj, cursory)+oObj.position.top);

 

return sCursorPos;

}

 

/*******************************************************************************
★ 설명
sAreaPos의 Center위치에 맞는 sObjPos의 position을 구한다.
★ parameter
1. sAreaPos : 영역에 해당하는 Position 문자열
(예 : "10 10 50 50", this.position,...)
2. sObjPos : Center에 위치할 대상 Object의 Position
(옵션 : Default="" ==> Object의 Width=0, Height=0인 경우에 해당함)
(예 : "", "10 10 30 30", this.position,...)
★ return
- 성공 = sAreaPos의 좌표계에 해당하는 Center position 문자열
( 예 : sObjPos=""인 경우 ==> "30 30",
sObjPos="10 10 20 20"인 경우 ==> "20 20 40 40" )
- 실패 = null
******************************************************************************/

function GetCenterPos(sAreaPos, sObjPos)

{

var vAreaPos = new Array();

var vObjPos = new Array();

var vCenterPos = new Array();

 

vAreaPos = _PosStr2Arr(sAreaPos);

if( vAreaPos == null ) return null;

vObjPos = _PosStr2Arr(sObjPos);

if( vObjPos == null )

{

vCenterPos[_L] = vAreaPos[_L] + Math.round(vAreaPos[_W]/2);

vCenterPos[_T] = vAreaPos[_T] + Math.round(vAreaPos[_H]/2);

}

else

{

vCenterPos[_L] = vAreaPos[_L] + Math.round(vAreaPos[_W]/2) - Math.round(vObjPos[_W]/2);

vCenterPos[_T] = vAreaPos[_T] + Math.round(vAreaPos[_H]/2) - Math.round(vObjPos[_H]/2);

if( vObjPos.length > 2 )

{

vCenterPos[_R] = vCenterPos[_L] + vObjPos[_W];

vCenterPos[_B] = vCenterPos[_T] + vObjPos[_H];

}

}

 

return _PosArr2Str(vCenterPos);

}

 

/*******************************************************************************
★ 설명
nLeft, nTop좌표로
sPosition의 Width에 대해 n Offset Width만큼,
sPosition의 Height에 대해 n Offset Height만큼
이동한 좌표 Position문자열을 획득한다.
★ parameter
1. sPosition : position 문자열 (예 : "absolute 10 10 20 20" = object.position )
   단, "absolute"는 생략 가능하다.
2. nLeft : 이동할 Left 값 ( 예 : 10 또는 -10 )
3. nOffsetTop : 이동할 Top 값 ( 예 : 10 또는 -10 )
4. nOffsetWidth : 이동할 Offset Width값 ( 예 : 10 또는 -10 )
   (옵션 : Default = 0, 즉 이동하지 않는다)
5. nOffsetHeight : 이동할 Offset Height값 ( 예 : 10 또는 -10 )
(옵션 : Default = 0, 즉 이동하지 않는다)

★ return
- 성공 = 이동될 Position문자열 ( 예 : "absolute 20 20 30 30" 또는 "absolute 0 0 10 10" )
단, sPosition이 2개만 지정된 경우 offsetWidth, nOffsetHeight에 어떤값을 지정하면
이 경우는 Widht=0, Height=0와 동일하므로 4개로 바꾸어 Return한다.
( 예 : GetMovePos("10 10", 20, 20) = "20 20 20 20" )
- 실패 = null ( sPosition이 적합한 값이 아닌 경우 )
★ 목적
XPlatform은 Width, Height가 아닌 Right, Bottom을 적용하기 때문에 헷갈리는 면이 있다.
또한, object를 이동시키는 함수는 있지만 이동될 좌표만 구하는 함수가 없기 때문에
이 함수를 만들었다.
******************************************************************************/

function GetMovePos(sPosition, nLeft, nTop, nOffsetWidth, nOffsetHeight)

{

var sType;

var aPosition = new Array();

var aRetPosition = new Array();

 

aPosition = _PosStr2Arr(sPosition);

if( aPosition == null ) return null;

if( gf_isNull(nLeft) ) return null;

if( gf_isNull(nTop) ) return null;

 

aRetPosition[_L] = nLeft;

aRetPosition[_T] = nTop;

 

if( aPosition.length <= 2 )

{

if( gf_isNull(nOffsetWidth) == true && gf_isNull(nOffsetHeight) == true )

return _PosArr2Str(aRetPosition);

else

{

aPosition[_W] = 0;

aPosition[_H] = 0;

}

}

if( gf_isNull(nOffsetWidth) )

nOffsetWidth = 0;

if( gf_isNull(nOffsetHeight) )

nOffsetHeight = 0;

 

aRetPosition[_R] = aRetPosition[_L] + (aPosition[_W] + nOffsetWidth);

aRetPosition[_B] = aRetPosition[_T] + (aPosition[_H] + nOffsetHeight);

return _PosArr2Str(aRetPosition);

}

 

/*******************************************************************************
★ 설명
sPosition대비
Left좌표에 대해 nOffsetLeft만큼, Top좌표에 대해 nOffsetTop만큼,
Width에 대해 n Offset Width만큼, Height에 대해 n Offset Height만큼
이동한 좌표 Position문자열을 획득한다.
★ parameter
1. sPosition : position 문자열 (예 : "absolute 10 10 20 20" = object.position )
단, "absolute"는 생략 가능하다.
2. nLeft : sPosition대비 이동할 Left Offset값 ( 예 : 10 또는 -10 )
3. nOffsetTop : sPosition대비 이동할 Left Offset값 ( 예 : 10 또는 -10 )
4. nOffsetWidth : sPosition대비 이동할 Width Offset 값 ( 예 : 10 또는 -10 )
(옵션 : Default = 0, 즉 이동하지 않는다)
5. nOffsetHeight : sPosition대비 이동할 Height Offset 값 ( 예 : 10 또는 -10 )
(옵션 : Default = 0, 즉 이동하지 않는다)
★ return
- 성공 = 이동될 Position문자열 ( 예 : "absolute 20 20 30 30" 또는 "absolute 0 0 10 10" )
단, sPosition이 2개만 지정된 경우 offsetWidth, nOffsetHeight에 어떤값을 지정하면
이 경우는 Widht=0, Height=0와 동일하므로 4개로 바꾸어 Return한다.
( 예 : GetMovePos("10 10", 20, 20) = "20 20 20 20" )
- 실패 = null ( sPosition이 적합한 값이 아닌 경우 )
******************************************************************************/

function GetMoveToPos(sPosition, nOffsetLeft, nOffsetTop, nOffsetWidth, nOffsetHeight)

{

var nLeft, nTop;

var aPosition = new Array();

 

aPosition = _PosStr2Arr(sPosition);

if( aPosition == null ) return null;

 

if( gf_isNull(nOffsetLeft) ) return null;

if( gf_isNull(nOffsetTop) ) return null;

 

nLeft = aPosition[_L] + nOffsetLeft;

nTop = aPosition[_T] + nOffsetTop;

 

return GetMovePos(sPosition, nLeft, nTop, nOffsetWidth, nOffsetHeight);

}

 

/*******************************************************************************
★ 설명
oObj에 해당하는 Object의 border width를 구하는 함수이다.
★ parameter
1. oObj : Object
(예 : mainframe, this.getOwnerFrame(), this, button,...)
★ return
- 성공 = oObj의 Border Width
- 실패 = -1
★ 목적
현재 XPlatform(2009.12.10.1)에서 border가 지정되지 않고 style로 적용되어 있으면
border를 구하지 못하므로 만들었다.
★ BUG
1. Component border가 지정되어 있지 않으면 값을 구할 수 없어 0으로 처리했음
2. ChildFrame의 border가 지정되어 있지 않으면 값을 구할 수 없어 0으로 처리됨
******************************************************************************/

function GetObjBorderWidth(oObj)

{

if( gf_isNull(oObj) ) return -1;

if( IsObjNoPos(oObj) ) return -1;

 

if( isNaN(oObj.style.border.width) || gf_isNull(oObj.style.border.width) )

{

var sType;

 

sType = GetObjType(oObj);

if( IsObjScreenPos(oObj) == true )

return 0-system.screenToClientX(oObj, oObj.position.left);

else

{

if( GetObjType(oObj.parent).toLowerCase() == "form" )

return 0;

else

return system.clientToScreenX(oObj, 0) - system.clientToScreenX(oObj, oObj.position.left);

}

}

else

return oObj.style.border.width;

}

 

/*******************************************************************************
★ 설명
oFromObj 좌표계의 sFromObjPos에 해당하는 Position을
oToObj 좌표계에 해당하는 Position으로 바꾼다.
★ parameter
1. sFromPos : 변경하고자 하는 oFromAreaObj좌표계 내에서의 Position
(예 : "10 10" 또는 "10 10 20 20", Button.position, ...)
2. oFromAreaObj : 변경할 좌표계 Object, 단, Screen의 경우는 "screen"을 넣으면 된다.
(예 : "screen", mainframe, this,...)
3. oToAreaObj : 변경할 좌표계 Object
단, Screen의 경우는 "screen"을 넣으면 된다.
(예 : "screen", mainframe, this,...)
★ return
- 성공 = oToObj 좌표계로 변경된 position 문자열
- 실패 = null
★ 목적
ScreenToClient, ClientToScreen 밖에 없고 A Object에서 B Object좌표계로
한번에 변경하는 함수가 없어서 만들었음
★ BUG
oFromAreaObj = form, oToAreaObj = "screen"인 경우 Xplatform Bug같다.
******************************************************************************/

function GetObjConvPos(sFromPos, oFromAreaObj, oToAreaObj)

{

var aFromPos = new Array();

var aRetPos = new Array();

 

if( gf_isNull(sFromPos) ) return null;

if( gf_isNull(oFromAreaObj) ) return null;

if( gf_isNull(oToAreaObj) ) return null;

if( IsObjNoPos(oFromAreaObj) ) return null;

if( IsObjNoPos(oToAreaObj) ) return null;

 

if( oFromAreaObj == oToAreaObj )

return sFromPos;

aFromPos = _PosStr2Arr(sFromPos);

 

if( oFromAreaObj.toString().toLowerCase() == "screen" )

{

aRetPos[_L] = system.screenToClientX( oToAreaObj, aFromPos[_L] );

aRetPos[_T] = system.screenToClientY( oToAreaObj, aFromPos[_T] );

}

else if( oToAreaObj.toString().toLowerCase() == "screen" )

{

aRetPos[_L] = system.clientToScreenX( oFromAreaObj, aFromPos[_L] );

aRetPos[_T] = system.clientToScreenY( oFromAreaObj, aFromPos[_T] );

}

else

{

aRetPos[_L] = system.clientToScreenX( oFromAreaObj, aFromPos[_L] );

aRetPos[_T] = system.clientToScreenY( oFromAreaObj, aFromPos[_T] );

aRetPos[_L] = system.screenToClientX( oToAreaObj, aRetPos[_L] );

aRetPos[_T] = system.screenToClientY( oToAreaObj, aRetPos[_T] );

}

if( aFromPos.length > 2 )

{

aRetPos[_R] = aRetPos[_L] + aFromPos[_W];

aRetPos[_B] = aRetPos[_T] + aFromPos[_H];

}

 

return _PosArr2Str(aRetPos);

}

 

/*******************************************************************************
★ 설명
sAreaPos좌표계 내에서 주어진 Align 조건에 따라
sObjPos의 좌표를 재 계산한다.
★ parameter
1. sAreaPos : Object가 움직일 좌표영역에 해당하는 Position 문자열 ( 예 : "10 10 100 100" )
2. sObjPos : Align될 Object의 현재 Position문자열 ( 예 : "50 50 60 60" )
3. sAxisPos : 기준이 되는 X,Y축 Position문자열
( 옵션 : Default=""==>sAreaPos의 center ) ( 예 : "60 60" )
4. sOffsetPos : sAxisPos로부터의 Offset Position문자열
( 옵션 : Default="0 0" ) ( 예 : "10 10" 또는 "-10 -10" )
5. nAlign : sAxisPos를 기준으로 한 정렬형태 ( 옵션 : Default=0 )
0 = 중앙정렬, 1 = 1사분면, 2 = 2사분면, 3 = 3사분면, 4 = 4사분면
6. bAuto : nAlign을 기준으로 sObjPos의 Width, Height가 들어갈 수 있는
사분면을 자동으로 찾아 정렬한다.( 옵션 : Default=false )
true = 자동정렬, false = 자동정렬 하지 않음
7. bBigResize : Object의 width, height가 해당 4분면의 영역보다 크면 4분면에 맞추어
Object의 width, height를 줄여서 조정한다.
즉, obj > Area이면 obj를 Area의 사분면에 맞춰 줄인다. ( 옵션 : Default = false )
true = Size 조정, false = Size 조정하지 않음
8. bSmallResize : Object의 width, height가 해당 4분면의 영역보다 작으면 4분면에 맞추어
Object의 width, height를 늘려서 조정한다.
즉, obj < Area이면 obj를 Area의 사분면에 맞춰 늘인다. ( 옵션 : Default = false )
true = Size 조정, false = Size 조정하지 않음
★ return
- 성공 = 주어진 조건에 맞는 정렬된 Object의 Position문자열
- 실패 = null
★ 주의사항
1. bAuto와 (bBigResize, bSmallResize)는 동시에 true일 수 없다.
bAuto가 true이면 bBigResize, bSmallResize는 false로 처리된다.
2. (sAxisPos+sOffsetPos)가 sAreaPos의 범위를 벗어나면 null이 return된다.
단, sObjPos의 최종 Align된 Position은 sAreaPos의 범위를 벗어날 수도 있다.
2. 모든 Position은 sAreaPos의 좌표계에 맞도록 전달되어야 한다.
따라서, 머리가 아프다면 모든 좌표를 screen좌표로 처리한다면
좀 더 쉬워지겠지...
******************************************************************************/

function GetAlignPos( sAreaPos, sObjPos, sAxisPos, sOffsetPos, nAlign, bAuto, bBigResize, bSmallResize )

{

var aAreaPos = new Array();

var aAxisPos = new Array();

var aObjPos = new Array();

var aOffsetPos = new Array();

var aAlignPos = new Array();

 

aAreaPos = _PosStr2Arr(sAreaPos);

if( aAreaPos == null ) return null;

aObjPos = _PosStr2Arr(sObjPos);

if( aObjPos == null ) return null;

if( gf_isNull(sAxisPos) != true )

{

aAxisPos = _PosStr2Arr(sAxisPos);

if( aAxisPos == null ) return null;

}

else

{

aAxisPos[_L] = aAreaPos[_L] + Math.round(aAreaPos[_W]/2);

aAxisPos[_T] = aAreaPos[_T] + Math.round(aAreaPos[_H]/2);

}

 

if( gf_isNull(sOffsetPos) != true )

{

aOffsetPos = _PosStr2Arr(sOffsetPos);

if( aOffsetPos == null ) return null;

}

else

{

aOffsetPos[_L] = 0;

aOffsetPos[_T] = 0;

}

if( gf_isNull(nAlign) ) nAlign = 0;

if( gf_isNull(bAuto) ) bAuto = true;

if( gf_isNull(bBigResize) ) bBigResize = false;

if( gf_isNull(bSmallResize) ) bSmallResize = false;

if( bAuto == true )

{

bBigResize = false;

bSmallResize = false;

}

 

// Axis를 Offset만큼 보정

aAxisPos[_L] += aOffsetPos[_L];

aAxisPos[_T] += aOffsetPos[_T];

 

// Axis가 Area의 범위를 벗어나면 return null

if( aAxisPos[_L] < aAreaPos[_L] )

return null;

if( aAxisPos[_L] > aAreaPos[_R] )

return null;

if( aAxisPos[_T] < aAreaPos[_T] )

return null;

if( aAxisPos[_T] > aAreaPos[_B] )

return null;

 

// Center에 위치

if( nAlign == 0 )

{

aAlignPos[_L] = aAxisPos[_L] - Math.round(aObjPos[_W]/2);

aAlignPos[_T] = aAxisPos[_T] - Math.round(aObjPos[_H]/2);

}

// 1사분면에 위치

else if( nAlign == 1 )

{

aAlignPos[_L] = aAxisPos[_L];

aAlignPos[_T] = aAxisPos[_T] - aObjPos[_H];

}

// 2사분면에 위치

else if( nAlign == 2 )

{

aAlignPos[_L] = aAxisPos[_L] - aObjPos[_W];

aAlignPos[_T] = aAxisPos[_T] - aObjPos[_H];

}

// 3사분면에 위치

else if( nAlign == 3 )

{

aAlignPos[_L] = aAxisPos[_L] - aObjPos[_W];

aAlignPos[_T] = aAxisPos[_T];

}

// 4사분면에 위치

else if( nAlign == 4 )

{

aAlignPos[_L] = aAxisPos[_L];

aAlignPos[_T] = aAxisPos[_T];

}

 

aAlignPos[_R] = aAlignPos[_L] + aObjPos[_W];

aAlignPos[_B] = aAlignPos[_T] + aObjPos[_H];

 

// Auto처리

if( bAuto == true )

{

var i;

var aAlignPosAuto, sAlignPosAuto, nCurAlign;

if( nAlign != 0 )

{

for( i = 0 ; i <= 4 ; i++ )

{

nCurAlign = (nAlign+i)%5;

if( nCurAlign == 0 )

continue;

sAlignPosAuto = GetAlignPos( sAreaPos, sObjPos, sAxisPos, sOffsetPos,

nCurAlign, false, false, false );

aAlignPosAuto = _PosStr2Arr(sAlignPosAuto);

if( (aAlignPosAuto[_L] >= aAreaPos[_L]) &&

(aAlignPosAuto[_R] <= aAreaPos[_R]) &&

(aAlignPosAuto[_T] >= aAreaPos[_T]) &&

(aAlignPosAuto[_B] <= aAreaPos[_B]) )

{

aAlignPos = aAlignPosAuto;

break;

}

}

}

}

 

// Resize처리

if( bBigResize == true || bSmallResize == true )

{

if( nAlign == 1 )

{

if( bBigResize == true )

{

if( aAlignPos[_R] > aAreaPos[_R] ) aAlignPos[_R] = aAreaPos[_R];

if( aAlignPos[_T] < aAreaPos[_T] ) aAlignPos[_T] = aAreaPos[_T];

}

if( bSmallResize == true )

{

if( aAlignPos[_R] < aAreaPos[_R] ) aAlignPos[_R] = aAreaPos[_R];

if( aAlignPos[_T] > aAreaPos[_T] ) aAlignPos[_T] = aAreaPos[_T];

}

}

if( nAlign == 2 )

{

if( bBigResize == true )

{

if( aAlignPos[_L] < aAreaPos[_L] ) aAlignPos[_L] = aAreaPos[_L];

if( aAlignPos[_T] < aAreaPos[_T] ) aAlignPos[_T] = aAreaPos[_T];

}

if( bSmallResize == true )

{

if( aAlignPos[_L] > aAreaPos[_L] ) aAlignPos[_L] = aAreaPos[_L];

if( aAlignPos[_T] > aAreaPos[_T] ) aAlignPos[_T] = aAreaPos[_T];

}

}

if( nAlign == 3 )

{

if( bBigResize == true )

{

if( aAlignPos[_L] < aAreaPos[_L] ) aAlignPos[_L] = aAreaPos[_L];

if( aAlignPos[_B] > aAreaPos[_B] ) aAlignPos[_B] = aAreaPos[_B];

}

if( bSmallResize == true )

{

if( aAlignPos[_L] > aAreaPos[_L] ) aAlignPos[_L] = aAreaPos[_L];

if( aAlignPos[_B] < aAreaPos[_B] ) aAlignPos[_B] = aAreaPos[_B];

}

}

if( nAlign == 4 )

{

if( bBigResize == true )

{

if( aAlignPos[_R] > aAreaPos[_R] ) aAlignPos[_R] = aAreaPos[_R];

if( aAlignPos[_B] > aAreaPos[_B] ) aAlignPos[_B] = aAreaPos[_B];

}

if( bSmallResize == true )

{

if( aAlignPos[_R] < aAreaPos[_R] ) aAlignPos[_R] = aAreaPos[_R];

if( aAlignPos[_B] < aAreaPos[_B] ) aAlignPos[_B] = aAreaPos[_B];

}

}

// Axis를 중심으로 작은 쪽에 맞추어 Resizing한다.

if( nAlign == 0 )

{

var nSmallWidth, nSmallHeight;

nSmallWidth = Math.min(aAxisPos[_L] - aAreaPos[_L], aAreaPos[_R] - aAxisPos[_L]);

nSmallHeight = Math.min(aAxisPos[_T] - aAreaPos[_T], aAreaPos[_B] - aAxisPos[_T]);

 

var bWFlag=false, bHFlag=false;

if( bSmallResize == true )

{

if( Math.round(aObjPos[_W]/2) < nSmallWidth )

bWFlag = true;

if( Math.round(aObjPos[_H]/2) < nSmallHeight )

bHFlag = true;

}

if( bBigResize == true )

{

if( Math.round(aObjPos[_W]/2) > nSmallWidth )

bWFlag = true;

if( Math.round(aObjPos[_H]/2) > nSmallHeight )

bHFlag = true;

}

if( bWFlag == true )

{

aAlignPos[_L] = aAxisPos[_L] - nSmallWidth;

aAlignPos[_R] = aAxisPos[_L] + nSmallWidth;

}

if( bHFlag == true )

{

aAlignPos[_T] = aAxisPos[_T] - nSmallHeight;

aAlignPos[_B] = aAxisPos[_T] + nSmallHeight;

}

}

}

 

aAlignPos[_W] = aAlignPos[_R] - aAlignPos[_L];

aAlignPos[_H] = aAlignPos[_B] - aAlignPos[_T];

 

return _PosArr2Str(aAlignPos);

}

 

/*******************************************************************************
★ 설명
Position문자열을 Rect Object로 바꾼다.
★ parameter
1. sPos : Position 문자열 (예 : "10 10 50 50" 또는 "10 10")
★ return
1. 성공 = Rect Object
(※ 단, sPos = "10 10" ==> 2개인 경우
Rect.right = Rect.left, Rect.bottom = Rect.top,
Rect.width = 0, Rect.height = 0)
2. 실패 = null
★ 주의사항
Rect Object는 좌표를 처리하는 XPlatform 내부 Object로서 메뉴얼에는 존재치 않는다.
Rect Object의 멤버는 left, top, right, bottom, width, height가 있다.
(예 : rect가 Rect Object라면 rect.left, rect.top으로 사용하면 된다.)
******************************************************************************/

function PosStr2Rect(sPos)

{

var oRect = new Rect();

 

aPos = _PosStr2Arr(sPos);

if( aPos == null )

return null;

 

oRect.left = aPos[_L];

oRect.top = aPos[_T];

if( aPos.length == 2 )

{

oRect.right = aPos[_L];

oRect.bottom = aPos[_T];

oRect.width = 0;

oRect.height = 0;

}

else

{

oRect.right = aPos[_R];

oRect.bottom = aPos[_B];

oRect.width = aPos[_W];

oRect.height = aPos[_H];

}

 

return oRect;

}

 

/*******************************************************************************
★ 설명
Rect Object를 Position문자열로 바꾼다.
★ parameter
1. oRect : Rect Object(예 : Rect.left = 10, ... )
★ return
1. 성공 = Position문자열 ( 예 : "10 20 30 40" )
(※ 단, Rect.right = Rect.left, Rect.right = Rect.left,
Rect.right = 0, Rect.bottom = 0,
Rect.width = 0, Rect.height = 0 인경우는
return = "10 10")
2. 실패 = null
★ 주의사항
Rect Object는 좌표를 처리하는 XPlatform 내부 Object로서 메뉴얼에는 존재치 않는다.
Rect Object의 멤버는 left, top, right, bottom, width, height가 있다.
(예 : rect가 Rect Object라면 rect.left, rect.top으로 사용하면 된다.)
******************************************************************************/

function PosRect2Str(oRect)

{

if( gf_isNull(oRect) ) return null;

 

// 2개인 경우 처리

if( ( ( oRect.left == oRect.right ) || oRect.right == 0 || oRect.width == 0 ) &&

( ( oRect.top == oRect.bottom ) || oRect.bottom == 0 || oRect.height == 0 ) )

return oRect.left + " " + oRect.top;

else

return oRect.left + " " + oRect.top + " " + oRect.right + " " + oRect.bottom;

}

 

 

☞  

 

☞  

 
 
 
 

  

 

Posted by 농부지기
,

[ Nexacro.Component -  Object Position1 ]

 


/*******************************************************************************
 ★ 설명
    oObj에 해당하는 좌표계가 Screen좌표계인지를 체크한다.
 ★ parameter
    1. oObj : 체크할 Object(예 : mainframe, this.getOwnerFrame(), this, button,...)
  ★ return
    - oObj가 Screenr기준 좌표계인 경우 = true
    - oObj가 Screenr기준 좌표계가 아닌경우 = false
    - oObj가 null인 경우 = false    
 ******************************************************************************/

function IsObjScreenPos(oObj)

{

 var sType;

 

 if( fn_IsNull(oObj) )  return false;

 

 sType = GetObjType(oObj);

 if( fn_IsNull(sType) )  return false;

 

 

 if( sType.toLowerCase() == "mainframe" )

  return true;

 if( sType.toLowerCase() == "childframe" )

 {

  if( IsObjPopup(oObj.name) == true )

   return true;

 }

  

 return false;

}

 

/*******************************************************************************
 ★ 설명
    oObj에 해당하는 Object가 Position을 갖지 않는 Object인지 판단한다.
    즉, oObj가 invisible Object인지 판단한다.
 ★ parameter
    1. oObj : 체크할 Object(예 : application, mainframe, this.getOwnerFrame(), this, button,...)
 ★ return
    - oObj가 position property가 없는 경우 = true
    - oObj가 position property가 있는 경우 = false
    - oObj가 null인 경우 = false
******************************************************************************/

function IsObjNoPos(oObj)

{

 var sType;

 

 if( fn_IsNull(oObj) )  return false;

 

 sType = GetObjType(oObj);

 if( fn_IsNull(sType) )  return false;

 

 if( fn_IsNull(oObj.position) )

  return true;

  

 return false;

}

 

/*******************************************************************************
 ★ 설명
     system의 cursorx, cursory를 해당 Object의 영역좌표에 맞는 값으로 변경한다.
 ★ parameter
    1. oObj : Object
       (예 : mainframe, this.getOwnerFrame(), this, button,...)
 ★ return
    - 성공 = oObj좌표계에 해당하는 Cursor position 문자열 ( 예 : "20 20" )
    - 실패 = ""
 ★ 주의사항  
    단, event에서 얻어지는 cursor좌표는 아니다.
 ******************************************************************************/

function GetObjCursorPos(oObj)

{

 var sObjPos;

 var cursorx, cursory;

 var sCursorPos;

 

 if( fn_IsNull(oObj) )  return "";

 if( IsObjNoPos(oObj) )  return "";

 

 cursorx = system.cursorx;

 cursory = system.cursory;

 

 if( IsObjScreenPos(oObj) == true )

  sCursorPos = cursorx + " " + cursory;

 else

  sCursorPos = (system.screenToClientX(oObj, cursorx)+oObj.position.left) + " " + (system.screenToClientY(oObj, cursory)+oObj.position.top);  

 

 return sCursorPos;

}

 

/*******************************************************************************
 ★ 설명
    Position문자열을 Rect Object로 바꾼다.
 ★ parameter
    1. sPos : Position 문자열 (예 : "10 10 50 50" 또는 "10 10")
 ★ return
    1. 성공 = Rect Object
              (※ 단,  sPos = "10 10" ==> 2개인 경우
                  Rect.right = Rect.left, Rect.bottom = Rect.top,
                  Rect.width = 0, Rect.height = 0)
    2. 실패 = null
 ★ 주의사항
    1. Rect Object는 좌표를 처리하는 XPlatform 내부 Object로서 메뉴얼에는 존재치 않는다.
       Rect Object의 멤버는 left, top, right, bottom, width, height가 있다.
       (예 : rect가 Rect Object라면 rect.left, rect.top으로 사용하면 된다.)
    2. Rect Object내에서의 좌표 처리 방법 (
       1) right ==> width순으로 처리하면 right는 재계산된다.
          width ==> right순으로 처리하면 right는 재계산 되지 않는다.
       2) width처리를 하지 않고 right만 처리하면 width는 자동계산 된다.
          right처리를 하지 않고 width만 처리하면 right는 자동계산 된다.
       3) 위 1), 2)는 left를 먼저 지정했을 경우에 한하여 처리된다.
          또한, top, bottom에 대해서도 동일하게 처리된다.
******************************************************************************/

function Str2Rect(sPos)

{

 var oRect = new Rect();

 var i;

 var aPos, no;

 

 if( fn_IsNull(sPos) ) return null;

 

 aPos = sPos.toString().split(" ");;

 if( aPos.length == 0 )

  return null;

  

 no = 0;

 for( i = 0 ; i < aPos.length ; i++ )

 {

  if( IsNum(aPos[i]) == true )

  {

   if( no == 0 )  oRect.left = Math.round(parseFloat(aPos[i]),1);

   if( no == 1 )  oRect.top = Math.round(parseFloat(aPos[i]),1);

   if( no == 2 )  oRect.right = Math.round(parseFloat(aPos[i]),1);

   if( no == 3 )  oRect.bottom = Math.round(parseFloat(aPos[i]),1);

   if( no == 4 )  oRect.width = Math.round(parseFloat(aPos[i]),1);

   if( no == 5 )  oRect.height = Math.round(parseFloat(aPos[i]),1);

   no++;

  }

 }

 

 if( no != 2 && no != 4 && no != 6 )

  return null;

  

 if( no == 2 )

 {

  oRect.right = oRect.left;

  oRect.bottom = oRect.top;

  oRect.width = 0;

  oRect.height = 0;

 }

 

 return oRect;

}

 

/*******************************************************************************
 ★ 설명
    Rect Object를 Position문자열로 바꾼다.
 ★ parameter
    1. oRect : Rect Object(예 : Rect.left = 10, ... )
 ★ return
    1. 성공 = Position문자열 ( 예 : "10 20 30 40" )
              (※ 단,  
                  Rect.right = Rect.left, Rect.right = Rect.left,
                  Rect.width = 0, Rect.height = 0 인경우는
                  return = "10 10")
    2. 실패 = ""
 *****************************************************************************/

function Rect2Str(oRect)

{

 if( fn_IsNull(oRect) )  return "";

 

 if( IsPoint(oRect) == true )

  return oRect.left + " " + oRect.top;

 else

  return oRect.left + " " + oRect.top + " " + oRect.right + " " + oRect.bottom;

}

 

/*******************************************************************************
 ★ 설명
    Rect Object의 내용이 Point(left, top만  유효한 경우)인지 판단한다.
 ★ parameter
    1. oRect : Rect Object(예 : Rect.left = 10, ... )
 ★ return
    1. 성공 = true (Point인 경우)
    2. 실패 = false ( oRect가 null이거나 Point가 아닌 경우)
 *****************************************************************************/

function IsPoint(oRect)

{

 if( fn_IsNull(oRect) )  return false;

 

 if( (oRect.left == oRect.right && oRect.top == oRect.bottom) ||

  (oRect.width == 0 && oRect.height == 0 ) ||

  ( (oRect.left != 0 && oRect.right == 0) && (oRect.top != 0 && oRect.bottom == 0) ) )

  return true;

 else

  return false;

}

 

/*******************************************************************************
 ★ 설명
     sAreaPos의 Center위치에 맞는 sObjPos의 position을 구한다.
 ★ parameter
    1. sAreaPos : 영역에 해당하는 Position 문자열
     (예 : "10 10 50 50", this.position,...)
    2. sObjPos  : Center에 위치할 대상 Object의 Position
                  (옵션 : Default="" ==> Object의 Width=0, Height=0인 경우에 해당함)
    (예 : "", "10 10 30 30", this.position,...)
 ★ return
    - 성공 = sAreaPos의 좌표계에 해당하는 Center position 문자열
              ( 예 : sObjPos=""인 경우 ==> "30 30",
                     sObjPos="10 10 20 20"인 경우 ==> "20 20 40 40" )
    - 실패 = ""                     
 ******************************************************************************/

function GetCenterPos(sAreaPos, sObjPos)

{

 var vAreaPos;

 var vObjPos  = new Rect();

 var vCenterPos = new Rect();

 

 if( fn_IsNull(sAreaPos) ) return "";

 vAreaPos = Str2Rect(sAreaPos);

 

 if( fn_IsNull(vAreaPos) )  return "";

 

 if( fn_IsNull(sObjPos) )

 {

  vObjPos.left = vObjPos.right = 0;

  vObjPos.top = vObjPos.bottom = 0;

  vObjPos.width = 0;

  vObjPos.height = 0;

 }

 else

 {

  vObjPos = Str2Rect(sObjPos);

  if( fn_IsNull(vObjPos) )  return "";

 }

 

 if( IsPoint(vObjPos) == true )

 {

  vCenterPos.left = vAreaPos.left + Math.round(vAreaPos.width/2,1);

  vCenterPos.top = vAreaPos.top + Math.round(vAreaPos.height/2,1);

 }

 else

 {

  vCenterPos.left = vAreaPos.left + Math.round(vAreaPos.width/2,1) - Math.round(vObjPos.width/2,1);

  vCenterPos.top = vAreaPos.top + Math.round(vAreaPos.height/2,1) - Math.round(vObjPos.height/2,1);

  vCenterPos.right = vCenterPos.left + vObjPos.width;

  vCenterPos.bottom = vCenterPos.top + vObjPos.height;

 }

 

 return Rect2Str(vCenterPos);

}

 

/*******************************************************************************
 ★ 설명
     nLeft, nTop좌표로
     sPosition의 Width에 대해 n Offset Width만큼,
     sPosition의 Height에 대해 n Offset Height만큼
     이동한 좌표 Position문자열을 획득한다.
 ★ parameter
    1. sPosition     : position 문자열 (예 : "absolute 10 10 20 20" = object.position )
                       단, "absolute"는 생략 가능하다.
    2. nLeft         : 이동할 Left 값 ( 예 : 10 또는 -10 )
    3. nTop          : 이동할 Top 값 ( 예 : 10 또는 -10 )
    4. nOffsetWidth  : 이동할 Offset Width값 ( 예 : 10 또는 -10 )
      (옵션 : Default = 0, 즉 이동하지 않는다)
    5. nOffsetHeight : 이동할 Offset Height값 ( 예 : 10 또는 -10 )
      (옵션 : Default = 0, 즉 이동하지 않는다)
 ★ return
    - 성공 = 이동될 Position문자열 ( 예 : "absolute 20 20 30 30" 또는 "absolute 0 0 10 10" )
              단, sPosition이 2개만 지정된 경우 offsetWidth, nOffsetHeight에 어떤값을 지정하면
              이 경우는 Widht=0, Height=0와 동일하므로 4개로 바꾸어 Return한다.
              ( 예 : GetMovePos("10 10", 20, 20) = "20 20 20 20" )
    - 실패 = ""
 ★ 목적
    XPlatform은 Width, Height가 아닌 Right, Bottom을 적용하기 때문에 헷갈리는 면이 있다.
    또한, object를 이동시키는 함수는 있지만 이동될 좌표만 구하는 함수가 없기 때문에
    이 함수를 만들었다.
 ******************************************************************************/

function GetMovePos(sPosition, nLeft, nTop, nOffsetWidth, nOffsetHeight)

{

 var sType;

 var vPosition;

 var vRetPosition = new Rect();

 

 if( fn_IsNull(sPosition) || fn_IsNull(nLeft) || fn_IsNull(nTop) ) return "";

 if( fn_IsNull(nOffsetWidth) )   

  nOffsetWidth = 0;

 

 if( fn_IsNull(nOffsetHeight) )   

  nOffsetHeight = 0;

 

 vPosition = Str2Rect(sPosition);

 if( fn_IsNull(vPosition) )  return "";

 

 vRetPosition.left = nLeft;

 vRetPosition.top = nTop;

 if( IsPoint(vPosition) == true )

 {

  if( nOffsetWidth == 0 && nOffsetHeight == 0 )

   return Rect2Str(vRetPosition);

  else

  {

   vPosition.width = 0;

   vPosition.height = 0;

  }

 }

 

 vRetPosition.right = vRetPosition.left + (vPosition.width + nOffsetWidth);

 vRetPosition.bottom = vRetPosition.top + (vPosition.height + nOffsetHeight);

 

 return Rect2Str(vRetPosition);

}

 

/*******************************************************************************
 ★ 설명
     sPosition대비
     Left좌표에 대해 nOffsetLeft만큼, Top좌표에 대해 nOffsetTop만큼,
     Width에 대해 n Offset Width만큼, Height에 대해 n Offset Height만큼
     이동한 좌표 Position문자열을 획득한다.
 ★ parameter
    1. sPosition     : position 문자열 (예 : "absolute 10 10 20 20" = object.position )
                       단, "absolute"는 생략 가능하다.
    2. nOffsetLeft   : sPosition대비 이동할 Left Offset값 ( 예 : 10 또는 -10 )
    3. nOffsetTop    : sPosition대비 이동할 Left Offset값 ( 예 : 10 또는 -10 )
    4. nOffsetWidth  : sPosition대비 이동할 Width Offset 값 ( 예 : 10 또는 -10 )
      (옵션 : Default = 0, 즉 이동하지 않는다)
    5. nOffsetHeight : sPosition대비 이동할 Height Offset 값 ( 예 : 10 또는 -10 )
      (옵션 : Default = 0, 즉 이동하지 않는다)
 ★ return
    - 성공 = 이동될 Position문자열 ( 예 : "absolute 20 20 30 30" 또는 "absolute 0 0 10 10" )
              단, sPosition이 2개만 지정된 경우 offsetWidth, nOffsetHeight에 어떤값을 지정하면
              이 경우는 Widht=0, Height=0와 동일하므로 4개로 바꾸어 Return한다.
              ( 예 : GetMovePos("10 10", 20, 20) = "20 20 20 20" )
    - 실패 = ""
 ******************************************************************************/

function GetMoveToPos(sPosition, nOffsetLeft, nOffsetTop, nOffsetWidth, nOffsetHeight)

{

 var nLeft, nTop;

 var vPosition;

 

 if( fn_IsNull(sPosition) || fn_IsNull(nOffsetLeft) || fn_IsNull(nOffsetTop) ) return "";

 if( fn_IsNull(nOffsetWidth) )

  nOffsetWidth = 0;

 

 if( fn_IsNull(nOffsetHeight) )

  nOffsetHeight = 0;

 

 vPosition = Str2Rect(sPosition);

 

 if( fn_IsNull(vPosition) )  return "";

 

 nLeft = vPosition.left + nOffsetLeft;

 nTop = vPosition.top + nOffsetTop;

 

 return GetMovePos(sPosition, nLeft, nTop, nOffsetWidth, nOffsetHeight);

 

}

 

/*******************************************************************************
 ★ 설명
    oObj에 해당하는 Object의 border width를 구하는 함수이다.
 ★ parameter
    1. oObj : Object
       (예 : mainframe, this.getOwnerFrame(), this, button,...)
 ★ return
    - 성공 = oObj의 Border Width
    - 실패 = -1    
 ★ 목적    
    현재 XPlatform(2009.12.10.1)에서 border가 지정되지 않고 style로 적용되어 있으면
    border를 구하지 못하므로 만들었다.
 ******************************************************************************/

function GetObjBorderWidth(oObj)

{

 if( fn_IsNull(oObj) ) return -1;

 if( IsObjNoPos(oObj) )  return -1;

 if( fn_IsNull(oObj.style.border.width) || fn_IsNull(oObj.style.border.width) )

 {

  var sType;

  

  sType = GetObjType(oObj);

  if( IsObjScreenPos(oObj) == true )

   return 0-system.screenToClientX(oObj, oObj.position.left);

  else

  {

   if( GetObjType(oObj.parent).toLowerCase() == "form" )

    return 0;

   else

    return system.clientToScreenX(oObj, 0) - system.clientToScreenX(oObj, oObj.position.left);

  }

 }

 else

  return oObj.style.border.width;

}

 

/*******************************************************************************
 ★ 설명
     oFromObj 좌표계의 sFromObjPos에 해당하는 Position을
     oToObj 좌표계에 해당하는 Position으로 바꾼다.
 ★ parameter
    1. sFromPos : 변경하고자 하는 oFromAreaObj좌표계 내에서의 Position
            (예 : "10 10" 또는 "10 10 20 20", Button.position, ...)
    2. oFromAreaObj : 변경할 좌표계 Object,
                  단, Screen의 경우는 "screen"을 넣으면 된다.
    (예 : "screen", mainframe, this,...)
    3. oToAreaObj  : 변경할 좌표계 Object
                 단, Screen의 경우는 "screen"을 넣으면 된다.
    (예 : "screen", mainframe, this,...)
 ★ return
    - 성공 = oToObj 좌표계로 변경된  position 문자열
    - 실패 = ""
 ★ 목적
     ScreenToClient, ClientToScreen 밖에 없고 A Object에서 B Object좌표계로
     한번에 변경하는 함수가 없어서 만들었음
 ★ BUG
     oFromAreaObj = form, oToAreaObj = "screen"인 경우 잘 안됨(???(모름))
 ******************************************************************************/

function GetObjConvPos(sFromPos, oFromAreaObj, oToAreaObj)

{

 var vFromPos;

 var vRetPos = new Rect();

 

 if( fn_IsNull(sFromPos) || fn_IsNull(oFromAreaObj) || fn_IsNull(oToAreaObj) )  return "";

 if( IsObjNoPos(oFromAreaObj) )  return "";

 if( IsObjNoPos(oToAreaObj) )  return "";  

 

 if( oFromAreaObj == oToAreaObj )

  return sFromPos;

 

 vFromPos = Str2Rect(sFromPos);

 

 if( fn_IsNull(vFromPos) )  return "";

 if( oFromAreaObj.toString().toLowerCase() == "screen" )

 {

  vRetPos.left = system.screenToClientX( oToAreaObj, vFromPos.left );

  vRetPos.top = system.screenToClientY( oToAreaObj, vFromPos.top );

 }

 else if( oToAreaObj.toString().toLowerCase() == "screen" )

 {

  vRetPos.left = system.clientToScreenX( oFromAreaObj, vFromPos.left );

  vRetPos.top = system.clientToScreenY( oFromAreaObj, vFromPos.top );

 }

 else

 {

  vRetPos.left = system.clientToScreenX( oFromAreaObj, vFromPos.left );

  vRetPos.top = system.clientToScreenY( oFromAreaObj, vFromPos.top );

  vRetPos.left = system.screenToClientX( oToAreaObj, vRetPos.left );

  vRetPos.top = system.screenToClientY( oToAreaObj, vRetPos.top );

 }

 if( IsPoint(vFromPos) == false )

 {

  vRetPos.right = vRetPos.left + vFromPos.width;

  vRetPos.bottom = vRetPos.top + vFromPos.height;

 }

 return Rect2Str(vRetPos);

}

 

/*******************************************************************************
 ★ 설명
    sAreaPos좌표계 내에서 주어진 Align 조건에 따라
    sObjPos의 좌표를 재 계산한다.
 ★ parameter
    1. sAreaPos   : Object가 움직일 좌표영역에 해당하는 Position 문자열 ( 예 : "10 10 100 100" )
    2. sObjPos    : Align될 Object의 현재 Position문자열 ( 예 : "50 50 60 60" )
    3. sAxisPos   : 기준이 되는 X,Y축 Position문자열
     ( 옵션 : Default=""==>sAreaPos의 center ) ( 예 : "60 60" )
    4. sOffsetPos : sAxisPos로부터의 Offset Position문자열
                    ( 옵션 : Default="0 0" ) ( 예 : "10 10" 또는 "-10 -10" )
    5. nAlign     : sAxisPos를 기준으로 한 정렬형태 ( 옵션 : Default=0 )
                    0 = 중앙정렬, 1 = 1사분면, 2 = 2사분면, 3 = 3사분면, 4 = 4사분면
    6. bAuto      : nAlign을 기준으로 sObjPos의 Width, Height가 들어갈 수 있는
                    사분면을 자동으로 찾아 정렬한다.( 옵션 : Default=true )
                    true = 자동정렬, false = 자동정렬 하지 않음
    7. bBigResize : Object의 width, height가 해당 4분면의 영역보다 크면 4분면에 맞추어
                    Object의 width, height를 줄여서 조정한다.
                    즉, obj > Area이면 obj를 Area의 사분면에 맞춰 줄인다. ( 옵션 : Default = false )
                    true = Size 조정, false = Size 조정하지 않음
    8. bSmallResize : Object의 width, height가 해당 4분면의 영역보다 작으면 4분면에 맞추어
                    Object의 width, height를 늘려서 조정한다.
                    즉, obj < Area이면 obj를 Area의 사분면에 맞춰 늘인다. ( 옵션 : Default = false )
                    true = Size 조정, false = Size 조정하지 않음
 ★ return
    - 성공 = 주어진 조건에 맞는 정렬된 Object의 Position문자열
    - 실패 = ""
 ★ 주의사항
    1. bAuto와 (bBigResize, bSmallResize)는 동시에 true일 수 없다.
       bAuto가 true이면 bBigResize, bSmallResize는 false로 처리된다.
    2. (sAxisPos+sOffsetPos)가 sAreaPos의 범위를 벗어나면 null이 return된다.
       단, sObjPos의 최종 Align된 Position은 sAreaPos의 범위를 벗어날 수도 있다.
    2. 모든 Position은 sAreaPos의 좌표계에 맞도록 전달되어야 한다.
       따라서, 머리가 아프다면 모든 좌표를 screen좌표로 처리한다면
       좀 더 쉬워지겠지...
 ******************************************************************************/

function GetAlignPos( sAreaPos, sObjPos, sAxisPos, sOffsetPos, nAlign, bAuto, bBigResize, bSmallResize )

{

 var vAreaPos;

 var vAxisPos = new Rect();

 var vObjPos;

 var vOffsetPos;

 var vAlignPos = new Rect();

 

 if( fn_IsNull(sAreaPos) || fn_IsNull(sObjPos) ) return "";

 

 if( fn_IsNull(sAxisPos) )

  sAxisPos = "";

 

 if( fn_IsNull(sOffsetPos) )

  sOffsetPos = "0 0";

 

 if( fn_IsNull(nAlign) )

  nAlign = 0;

 

 if( fn_IsNull(bAuto) )

  bAuto = false;

 

 if( fn_IsNull(bBigResize) )

  bBigResize = false;

 

 if( fn_IsNull(bSmallResize) )

  bSmallResize = false;

 

 vAreaPos = Str2Rect(sAreaPos);

 if( fn_IsNull(vAreaPos) ) return "";

 vObjPos = Str2Rect(sObjPos);

 if( fn_IsNull(vObjPos) ) return "";

 if( sAxisPos != "" )

 {

  vAxisPos = Str2Rect(sAxisPos);

  if( fn_IsNull(vAxisPos) ) return null;

 }

 else

 {

  vAxisPos.left = vAreaPos.left + Math.round(vAreaPos.width/2,1);

  vAxisPos.top = vAreaPos.top + Math.round(vAreaPos.height/2,1);

 }

 

 vOffsetPos = Str2Rect(sOffsetPos);

 if( fn_IsNull(vOffsetPos) ) return "";

 

 if( bAuto == true )

 {

  bBigResize = false;

  bSmallResize = false;

 }

 

 // Axis를 Offset만큼 보정

 vAxisPos.left += vOffsetPos.left;

 vAxisPos.top += vOffsetPos.top;

 

 // Axis가 Area의 범위를 벗어나면 return null

 if( vAxisPos.left < vAreaPos.left )

  return "";

 if( vAxisPos.left > vAreaPos.right )

  return "";

 if( vAxisPos.top < vAreaPos.top )

  return "";

 if( vAxisPos.top > vAreaPos.bottom )

  return "";

 

 // Center에 위치

 if( nAlign == 0 )

 {

  vAlignPos.left = vAxisPos.left - Math.round(vObjPos.width/2,1);

  vAlignPos.top = vAxisPos.top - Math.round(vObjPos.height/2,1);

 }

 // 1사분면에 위치

 else if( nAlign == 1 )

 {

  vAlignPos.left = vAxisPos.left;

  vAlignPos.top = vAxisPos.top - vObjPos.height;

 }

 // 2사분면에 위치

 else if( nAlign == 2 )

 {

  vAlignPos.left = vAxisPos.left - vObjPos.width;

  vAlignPos.top = vAxisPos.top - vObjPos.height;

 }

 // 3사분면에 위치

 else if( nAlign == 3 )

 {

  vAlignPos.left = vAxisPos.left - vObjPos.width;

  vAlignPos.top = vAxisPos.top;

 }

 // 4사분면에 위치

 else if( nAlign == 4 )

 {

  vAlignPos.left = vAxisPos.left;

  vAlignPos.top = vAxisPos.top;

 }

 

 vAlignPos.right = vAlignPos.left + vObjPos.width;

 vAlignPos.bottom = vAlignPos.top + vObjPos.height;

 

 // Auto처리

 if( bAuto == true )

 {

  var i;

  var aAlignPosAuto, sAlignPosAuto, nCurAlign;

  if( nAlign != 0 )

  {

   for( i = 0 ; i <= 4 ; i++ )

   {

    nCurAlign = (nAlign+i)%5;

    if( nCurAlign == 0 )

     continue;

    sAlignPosAuto = GetAlignPos( sAreaPos, sObjPos, sAxisPos, sOffsetPos,

            nCurAlign, false, false, false );

    vAlignPosAuto = Str2Rect(sAlignPosAuto);

    if( (vAlignPosAuto.left >= vAreaPos.left) &&

     (vAlignPosAuto.right <= vAreaPos.right) &&

     (vAlignPosAuto.top >= vAreaPos.top) &&

     (vAlignPosAuto.bottom <= vAreaPos.bottom) )

    {

     vAlignPos = vAlignPosAuto;

     break;

    }

   }

  }

 }

 

 // Resize처리

 if( bBigResize == true || bSmallResize == true )

 {

  if( nAlign == 1 )

  {

   if( bBigResize == true )

   {

    if( vAlignPos.right > vAreaPos.right )  vAlignPos.right = vAreaPos.right;

    if( vAlignPos.top < vAreaPos.top )  vAlignPos.top = vAreaPos.top;      

   }

   if( bSmallResize == true )

   {

    if( vAlignPos.right < vAreaPos.right )  vAlignPos.right = vAreaPos.right;

    if( vAlignPos.top > vAreaPos.top )  vAlignPos.top = vAreaPos.top;      

   }

  }

  if( nAlign == 2 )

  {

   if( bBigResize == true )

   {

    if( vAlignPos.left < vAreaPos.left )  vAlignPos.left = vAreaPos.left;

    if( vAlignPos.top < vAreaPos.top )  vAlignPos.top = vAreaPos.top;      

   }

   if( bSmallResize == true )

   {

    if( vAlignPos.left > vAreaPos.left )  vAlignPos.left = vAreaPos.left;

    if( vAlignPos.top > vAreaPos.top )  vAlignPos.top = vAreaPos.top;      

   }

  }

  if( nAlign == 3 )

  {

   if( bBigResize == true )

   {

    if( vAlignPos.left < vAreaPos.left )  vAlignPos.left = vAreaPos.left;

    if( vAlignPos.bottom > vAreaPos.bottom )  vAlignPos.bottom = vAreaPos.bottom;      

   }

   if( bSmallResize == true )

   {

    if( vAlignPos.left > vAreaPos.left )  vAlignPos.left = vAreaPos.left;

    if( vAlignPos.bottom < vAreaPos.bottom )  vAlignPos.bottom = vAreaPos.bottom;      

   }

  }

  if( nAlign == 4 )

  {

   if( bBigResize == true )

   {

    if( vAlignPos.right > vAreaPos.right )  vAlignPos.right = vAreaPos.right;

    if( vAlignPos.bottom > vAreaPos.bottom )  vAlignPos.bottom = vAreaPos.bottom;      

   }

   if( bSmallResize == true )

   {

    if( vAlignPos.right < vAreaPos.right )  vAlignPos.right = vAreaPos.right;

    if( vAlignPos.bottom < vAreaPos.bottom )  vAlignPos.bottom = vAreaPos.bottom;      

   }

  }

  // Axis를 중심으로 작은 쪽에 맞추어 Resizing한다.

  if( nAlign == 0 )

  {

   var nSmallWidth, nSmallHeight;

   nSmallWidth = Math.min(vAxisPos.left - vAreaPos.left, vAreaPos.right - vAxisPos.left);

   nSmallHeight = Math.min(vAxisPos.top - vAreaPos.top, vAreaPos.bottom - vAxisPos.top);

 

   var bWFlag=false, bHFlag=false;  

   if( bSmallResize == true )

   {

    if( Math.round(vObjPos.width/2,1) < nSmallWidth )

     bWFlag = true;

    if( Math.round(vObjPos.height/2,1) < nSmallHeight )

     bHFlag = true;

   }

   if( bBigResize == true )

   {

    if( Math.round(vObjPos.width/2,1) > nSmallWidth )

     bWFlag = true;

    if( Math.round(vObjPos.height/2,1) > nSmallHeight )

     bHFlag = true;

   }

   if( bWFlag == true )

   {

    vAlignPos.left = vAxisPos.left - nSmallWidth;

    vAlignPos.right = vAxisPos.left + nSmallWidth;

   }

   if( bHFlag == true )

   {

    vAlignPos.top = vAxisPos.top - nSmallHeight;

    vAlignPos.bottom = vAxisPos.top + nSmallHeight;

   }

  }

 }

 

 vAlignPos.width = vAlignPos.right - vAlignPos.left;

 vAlignPos.height = vAlignPos.bottom - vAlignPos.top;

 

 return Rect2Str(vAlignPos);

}


/*******************************************************************************
 ★ 설명
    nX, nY좌표를 nCx, nCy를 중심으로 nAngle만큼 회전한 좌표를 구한다.
 ★ parameter
    1. nX : 회전할 X좌표
    2. nY : 회전할 Y좌표
    3. nCx : 회전 중심 X좌표
    4. nCy : 회전 중심 Y좌표
    5. nAngle : 회전 각(※ radian, 숫자값이 아니다.)(예:Math.PI, Math.PI/2,...)
 ★ return
    1. 성공 = Rect Object( 단, Rect.left = 회전된 X좌표, Rect.top = 화전된 Y좌표 )
    2. 실패 = null
******************************************************************************/

function RotatePoint(nX, nY, nCx, nCy, nAngle)

{

 var vPoint = new Rect();

 

 if( fn_IsNull(nX) || fn_IsNull(nY) || fn_IsNull(nCx) || fn_IsNull(nCy) || fn_IsNull(nAngle) )

  return null;

 

 nY = -1*nY;

 nCy = -1*nCy;

 vPoint.left = nCx + Math.round(Math.cos(nAngle)*(nX-nCx) - Math.sin(nAngle)*(nY-nCy),1);

 vPoint.top = nCy + Math.round(Math.sin(nAngle)*(nX-nCx) + Math.cos(nAngle)*(nY-nCy),1);

 vPoint.top = -1*vPoint.top;

 

 return vPoint;

}

 

/*******************************************************************************
 ★ 설명
    A직선(Start ~ End)과 B직선(Start ~ End)의 교차점을 구한다.
 ★ parameter
    1. nA_StartX : A직선의 Start X값
    2. nA_StartY : A직선의 Start Y값
    3. nA_EndX   : A직선의 End X값
    4. nA_EndY   : A직선의 End Y값
    5. nB_StartX : B직선의 Start X값
    6. nB_StartY : B직선의 Start Y값
    7. nB_EndX   : B직선의 End X값
    8. nB_EndY   : B직선의 End Y값
 ★ return
    1. 성공 = Rect Object( 단, Rect.left = 교차점 X좌표, Rect.top = 교차점 Y좌표 )
    2. 실패 = null
 *****************************************************************************/

function CrossPoint(nA_StartX, nA_StartY, nA_EndX, nA_EndY, nB_StartX, nB_StartY, nB_EndX, nB_EndY)

{

 var vPoint = new Rect();

 var nA_Angle, nB_Angle;

 

 if( fn_IsNull(nA_StartX) || fn_IsNull(nA_StartY) || fn_IsNull(nA_EndX) || fn_IsNull(nA_EndY) ||

  fn_IsNull(nB_StartX) || fn_IsNull(nB_StartY) || fn_IsNull(nB_EndX) || fn_IsNull(nB_EndY) )

  return null;

 

 nA_StartY = -1*nA_StartY;

 nB_StartY = -1*nB_StartY;

 nA_EndY = -1*nA_EndY;

 nB_EndY = -1*nB_EndY;  

 nA_Angle = Math.tan(Math.atan2((nA_EndY - nA_StartY), (nA_EndX - nA_StartX)));

 nB_Angle = Math.tan(Math.atan2((nB_EndY - nB_StartY), (nB_EndX - nB_StartX)));

 

 // 평행한 경우

 if( Math.abs(Deg2Rad(nA_Angle - nB_Angle))%180  == 0 )

  return null;

  

 vPoint.left = (nA_StartY - nB_StartY - nA_Angle*nA_StartX + nB_Angle*nB_StartX)/(nB_Angle - nA_Angle);

 vPoint.top = nA_StartY - nA_Angle*(nA_StartX - vPoint.left);

 

 vPoint.left = Math.round(vPoint.left,1);

 vPoint.top = -1*Math.round(vPoint.top,1);

 

 return vPoint;

}

 

/*******************************************************************************
 ★ 설명
    화면좌표에서 nBase(X,Y)를 지나는 가로선 대비 n(X,Y)좌표를 Radian각으로 구한다.
 ★ parameter
    1. nBaseX, nBaseY : 기준 X, Y좌표
    2. nX, nY : X, Y좌표
 ★ return
    1. 성공 = Radian(예: Math.PI, ...)
    2. 실패 = NaN
******************************************************************************/

function fn_GetAngle(nBaseX, nBaseY, nX, nY)

{

 return Math.atan2((nBaseY-nY),(nX-nBaseX));

}

☞  

 

☞  

 
위쪽 공통 함수 (즉, 위에서 호출)


/*******************************************************************************
 ★ 설명
     sObjName이 Popup창(showModaless()에 의해 뜬창)인지 확인한다.
     단, showModal()에 의해 뜬 창은 해당되지 않는다.
 ★ parameter
    1. sObjName : Popup창 여부를 확인할 Object Name
 ★ return
    - sObjName이 Popup창인 경우 = true
    - sObjName이 Popup창이 아닌 경우 = false
 ★ 주의사항
    단, showModal()에 의해 뜬 창은 해당되지 않는다.
 ******************************************************************************/

function IsObjPopup(sPopupName)

{

 if( fn_IsNull(sPopupName) ) return false;

 

 if( fn_IsNull(application.popupframes(sPopupName)) )

  return false;

 else

  return true;

}

 

 

  

Posted by 농부지기
,

[ Nexacro.Component -  Object 생성.삭제 ]

 


/*******************************************************************************
 ★ 설명
     Object를 생성한다. 만일 Object가 이미 존재하면 존재하는 Object를 return한다.
     (예 : sObjType="Button", sObjName="Button00"이면
           Button00 Object를 생성하여 oParent에 포함시킨 후 Return한다.)
 ★ parameter
    1. sObjName : 생성할 Object Name ( 예 : "Button00" )
    2. sObjType : 생성할 Object Type ( 예 : "Button", "Static", ... )
    3. oParent  : 포함시킬 부모 Object(옵션 : Default=this) (예 : this, childframe, ... )
    4. bShow    : 화면에 보여질지 여부 (옵션 : Default=true)
 ★ return
    - 성공 = 생성된 Object 또는 이미 존재하면 해당 Object
    - 실패 = null
 ★ 주의사항
    - Component생성만 할것, 다른 Object는 Test안해봐서 신뢰할 수 없음
 ******************************************************************************/

function NewObj(sObjName, sObjType, oParent, bShow)

{

 var sFstr, oRet, aObjExist;

 

 if( fn_IsNull(sObjName) ) return null;

 if( fn_IsNull(sObjType) )  return null;

 

 if( fn_IsNull(oParent) ) oParent = this;

 if( fn_IsNull(bShow) )  bShow = true;

 

 aObjExist = oParent.all(sObjName);

 if( aObjExist != null )

  return aObjExist;

 

 sFstr = "new " + sObjType + "(\"" + sObjName + "\")";

 oRet = eval(sFstr);

 if( fn_IsNull(oRet) )

  return null;

  

 if( oParent.addChild(sObjName, oRet) == -1 )

  return null;

 

 

 if( bShow == true )

  oRet.show();

 

 return oRet;

}

 

/*******************************************************************************
 ★ 설명
     Object를 생성한다. 만일 Object가 이미 존재하면 존재하는 Object를 return한다.
     (예 : sObjType="Button", sObjName="Button00"이면
           Button00 Object를 생성하여 oParent에 포함시킨 후 Return한다.)
 ★ parameter
    1. sObjName : 생성할 Object Name ( 예 : "Button00" )
    2. sObjType : 생성할 Object Type ( 예 : "Button", "Static", ... )
    3. oParent  : 포함시킬 부모 Object(옵션 : Default=this) (예 : this, childframe, ... )
    4. bShow    : 화면에 보여질지 여부 (옵션 : Default=true)
 ★ return
    - 성공 = 생성된 Object 또는 이미 존재하면 해당 Object
    - 실패 = null
 ★ 주의사항
    - Component파괴만 할것, 다른 Object는 Test안해봐서 신뢰할 수 없음
 ******************************************************************************/

function DelObj(sObjName, oParent)

{

 var oObj;

 

 if( fn_IsNull(sObjName) ) return false;

 

 if( fn_IsNull(oParent) )

  oParent = this;

 

 oObj = oParent.all(sObjName);

 if( oObj == null ) return true;

 

 oParent.removeChild(sObjName);  

 

 oObj.destroy();

 oObj = null;

 

 return true;

}

 

☞  

 

☞  

 
 
 
 

  

 

Posted by 농부지기
,

[ Nexacro.Component -  Object Properties ]

 


/*******************************************************************************
 ★ 설명
     Object의 Property를  설정한다.
 ★ parameter
    1. sObjName = Object Name ( 예 : Button00, ... )
    2. sPropName = Property Name ( 예 : enable, style.border, ... )
    3. sPropVal - Property Value ( 예 : true, "1 solid blue", ... )
 ★ return
    - 성공 = 수행된 Property Setting 문자열 ( TEST를 위해 Return함 )
    - 실패 = ""
 ******************************************************************************/

function SetProp(sObjName, sPropName, sPropVal)

{

 if( fn_IsNull(sObjName) || fn_IsNull(sPropName) || fn_IsNull(sPropVal) )  return "";

 

 var sPropExpr = sObjName+"."+sPropName+" = " + sPropVal;

 eval(sPropExpr);

 

 return sPropExpr;

}

 

/*******************************************************************************
 ★ 설명
     Object의 Property를  가져온다.
 ★ parameter
    1. sObjName = Object Name ( 예 : Button00, ... )
    2. sPropName = Property Name ( 예 : enable, style.border, ... )
 ★ return
    - 성공 = Property 값
    - 실패 = eval()과 동일
 ******************************************************************************/

function GetProp(sObjName, sPropName, sPropVal)

{

 var sPropExpr = sObjName+"."+sPropName;

 return eval(sPropExpr);

}

 

 

 

 

 

/*******************************************************************************
 ★ 설명
     Object의 Property를  가져온다.
 ★ parameter
    1. sObjName = Object Name ( 예 : Button00, ... )
    2. sPropName = Property Name ( 예 : enable, style.border, ... )
 ★ return
    - 성공 = Property 값
    - 실패 = eval()과 동일
 ******************************************************************************/

function GetPropList(oObj)

{

 if( fn_IsNull(oObj) ) return null;

 

 for( var x in oObj )

 {

  trace( x + ":" + oObj[x] );

 }

}


/*******************************************************************************
 ★ 설명
     Object의 type을 문자열로 얻어온다.
 ★ parameter
    1. oObj : type을 얻어올 Object
    (예 : mainframe, this.getOwnerFrame(), this, button,...)
 ★ return
    - 성공 = Object의 type문자열(예 : "MainFrame", "ChildFrame", "Form", "Button",...)
    - 실패 = ""
 ******************************************************************************/

function GetObjType(oObj)

{

 var sType;

 

 if( fn_IsNull(oObj) )  return "";

 

 sType = oObj.toString().valueOf().substr(1,6);

 if( sType.toLowerCase() == "object" )

 

    return Mid(oObj.toString().valueOf(), " ", "]");

 

 return "";

}

☞  

 

☞  

 
 
 
 

  

Posted by 농부지기
,

[ Nexacro.Component -  combo ]

 

 

/**********************************************************************************
 * 함수명      : gfn_getCboValue
 * 설명        : 콤보에 존재하는 values값들을 return
 * argument     :
 * return Type : String
**********************************************************************************/

function gfn_getCboValue(obj) {

    if(!obj instanceof Combo) return;

    var ds = obj.innerdataset;

    if ( gfn_GetCompType(ds) != "Dataset"){

        ds = eval(ds);

    }

    if (obj.index < 0) obj.index = 0;

    var cd   = obj.codecolumn;

    var nm   = obj.datacolumn;

    var rtnCd = "";

 

    if (ds.getColumn(obj.index, nm) == "선택" || ds.getColumn(obj.index, nm) == "전체") {

        for (var i=1; i<ds.rowcount; i++) {

            if (i==1) {

                rtnCd += "'" + ds.getColumn(i, "CD") + "'";

            } else {

                rtnCd += ",'" + ds.getColumn(i, "CD") + "'";

            }

        }

    } else {

        rtnCd = "'" + ds.getColumn(obj.index, cd) + "'";

    }

    return rtnCd;

}

 

☞  

 

☞  

 
 
 
 

  

Posted by 농부지기
,

[ Nexacro.Component -  checkBox ]

 

 

/**
* 선택된 라디오버튼이 있는지 체크
*/

function hasCheckedRadio(input) {

    if (input.length > 1) {

        for (var inx = 0; inx < input.length; inx++) {

            if (input[inx].checked) return true;

        }

    } else {

        if (input.checked) return true;

    }

    return false;

}

 

/**
* 선택된 체크박스가 있는지 체크
*/

function hasCheckedBox(input) {

    return hasCheckedRadio(input);

}

 

☞  

 

☞  

 
 
 
 

  

 

Posted by 농부지기
,

[ Nexacro.Component -  div minimize ]

 


/*++
프로그램 설명     : minimize Div들의 onresize를 위해 미리 정보를 저장
@ Name            : gfn_InitMinimizeDiv
@ Parameter       : paDiv : Div Object의 Array, (예, [div1, div2, div3])
@ Parameter       : pbResizeAll : Div 전체를 Anchor에 상관없이 resize 하려는 경우 true
@ Return          : none
*/

function gfn_InitMinimizeDiv(paDiv, pbResizeAll)

{

    if (gfn_IsNull(pbResizeAll)) pbResizeAll = false;

    _bResizeAll = pbResizeAll;

    

    var dsObj = eval(_gfn_AddDsAnchor());

    

    if (dsObj.rowcount == 0) {

        for (var i = 0; i < paDiv.length; i++) {

            var nRow = dsObj.addRow();

            dsObj.setColumn(nRow, "id", paDiv[i].name);

            dsObj.setColumn(nRow, "state", "maximize");

            dsObj.setColumn(nRow, "org_top", paDiv[i].position.top);

            dsObj.setColumn(nRow, "org_height", paDiv[i].position.height);

            dsObj.setColumn(nRow, "cur_top", paDiv[i].position.top);

            dsObj.setColumn(nRow, "cur_height", paDiv[i].position.height);

            dsObj.setColumn(nRow, "anchor", paDiv[i].anchor);

        }

    }

}

 

 

/*++
프로그램 설명     : Div 간의 minimize/maximize 기능
@ Name            : gfn_MinimizeDiv
@ Parameter       : obj : Div에 포함된 Component (이벤트 발생 Object)
@ Parameter       : paDiv : Div Object의 Array, (예, [div1, div2, div3])
@ Return          : none
*/

function gfn_MinimizeDiv(obj, paDiv)

{

    var dsObj = eval(_gfn_AddDsAnchor());

    var nMinHeight = 37; //minimize될때의 Div Height

    var nHeightSpace = 0; //Div들간의 minimize/maximize 될때 생기는 높이값

    

    if (gfn_IsNull(obj.state)) obj.state = "maximize";

    

    if (obj.state == "maximize") {

        obj.state = "minimize";

        obj.class = "btn_WFDA_maximize";

    } else {

        obj.state = "maximize";

        obj.class = "btn_WFDA_minimize";

    }

    

    if (dsObj.rowcount == 0) {

        for (var i = 0; i < paDiv.length; i++) {

            var nRow = dsObj.addRow();

            dsObj.setColumn(nRow, "id", paDiv[i].name);

            dsObj.setColumn(nRow, "state", "maximize");

            dsObj.setColumn(nRow, "org_top", paDiv[i].position.top);

            dsObj.setColumn(nRow, "org_height", paDiv[i].position.height);

            dsObj.setColumn(nRow, "cur_top", paDiv[i].position.top);

            dsObj.setColumn(nRow, "cur_height", paDiv[i].position.height);

            dsObj.setColumn(nRow, "anchor", paDiv[i].anchor);

        }

    }

 

    dsObj.keystring = "S:+org_top"; //정렬

    dsObj.setColumn(dsObj.findRow("id", obj.parent.name), "state", obj.state);

    

    if (obj.state == "minimize") { //Div접음

        for (var nRow = 0; nRow < dsObj.rowcount; nRow++) {

            var oDiv = eval(dsObj.getColumn(nRow, "id"));

            

            if (obj.parent.name == oDiv.name) {

                nHeightSpace = oDiv.position.height - nMinHeight;

                oDiv.position.height = nMinHeight;

                

                if (nRow < dsObj.rowcount && nHeightSpace > 0) {

                    for (var i = nRow + 1; i < dsObj.rowcount; i++) {

                        var oNextDiv = eval(dsObj.getColumn(i, "id"));

                        oNextDiv.position.top = oNextDiv.position.top - nHeightSpace;

                        

                        if (dsObj.getColumn(i, "state") == "minimize") {

                            oNextDiv.position.height = nMinHeight;

                        } else {

                            nHeightSpace = 0;

                        }

                    }

                }

            }

        }

    } else { //Div펼침

        for (var nRow = 0; nRow < dsObj.rowcount; nRow++) {

            var oDiv = eval(dsObj.getColumn(nRow, "id"));

            

            if (obj.parent.name == oDiv.name) {

                nHeightSpace = dsObj.getColumn(nRow, "cur_height") - oDiv.position.height;

                oDiv.position.height = dsObj.getColumn(nRow, "cur_height");

                

                if (nRow < dsObj.rowcount && nHeightSpace > 0) {

                    for (var i = nRow + 1; i < dsObj.rowcount; i++) {

                        var oNextDiv = eval(dsObj.getColumn(i, "id"));

                        

                        if (dsObj.getColumn(i, "state") == "minimize") {

                            oNextDiv.position.top = oNextDiv.position.top + nHeightSpace;

                            oNextDiv.position.height = nMinHeight;

                        } else {

                            var nOrgHeight = dsObj.getColumn(i, "cur_height");

                            var nCurHeight = oNextDiv.position.height;

                            

                            oNextDiv.position.top = oNextDiv.position.top + nHeightSpace;

                            

                            if (nOrgHeight == nCurHeight) {

                                oNextDiv.position.height = nOrgHeight;

                            } else {

                                oNextDiv.position.height = nCurHeight - nHeightSpace;

                                nHeightSpace = 0;

                            }

                        }

                    }

                }

            }

        }

    }

}

 

 

/*++
프로그램 설명     : Div 간의 minimize/maximize 정보를 저장할 Dataset을 생성 (개발자 사용금지)
@ Name            : _gfn_AddDsAnchor
@ Parameter       : none
@ Return          : Dataset Name
*/

function _gfn_AddDsAnchor()

{

    return _gfn_AddDataset("_dsAnchor", ["id", "state", "org_top", "org_height", "cur_top", "cur_height", "anchor"]

                                      , ["string", "string", "int", "int", "int", "int", "string"]);

}

 

 

/*++
프로그램 설명     : Dataset을 추가생성 (개발자 사용금지)
@ Name            : _gfn_AddDataset
@ Parameter       : psDatasetName : 생성할 Dataset명
@ Parameter       : paColumnName : Dataset에 들어갈 Column명 Array
@ Parameter       : paType : Column의 Type Array
@ Return          : Dataset Name
*/

function _gfn_AddDataset(psDatasetName, paColumnName, paType)

{

    //Dataset 존재여부 확인 및 생성

    if (!isValidObject(psDatasetName)) {

        var oDs = new Dataset;

        oDs.name = psDatasetName;

        this.addChild(psDatasetName, oDs);

        

        if (!gfn_IsNull(paColumnName)) {        

            var dsObj = eval(psDatasetName);

            

            for (var i = 0; i < paColumnName.length; i++) {

                dsObj.addColumn(paColumnName[i], paType[i]);

            }

        }

    }

    

    return psDatasetName;

}

 

/*++
프로그램 설명     : 값이 존재하는지 여부 체크
@ Name            : gfn_IsNull
@ Parameter       : Value
@ Return          : true / false
*/

function gfn_IsNull(val)

{

    var sVal = new String(val);

    

    if (sVal == null || sVal == "null" || sVal.trim().length <= 0 || escape(sVal) == "undefined") {

        return true;

    } else {

        return false;

    }

}

 

☞  

 

☞  

 
 
 
 

  

Posted by 농부지기
,

[ Nexacro.Component -  전체컴포넌트 검색 ]

     

/******************************************************************************************
@desc    상태별 콤보넌트 처리

@호출예 : gfn_EnableComponentMain(this.components, bEnable);
          gfn_EnableComponentMain(tab.pageSpec.divSpec.components, bEnable);
 *****************************************************************************************/

function gfn_EnableComponentMain(objComp, bEnable){
    // 1. root components
    
for(var i=0; i<objComp.length; i++){
        
var sType = gfn_GetCompType(objComp[i]);
        
        
if (sType == 'Div' || sType=='Tab'){
            gfn_EnableComponentMain(objComp[i].components, bEnable);
        }
else if (sType=='Tabpage' || sType=='Grid' || sType=='Static'){
            //skip
        }
else{
            
var sDefaultEnable = objComp[i].DefaultEnable;
            
if (sDefaultEnable == "false")
                objComp[i].enable = false;
            else if (sDefaultEnable == "
true")
                objComp[i].enable = true;
            else

                objComp[i].enable = bEnable;
        }
    }
}

function cfn_GetCompType(objComp){

    return ((objComp+"").substr(8)).replace("]", "");

}

☞  

 
 

 

--  아래는 위 function에서 필요한  공통함수들 임 --

/*++

@desc  각 컴포넌트 type return

@name  gfn_GetCompType

@param  objComp - component name

@return  componet type

*/

function gfn_GetCompType(objComp){

    return ((objComp+"").substr(8)).replace("]", "");

}

'Nexacro-Function > Componet.Object.Form' 카테고리의 다른 글

Nexacro.Component - Object Properties  (0) 2017.01.28
Nexacro.Component - combo  (0) 2017.01.28
Nexacro.Component - checkBox  (0) 2017.01.28
Nexacro.Component - div minimize  (0) 2017.01.28
Nexacro.Component - component  (0) 2017.01.28
Posted by 농부지기
,

[ Nexacro.Component -  component ]

 

/*==+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 * Group : 1. 기타
 **=++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/


/******************************************************************************************
 * 기능 : component path 구하기
 * 인자 : Object
 * 리턴 :
 * 예문 :
 *****************************************************************************************/

var iCompFullPath='';
function gfn_CompFullPath(obj)
{
    var rtn = "";

    if(iCompFullPath == ""){
        iCompFullPath = obj.name;
    }

    if(obj.parent.toString().toUpperCase() == "[OBJECT CHILDFRAME]")
    {
       var arr = iCompFullPath.split(".");

       for ( var i = (arr.length-2); i >=0; i -- ) {
          rtn = rtn + arr[i] + ".";
       }

       iCompFullPath = rtn.substr(0,rtn.length -2);

       return ;
    }

    var obj = obj.parent;
    iCompFullPath = iCompFullPath + "." + obj.name;

    gfn_CompFullPath(obj);
}


//호출 : gfn_setBindItem("csAsstClsCd", "tab.page1.divRight.csAsstCls.edtCode"
                         ,"dsAsstPlan", "ASST_CLS_CD");
//정의 : 컴포넌트에 대해서 동적으로 script를 이용해서 binding 처리
//인자 : psBindId - bind id
//       psBindComp - component id
//       strDS      - bind할 dataset
//       strCol     - bind할 column id

function gfn_setBindItem(psBindId, psBindComp,strDS,strCol)

{

    var newbinditem = new BindItem;

    newbinditem.init(psBindId, psBindComp, "value", strDS,strCol);

    this.addChild(psBindId, newbinditem);

    eval(psBindId).bind();

}

 

/******************************************************************************************
// 다음 FOCUS 컴포넌트 얻은 후 Focus위치시키기

*****************************************************************************************/

function gfn_setEvent(obj, e:KeyEventInfo) {

    var objNComp = getNextComponent(obj, true);

    if(objNComp <> null) {

        objNComp.setFocus();

    }

}


/******************************************************************************************
 * 기능 : null 값일경우 치환
 * 인자 : arg1 : 실제의 값
 *        arg2 : 치환될 값
 * 리턴 :
 * 예문 :
 *****************************************************************************************/

function gfn_NVL(arg1, arg2)

{

    if(gfn_IsNull(arg1)){

        return arg2;

    }else{

        return arg1;

    }

}

 


/******************************************************************************************
 * 기능 : 입력값이 null에 해당하는 경우 모두를 한번에 체크한다.
 * 인자 : sValue : 체크할 문자열( 예 : null 또는 undefined 또는 "" 또는 "abc" )
 * 리턴 : true - undefined, null, NaN, "", Array.length = 0인 경우
 *        fasle - 위값 이외의 경우
 * 예문 :
 *****************************************************************************************/

function fn_IsNull(sValue)

{

    if( String(sValue).valueOf() == "undefined") return true;

        

    if( sValue == null ) return true;

 

    if( ("x"+sValue == "xNaN") && ( new String(sValue.length).valueOf() == "undefined" ) )  return true;

 

    if( sValue.length == 0 ) return true;

 

    return false;

}

 

/*******************************************************************************
 ★ 설명
    전각문자를 반각문자로
    ( 참고 : 전각문자는 "정사각형" 안에 들어가는 문자이고, 반각은 그 정사각형의 반쪽에 들어가는 문자이다.
             전각문자의 폭은, 반각문자의 2배입니다.
             예를 들어 숫자 "3" 은, 한글 "가"의 절반의 폭만을 가지고 있습니다.
             그래서 영문과 숫자 등은 반각이고, 한글이나 한자들은 전각문자입니다.
             다만, 영문과 숫자를 전각으로 표현할 수도 있습니다.
      예 : 전각문자 ==> ※★0+
           반각문자 ==> 1a )
 ★ Parameter
    1. sFull   : 전각문자( 예 : "0+" )
 ★ return
    - 성공 = 반각문자 ( 예 : "0+" )
    - 실패 = ""
 ******************************************************************************/

function fn_Full2Half(sFull)

{

 var i, c, sHalf = "";

  

 if( fn_IsNull(sFull) )  return "";

 

 for( i=0 ; i < sFull.length ; i++ )

 {

  var c = sFull.charCodeAt(i);

 

  if (c == 12288)

   sHalf += unescape("%20");

  else if ( (c >= 65281) && (c <= 65374) )

   sHalf += unescape("%"+(c-65248).toString(16));

  else

   sHalf += sFull.charAt(i);

 }

 return  sHalf;

}

 

/*******************************************************************************
 ★ 설명
    반각문자를 전각문자로
 ★ Parameter
    1. sHalf   : 반각문자( 예 : "0+" )
 ★ return
    - 성공 = 전각문자 ( 예 : "0+" )
    - 실패 = ""
 ******************************************************************************/

function fn_Half2Full(sHalf)

{

    var rTmp = "";

    var iTmp = "";

    var i;

 

  if( fn_IsNull(sHalf) )  return "";

  

    for( i = 0 ; i < sHalf.length ; i++ )

    {

        //기본 아스키 코드 값을 벗어난 경우(한글)는 전자로 변환할 필요 없음.

        if( (sHalf.charCodeAt(i) >= 32) && (sHalf.charCodeAt(i) <= 126) )

        {

   if( sHalf.charCodeAt(i) == 32 )

    iTmp = unescape("%u"+(12288).toString(16));

            else

    iTmp = sHalf.charCodeAt(i) + 65248;

  }

        else

            iTmp = sHalf.charCodeAt(i);

 

 

  if( sHalf.charCodeAt(i) == 32 )

   rTmp = rTmp + (iTmp);

  else

   rTmp = rTmp + String.fromCharCode(iTmp);

    }

 

    return rTmp;

}


/*******************************************************
 * @name : gf_getBindObjInfo
 * @description : 컴포넌트의 바인딩 정보를 알아낸다
 * @param : component obj
 * @return : obj
 * @example :    var obj = gf_getBindObjInfo(Combo00);
                                 //trace(obj.datasetid);
                                 //trace(obj.columnid);
 *******************************************************/

 function gf_getBindObjInfo(findObj)

 {

         var obj = {};

         var bindObj = this.binds;

         for(var i=0 ; i<bindObj.length ; i++){

                 

                if(findObj.name != bindObj[i].compid) continue;

                 

                obj.datasetid = bindObj[i].datasetid;

                 obj.columnid = bindObj[i].columnid;

         }

         

        return obj;

 }

 /******************************************************************************
  * Function명 : gf_cutIndexByBytes
  * 설명       : byte수 체크하여 잘라낼 시작 index값을 반환
  * Params     : String
  * Return     : 잘라낼 시작 index(-1이면 잘라낼 값 없음.)
  ******************************************************************************/

 function gf_cutIndexByBytes(str, maxByte) {

     if ( gf_isNull(str) ) return;

     

    var bytes = 0;

 

    for (var i=0, n=str.length; i < n; i++) {

         var oneChar = escape(str.charAt(i));

         if ( oneChar.length == 1 ) {

             bytes ++;

         } else if (oneChar.indexOf("%u") != -1) {

             bytes += 2;

         } else if (oneChar.indexOf("%") != -1) {

             bytes += oneChar.length/3;

         }

         

        if (bytes > maxByte) {

                         return i;

         }

     }

 

    return -1;

 }

 

 /******************************************************************************
  * Function명 : gf_checkBytes()
  * 설명       : Edit, TextArea의 byte수를 체크하고 초과되는 내용을 자동으로 잘라낸다. ontextchange 이벤트에서 호출.
  * Params     : obj - 체크할 object
                 autoCutYn - 자동으로 잘라낼지 여부(파라메터 넘기지 않으면 기본값 'Y'로 처리)
  * Return     : boolean - true 또는 false
  ******************************************************************************/

 function gf_checkBytes(obj, e:TextChangeEventInfo) {

     var str = e.posttext;

     var maxByte = obj.maxlength;

     

    if ( gf_isNull(str) ) return true;

     if ( gf_isNull(maxByte) || toNumber(maxByte) < 0 ) return true;

     

    var cutIdx = gf_cutIndexByBytes(str, maxByte);

     

    if (cutIdx > 0)

     {

                 obj.value = str.substring(0, cutIdx);

                 return false;

     }

     

    return true;

 }

 

/******************************************************************************************
 * 기      능 : 각 컴포넌트 type return
 * 인      자 : objComp - component name
 * 반      환 : componet type
 *****************************************************************************************/

function gfn_GetCompType(objComp){

    return ((objComp+"").substr(8)).replace("]", "");

}

 

/******************************************************************************************
 * 기      능 : 동적 binding
 *              사용자 object를 만든 후 form에 추가했을 경우 dataset과 binding을 할 수 없다.
 *              이때 binding을 처리 해준다.
 * 인      자 : psBindId - bind id
 *              bindComp - stirng형 component id
 * 반      환 : componet type
 *****************************************************************************************/

function gfn_setBindItem(psBindId, bindComp,strDS,strCol)

{

    var newbinditem = new BindItem;

    newbinditem.init(psBindId, bindComp, "value", strDS,strCol);

    this.addChild(psBindId, newbinditem);

    eval(psBindId).bind();

}

 
 

  

 

Posted by 농부지기
,