[ Nexacro-FrameWork1. step2.메뉴연결 및 업무화면생성 ]

1. menu dataset생성
   - id      : gds_menu
   - Columns : level, menuId, menuNm, formUrl, param
   - Rows    : 메뉴 data row 추가 및 data추가 (잘)

2. 열려진 menu dataset생성
   - id      : gds_openMenu
   - Columns : level, menuId, menuNm, formUrl

3. 왼쪽 Frame에  메뉴 목록 조회
   - leftMenu.xfdl
   - grid 생성 : id : grd_menu,     binddataset : gds_menu
   - grd_menu에 : gds_menu연결 및 메뉴를 tree로 보여주도록 Grid (잘)설정
   - grid 속성
     . autofittype     : col
     . treeinitstatus  : expand,all
     . treeusecheckbox : false
    
4. workMain.xfdl - div생성
   - 정의 : 업무 화면을 보여줄(연결할) div생성
   - id : div_work

5. 업무화면(form)용 Services 하나 추가
    - Service ID : busi
    - Service Type : form
    - Service Url : ./busi/

6. 업무화면 추가
    - busi::commonCode.xfdl  (공통코드) (width:784,  height:608)
    - busi::subsidiary.xfdl (법인코드)  (width:784,  height:608)
    - busi::proforma.xfdl (견적서관리)  (width:784,  height:608)
    - busi::unitPrice.xfdl (단가관리)   (width:784,  height:608)
    - busi::bid.xfdl   (입찰관리)       (width:784,  height:608)

7. 업무화면 id와 gds_menu의 url 등 연결
    - 잘...

8. leftMenu.xfdl
   1. 정의 : Grid에서 menu douclick시 화면 조회 script개발

//메뉴클릭 시 > 업무화면 open
this.grd_menu_oncelldblclick = function(obj:Grid, e:nexacro.GridClickEventInfo)
{
 var nChildCnt = obj.getTreeChildCount(e.row);
 if (nChildCnt == 0){
  var sMenuId = application.gds_menu.getColumn(e.row, "menuId");
  application.afn_menuOpen(sMenuId);
 }
}

8. application script 개발
   1. 정의 :  메뉴 클릭 시 화면 open(interface용. tabFrame에 fn_menuOpen() 호출)
   2. event1개, function1개 추가
      . application_onloadingglobalvariables : Event추가 (application관점에서 변수관리)
      . afn_menuOpen() : function추가 (메뉴 open interface용)
   3. script
this.av_mainFrame;
this.av_tapFrame;
this.av_mdiFrameSet;

this.application_onloadingglobalvariables = function(obj:Application, e:nexacro.LoadEventInfo)
{
 this.av_mainFrame   = application.mainframe;
 this.av_tapFrame    = this.av_mainFrame.vStartFrameSet.vMainFrameSet.hMiddleFrameSet.vWorkFrameSet.tabFrame;
 this.av_mdiFrameSet = this.av_mainFrame.vStartFrameSet.vMainFrameSet.hMiddleFrameSet.vWorkFrameSet.mdiFrameSet;
}

//메뉴클릭 시 > 업무화면 open(interface용. tabFrame에 fn_menuOpen() 호출)
this.afn_menuOpen = function(sMenuId){
 var nRow = application.gds_menu.findRow("menuId", sMenuId);
 if (nRow < 0) return;
 
 this.av_tapFrame.form.fn_menuOpen(nRow);  //이때 중간에 form object명을 넣어야 됨 (왜, 몰러??)
}

