[ 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 농부지기
,