9. tapFrame.xfdl
   1. 정의 : 클릭한 메뉴를 tab에 보여주고, workFrame에 화면 보여주기
   2. tab component 추가
      . id : tabMenu
      . 초기 생성 시 : tabpage가 2개 생성됨. 이때 하나는 삭제
                       (하나는 남겨두는 이유는 개발자 눈에 보이기 위해서.
                        차후 onload event에서 결국 삭제 함)
   3. Event 3개 와 function1개 생성
      . form.fn_onload     : 화면 onload시 tab 초기화
      . fn_menuOpen        : workMain Frame에 MDI로 업무화면 open 
      . tabMenu.onchanged  : menu클릭 시 클릭한 메뉴 tab에 추가 및 화면 open
      . tabMenu.onextrabuttonclick : tabpage에서 [x]를 클릭하면 화면 close
       
   4. fn_onload  script
/*
* desc : form onload
*/
this.fn_onload = function(obj:Form, e:nexacro.LoadEventInfo)
{
 this.tabMenu.removeTabpage(0);
}

   5. fn_menuOpen script
/*
* desc : menu 클릭 시 클릭한 메뉴 open
*/
var fv_maxMenu = 20;
this.fn_menuOpen = function(nMenuRow){
 var objTab = this.tabMenu;
 
 var objDsMenu = application.gds_menu;
 var sMenuId   = objDsMenu.getColumn(nMenuRow, "menuId");
 var sMenuNm   = objDsMenu.getColumn(nMenuRow, "menuNm");
 var sFormUrl  = objDsMenu.getColumn(nMenuRow, "formUrl");
 var sFormUrl  = objDsMenu.getColumn(nMenuRow, "formUrl");
 var sParam    = objDsMenu.getColumn(nMenuRow, "param");
 
 if (this.gfn_isNull(sFormUrl)) return;
 
 //1. 현재 메뉴가 이미 open되어 있으면 해당화면 활성화
 var nFind = application.gds_openMenu.findRow("menuId", sMenuId)
 if (nFind >= 0){
  var nPageCnt = this.tabMenu.getTabpageCount();
  var objPages = this.tabMenu.tabpages;
  for(var idx=0; idx<nPageCnt; idx++){
   if (sMenuId == objPages[idx].name){
    this.tabMenu.set_tabindex(idx);
   }
  }
  return;
 }
 
 //2. open가능 메뉴 수 체크
 var nOpenMenuCnt = this.tabMenu.getTabpageCount();
 if (nOpenMenuCnt >= fv_maxMenu){
  alert("최대수 " + fv_maxMenu + "개를 넘었습니다");
  return;
 }
 
 //4. openmenu dataset에 추가
 var objOpenMenu = application.gds_openMenu;
 var nAddRow = objOpenMenu.addRow();
 objOpenMenu.setColumn(nAddRow, "level"  , objDsMenu.getColumn(nMenuRow, "level"));
 objOpenMenu.setColumn(nAddRow, "menuId" , sMenuId);
 objOpenMenu.setColumn(nAddRow, "menuNm" , sMenuNm);
 objOpenMenu.setColumn(nAddRow, "formUrl", sFormUrl);

 //5. 화면 MDI로 form생성 및 조회
 var newChild = new nexacro.ChildFrame;
  //업무화면을 workMain Form과 div를 이용해서 업무화면 open하는 방식
  newChild.init(sMenuId,"absolute",10, 10, 10, 10, null, null, "frame::workMain.xfdl");
  //업무화면을 직접 open하는 방식
  //newChild.init(sMenuId,"absolute",10, 10, 10, 10, null, null, sFormUrl);
  
  application.av_mdiFrameSet.addChild(sMenuId, newChild);

  newChild.set_showtitlebar(false);
  newChild.set_autosize(true);
  newChild.set_resizable(true);
  newChild.set_titletext("");
  newChild.set_showstatusbar(false);
  newChild.set_openalign("left top");
  newChild.set_openstatus("maximize");
  newChild.style.set_border("0px solid blue");
 
  newChild.show();
  
  newChild.biz_url      = sFormUrl;
  newChild.biz_menuText = sMenuNm;
  newChild.biz_menuId   = sMenuId;
  newChild.biz_param    = sParam;
  
  newChild.setFocus();
  application.gv_activeMenuId = sMenuId;
  
 //3. page 추가(이때 바로 'tabMenu_onchanged' event가 발생됨)
 //
 //   참고, 아래 script가 'application.av_mdiFrameSet.addChild(sMenuId, newChild);' 위쪽으로 올라 가면
 //          tabMenu_onchanged() Event쪽에서 오류가 발생한다.
 //   이유, 1. tabMenu.insertTabpage()로 page추가
 //          2. tabMenu_onchanged() Event 발생
 //          3. application.av_mdiFrameSet[sMenuId].setFocus(); -> 이때 아직 mdi화면생성이 안되어 있기에 오류 발생
 //          4. application.av_mdiFrameSet.addChild(sMenuId, newChild); -> tabMenu_onchanged() Event 발생 종료 후 mdi화면 추가 및 조회
 objTab.insertTabpage(sMenuId, objTab.getTabpageCount(), "", sMenuNm);
}


   5. tabMenu.onchanged  script
//page변경 시  해당화면 활성화
this.tabMenu_onchanged = function(obj:Tab, e:nexacro.TabIndexChangeEventInfo)
{
 var objPages = obj.tabpages;
 
 //e.postindex                : 현재 click한 page index
 //objPages[e.postindex].name : Tab.insertTabpage()함수로 설정한 page Id (즉, 메뉴id)
 var sMenuId = objPages[e.postindex].name;
 application.av_mdiFrameSet[sMenuId].setFocus();
 application.gv_activeMenuId = sMenuId;
}
  
  
   6. tabMenu.onextrabuttonclick  script
//page닫기 버튼 클릭 시 (page 삭제하고, 열려있는 화면 닫기)
this.tabMenu_onextrabuttonclick = function(obj:Tab, e:nexacro.TabMouseEventInfo)
{
 var objPages = obj.tabpages;
 var sMenuId  = objPages[e.index].name;
 
 //1. MDI Close
 application.av_mdiFrameSet[sMenuId].form.close();
 
 //2. Page Close
 obj.removeTabpage(e.index);
 application.gv_activeMenuId = '';
 
 //3. openMenu Delete
 var nFindRow = application.gds_openMenu.findRow("menuId", sMenuId);
 application.gds_openMenu.deleteRow(nFindRow);
 if (application.gds_openMenu.rowcount <= 0){
  //intro 화면 open하기
 }
 
 //4. 참고
 //   page를 삭제 하면 자동으로 tab onchanged() Event가 발생 됨
 //   그래서 다음 tabpage의 화면이 활성화 됨
}

//isNull검사
this.gfn_isNull = function(sValue)
{
    if (new String(sValue).valueOf().toUpperCase() == "UNDEFINED") return true;
    if (sValue == null) return true;
    var v_ChkStr = new String(sValue);

    if (v_ChkStr == null) return true;

    if (v_ChkStr.toString().length == 0 ) return true;

    return false;
}

  
   7. workMain script개발
      1. 정의 : tabFrame에서 workMain을 MDI로생성 시 onload Event에서   workMain.div_work에  업무화면 URL을 연동시킨다.
      2. script개발
         . event 1개
         . fn_onload Event : tabFrame에서 workMain을 생성시 연결시켜준 argument를 이용해서 업무화면을 연동시킨다.
      3.fn_onload Event Script
     
this.fv_param;
this.fv_menuId;
this.fn_onload = function(obj:Form, e:nexacro.LoadEventInfo)
{
 var sBizUrl    = this.getOwnerFrame().biz_url;
 var sMenuNm    = this.getOwnerFrame().biz_menuText;
 this.fv_menuId = this.getOwnerFrame().biz_menuId;
 this.fv_param  = this.getOwnerFrame().biz_param;
 
 this.div_work.set_url(sBizUrl);
 //this.setZoom(80);
}
  
  
  


 

Posted by 농부지기
,