www.pudn.com > 1.rar > I2BaseWB.cpp


// I2BaseWB.cpp: implementation of the CBaseWB class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "I2BaseWBSet.h" 
#include "I2BaseWB.h" 
    
extern UINT g_wb32clipformat; 
extern VOID screentoclient(HWND hwnd,I2Rect& lprect); 
 
CI2WBBaseWB::CI2WBBaseWB(VOID* wbset) 
{ 
m_wbset=wbset; 
m_width=WB_DEFAULT_WIDTH; 
m_height=WB_DEFAULT_HEIGHT; 
m_wbs=wbsNone; 
 
m_curcontrol=NULL; 
m_pttrackstart.x=0; 
m_pttrackstart.y=0; 
 
m_existeditor=0; 
m_wbset=wbset; 
 
iResizeHandle = RH_NONE;  
iRectStatus   = RS_NONE; 
lpMouseStatus = IDC_ARROW; 
 
m_sync=1; 
m_wbname[0]=0; 
} 
 
CI2WBBaseWB::~CI2WBBaseWB() 
{ 
INT   i,j; 
j=m_controllist.get_Count()-1; 
for(i=j;i>=0;i--) 
{ 
  delete (CI2WBBaseCtrl*)m_controllist.get_Items()[i]; 
  m_controllist.Delete(i); 
} 
} 
 
VOID CI2WBBaseWB::OnDragFile(const I2String& filename,I2Point p) 
{ 
CI2WBBaseCSet* pawcs; 
CI2WBBaseCtrl* pawc; 
I2MemoryFileStream stm(1024); 
I2Rect r; 
I2List *l; 
INT i; 
CHAR *pfile; 
l=&(((CI2WBBaseWBSet*)m_wbset)->m_regdragdropcontrol); 
pfile=strchr(filename,'.'); 
for(i=0;iget_Count();i++) 
{ 
  REGDRAGDROPENTRY rdde; 
  memcpy((void*)&rdde,(void*)&(l->get_Items()[i]),sizeof(REGDRAGDROPENTRY));  
 
  if(!lstrcmpi(pfile+1,rdde.ext)) 
  { 
	pawcs=((CI2WBBaseWBSet*)m_wbset)->getControlSet(rdde.csid); 
	if(!createWBControl(pawcs,rdde.cid,&pawc,NULL,NULL)) 
		return; 
	if(pawc->OnDragFile(filename,p,rdde.ext,m_hwnd)==FALSE) 
  { 
    int j=m_controllist.get_Count()-1; 
    m_controllist.Delete(j); 
    delete pawc; 
    return; 
  } 
  pawc->getControlRect(r); 
 	InflateRect(&r,5,5); 
  InvalidateRect(m_hwnd,&r,TRUE); 
  writeHeader(&stm,WB32DATACODE_COPY,1,0); 
  pawc->writeToStream(&stm,TRUE); 
  ((CI2WBBaseWBSet*)m_wbset)->sendData(stm); 
  break; 
  } 
} 
//delete pawcs; 
//delete pawc; 
//delete l; 
return; 
} 
 
BOOL CI2WBBaseWB::processMessage(UINT uMessage,WPARAM wParam,LPARAM lParam) 
{ 
POINTS ps; 
switch(uMessage) 
  { 
  case WM_CREATE: 
    DragAcceptFiles(m_hwnd,TRUE); 
  break; 
 
  case WM_DROPFILES: 
  { 
    CHAR DropFileName[256]; 
    POINT DropPoint; 
 
    DragQueryFile((HDROP)wParam,0,DropFileName,256); 
    DragQueryPoint((HDROP)wParam,&DropPoint); 
    DragFinish((HDROP)wParam); 
 
    OnDragFile(DropFileName,DropPoint); 
    break; 
  } 
 
  case WM_LBUTTONDBLCLK: 
    ps=MAKEPOINTS(lParam); 
    OnLButtonDBLCLK(wParam,ps.x,ps.y); 
    break; 
 
  case WM_LBUTTONDOWN: 
    ps=MAKEPOINTS(lParam); 
    OnLButtonDown(wParam,ps.x,ps.y); 
    break; 
 
  case WM_LBUTTONUP: 
    ps=MAKEPOINTS(lParam); 
    OnLButtonUp(wParam,ps.x,ps.y); 
    break; 
 
  case WM_RBUTTONDOWN: 
	{ 
    ps=MAKEPOINTS(lParam); 
    OnRButtonDown(wParam,ps.x,ps.y); 
    break; 
	} 
 
  case WM_RBUTTONUP: 
    ps=MAKEPOINTS(lParam); 
    OnRButtonUp(wParam,ps.x,ps.y); 
    break; 
 
  case WM_MOUSEMOVE: 
    ps=MAKEPOINTS(lParam); 
    OnMouseMove(wParam,ps.x,ps.y); 
    break; 
 
  case WM_CAPTURECHANGED: 
    OnLoseCapture(); 
    break; 
    
  case WM_PAINT: 
  { 
    PAINTSTRUCT ps; 
    HDC hdc=BeginPaint(m_hwnd,&ps); 
    OnPaint(hdc); 
    EndPaint(m_hwnd,&ps); 
  } 
  break; 
 
  case WM_COMMAND: 
    OnCommand(HIWORD(wParam),LOWORD(wParam),(HWND)lParam); 
    break; 
    
  default: 
	  return I2Wnd::processMessage(uMessage,wParam,lParam); 
}  
return TRUE; 
} 
 
void CI2WBBaseWB::fillClassInfo(LPWNDCLASSEX pwcx) 
{ 
pwcx->lpszClassName=WB32CLASSNAME; 
pwcx->hCursor=NULL; 
pwcx->style=CS_DBLCLKS; 
} 
 
void CI2WBBaseWB::deleteControl() 
{ 
DWORD dw; 
I2List l; 
I2Rect  r; 
CHAR buf[MAX_CTRLIDNAME]; 
INT   i,j; 
CI2WBBaseCtrl* pawc; 
I2MemoryFileStream stm(1024); 
 
getStateControlList(l,CTRLSTATE_SELECT); 
writeHeader(&stm,WB32DATACODE_DEL,l.get_Count(),0); 
 
for(i=0;iget_State(&dw); 
  if(!(dw&CTRLSTATE_LOCKED)) 
  { 
    pawc->get_GrpName(buf); 
    if(strlen(buf)) 
      pawc->get_GrpRect(&r); 
    else 
      pawc->getControlRect(r); 
    InflateRect(&r,5,5); 
    InvalidateRect(m_hwnd,&r,TRUE); 
    pawc->writeToStream(&stm,FALSE); 
    j=m_controllist.IndexOf(pawc); 
    m_controllist.Delete(j); 
    delete pawc; 
  } 
} 
UpdateWindow(m_hwnd); 
//(((CI2WBBaseWBSet*)m_wbset)->m_stream) 
//I2WBBaseWBSet*)m_wbset)->m_stream)->write((CHAR *)stm.get_Pointer(),stm.get_Length()); 
((CI2WBBaseWBSet*)m_wbset)->sendData(stm); 
} 
 
void CI2WBBaseWB::recv(VOID *p,INT len) 
{ 
I2MemoryFileStream stm(1024); 
stm.write((CHAR*)p,len); 
WB32DATAHEADER  wdh; 
WB32CONTROLDATA wcd; 
WB32HEADER		wh; 
CI2WBBaseCSet* pawcs; 
CI2WBBaseCtrl *pawc,*pawc1; 
I2Rect r,r1,rect,rect1; 
INT i,j,k,xoffset,yoffset; 
CHAR buf[MAX_CTRLIDNAME],buf1[MAX_CTRLIDNAME]; 
 
if(stm.get_Length()==0) 
  throw new I2BaseException(I2E_INVALIDPARAMETER); 
 
stm.seekFile(0,I2SEEK_SET); 
 
stm.readFile((CHAR*)&wh,sizeof(WB32HEADER)); 
switch(wh.datatype) 
{ 
  case WB_TYPE_LAYER: 
  WB32LAYER wl; 
  stm.readFile((CHAR*)&wl,sizeof(WB32LAYER)); 
  for(j=0;jget_Name(buf); 
    if(S_OK==nameIs(buf,wl.idname)) 
    { 
	    if(wl.flayer) 
      { 
		    m_controllist.append(m_controllist.get_Items()[j]); 
		    m_controllist.Delete(j); 
        ((CI2WBBaseCtrl*)m_controllist.get_Items()[j])->getControlRect(r); 
      	InflateRect(&r,5,5); 
        InvalidateRect(m_hwnd,&r,TRUE); 
        ((CI2WBBaseCtrl*)m_controllist.get_Items()[m_controllist.get_Count()-1])->getControlRect(r); 
      	InflateRect(&r,5,5); 
        InvalidateRect(m_hwnd,&r,TRUE); 
        UpdateWindow(m_hwnd); 
      } 
      else 
      { 
	  	  m_controllist.Delete(j); 
		    m_controllist.insert(0,pawc); 
        ((CI2WBBaseCtrl*)m_controllist.get_Items()[0])->getControlRect(r); 
      	InflateRect(&r,5,5); 
        InvalidateRect(m_hwnd,&r,TRUE); 
        ((CI2WBBaseCtrl*)m_controllist.get_Items()[j+1])->getControlRect(r); 
      	InflateRect(&r,5,5); 
        InvalidateRect(m_hwnd,&r,TRUE); 
        UpdateWindow(m_hwnd); 
      } 
      break; 
    } 
  } 
  break; 
 
  case WB_TYPE_CONTROL://control operation 
    stm.read((CHAR*)&wdh,sizeof(WB32DATAHEADER)); 
    switch(wdh.datacode) 
    { 
      case WB32DATACODE_PASTE://paste controls 
	      for(i=0;i<(INT)wdh.count;i++) 
        { 
	        stm.readFile((CHAR*)&wcd,sizeof(WB32CONTROLDATA)); 
	        pawcs=(CI2WBBaseCSet*)((CI2WBBaseWBSet*)m_wbset)->getControlSet(wcd.csid); 
//	        if(!createWBControl(pawcs,wcd.cid,&pawc,wcd.idname,wcd.idgrpname)) 
//		        return; 
//          d::s("recv paste %s",wcd.idname); 
          if(lstrlen(wcd.idgrpname)) 
					{ 
						if(!createWBControl(pawcs,wcd.cid,&pawc,wcd.idname,wcd.idgrpname)) 
							return; 
					} 
					else 
					{ 
						if(!createWBControl(pawcs,wcd.cid,&pawc,wcd.idname,NULL)) 
							return; 
					} 
 
	        pawc->readFromStream(&stm,wcd.len,wcd.rect); 
          if(lstrlen(wcd.idgrpname)) 
            pawc->set_GrpRect(wcd.grprect); 
	        InflateRect(&wcd.rect,5,5); 
          InvalidateRect(m_hwnd,&wcd.rect,TRUE); 
        } 
	      break;   
 
      case WB32DATACODE_COPY://copy controls 
        k=m_controllist.get_Count(); 
				for(i=0;i<(INT)wdh.count;i++) 
        { 
	        stm.readFile((CHAR*)&wcd,sizeof(WB32CONTROLDATA)); 
	        pawcs=(CI2WBBaseCSet*)((CI2WBBaseWBSet*)m_wbset)->getControlSet(wcd.csid); 
          if(lstrlen(wcd.idgrpname)) 
					{ 
						if(!createWBControl(pawcs,wcd.cid,&pawc,wcd.idname,wcd.idgrpname)) 
							return; 
					} 
					else 
					{ 
						if(!createWBControl(pawcs,wcd.cid,&pawc,wcd.idname,NULL)) 
							return; 
					} 
 
	        pawc->readFromStream(&stm,wcd.len,wcd.rect); 
          if(lstrlen(wcd.idgrpname)) 
            pawc->set_GrpRect(wcd.grprect); 
	        r=wcd.rect; 
	        InflateRect(&r,5,5); 
          InvalidateRect(m_hwnd,&r,TRUE); 
        } 
 
				//set control's group rects 
				for(i=k;iget_GrpName(buf); 
					if(strlen(buf)) 
					{ 
						pawc->get_GrpRect(&r); 
						if(r.left==-1) 
						{//if not set group rect,computing the rect 
							pawc->getControlRect(rect); 
							//caculate the rect 
				      for(j=k;jget_GrpName(buf1); 
								if(!lstrcmp(buf,buf1)) 
								{ 
									pawc1->getControlRect(rect1); 
    							rect.left=rect.leftget_GrpName(buf1); 
								if(!lstrcmp(buf,buf1)) 
  								pawc1->set_GrpRect(rect); 
							} 
							InflateRect(&rect,5,5); 
							InvalidateRect(m_hwnd,&rect,TRUE); 
						} 
					}	 
				} 
	      break;//end copy  
 
      case WB32DATACODE_CHANGEDATA://modify control data 
	      stm.readFile((CHAR*)&wcd,sizeof(WB32CONTROLDATA)); 
	      for(j=0;jget_Name(buf); 
          if(S_OK==nameIs(buf,wcd.idname)) 
          { 
		        pawc->getControlRect(r); 
		        pawc->readFromStream(&stm,wcd.len,wcd.rect); 
            if(lstrlen(wcd.idgrpname)) 
              pawc->set_GrpRect(wcd.grprect); 
	          InflateRect(&r,5,5); 
          	InflateRect(&wcd.rect,5,5); 
		        InvalidateRect(m_hwnd,&r,TRUE); 
		        InvalidateRect(m_hwnd,&wcd.rect,TRUE); 
            break; 
          } 
        } 
	      break;//end modify data used for text control   
 
      case WB32DATACODE_DRAG://drag controls 
        for(i=0;i<(INT)wdh.count;i++) 
        { 
          stm.readFile((CHAR*)&wcd,sizeof(WB32CONTROLDATA)); 
          for(j=0;jget_Name(buf); 
            if(S_OK==nameIs(buf,wcd.idname)) 
            { 
              pawc->getControlRect(r); 
              xoffset=wcd.rect.left-r.left; 
              yoffset=wcd.rect.top-r.top; 
              pawc->moveTo(xoffset,yoffset); 
              pawc->getControlRect(r1); 
 
            	InflateRect(&r,5,5); 
	            InflateRect(&r1,5,5); 
              InvalidateRect(m_hwnd,&r,TRUE); 
              InvalidateRect(m_hwnd,&r1,TRUE); 
 
              pawc->get_GrpName(buf); 
              if(S_OK==nameIs(buf,wcd.idgrpname)) 
              { 
                pawc->get_GrpRect(&r); 
                pawc->moveGroupTo(xoffset,yoffset); 
                pawc->get_GrpRect(&r1); 
               	InflateRect(&r,5,5); 
               	InflateRect(&r1,5,5); 
                InvalidateRect(m_hwnd,&r,TRUE); 
                InvalidateRect(m_hwnd,&r1,TRUE); 
              } 
 
              break; 
            } 
          } 
        } 
        break;//end drag 
 
      case WB32DATACODE_DEL://delete controls 
        for(i=0;i<(INT)wdh.count;i++) 
        { 	 
          stm.readFile((CHAR*)&wcd,sizeof(WB32CONTROLDATA));  
          for(j=0;jget_Name(buf); 
            if(S_OK==nameIs(buf,wcd.idname)) 
            { 
              m_controllist.Delete(m_controllist.IndexOf(pawc)); 
		          delete pawc; 
	            InflateRect(&wcd.rect,5,5); 
		          InvalidateRect(m_hwnd,&wcd.rect,TRUE); 
            } 
          } 
        }  
        UpdateWindow(m_hwnd); 
        break;//end delete 
 
      case WB32DATACODE_CHANGE: 
        CI2WBBaseWBSet *pset=(CI2WBBaseWBSet *)m_wbset; 
        for(i=0;i<(INT)wdh.count;i++) 
        { 
          stm.readFile((CHAR*)&wcd,sizeof(WB32CONTROLDATA)); 
          for(j=0;jget_Name(buf); 
            if(S_OK==nameIs(buf,wcd.idname)) 
            { 
	            pawc->getControlRect(r1); 
	            if(HIWORD(wdh.attribchanged)) 
		          pawc->set_Font(&wdh.font,HIWORD(wdh.attribchanged)); 
      
              switch(LOWORD(wdh.attribchanged)) 
              { 
                case WBAT_LINEWIDTH: 
                  pawc->set_LineWidth(wdh.linewidth); 
                  break; 
   
                case WBAT_LINESTYLE: 
                  pawc->set_LineStyle(wdh.linestyle); 
                  break; 
 
                case WBAT_COLOR: 
                  pawc->set_Color(wdh.color); 
                  break; 
 
                case WBAT_BKCOLOR: 
                  pawc->set_Bkcolor(wdh.bkcolor); 
                  break; 
 
                default: 
                  break; 
              } 
	            pawc->OnAttribChange(LOWORD(wdh.attribchanged),HIWORD(wdh.attribchanged),FALSE); 
	            pawc->getControlRect(r); 
 	            InflateRect(&r,5,5); 
	            InflateRect(&r1,5,5); 
              InvalidateRect(m_hwnd,&r,TRUE); 
              InvalidateRect(m_hwnd,&r1,TRUE); 
              break; 
            } 
          } 
        } 
        break;//end change 
      }//end switch(wdh.datacode) 
   } 
} 
 
VOID CI2WBBaseWB::OnLButtonDown(DWORD fwKeys,SHORT x,SHORT y) 
{ 
if(!((CI2WBBaseWBSet*)m_wbset)->m_permit) 
  return; 
 
CI2WBBaseCSet* pawcs; 
HCURSOR cur; 
I2Point p(x,y); 
m_pttrackstart.x=x; 
m_pttrackstart.y=y; 
CHAR buf[MAX_CTRLIDNAME],buf1[MAX_CTRLIDNAME]; 
 
pawcs=((CI2WBBaseWBSet*)m_wbset)->getCurControlSet(); 
if(pawcs) 
{ 
	pawcs->getControlCursor(((CI2WBBaseWBSet*)m_wbset)->m_CurControlId,&cur); 
	if(cur) 
	  SetCursor(cur); 
} 
 
if(!pawcs) 
{//not create a control 
  INT ControlAtThisPoint=-1,i; 
  CI2WBBaseCtrl *pawc,*pawc1; 
  DWORD dw; 
  I2Rect  r,rect; 
 
  for(i=m_controllist.get_Count()-1;i>=0;i--) 
  {  
    pawc=(CI2WBBaseCtrl*)m_controllist.get_Items()[i]; 
    memset(buf,0,MAX_CTRLIDNAME); 
    pawc->get_GrpName(buf); 
    if(strlen(buf)) 
      pawc->get_GrpRect(&r); 
    else 
      pawc->getControlRect(r); 
    if(PtInRect(&r,p)) 
    { 
      ControlAtThisPoint=i; 
      break; 
    } 
  } 
 
  if(iRectStatus==RS_NORMAL || iRectStatus==RS_MOVE) 
  { 
    dragRectLD(x,y,ControlAtThisPoint); 
  } 
 
  if(iRectStatus==RS_RESIZING) 
  {//when resizing a control,mouse pointer is outside the control rect 
   //so set ControlAtThisPoint to previous selected control 
		for(i=0;iget_State(&dw); 
      if(dw&CTRLSTATE_SELECT) 
        ControlAtThisPoint=i; 
    } 
  } 
   
  if(ControlAtThisPoint!=-1) 
  { 
    pawc=(CI2WBBaseCtrl*)m_controllist.get_Items()[ControlAtThisPoint]; 
     
    if(fwKeys&MK_SHIFT) 
    {//Select multi control 
			pawc->get_GrpName(buf); 
			if(strlen(buf)) 
			{//belong to a group 
				pawc->get_GrpRect(&r); 
				for(i=0;iget_GrpName(buf1); 
					if(!lstrcmp(buf,buf1)) 
					{ 
						pawc1->get_State(&dw); 
						dw=dw|CTRLSTATE_SELECT; 
						pawc1->set_State(dw); 
					} 
				} 
      	InflateRect(&r,5,5); 
				InvalidateRect(m_hwnd,&r,TRUE); 
			} 
			else//not belong to a group 
      { 
				pawc->get_State(&dw); 
				dw=dw|CTRLSTATE_SELECT; 
				pawc->set_State(dw); 
				pawc->getControlRect(r); 
      } 
 
	    InflateRect(&r,5,5); 
      InvalidateRect(m_hwnd,&r,TRUE); 
      UpdateWindow(m_hwnd); 
    } 
    else 
    {//Begin to drag control 
      ReleaseCapture(); 
      if(iRectStatus==RS_RESIZING ) 
        goto label; 
      pawc->get_State(&dw); 
      if(!(dw&CTRLSTATE_SELECT)) 
      {//Select a control 
        unselectAllControl(); 
        dw=dw|CTRLSTATE_SELECT; 
        pawc->set_State(dw); 
        //if the control belong to a group 
        INT i; 
        I2Rect rect; 
       
        pawc->get_GrpName(buf); 
        if(strlen(buf)) 
        { 
					pawc->get_GrpRect(&rect); 
					for(i=0;iget_GrpName(buf1); 
						if(!lstrcmp(buf,buf1)) 
						{ 
	            pawc1->get_State(&dw); 
		          dw=dw|CTRLSTATE_SELECT; 
			        pawc1->set_State(dw); 
	          } 
		      } 
          iRectStatus=RS_MOVE; 
        } 
				else 
        { 
          pawc->get_Property(&dw); 
          if(dw & WB_PROP_CHANGE) 
            iRectStatus=RS_NORMAL; 
          else  
            iRectStatus=RS_MOVE; 
				  pawc->getControlRect(rect); 
        } 
        m_rect=rect; 
      	InflateRect(&rect,5,5); 
				InvalidateRect(m_hwnd,&rect,TRUE); 
        UpdateWindow(m_hwnd); 
      } 
        
label: 
      HDC hdc=GetWindowDC(m_hwnd); 
      m_tmpstartx=x; 
      m_tmpstarty=y; 
      m_tmpoldx=x; 
      m_tmpoldy=y; 
 
      drawDragBorders(hdc,m_tmpstartx,m_tmpstarty,m_tmpoldx,m_tmpoldy); 
      ReleaseDC(m_hwnd,hdc); 
      SetCapture(m_hwnd); 
      m_wbs=wbsDragControl; 
    } 
     
  }// if(ControlAtThisPoint!=-1) 
  else 
  { 
    //Clear All Selection 
    if(unselectAllControl()) 
      UpdateWindow(m_hwnd); 
    ReleaseCapture(); 
 
    //begin range select 
    beginWBTrackRect(x,y); 
 
    SetCapture(m_hwnd); 
    m_wbs=wbsRangeSelect; 
    iRectStatus=RS_MOVE; 
  }  
   
return; 
} 
 
if(dealWithClickControl(fwKeys,x,y)) 
	return; 
 
if(dealWithEditorControl(x,y)) 
   return; 
 
if(!createWBControl(pawcs,((CI2WBBaseWBSet*)m_wbset)->m_CurControlId,&m_curcontrol,NULL,NULL)) 
   return; 
m_wbs=wbsCreateControl; 
INT fend=0; 
m_curcontrol->OnLButtonDown(fwKeys,x,y,m_hwnd,&fend); 
} 
 
VOID CI2WBBaseWB::OnLButtonUp(DWORD fwKeys,SHORT x,SHORT y) 
{ 
I2List l; 
adjustPoints(&x,&y); 
 
I2Point p(x,y); 
I2Rect  r; 
 
I2MemoryFileStream stm(1024); 
WhiteBoardState wbs=m_wbs; 
//if((m_wbs!=wbsInplaceEditorActive)&&(m_wbs!=wbsControlTrackClick)) 
if(m_wbs==wbsDragControl || m_wbs==wbsRangeSelect) 
	m_wbs=wbsNone; 
 
switch(wbs) 
{ 
  case wbsNone: 
    ReleaseCapture(); 
    break; 
   
  case wbsDragControl: 
  { 
    RECT r; 
    r=m_rect; 
	  InflateRect(&r,5,5); 
    InvalidateRect(m_hwnd,&r,TRUE); 
    dragRectLU(x,y); 
//	  InflateRect(&r,5,5); 
//    InvalidateRect(m_hwnd,&r,TRUE); 
  } 
    break; 
   
  case wbsRangeSelect: 
    endWBTrackRect(); 
    ReleaseCapture(); 
    SetRect(&r,m_tmpstartx,m_tmpstarty,x,y); 
    OnRangeSelect(&r); 
    if(((CI2WBBaseWBSet*)m_wbset)->m_erase) 
	    deleteControl(); 
    break; 
   
  case wbsControlTrackPoint: 
    break; 
 
  case wbsCreateControl: 
	{ 
    INT fend=0; 
    if(m_curcontrol->OnLButtonUp(fwKeys,x,y,m_hwnd,&fend)==0) 
    { 
      if(fend) 
      { 
        m_wbs=wbsNone; 
        ReleaseCapture(); 
        writeHeader(&stm,WB32DATACODE_COPY,1,0); 
        m_curcontrol->writeToStream(&stm,TRUE);  
        int i=stm.get_Length(); 
  //      if(((CI2WBBaseWBSet*)m_wbset)->m_stream) 
  //        (((CI2WBBaseWBSet*)m_wbset)->m_stream)->write((CHAR *)stm.get_Pointer(),stm.get_Length()); 
        ((CI2WBBaseWBSet*)m_wbset)->sendData(stm); 
        ((CI2WBBaseWBSet*)m_wbset)->setControlSetID(GUID_NULL); 
        ((CI2WBBaseWBSet*)m_wbset)->setControlID(0); 
        if(((CI2WBBaseWBSet*)m_wbset)->m_wbcallback) 
    	    ((CI2WBBaseWBSet*)m_wbset)->m_wbcallback(WB32_SETSELECT,(void*)NULL); 
      } 
    } 
/*    m_curcontrol->OnLButtonUp(fwKeys,x,y,m_hwnd,&fend); 
    if(fend) 
    { 
      m_wbs=wbsNone; 
      ReleaseCapture(); 
      writeHeader(&stm,WB32DATACODE_COPY,1,0); 
      m_curcontrol->writeToStream(&stm,TRUE);  
      int i=stm.get_Length(); 
//      if(((CI2WBBaseWBSet*)m_wbset)->m_stream) 
//        (((CI2WBBaseWBSet*)m_wbset)->m_stream)->write((CHAR *)stm.get_Pointer(),stm.get_Length()); 
      ((CI2WBBaseWBSet*)m_wbset)->sendData(stm); 
      ((CI2WBBaseWBSet*)m_wbset)->setControlSetID(GUID_NULL); 
      ((CI2WBBaseWBSet*)m_wbset)->setControlID(0); 
      if(((CI2WBBaseWBSet*)m_wbset)->m_wbcallback) 
    	  ((CI2WBBaseWBSet*)m_wbset)->m_wbcallback(WB32_SETSELECT,(void*)NULL); 
    }*/ 
    break; 
  } 
 
  case wbsWBTrackPoint: 
    break; 
 
  case wbsControlTrackRect: 
    break; 
 
  case wbsWBTrackRect: 
    break; 
 
  case wbsControlTrackClick: 
    break; 
 
  case wbsWBTrackClick: 
    break; 
} 
} 
 
 
VOID CI2WBBaseWB::OnMouseMove(DWORD fwKeys,SHORT x,SHORT y) 
{ 
if(!((CI2WBBaseWBSet*)m_wbset)->m_permit) 
{ 
  SetCursor(LoadCursor(NULL,IDC_NO)); 
  return; 
} 
 
adjustPoints(&x,&y); 
dragRectMM(x,y); 
//I2Point p(x,y); 
 
CI2WBBaseCSet* pawcs=((CI2WBBaseWBSet*)m_wbset)->getCurControlSet(); 
HCURSOR cur; 
if(pawcs) 
{ 
  pawcs->getControlCursor(((CI2WBBaseWBSet*)m_wbset)->m_CurControlId,&cur); 
  if(cur) 
	  SetCursor(cur); 
} 
else if(lpMouseStatus==IDC_ARROW) 
  SetCursor(LoadCursor(NULL,IDC_ARROW)); 
switch(m_wbs) 
{ 
  case wbsNone: 
    break; 
 
  case wbsDragControl: 
    break; 
 
  case wbsRangeSelect: 
    WBTrackRect(x,y); 
    break; 
   
  case wbsControlTrackPoint: 
  case wbsCreateControl: 
	{ 
    INT fend=0; 
    m_curcontrol->OnMouseMove(fwKeys,x,y,m_hwnd,&fend); 
	  break; 
  } 
 
  case wbsWBTrackPoint: 
    break; 
 
  case wbsControlTrackRect: 
    break; 
 
  case wbsWBTrackRect: 
    WBTrackRect(x,y); 
    break; 
 
  case wbsControlTrackClick: 
    break; 
 
  case wbsWBTrackClick: 
    break; 
} 
} 
 
VOID CI2WBBaseWB::OnRButtonDown(DWORD fwKeys,SHORT x,SHORT y) 
{ 
if(!((CI2WBBaseWBSet*)m_wbset)->m_permit) 
  return; 
 
adjustPoints(&x,&y); 
 
I2Point p(x,y); 
I2MemoryFileStream stm(1024); 
 
WhiteBoardState wbs=m_wbs; 
//if((m_wbs!=wbsInplaceEditorActive)&&(m_wbs!=wbsControlTrackClick)) 
//	m_wbs=wbsNone; 
 
switch(wbs) 
{ 
  case wbsCreateControl: 
	{ 
    INT fend=0; 
    m_curcontrol->OnRButtonDown(fwKeys,x,y,m_hwnd,&fend); 
    ReleaseCapture(); 
    if(fend) 
      m_wbs=wbsNone; 
 
    writeHeader(&stm,WB32DATACODE_COPY,1,0); 
    m_curcontrol->writeToStream(&stm,TRUE);  
//    if(((CI2WBBaseWBSet*)m_wbset)->m_stream) 
//      (((CI2WBBaseWBSet*)m_wbset)->m_stream)->write((CHAR *)stm.get_Pointer(),stm.get_Length()); 
    ((CI2WBBaseWBSet*)m_wbset)->sendData(stm); 
    ((CI2WBBaseWBSet*)m_wbset)->setControlSetID(GUID_NULL); 
    ((CI2WBBaseWBSet*)m_wbset)->setControlID(0); 
    if(((CI2WBBaseWBSet*)m_wbset)->m_wbcallback) 
  	  ((CI2WBBaseWBSet*)m_wbset)->m_wbcallback(WB32_SETSELECT,(void*)NULL); 
    break; 
	} 
 
  default: 
	  drawIndicate(x,y,FALSE,TRUE); 
    break; 
} 
} 
 
VOID CI2WBBaseWB::OnRButtonUp(DWORD fwKeys,SHORT x,SHORT y) 
{ 
} 
 
VOID CI2WBBaseWB::OnLButtonDBLCLK(DWORD fwKeys,SHORT x,SHORT y) 
{ 
if(!((CI2WBBaseWBSet*)m_wbset)->m_permit) 
  return; 
 
if(((CI2WBBaseWBSet*)m_wbset)->getCurControlSet()!=NULL) 
  return; 
adjustPoints(&x,&y); 
 
I2Point p(x,y); 
I2MemoryFileStream stm(1024); 
 
WhiteBoardState wbs=m_wbs; 
//if((m_wbs!=wbsInplaceEditorActive)&&(m_wbs!=wbsControlTrackClick)) 
//	m_wbs=wbsNone; 
  INT ControlAtThisPoint=-1,i; 
  CI2WBBaseCtrl *pawc,*pawc1; 
  DWORD dw; 
  I2Rect  r,rect; 
  CHAR buf[MAX_CTRLIDNAME]; 
 
  for(i=m_controllist.get_Count()-1;i>=0;i--) 
  {  
    pawc=(CI2WBBaseCtrl*)m_controllist.get_Items()[i]; 
    memset(buf,0,MAX_CTRLIDNAME); 
    pawc->get_GrpName(buf); 
    if(strlen(buf)) 
      pawc->get_GrpRect(&r); 
    else 
      pawc->getControlRect(r); 
    if(PtInRect(&r,p)) 
    { 
      ControlAtThisPoint=i; 
      break; 
    } 
  } 
 
  if(ControlAtThisPoint!=-1) 
  { 
    I2MemoryFileStream stm(1024); 
    pawc=(CI2WBBaseCtrl*)m_controllist.get_Items()[ControlAtThisPoint]; 
    if(pawc->OnLButtonDBLCLK(fwKeys,x,y,m_hwnd)==0) 
    { 
      writeHeader(&stm,WB32DATACODE_CHANGEDATA,1,0); 
      pawc->writeToStream(&stm,TRUE); 
  //    if(((CI2WBBaseWBSet*)m_wbset)->m_stream) 
  //      (((CI2WBBaseWBSet*)m_wbset)->m_stream)->write((CHAR *)stm.get_Pointer(),stm.get_Length()); 
      ((CI2WBBaseWBSet*)m_wbset)->sendData(stm); 
    } 
/*    pawc->OnLButtonDBLCLK(fwKeys,x,y,m_hwnd); 
    writeHeader(&stm,WB32DATACODE_CHANGEDATA,1,0); 
    pawc->writeToStream(&stm,TRUE); 
//    if(((CI2WBBaseWBSet*)m_wbset)->m_stream) 
//      (((CI2WBBaseWBSet*)m_wbset)->m_stream)->write((CHAR *)stm.get_Pointer(),stm.get_Length()); 
    ((CI2WBBaseWBSet*)m_wbset)->sendData(stm);*/ 
  } 
/*switch(wbs) 
{ 
  case wbsNone: 
	{ 
    m_curcontrol->OnLButtonDBLCLK(fwKeys,x,y,m_hwnd); 
    ReleaseCapture(); 
/*    if(fend) 
      m_wbs=wbsNone; 
 
    writeHeader(&stm,WB32DATACODE_COPY,1,0); 
    m_curcontrol->writeToStream(&stm,TRUE);  
    if(((CI2WBBaseWBSet*)m_wbset)->m_stream) 
      (((CI2WBBaseWBSet*)m_wbset)->m_stream)->write((CHAR *)stm.get_Pointer(),stm.get_Length()); 
    break; 
	} 
 
  default: 
	  //drawIndicate(x,y,FALSE,TRUE); 
    break; 
}*/ 
} 
 
BOOL CI2WBBaseWB::createWBControl(CI2WBBaseCSet* pawcs,INT cid,CI2WBBaseCtrl** ppawc,LPSTR name,LPSTR grpname) 
{ 
CI2WBBaseCtrl*     pawc;  
CHAR buf[MAX_CTRLIDNAME]; 
if(!pawcs) 
  return FALSE; 
 
pawcs->createControl(cid,this,(VOID**)&pawc,m_hwnd);  
//set control name 
if(name) 
  pawc->set_Name(name); 
else 
{ 
  getUniqueName(buf); 
  pawc->set_Name(buf); 
} 
 
//set group name 
if(grpname) 
  pawc->set_GrpName(grpname); 
 
pawc->set_State(CTRLSTATE_NORMAL); 
m_controllist.append(pawc); 
*ppawc=pawc; 
 
return TRUE; 
} 
 
BOOL CI2WBBaseWB::dealWithClickControl(DWORD fwKeys,INT x,INT y) 
{ 
I2Point p(x,y); 
CI2WBBaseWBSet* pwbs=(CI2WBBaseWBSet*)m_wbset; 
CI2WBBaseCtrl* pawc; 
if(m_wbs!=wbsCreateControl) 
	return FALSE; 
if(m_controllist.get_Count()) 
{ 
	pawc=(CI2WBBaseCtrl*)m_controllist.get_Items()[m_controllist.get_Count()-1]; 
	INT fend=0; 
    pawc->OnLButtonDown(fwKeys,x,y,m_hwnd,&fend); 
	return TRUE; 
} 
 
return FALSE; 
} 
 
VOID CI2WBBaseWB::OnPaint(HDC hdc) 
{ 
INT i; 
CHAR buf[MAX_CTRLIDNAME]; 
I2Rect rect; 
DWORD dw; 
for(i=0;ipaintControl(hdc); 
 
  //draw selected rect 
  if(pawc->m_state&CTRLSTATE_SELECT) 
  { 
		pawc->get_GrpName(buf); 
		if(strlen(buf)) 
		{ 
			pawc->get_GrpRect(&rect); 
			drawSelectedRect(hdc,&rect,1); 
		} 
		else  
		{ 
			pawc->getControlRect(rect); 
      pawc->get_Property(&dw); 
      if(dw&WB_PROP_CHANGE) 
			  drawSelectedRect(hdc,&rect,0); 
      else 
			  drawSelectedRect(hdc,&rect,1); 
		} 
  } 
 
  //draw locked rect 
  if(pawc->m_state&CTRLSTATE_LOCKED) 
  { 
 		pawc->get_GrpName(buf); 
		if(strlen(buf)) 
			pawc->get_GrpRect(&rect); 
		else  
			pawc->getControlRect(rect); 
    drawLockedRect(hdc,&rect); 
  } 
} 
 
//draw indicator 
if((((CI2WBBaseWBSet*)m_wbset)->m_findi)==TRUE) 
	drawRemotePoint(hdc,((CI2WBBaseWBSet*)m_wbset)->m_indipos.x,((CI2WBBaseWBSet*)m_wbset)->m_indipos.y); 
} 
 
BOOL CI2WBBaseWB::unselectAllControl(VOID) 
{ 
INT  i; 
I2Rect r; 
CI2WBBaseCtrl* pawc; 
DWORD dw; 
CHAR buf[MAX_CTRLIDNAME]; 
BOOL  HasControlChanged=FALSE; 
 
for(i=0;iget_State(&dw); 
  if(dw&CTRLSTATE_SELECT) 
  { 
    dw=dw^ CTRLSTATE_SELECT; 
    pawc->set_State(dw); 
    HasControlChanged=TRUE; 
 
    pawc->get_GrpName(buf); 
    if(strlen(buf)) 
      pawc->get_GrpRect(&r); 
    else 
      pawc->getControlRect(r); 
	  InflateRect(&r,5,5); 
    InvalidateRect(m_hwnd,&r,TRUE); 
  } 
} 
 
return HasControlChanged; 
} 
 
VOID CI2WBBaseWB::drawDragBorders(HDC hdc,INT sx,INT sy,INT cx,INT cy) 
{ 
INT  i; 
I2Rect r; 
CHAR buf[MAX_CTRLIDNAME]; 
CI2WBBaseCtrl* pawc; 
DWORD dw; 
 
HPEN hpen=CreatePen(PS_SOLID,1,GetSysColor(COLOR_WINDOW)); 
HBRUSH hbrush=(HBRUSH)GetStockObject(NULL_BRUSH); 
 
HPEN oldpen=(HPEN)SelectObject(hdc,hpen); 
HBRUSH oldbrush=(HBRUSH)SelectObject(hdc,hbrush); 
SetROP2(hdc,R2_XORPEN); 
 
for(i=0;iget_State(&dw); 
  if(dw&CTRLSTATE_SELECT) 
  { 
    pawc->get_GrpName(buf); 
		if(strlen(buf)) 
		{ 
			pawc->get_GrpRect(&r); 
		  r.left+=cx-sx; 
	    r.right+=cx-sx; 
			r.top+=cy-sy; 
			r.bottom+=cy-sy; 
		} 
    else 
    { 
      pawc->getControlRect(r); 
      r.left+=cx-sx; 
      r.right+=cx-sx; 
      r.top+=cy-sy; 
      r.bottom+=cy-sy; 
    } 
    Rectangle(hdc,r.left,r.top,r.right,r.bottom); 
  } 
} 
 
SelectObject(hdc,oldpen); 
SelectObject(hdc,oldbrush); 
DeleteObject(hpen); 
DeleteObject(hbrush); 
} 
 
VOID CI2WBBaseWB::OnDragControl(INT offsetx,INT offsety) 
{ 
INT     i; 
I2Rect    r1,r2,r; 
DWORD   dw; 
CHAR buf[MAX_CTRLIDNAME]; 
CI2WBBaseCtrl*        pawc; 
 
for(i=0;iget_State(&dw); 
  if(!(dw&CTRLSTATE_SELECT)) 
    continue; 
	if(!(dw&CTRLSTATE_LOCKED)) 
  { 
  pawc->get_GrpName(buf); 
	if(strlen(buf)) 
	{ 
		pawc->get_GrpRect(&r); 
	  //InflateRect(&r,5,5); 
    InvalidateRect(m_hwnd,&r,TRUE); 
	  r.left+=offsetx; 
	  r.right+=offsetx; 
		r.top+=offsety; 
		r.bottom+=offsety; 
		pawc->set_GrpRect(r); 
	  //InflateRect(&r,5,5); 
    InvalidateRect(m_hwnd,&r,TRUE); 
	} 
  pawc->getControlRect(r1); 
  pawc->moveTo(offsetx,offsety); 
  pawc->getControlRect(r2); 
	InflateRect(&r1,5,5); 
	InflateRect(&r2,5,5); 
  InvalidateRect(m_hwnd,&r1,TRUE); 
  InvalidateRect(m_hwnd,&r2,TRUE); 
	} 
} 
 
UpdateWindow(m_hwnd); 
} 
 
VOID CI2WBBaseWB::beginWBTrackRect(INT x,INT y) 
{ 
HDC hdc=GetWindowDC(m_hwnd); 
HPEN hpen=CreatePen(PS_DOT,1,GetSysColor(COLOR_WINDOW)); 
HBRUSH hbrush=(HBRUSH)GetStockObject(NULL_BRUSH); 
HPEN oldpen=(HPEN)SelectObject(hdc,hpen); 
HBRUSH oldbrush=(HBRUSH)SelectObject(hdc,hbrush); 
 
SetROP2(hdc,R2_XORPEN); 
SetBkColor(hdc,0); 
 
m_tmpstartx=x; 
m_tmpstarty=y; 
m_tmpoldx=x; 
m_tmpoldy=y; 
 
Rectangle(hdc,m_tmpstartx,m_tmpstarty,m_tmpoldx,m_tmpoldy); 
SelectObject(hdc,oldpen); 
SelectObject(hdc,oldbrush); 
DeleteObject(hpen); 
DeleteObject(hbrush); 
ReleaseDC(m_hwnd,hdc); 
} 
 
VOID CI2WBBaseWB::WBTrackRect(INT x,INT y) 
{ 
HDC hdc=GetWindowDC(m_hwnd); 
HPEN hpen=CreatePen(PS_DOT,1,GetSysColor(COLOR_WINDOW)); 
HBRUSH hbrush=(HBRUSH)GetStockObject(NULL_BRUSH); 
HPEN oldpen=(HPEN)SelectObject(hdc,hpen); 
HBRUSH oldbrush=(HBRUSH)SelectObject(hdc,hbrush); 
SetROP2(hdc,R2_XORPEN); 
SetBkColor(hdc,0); 
 
Rectangle(hdc,m_tmpstartx,m_tmpstarty,m_tmpoldx,m_tmpoldy); 
Rectangle(hdc,m_tmpstartx,m_tmpstarty,x,y); 
 
m_tmpoldx=x; 
m_tmpoldy=y; 
SelectObject(hdc,oldpen); 
SelectObject(hdc,oldbrush); 
DeleteObject(hpen); 
DeleteObject(hbrush); 
ReleaseDC(m_hwnd,hdc); 
} 
 
VOID CI2WBBaseWB::endWBTrackRect(VOID) 
{ 
HDC hdc=GetWindowDC(m_hwnd); 
HPEN hpen=CreatePen(PS_DOT,1,GetSysColor(COLOR_WINDOW)); 
HBRUSH hbrush=(HBRUSH)GetStockObject(NULL_BRUSH); 
HPEN oldpen=(HPEN)SelectObject(hdc,hpen); 
HBRUSH oldbrush=(HBRUSH)SelectObject(hdc,hbrush); 
SetROP2(hdc,R2_XORPEN); 
SetBkColor(hdc,0); 
 
Rectangle(hdc,m_tmpstartx,m_tmpstarty,m_tmpoldx,m_tmpoldy);   
SelectObject(hdc,oldpen); 
SelectObject(hdc,oldbrush); 
DeleteObject(hpen); 
DeleteObject(hbrush); 
ReleaseDC(m_hwnd,hdc); 
} 
 
VOID CI2WBBaseWB::OnRangeSelect(RECT* r) 
{ 
INT   i,j; 
I2Rect  rect; 
DWORD dw; 
CI2WBBaseCtrl*        pawc; 
CHAR buf[MAX_CTRLIDNAME], buf1[MAX_CTRLIDNAME]; 
 
for(i=0;iget_GrpName(buf); 
  if(strlen(buf)) 
    pawc->get_GrpRect(&rect); 
  else 
    pawc->getControlRect(rect); 
  if(rect.left>=r->left&&rect.right<=r->right&&rect.top>=r->top&&rect.bottom<=r->bottom) 
  { 
    pawc->get_State(&dw); 
    dw=dw|CTRLSTATE_SELECT; 
    pawc->set_State(dw); 
    if(strlen(buf)) 
    {//control belong to a group 
			pawc->get_GrpRect(&rect); 
			for(j=0;jget_GrpName(buf1); 
				if(!lstrcmp(buf,buf1)) 
				{ 
					pawc->get_State(&dw); 
					dw=dw|CTRLSTATE_SELECT; 
					pawc->set_State(dw); 
				} 
			} 
		} 
		else//not belong to a grpup 
			pawc->getControlRect(rect); 
	  InflateRect(&rect,5,5); 
		InvalidateRect(m_hwnd,&rect,TRUE); 
	} 
} 
UpdateWindow(m_hwnd); 
} 
 
VOID CI2WBBaseWB::drawSelectedRect(HDC hdc,RECT* r,INT grouped) 
{ 
if(!hdc||!r) 
  throw new I2BaseException(I2E_INVALIDPARAMETER); 
switch(grouped) 
{ 
case 2: 
  { 
	HPEN   hpen=CreatePen(PS_SOLID,1,RGB(0,0,0)); 
	HBRUSH hbrush=(HBRUSH)GetStockObject(NULL_BRUSH); 
 
	HPEN   holdpen=(HPEN)SelectObject(hdc,hpen); 
	HBRUSH holdbrush=(HBRUSH)SelectObject(hdc,hbrush); 
  INT i=SetROP2(hdc,R2_NOTXORPEN); 
 
	Rectangle(hdc,r->left,r->top,r->right,r->bottom); 
 
  SetROP2(hdc,i); 
	SelectObject(hdc,holdpen); 
	SelectObject(hdc,holdbrush); 
	DeleteObject(hpen); 
  DeleteObject(hbrush); 
  break; 
  } 
 
case 1: 
  { 
	HPEN   hpen=CreatePen(PS_DOT,1,RGB(0,100,0)); 
	HBRUSH hbrush=(HBRUSH)GetStockObject(NULL_BRUSH); 
 
	HPEN   holdpen=(HPEN)SelectObject(hdc,hpen); 
	HBRUSH holdbrush=(HBRUSH)SelectObject(hdc,hbrush); 
 
	Rectangle(hdc,r->left,r->top,r->right,r->bottom); 
 
	SelectObject(hdc,holdpen); 
	SelectObject(hdc,holdbrush); 
	DeleteObject(hpen); 
  DeleteObject(hbrush); 
  break; 
  } 
 
case 0: 
  { 
	HPEN hpen=CreatePen(PS_DOT,1,RGB(0,100,0)); 
	HBRUSH hbrush=(HBRUSH)GetStockObject(NULL_BRUSH); 
 
	HPEN holdpen=(HPEN)SelectObject(hdc,hpen); 
	HBRUSH holdbrush=(HBRUSH)SelectObject(hdc,hbrush); 
  //SetROP2(hdc,R2_NOTXORPEN); 
	//SetBkColor(hdc,RGB(255,255,255)); 
 
	Rectangle(hdc,r->left,r->top,r->right,r->bottom); 
 
	SelectObject(hdc,holdpen); 
	SelectObject(hdc,holdbrush); 
	DeleteObject(hpen); 
	DeleteObject(hbrush); 
 
	hpen=CreatePen(PS_SOLID,1,RGB(0,0,0)); 
	hbrush=(HBRUSH)CreateSolidBrush(RGB(0,100,0)); 
 
	holdpen=(HPEN)SelectObject(hdc,hpen); 
	holdbrush=(HBRUSH)SelectObject(hdc,hbrush); 
 
/*	Rectangle(hdc,r->left,r->top,r->left+4,r->top+4); 
	Rectangle(hdc,r->left,r->bottom-4,r->left+4,r->bottom); 
	Rectangle(hdc,r->right-4,r->top,r->right,r->top+4); 
	Rectangle(hdc,r->right-4,r->bottom-4,r->right,r->bottom); 
 
	Rectangle(hdc,r->left,r->top+(r->bottom-r->top)/2-2,r->left+4,r->top+(r->bottom-r->top)/2+2); 
	Rectangle(hdc,r->right-4,r->top+(r->bottom-r->top)/2-2,r->right,r->top+(r->bottom-r->top)/2+2); 
	Rectangle(hdc,r->left+(r->right-r->left)/2-2,r->top,r->left+(r->right-r->left)/2+2,r->top+4); 
	Rectangle(hdc,r->left+(r->right-r->left)/2-2,r->bottom-4,r->left+(r->right-r->left)/2+2,r->bottom); 
*/ 
	Rectangle(hdc,r->left-2,r->top-2,r->left+2,r->top+2); 
	Rectangle(hdc,r->left-2,r->bottom-2,r->left+2,r->bottom+2); 
	Rectangle(hdc,r->right-2,r->top-2,r->right+2,r->top+2); 
	Rectangle(hdc,r->right-2,r->bottom-2,r->right+2,r->bottom+2); 
 
	Rectangle(hdc,r->left-2,r->top+(r->bottom-r->top)/2-2,r->left+2,r->top+(r->bottom-r->top)/2+2); 
	Rectangle(hdc,r->right-2,r->top+(r->bottom-r->top)/2-2,r->right+2,r->top+(r->bottom-r->top)/2+2); 
	Rectangle(hdc,r->left+(r->right-r->left)/2-2,r->top-2,r->left+(r->right-r->left)/2+2,r->top+2); 
	Rectangle(hdc,r->left+(r->right-r->left)/2-2,r->bottom-2,r->left+(r->right-r->left)/2+2,r->bottom+2); 
 
	SelectObject(hdc,holdpen); 
	SelectObject(hdc,holdbrush); 
	DeleteObject(hpen); 
	DeleteObject(hbrush); 
  break; 
  } 
} 
} 
 
VOID CI2WBBaseWB::drawLockedRect(HDC hdc,RECT* r) 
{ 
if(!hdc||!r) 
  throw new I2BaseException(I2E_INVALIDPARAMETER); 
HPEN   hpen=CreatePen(PS_DOT,1,RGB(255,0,0)); 
HBRUSH hbrush=(HBRUSH)CreateSolidBrush(RGB(255,0,0)); 
 
HPEN   holdpen=(HPEN)SelectObject(hdc,hpen); 
HBRUSH holdbrush=(HBRUSH)SelectObject(hdc,hbrush); 
 
Rectangle(hdc,r->left,r->top,r->left+3,r->top+3); 
Rectangle(hdc,r->left,r->bottom-3,r->left+3,r->bottom); 
Rectangle(hdc,r->right-3,r->top,r->right,r->top+3); 
Rectangle(hdc,r->right-3,r->bottom-3,r->right,r->bottom); 
 
SelectObject(hdc,holdpen); 
SelectObject(hdc,holdbrush); 
DeleteObject(hpen); 
DeleteObject(hbrush); 
} 
 
VOID CI2WBBaseWB::lock() 
{ 
I2List l; 
I2Rect  r; 
CHAR buf[MAX_CTRLIDNAME],buf1[MAX_CTRLIDNAME]; 
getStateControlList(l,CTRLSTATE_SELECT); 
if(l.get_Count()==0) 
  return; 
 
DWORD dw; 
INT i,j; 
CI2WBBaseCtrl *pawc,*pawc1; 
for(i=0;iget_GrpName(buf); 
	if(strlen(buf)) 
	{ 
		for(j=0;jget_GrpName(buf1); 
			if(!lstrcmp(buf,buf1)) 
			{ 
				pawc1->get_State(&dw); 
				dw=dw|CTRLSTATE_LOCKED; 
				pawc1->set_State(dw); 
			} 
		} 
		pawc->get_GrpRect(&r); 
	} 
	else 
	{ 
		pawc->getControlRect(r); 
		pawc->get_State(&dw); 
		dw=dw|CTRLSTATE_LOCKED; 
		pawc->set_State(dw); 
	} 
	InflateRect(&r,5,5); 
  InvalidateRect(m_hwnd,&r,TRUE); 
} 
} 
 
VOID CI2WBBaseWB::unlock() 
{ 
I2List l; 
I2Rect  r; 
CHAR buf[MAX_CTRLIDNAME],buf1[MAX_CTRLIDNAME]; 
 
getStateControlList(l,CTRLSTATE_SELECT); 
if(l.get_Count()==0) 
  return; 
 
DWORD dw; 
INT i,j; 
CI2WBBaseCtrl *pawc,*pawc1; 
for(i=0;iget_GrpName(buf); 
	if(strlen(buf)) 
	{ 
		for(j=0;jget_GrpName(buf1); 
			if(!lstrcmp(buf,buf1)) 
			{ 
				pawc1->get_State(&dw); 
        if(!(dw&CTRLSTATE_LOCKED)) 
          break; 
				dw=dw^CTRLSTATE_LOCKED; 
				pawc1->set_State(dw); 
			} 
		} 
		pawc->get_GrpRect(&r); 
	} 
	else 
	{ 
		pawc->get_State(&dw); 
		dw=dw^CTRLSTATE_LOCKED; 
		pawc->set_State(dw); 
		pawc->getControlRect(r); 
	} 
	InflateRect(&r,5,5); 
  InvalidateRect(m_hwnd,&r,TRUE); 
} 
} 
 
VOID CI2WBBaseWB::getStateControlList(I2List& l,DWORD state) 
{ 
INT   i; 
DWORD dw; 
CI2WBBaseCtrl* pawc; 
 
for(i=0;iget_State(&dw); 
  if(dw&state) 
    l.append(pawc); 
} 
} 
 
VOID CI2WBBaseWB::getUniqueName(LPSTR buf) 
{ 
GUID guid; 
 
CoCreateGuid(&guid); 
I2Crypt::bin2asc((char*)&guid,sizeof(GUID),(CHAR*)buf); 
} 
 
VOID CI2WBBaseWB::writeHeader(I2MemoryFileStream *pstm,DWORD datacode,INT count,INT attrib) 
{ 
WB32DATAHEADER wdh; 
WB32HEADER wh; 
wh.datatype=WB_TYPE_CONTROL; 
lstrcpy(wh.wbname,m_wbname); 
pstm->writeFile((CHAR*)&wh,sizeof(WB32HEADER)); 
 
FillMemory(&wdh,sizeof(WB32DATAHEADER),0); 
wdh.version=MAKELPARAM(0,1); 
wdh.datacode=datacode; 
switch(LOWORD(attrib)) 
{ 
  case WBAT_LINEWIDTH: 
    get_LineWidth((INT *)&wdh.linewidth); 
    break; 
   
  case WBAT_LINESTYLE: 
    get_LineStyle((INT *)&wdh.linestyle); 
    break; 
 
  case WBAT_COLOR: 
    get_Color(&wdh.color); 
    break; 
 
  case WBAT_BKCOLOR: 
    get_BKColor(&wdh.bkcolor); 
    break; 
 
  case WBAT_FONT: 
    get_Font(&wdh.font,WB_FONT_ALL); 
    break; 
 
  default: 
    break; 
} 
wdh.count=count; 
wdh.attribchanged=attrib; 
pstm->writeFile((CHAR*)&wdh,sizeof(WB32DATAHEADER)); 
} 
 
VOID CI2WBBaseWB::get_LineWidth(INT* Value) 
{ 
*Value=((CI2WBBaseWBSet*)m_wbset)->m_prop_linewidth; 
} 
  
VOID CI2WBBaseWB::get_LineStyle(INT* Value) 
{ 
*Value=((CI2WBBaseWBSet*)m_wbset)->m_prop_linestyle; 
} 
 
VOID CI2WBBaseWB::get_Color(COLORREF* Value) 
{ 
*Value=((CI2WBBaseWBSet*)m_wbset)->m_prop_color; 
} 
 
VOID CI2WBBaseWB::get_BKColor(COLORREF* Value) 
{ 
*Value=((CI2WBBaseWBSet*)m_wbset)->m_prop_bkcolor; 
} 
 
VOID CI2WBBaseWB::get_Font(LPWB32FONT Value,INT mask) 
{ 
switch(mask) 
{ 
  case WB_FONT_NAME: 
	  lstrcpy((*Value).name,((CI2WBBaseWBSet*)m_wbset)->m_prop_font.name); 
	  break; 
 
  case WB_FONT_SIZE: 
	  (*Value).size=((CI2WBBaseWBSet*)m_wbset)->m_prop_font.size; 
	  break; 
 
  case WB_FONT_BOLD: 
	  if(((CI2WBBaseWBSet*)m_wbset)->m_prop_font.style&WBFS_BOLD) 
	    (*Value).style=(*Value).style|WBFS_BOLD; 
	  else 
	    (*Value).style=(*Value).style^WBFS_BOLD; 
	  break; 
 
  case WB_FONT_ITAL: 
	  if(((CI2WBBaseWBSet*)m_wbset)->m_prop_font.style&WBFS_ITALIC) 
	    (*Value).style=(*Value).style|WBFS_ITALIC; 
	  else 
	    (*Value).style=(*Value).style^WBFS_ITALIC;	 
	  break; 
 
  case WB_FONT_UNDE: 
	  if(((CI2WBBaseWBSet*)m_wbset)->m_prop_font.style&WBFS_UNDERLINE) 
	    (*Value).style=(*Value).style|WBFS_UNDERLINE; 
	  else 
	    (*Value).style=(*Value).style^WBFS_UNDERLINE;	 
	  break; 
 
  case WB_FONT_ALL: 
	  *Value=((CI2WBBaseWBSet*)m_wbset)->m_prop_font; 
	  break; 
 
  default: 
	  break; 
} 
} 
 
VOID CI2WBBaseWB::OnAttribChange(INT type) 
{ 
I2List l; 
INT   i; 
I2Rect r,r1; 
CHAR buf[MAX_CTRLIDNAME]; 
 
CI2WBBaseCtrl* pawc; 
I2MemoryFileStream stm(1024); 
 
getStateControlList(l,CTRLSTATE_SELECT); 
if(l.get_Count()==0) 
  return; 
 
writeHeader(&stm,WB32DATACODE_CHANGE,l.get_Count(),type); 
for(i=0;iget_GrpName(buf); 
	if(strlen(buf)) 
		continue; 
  pawc->getControlRect(r1); 
  pawc->OnAttribChange(LOWORD(type),HIWORD(type),TRUE); 
  pawc->getControlRect(r); 
  InflateRect(&r1,5,5); 
  InflateRect(&r,5,5); 
  InvalidateRect(m_hwnd,&r1,TRUE); 
  InvalidateRect(m_hwnd,&r,TRUE); 
  pawc->writeToStream(&stm,FALSE);    
} 
//if(((CI2WBBaseWBSet*)m_wbset)->m_stream) 
//  (((CI2WBBaseWBSet*)m_wbset)->m_stream)->write((CHAR*)stm.get_Pointer(),stm.get_Length()); 
  ((CI2WBBaseWBSet*)m_wbset)->sendData(stm); 
} 
 
VOID CI2WBBaseWB::bringToFront() 
{ 
I2List l; 
I2Rect  r; 
CI2WBBaseCtrl *pawc,*pawc1; 
CHAR buf[MAX_CTRLIDNAME],buf1[MAX_CTRLIDNAME];; 
getStateControlList(l,CTRLSTATE_SELECT); 
if(l.get_Count()==0) 
    return; 
INT i,j,k=0; 
pawc=l.get_Items()[0]; 
pawc->get_GrpName(buf); 
if(strlen(buf)) 
{ 
    i=m_controllist.IndexOf(l.get_Items()[0]); 
    m_controllist.Delete(i); 
    m_controllist.append(l.get_Items()[0]); 
    for(j=1;jget_GrpName(buf1); 
        if(!lstrcmp(buf,buf1)) 
        { 
            i=m_controllist.IndexOf(l.get_Items()[j]); 
            m_controllist.Delete(i); 
            m_controllist.append(l.get_Items()[j]); 
        } 
    } 
    pawc->get_GrpRect(&r); 
} 
else 
{ 
    if(l.get_Count()!=1) 
        return; 
    i=m_controllist.IndexOf(l.get_Items()[0]); 
    m_controllist.Delete(i); 
    m_controllist.append(l.get_Items()[0]); 
    ((CI2WBBaseCtrl*)m_controllist.get_Items()[0])->getControlRect(r); 
} 
InflateRect(&r,5,5); 
InvalidateRect(m_hwnd,&r,TRUE); 
UpdateWindow(m_hwnd); 
} 
 
VOID CI2WBBaseWB::sendToBack() 
{ 
I2List l; 
I2Rect  r; 
CI2WBBaseCtrl *pawc,*pawc1; 
CHAR buf[MAX_CTRLIDNAME],buf1[MAX_CTRLIDNAME];; 
getStateControlList(l,CTRLSTATE_SELECT); 
if(l.get_Count()==0) 
    return; 
INT i,j,k=0; 
pawc=l.get_Items()[0]; 
pawc->get_GrpName(buf); 
if(strlen(buf)) 
{ 
    i=m_controllist.IndexOf(l.get_Items()[0]); 
    m_controllist.Delete(i); 
    m_controllist.insert(0,l.get_Items()[0]); 
    for(j=1;jget_GrpName(buf1); 
        if(!lstrcmp(buf,buf1)) 
        { 
            k++; 
            i=m_controllist.IndexOf(l.get_Items()[j]); 
            m_controllist.Delete(i); 
            m_controllist.insert(k,l.get_Items()[j]); 
        } 
    } 
    pawc->get_GrpRect(&r); 
} 
else 
{ 
    if(l.get_Count()!=1) 
        return; 
    i=m_controllist.IndexOf(l.get_Items()[0]); 
    m_controllist.Delete(i); 
    m_controllist.insert(0,l.get_Items()[0]); 
    ((CI2WBBaseCtrl*)m_controllist.get_Items()[0])->getControlRect(r); 
} 
InflateRect(&r,5,5); 
InvalidateRect(m_hwnd,&r,TRUE); 
UpdateWindow(m_hwnd); 
} 
 
VOID CI2WBBaseWB::drawRemotePoint(HDC hdc,INT x,INT y) 
{ 
BOOL f=ImageList_Draw(((CI2WBBaseWBSet *)m_wbset)->m_himl,0,hdc,x-WB_INDICATE_XOFFSET,y-WB_INDICATE_YOFFSET,ILD_TRANSPARENT); 
} 
 
VOID CI2WBBaseWB::drawIndicate(INT x,INT y,BOOL fchanged,BOOL fsend) 
{ 
I2Rect r1,r2; 
I2Point m_indipos; 
m_indipos=((CI2WBBaseWBSet*)m_wbset)->m_indipos; 
if(fchanged==TRUE) 
{ 
	r1.left=m_indipos.x-WB_INDICATE_XOFFSET; 
	r1.top=m_indipos.y-WB_INDICATE_YOFFSET; 
	r1.right=r1.left+WB_INDICATE_WIDTH; 
	r1.bottom=r1.top+WB_INDICATE_HEIGHT; 
	InflateRect(&r1,5,5); 
	InvalidateRect(m_hwnd,&r1,TRUE); 
} 
else if(((CI2WBBaseWBSet*)m_wbset)->m_findi==TRUE) 
{ 
	r1.left=m_indipos.x-WB_INDICATE_XOFFSET; 
	r1.top=m_indipos.y-WB_INDICATE_YOFFSET; 
	r1.right=r1.left+WB_INDICATE_WIDTH; 
	r1.bottom=r1.top+WB_INDICATE_HEIGHT; 
	InflateRect(&r1,5,5); 
	InvalidateRect(m_hwnd,&r1,TRUE); 
	((CI2WBBaseWBSet*)m_wbset)->m_indipos.x=x; 
	((CI2WBBaseWBSet*)m_wbset)->m_indipos.y=y; 
	m_indipos=((CI2WBBaseWBSet*)m_wbset)->m_indipos; 
	r2.left=m_indipos.x-WB_INDICATE_XOFFSET; 
	r2.top=m_indipos.y-WB_INDICATE_YOFFSET; 
	r2.right=r2.left+WB_INDICATE_WIDTH; 
	r2.bottom=r2.top+WB_INDICATE_HEIGHT; 
	InflateRect(&r2,5,5); 
	InvalidateRect(m_hwnd,&r2,TRUE); 
} 
if(fsend==TRUE)   
	((CI2WBBaseWBSet*)m_wbset)->sendIndicate(((CI2WBBaseWBSet *)m_wbset)->m_findi,x,y); 
} 
 
VOID CI2WBBaseWB::adjustPoints(SHORT* x,SHORT* y) 
{ 
if(*x<0)*x=0; 
if(*x>m_width)*x=WB_DEFAULT_WIDTH; 
if(*y<0)*y=0; 
if(*y>m_height)*y=WB_DEFAULT_HEIGHT; 
} 
 
BOOL CI2WBBaseWB::nameIs(const I2String& name1,const I2String& name2) 
{ 
if(!strncmp(name1,name2,32)) 
	return FALSE; 
return TRUE; 
} 
 
VOID CI2WBBaseWB::cut() 
{ 
copy(); 
deleteControl(); 
} 
 
VOID CI2WBBaseWB::copy() 
{ 
I2List l; 
INT   i; 
 
CI2WBBaseCtrl* pawc; 
I2MemoryFileStream stm(1024); 
 
getStateControlList(l,CTRLSTATE_SELECT); 
if(l.get_Count()==0) 
  return; 
 
writeHeader(&stm,WB32DATACODE_COPY,l.get_Count(),0); 
for(i=0;iwriteToStream(&stm,TRUE);    
} 
 
HGLOBAL hClipBuf=GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE,stm.get_Length()); 
if(!hClipBuf) 
  throw new I2BaseException(I2E_INVALIDPARAMETER); 
CopyMemory(GlobalLock(hClipBuf),stm.get_Pointer(),stm.get_Length()); 
GlobalUnlock(hClipBuf); 
 
if(OpenClipboard(NULL)) 
{ 
  SetClipboardData(g_wb32clipformat,hClipBuf); 
  CloseClipboard(); 
} 
} 
 
VOID CI2WBBaseWB::paste() 
{ 
I2MemoryFileStream stm(1024),stm_out(1024); 
INT        len; 
WB32DATAHEADER  wdh; 
WB32CONTROLDATA wcd; 
WB32HEADER wh; 
I2List grpname; 
CHAR buf[MAX_CTRLIDNAME],buf1[MAX_CTRLIDNAME]; 
CI2WBBaseCSet* pawcs; 
CI2WBBaseCtrl *pawc,*pawc1; 
INT i,j,k; 
I2Rect r,rect,rect1; 
 
if(IsClipboardFormatAvailable(g_wb32clipformat)&&OpenClipboard(NULL)) 
{ 
  HANDLE hClipBuf=GetClipboardData(g_wb32clipformat); 
  if(hClipBuf!=NULL) 
  { 
    len=GlobalSize(hClipBuf); 
    stm.writeFile((CHAR*)GlobalLock(hClipBuf),len); 
    GlobalUnlock(hClipBuf); 
    EmptyClipboard(); 
  }  
 
  CloseClipboard(); 
} 
 
if(stm.get_Length()==0) 
   return; 
stm.seekFile(0,I2SEEK_SET); 
stm.readFile((CHAR*)&wh,sizeof(WB32HEADER)); 
 
if(wh.datatype!=WB_TYPE_CONTROL) 
	return; 
stm_out.writeFile((CHAR*)&wh,sizeof(WB32HEADER)); 
stm.readFile((CHAR*)&wdh,sizeof(WB32DATAHEADER)); 
wdh.datacode=WB32DATACODE_PASTE; 
stm_out.writeFile((CHAR*)&wdh,sizeof(WB32DATAHEADER)); 
 
k=m_controllist.get_Count(); 
 
for(i=0;i<(INT)wdh.count;i++) 
{ 
	stm.readFile((CHAR*)&wcd,sizeof(WB32CONTROLDATA)); 
	pawcs=((CI2WBBaseWBSet*)m_wbset)->getControlSet(wcd.csid); 
//  d::s("paste"); 
//  d::s("wcd.name %s",wcd.idname); 
  if(strlen(wcd.idgrpname)) 
  { 
    memset(buf,0,MAX_CTRLIDNAME); 
    for(j=0;jreadFromStream(&stm,wcd.len,wcd.rect); 
  if(lstrlen(wcd.idgrpname)) 
    pawc->set_GrpRect(wcd.grprect); 
  pawc->moveTo(10,10); 
  pawc->getControlRect(r); 
	InflateRect(&wcd.rect,5,5); 
	InflateRect(&r,5,5); 
  InvalidateRect(m_hwnd,&wcd.rect,TRUE); 
  InvalidateRect(m_hwnd,&r,TRUE); 
  //if(lstrlen(wcd.idgrpname)) 
  pawc->writeToStream(&stm_out,TRUE); 
} 
 
//set control's group rects 
for(i=k;iget_GrpName(buf); 
  if(strlen(buf)) 
  { 
    pawc->get_GrpRect(&r); 
    if(r.left==-1) 
		{//if not set group rect,computing the rect 
      pawc->getControlRect(rect); 
			//compute the rect 
      for(j=k;jget_GrpName(buf1); 
        if(!lstrcmp(buf,buf1)) 
        { 
          pawc1->getControlRect(rect1); 
    	    rect.left=rect.leftget_GrpName(buf1); 
        if(!lstrcmp(buf,buf1)) 
          pawc1->set_GrpRect(rect); 
      } 
      InflateRect(&rect,5,5); 
      InvalidateRect(m_hwnd,&rect,TRUE); 
    } 
  } 
} 
 
//if(((CI2WBBaseWBSet*)m_wbset)->m_stream) 
//  (((CI2WBBaseWBSet*)m_wbset)->m_stream)->write((CHAR *)stm_out.get_Pointer(),stm_out.get_Length()); 
((CI2WBBaseWBSet*)m_wbset)->sendData(stm_out); 
} 
 
VOID CI2WBBaseWB::copyWb() 
{ 
INT   i; 
 
CI2WBBaseCtrl* pawc; 
I2MemoryFileStream stm(1024); 
 
writeHeader(&stm,WB32DATACODE_COPY,m_controllist.get_Count(),0); 
for(i=0;iwriteToStream(&stm,TRUE);    
} 
 
HGLOBAL hClipBuf=GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE,stm.get_Length()); 
if(!hClipBuf) 
  throw new I2BaseException(I2E_INVALIDPARAMETER); 
CopyMemory(GlobalLock(hClipBuf),stm.get_Pointer(),stm.get_Length()); 
GlobalUnlock(hClipBuf); 
 
if(OpenClipboard(NULL)) 
{ 
  SetClipboardData(g_wb32clipformat,hClipBuf); 
  CloseClipboard(); 
} 
} 
 
VOID CI2WBBaseWB::pasteWb() 
{ 
I2MemoryFileStream stm(1024),stm_out(1024); 
INT        len; 
WB32DATAHEADER  wdh; 
WB32CONTROLDATA wcd; 
WB32HEADER wh; 
 
CI2WBBaseCSet* pawcs; 
CI2WBBaseCtrl* pawc; 
INT i; 
if(IsClipboardFormatAvailable(g_wb32clipformat)&&OpenClipboard(NULL)) 
{ 
  HANDLE hClipBuf=GetClipboardData(g_wb32clipformat); 
  if(hClipBuf!=NULL) 
  { 
    len=GlobalSize(hClipBuf); 
    stm.writeFile((CHAR*)GlobalLock(hClipBuf),len); 
    GlobalUnlock(hClipBuf); 
    EmptyClipboard(); 
  }  
 
  CloseClipboard(); 
} 
 
if(stm.get_Length()==0) 
   return; 
stm.seekFile(0,I2SEEK_SET); 
stm.readFile((CHAR*)&wh,sizeof(WB32HEADER)); 
 
if(wh.datatype!=WB_TYPE_CONTROL) 
	return; 
stm_out.writeFile((CHAR*)&wh,sizeof(WB32HEADER)); 
stm.readFile((CHAR*)&wdh,sizeof(WB32DATAHEADER)); 
wdh.datacode=WB32DATACODE_PASTE; 
stm_out.writeFile((CHAR*)&wdh,sizeof(WB32DATAHEADER)); 
 
for(i=0;i<(INT)wdh.count;i++) 
  { 
	stm.readFile((CHAR*)&wcd,sizeof(WB32CONTROLDATA)); 
	pawcs=((CI2WBBaseWBSet*)m_wbset)->getControlSet(wcd.csid); 
	if(!createWBControl(pawcs,wcd.cid,&pawc,NULL,NULL)) 
		return; 
	pawc->readFromStream(&stm,wcd.len,wcd.rect); 
  if(lstrlen(wcd.idgrpname)) 
    pawc->set_GrpRect(wcd.grprect); 
	InflateRect(&wcd.rect,5,5); 
  InvalidateRect(m_hwnd,&wcd.rect,TRUE); 
 
  pawc->writeToStream(&stm_out,TRUE); 
} 
//if(((CI2WBBaseWBSet*)m_wbset)->m_stream) 
//  (((CI2WBBaseWBSet*)m_wbset)->m_stream)->write((CHAR *)stm_out.get_Pointer(),stm_out.get_Length()); 
((CI2WBBaseWBSet*)m_wbset)->sendData(stm); 
} 
 
HFONT CI2WBBaseWB::createWBFont(LPWB32FONT pwbfont) 
{ 
LOGFONT logfont; 
HDC hdc=GetDC(m_hwnd); 
logfont.lfHeight=-MulDiv(pwbfont->size,GetDeviceCaps(hdc,LOGPIXELSY),72); 
ReleaseDC(m_hwnd,hdc); 
logfont.lfWidth=0; 
logfont.lfEscapement=0; 
logfont.lfOrientation=0; 
logfont.lfWeight=pwbfont->style&WBFS_BOLD?FW_BOLD:FW_NORMAL; 
logfont.lfItalic=pwbfont->style&WBFS_ITALIC?TRUE:FALSE; 
logfont.lfUnderline=pwbfont->style&WBFS_UNDERLINE?TRUE:FALSE; 
logfont.lfStrikeOut=FALSE; 
logfont.lfCharSet=DEFAULT_CHARSET; 
logfont.lfOutPrecision=OUT_DEFAULT_PRECIS; 
logfont.lfClipPrecision=CLIP_DEFAULT_PRECIS; 
logfont.lfQuality=DEFAULT_QUALITY; 
logfont.lfPitchAndFamily=FF_DONTCARE; 
lstrcpy(logfont.lfFaceName,pwbfont->name); 
 
return CreateFontIndirect(&logfont);  
} 
 
BOOL CI2WBBaseWB::dealWithEditorControl(INT x,INT y) 
{ 
I2Point p(x,y); 
CI2WBBaseWBSet* pwbs=(CI2WBBaseWBSet*)m_wbset; 
INT  i,j,ControlAtThisPoint=-1; 
INT  cid; 
I2Rect r; 
CI2WBBaseCtrl* pawc; 
 
if(m_wbs==wbsInplaceEditorActive) 
{ 
  ((CI2WBBaseWBSet*)m_wbset)->setControlSetID(GUID_NULL); 
  ((CI2WBBaseWBSet*)m_wbset)->setControlID(0); 
//  closeInplaceEditor(); 
  m_wbs=wbsNone; 
  if(((CI2WBBaseWBSet*)m_wbset)->m_wbcallback) 
 	  ((CI2WBBaseWBSet*)m_wbset)->m_wbcallback(WB32_SETSELECT,(void*)NULL); 
 
  return TRUE; 
} 
 
for(i=0;im_regeditorcontrol.get_Count();i++) 
{ 
  REGEDITORENTRY ree=pwbs->m_regeditorcontrol.get_Items()[i]; 
  if(IsEqualGUID(pwbs->m_CurControlSetId,ree.csid)&&  pwbs->m_CurControlId == ree.cid) 
  {//current control is editor 
    for(j=m_controllist.get_Count()-1;j>=0;j--) 
    { 
      pawc=(CI2WBBaseCtrl*)m_controllist.get_Items()[j]; 
      pawc->get_CID(&cid); 
      pawc->getControlRect(r); 
      if( cid==ree.cid &&PtInRect(&r,p)) 
      { 
        ControlAtThisPoint=j; 
        break; 
      } 
    } 
    if(ControlAtThisPoint==-1) 
    { 
      CI2WBBaseCSet* pawcs=pwbs->getCurControlSet(); 
      if(createWBControl(pawcs,ree.cid,&pawc,NULL,NULL)) 
      { 
		    m_existeditor=0; 
        openInplaceEditor(&((CI2WBBaseWBSet*)m_wbset)->m_prop_font,p,NULL,pawc); 
      } 
    } 
    else  
    { 
      pawc=(CI2WBBaseCtrl*)m_controllist.get_Items()[ControlAtThisPoint]; 
	    pawc->get_CID(&cid); 
      if(cid==ree.cid) 
      { 
        LPSTR    text; 
        WB32FONT font; 
	      pawc->OnInplaceEditorNeedText(&font,&text); 
		    if(lstrlen(text)) 
        { 
          pawc->getControlRect(r); 
          p.x=r.left-2; 
          p.y=r.top-2; 
          HDC hdc; 
		      hdc=GetWindowDC(m_hwnd); 
		      m_existeditor=1; 
          openInplaceEditor(&font,p,text,pawc); 
		      ReleaseDC(m_hwnd,hdc); 
		      CoTaskMemFree(text); 
        } 
      } 
    } 
    return TRUE; 
  } 
} 
return FALSE; 
} 
 
VOID CI2WBBaseWB::openInplaceEditor(LPWB32FONT pfont,POINT pos,LPSTR text,CI2WBBaseCtrl* editoruser) 
{ 
m_heditfont=createWBFont(pfont); 
m_heditwnd=CreateWindowEx(0,"EDIT",text, 
                          WS_BORDER|WS_CHILD|ES_AUTOHSCROLL|ES_AUTOVSCROLL|ES_MULTILINE|ES_WANTRETURN, 
                          pos.x,pos.y,0,0, 
                          m_hwnd,NULL,(HINSTANCE)GetModuleHandle(NULL),NULL); 
SendMessage(m_heditwnd,EM_SETLIMITTEXT,1024,0); 
 
if(!m_heditwnd) 
   throw new I2BaseException(I2E_INVALIDPARAMETER); 
SendMessage(m_heditwnd,WM_SETFONT,(WPARAM)m_heditfont,0); 
INT w,h; 
calculateEditSize(&w,&h); 
SetWindowPos(m_heditwnd,NULL,0,0,w,h,SWP_NOZORDER|SWP_NOMOVE|SWP_SHOWWINDOW); 
SetFocus(m_heditwnd); 
 
m_editoruser=editoruser; 
m_wbs=wbsInplaceEditorActive; 
} 
 
VOID CI2WBBaseWB::closeInplaceEditor(VOID) 
{ 
if(m_wbs!=wbsInplaceEditorActive) 
  return; 
I2MemoryFileStream stm(1024); 
INT j; 
I2Rect r; 
GetWindowRect(m_heditwnd,&r); 
screentoclient(m_hwnd,r); 
I2Point pt(r.left+2,r.top+2); 
 
LPSTR p; 
INT   len=SendMessage(m_heditwnd,WM_GETTEXTLENGTH,0,0)+1; 
 
if(len==1) 
{ 
  j=m_controllist.IndexOf(m_editoruser); 
  m_controllist.Delete(j); 
} 
else 
{ 
  p=(LPSTR)GlobalAlloc(GPTR,len); 
  SendMessage(m_heditwnd,WM_GETTEXT,len,(LPARAM)p); 
  m_editoruser->OnInplaceEditorReturnText(pt,p); 
 
  if(m_existeditor) 
	writeHeader(&stm,WB32DATACODE_CHANGEDATA,1,0); 
  else 
	writeHeader(&stm,WB32DATACODE_COPY,1,0); 
  m_editoruser->writeToStream(&stm,TRUE); 
//  if(((CI2WBBaseWBSet*)m_wbset)->m_stream) 
//    (((CI2WBBaseWBSet*)m_wbset)->m_stream)->write((CHAR *)stm.get_Pointer(),stm.get_Length()); 
  ((CI2WBBaseWBSet*)m_wbset)->sendData(stm); 
 
  GlobalFree(p); 
//  ((CI2WBBaseWBSet*)m_wbset)->setControlSetID(GUID_NULL); 
//  ((CI2WBBaseWBSet*)m_wbset)->setControlID(0); 
//  m_wbs=wbsNone; 
} 
 
DestroyWindow(m_heditwnd); 
DeleteObject(m_heditfont); 
 
m_wbs=wbsNone; 
} 
 
VOID CI2WBBaseWB::calculateEditSize(INT* width,INT* height) 
{ 
I2Rect     r(0,0,0,0); 
LPSTR      p; 
INT        len; 
TEXTMETRIC tm; 
 
HDC hdc=GetDC(m_heditwnd); 
SelectObject(hdc,m_heditfont); 
len=SendMessage(m_heditwnd,WM_GETTEXTLENGTH,0,0)+1; 
p=(LPSTR)GlobalAlloc(GPTR,len); 
SendMessage(m_heditwnd,WM_GETTEXT,len,(LPARAM)p); 
DrawText(hdc,p,-1,&r,DT_CALCRECT|DT_EDITCONTROL|DT_NOPREFIX|DT_EXPANDTABS); 
GlobalFree(p); 
 
GetTextMetrics(hdc,&tm); 
 
*width=r.width()+tm.tmMaxCharWidth; 
*height=r.height()+tm.tmHeight+10; 
 
ReleaseDC(m_heditwnd,hdc); 
} 
 
VOID CI2WBBaseWB::OnCommand(WORD wNotifyCode,WORD wID,HWND hwndCtl) 
{ 
if(wNotifyCode==EN_CHANGE&&hwndCtl==m_heditwnd) 
{ 
  if(SendMessage(m_heditwnd,EM_GETMODIFY,0,0)) 
  { 
    INT w,h; 
    calculateEditSize(&w,&h); 
    SetWindowPos(m_heditwnd,NULL,0,0,w,h,SWP_NOZORDER|SWP_NOMOVE); 
  } 
} 
} 
 
VOID CI2WBBaseWB::OnCSIDChange(GUID oldcsid,GUID newcsid) 
{ 
closeInplaceEditor(); 
} 
 
VOID CI2WBBaseWB::save(I2MemoryFileStream& stm) 
{ 
INT i; 
WB32WBSAVE ws; 
CI2WBBaseCtrl* pawc; 
I2MemoryFileStream mstm(1024); 
 
if(m_wbs==wbsInplaceEditorActive) 
  closeInplaceEditor(); 
 
lstrcpy(ws.tag,"wb10"); 
lstrcpy(ws.name,m_wbname); 
ws.num=m_controllist.get_Count(); 
for(i=0;iwriteToStream(&mstm,TRUE); 
} 
CHAR *p=(CHAR*)GlobalAlloc(GPTR,mstm.get_Length()*1.001+12+sizeof(long)); 
long lendata=I2Zlib::compress((CHAR*)mstm.get_Pointer(),mstm.get_Length(),p+sizeof(long),9); 
*((long*)p)=mstm.get_Length(); 
ws.len=lendata+sizeof(long); 
stm.writeFile((CHAR*)&ws,sizeof(WB32WBSAVE)); 
stm.writeFile(p,lendata+sizeof(long)); 
GlobalFree(p); 
} 
 
VOID CI2WBBaseWB::load(SHORT x,SHORT y,VOID* p,INT len, bool grouped) 
{ 
int i,j; 
WB32WBSAVE ws; 
WB32CONTROLDATA wcd; 
I2MemoryFileStream stm(1024),stm_out(1024),mstm(1024); 
mstm.writeFile((CHAR*)p,len); 
 
CI2WBBaseCSet* pawcs; 
CI2WBBaseCtrl *pawc,*pawc1; 
 
mstm.seekFile(0,I2SEEK_SET); 
mstm.readFile((CHAR*)&ws,sizeof(WB32WBSAVE)); 
if(strcmp(ws.tag,"wb10")) 
  return; 
if(x==-1 && y==-1) 
  set_Name(ws.name);//sync name of white board 
writeHeader(&stm_out,WB32DATACODE_COPY,ws.num,0); 
CHAR buf[MAX_CTRLIDNAME]; 
if(grouped) 
  getUniqueName(buf); 
 
VOID *point=(CHAR*)p+sizeof(WB32WBSAVE); 
VOID *pdata=GlobalAlloc(GPTR,*((long*)point)); 
INT count=I2Zlib::decompress((CHAR*)point+sizeof(long),ws.len-sizeof(long)/*-sizeof(WB32WBSAVE)*/,(CHAR*)pdata); 
stm.writeFile((CHAR*)pdata,*((long*)point));//*(long*)p) length of data before compress 
                                 //len = length of compressed data + long 
GlobalFree(pdata); 
stm.seekFile(0,I2SEEK_SET); 
j=m_controllist.get_Count(); 
for(i=0;i<(INT)ws.num;i++) 
{ 
  stm.readFile((CHAR*)&wcd,sizeof(WB32CONTROLDATA));   
  pawcs=(CI2WBBaseCSet*)((CI2WBBaseWBSet*)m_wbset)->getControlSet(wcd.csid); 
  if(grouped) 
  {   
   if(!createWBControl(pawcs,wcd.cid,&pawc,NULL,buf)) 
      return; 
  } 
  else 
  { 
    if(!createWBControl(pawcs,wcd.cid,&pawc,NULL,NULL)) 
      return; 
  } 
  pawc->readFromStream(&stm,wcd.len,wcd.rect); 
  if(!grouped) 
    pawc->writeToStream(&stm_out,TRUE); 
  InflateRect(&wcd.rect,5,5); 
  InvalidateRect(m_hwnd,&wcd.rect,TRUE);  
} 
 
if(grouped) 
{ 
  //computing group rect 
	I2Rect rect,rect1; 
	pawc->getControlRect(rect); 
       
	for(i=j;igetControlRect(rect1); 
		rect.left=rect.leftmoveTo(x-rect.left,y-rect.top); 
	  } 
    rect.right=rect.right+x-rect.left; 
    rect.bottom=rect.bottom+y-rect.top; 
    rect.left=x; 
    rect.top=y; 
  } 
 
  //set group rect 
	for(i=j;iset_GrpRect(rect); 
    pawc1->writeToStream(&stm_out,TRUE); 
	} 
	InflateRect(&rect,5,5); 
	InvalidateRect(m_hwnd,&rect,TRUE); 
} 
 
((CI2WBBaseWBSet*)m_wbset)->sendData(stm_out); 
} 
 
VOID CI2WBBaseWB::get_Name(CHAR* value) 
{ 
lstrcpy(value,m_wbname); 
} 
 
VOID CI2WBBaseWB::set_Name(CHAR* value) 
{ 
lstrcpy(m_wbname,value); 
} 
 
BOOL CI2WBBaseWB::get_Sync() 
{ 
return m_sync; 
} 
 
VOID CI2WBBaseWB::set_Sync(BOOL value) 
{ 
m_sync=value; 
} 
 
 
VOID CI2WBBaseWB::dragRectMM(SHORT x,SHORT y) 
{ 
 	POINT pt = {x,y}; 
	RECT  rcTemp; 
 
		if (iRectStatus == RS_NORMAL) 
		{ 
				RECT  rc[8]; 
				 
				//set hot area 
        //for moving a small control,set hot area outside the control rect 
				rc[4].left   = m_rect.left - HOTSIZER * 2; 
				rc[4].top    = m_rect.top - HOTSIZER * 2; 
				rc[4].right  = m_rect.left; 
				rc[4].bottom = m_rect.top; 
 
				rc[0].left   = (m_rect.right + m_rect.left + 1) / 2 - HOTSIZER; 
				rc[0].top    = m_rect.top - HOTSIZER * 2; 
				rc[0].right  = (m_rect.right + m_rect.left + 1) / 2 + HOTSIZER; 
				rc[0].bottom = m_rect.top ; 
 
				rc[5].left   = m_rect.right - HOTSIZER * 2; 
				rc[5].top    = m_rect.top - HOTSIZER * 2; 
				rc[5].right  = m_rect.right; 
				rc[5].bottom = m_rect.top; 
 
				rc[2].left   = m_rect.left - HOTSIZER * 2; 
				rc[2].top    = (m_rect.top + m_rect.bottom + 1) / 2 - HOTSIZER; 
				rc[2].right  = m_rect.left ; 
				rc[2].bottom = (m_rect.top + m_rect.bottom + 1) / 2 + HOTSIZER; 
 
				rc[3].left   = m_rect.right ; 
				rc[3].top    = (m_rect.top + m_rect.bottom + 1) / 2 - HOTSIZER; 
				rc[3].right  = m_rect.right + HOTSIZER * 2; 
				rc[3].bottom = (m_rect.top + m_rect.bottom + 1) / 2 + HOTSIZER; 
 
				rc[6].left   = m_rect.left - HOTSIZER * 2; 
				rc[6].top    = m_rect.bottom + HOTSIZER * 2; 
				rc[6].right  = m_rect.left; 
				rc[6].bottom = m_rect.bottom ; 
 
				rc[1].left   = (m_rect.right + m_rect.left + 1) / 2 - HOTSIZER; 
				rc[1].top    = m_rect.bottom ; 
				rc[1].right  = (m_rect.right + m_rect.left + 1) / 2 + HOTSIZER; 
				rc[1].bottom = m_rect.bottom + HOTSIZER * 2; 
 
				rc[7].left   = m_rect.right ; 
				rc[7].top    = m_rect.bottom; 
				rc[7].right  = m_rect.right +  HOTSIZER * 2; 
				rc[7].bottom = m_rect.bottom +  HOTSIZER * 2; 
 
				BOOL f = FALSE; 
 
				for(int i = RH_TOP; i <= RH_BOTTOMRIGHT; i++) 
				{ 
					  if (PtInRect(&rc[i - 1], pt)) 
					  { 
						    iResizeHandle = i; 
						    f = TRUE; 
						    if ((i == 1) || (i == 2)) 
							      lpMouseStatus = IDC_SIZENS; 
						    else if ((i == 3) || (i == 4)) 
							      lpMouseStatus = IDC_SIZEWE; 
						    else if ((i == 5) || (i == 8)) 
							      lpMouseStatus = IDC_SIZENWSE; 
						    else if ((i == 6) || (i == 7)) 
							      lpMouseStatus = IDC_SIZENESW; 
					  } 
					  if (f) break; 
				} 
 
				if (!f) 
				{ 
					  iResizeHandle = RH_NONE; 
					  lpMouseStatus = IDC_ARROW; 
				} 
		} 
		else if (iRectStatus == RS_MOVING) 
		{ 
    		HDC hdc=GetWindowDC(m_hwnd); 
 
        drawDragBorders(hdc,m_tmpstartx,m_tmpstarty,m_tmpoldx,m_tmpoldy); 
        drawDragBorders(hdc,m_tmpstartx,m_tmpstarty,x,y); 
 
        m_tmpoldx=x; 
        m_tmpoldy=y; 
 
		    ReleaseDC(m_hwnd,hdc); 
 
				rcTemp.left   = m_rect.left + pt.x - pPrevPos.x; 
				rcTemp.right  = m_rect.right + pt.x - pPrevPos.x; 
				rcTemp.top    = m_rect.top + pt.y - pPrevPos.y; 
				rcTemp.bottom = m_rect.bottom + pt.y - pPrevPos.y; 
 
				rcTempPrev = rcTemp; 
		} 
		else if (iRectStatus == RS_RESIZING) 
		{ 
				switch(iResizeHandle) 
				{ 
				    case RH_TOP: 
					      rcTemp.left   = m_rect.left; 
					      rcTemp.right  = m_rect.right; 
					      rcTemp.top    = m_rect.top + pt.y - pPrevPos.y; 
					      rcTemp.bottom = m_rect.bottom; 
					      if (rcTemp.top > rcTemp.bottom - RCMINSIZE) 
						        rcTemp.top = rcTemp.bottom - RCMINSIZE; 
					      break; 
 
				    case RH_BOTTOM: 
					      rcTemp.left   = m_rect.left; 
					      rcTemp.right  = m_rect.right; 
					      rcTemp.top    = m_rect.top; 
					      rcTemp.bottom = m_rect.bottom + pt.y - pPrevPos.y; 
					      if (rcTemp.top > rcTemp.bottom - RCMINSIZE) 
						        rcTemp.bottom = rcTemp.top + RCMINSIZE; 
					      break; 
 
				    case RH_LEFT: 
					      rcTemp.left   = m_rect.left + pt.x - pPrevPos.x; 
					      rcTemp.right  = m_rect.right; 
					      rcTemp.top    = m_rect.top; 
					      rcTemp.bottom = m_rect.bottom; 
					      if (rcTemp.left > rcTemp.right - RCMINSIZE) 
						        rcTemp.left = rcTemp.right - RCMINSIZE; 
					      break; 
 
				    case RH_RIGHT: 
					      rcTemp.left   = m_rect.left; 
					      rcTemp.right  = m_rect.right + pt.x - pPrevPos.x; 
					      rcTemp.top    = m_rect.top; 
					      rcTemp.bottom = m_rect.bottom; 
					      if (rcTemp.left > rcTemp.right - RCMINSIZE) 
						        rcTemp.right = rcTemp.left + RCMINSIZE; 
					      break; 
 
				    case RH_TOPLEFT: 
					      rcTemp.left   = m_rect.left + pt.x - pPrevPos.x; 
					      rcTemp.right  = m_rect.right; 
					      rcTemp.top    = m_rect.top + pt.y - pPrevPos.y; 
					      rcTemp.bottom = m_rect.bottom; 
					      if (rcTemp.left > rcTemp.right - RCMINSIZE) 
						        rcTemp.left = rcTemp.right - RCMINSIZE; 
					      if (rcTemp.top > rcTemp.bottom - RCMINSIZE) 
						        rcTemp.top = rcTemp.bottom - RCMINSIZE; 
					      break; 
 
				    case RH_TOPRIGHT: 
					      rcTemp.left   = m_rect.left; 
					      rcTemp.right  = m_rect.right + pt.x - pPrevPos.x; 
					      rcTemp.top    = m_rect.top + pt.y - pPrevPos.y; 
					      rcTemp.bottom = m_rect.bottom; 
					      if (rcTemp.left > rcTemp.right - RCMINSIZE) 
						        rcTemp.right = rcTemp.left + RCMINSIZE; 
					      if (rcTemp.top > rcTemp.bottom - RCMINSIZE) 
						        rcTemp.top = rcTemp.bottom - RCMINSIZE; 
					      break; 
 
				    case RH_BOTTOMLEFT: 
					      rcTemp.left   = m_rect.left + pt.x - pPrevPos.x; 
					      rcTemp.right  = m_rect.right; 
					      rcTemp.top    = m_rect.top; 
					      rcTemp.bottom = m_rect.bottom + pt.y - pPrevPos.y; 
					      if (rcTemp.left > rcTemp.right - RCMINSIZE) 
						        rcTemp.left = rcTemp.right - RCMINSIZE; 
					      if (rcTemp.top > rcTemp.bottom - RCMINSIZE) 
						        rcTemp.bottom = rcTemp.top + RCMINSIZE; 
					      break; 
 
				    case RH_BOTTOMRIGHT: 
					      rcTemp.left   = m_rect.left; 
					      rcTemp.right  = m_rect.right + pt.x - pPrevPos.x; 
					      rcTemp.top    = m_rect.top; 
					      rcTemp.bottom = m_rect.bottom + pt.y - pPrevPos.y; 
					      if (rcTemp.left > rcTemp.right - RCMINSIZE) 
						        rcTemp.right = rcTemp.left + RCMINSIZE; 
					      if (rcTemp.top > rcTemp.bottom - RCMINSIZE) 
						        rcTemp.bottom = rcTemp.top + RCMINSIZE; 
					      break; 
 
    				default: ; 
				} 
     		HDC hdc=GetWindowDC(m_hwnd); 
		    drawSelectedRect(hdc,&rcTemp,2); 
		    drawSelectedRect(hdc,&rcTempPrev,2); 
//        drawDragBorders(hdc,m_tmpstartx,m_tmpstarty,m_tmpoldx,m_tmpoldy); 
//        drawDragBorders(hdc,m_tmpstartx,m_tmpstarty,x,y); 
//        m_tmpoldx=x; 
//        m_tmpoldy=y; 
 
        ReleaseDC(m_hwnd,hdc); 
			  rcTempPrev = rcTemp; 
		} 
			 
		if (lpMouseStatus != IDC_ARROW) 
				SetCursor(LoadCursor(NULL, lpMouseStatus)); 
    else 
				SetCursor(LoadCursor(NULL,IDC_ARROW)); 
 
} 
 
VOID CI2WBBaseWB::dragRectLD(SHORT x,SHORT y,INT i) 
{ 
	  HDC hdc; 
 	  POINT pt = {x,y}; 
    hdc=GetWindowDC(m_hwnd); 
    CI2WBBaseCtrl* pawc; 
    int lw; 
    DWORD dw; 
    CHAR buf[MAX_CTRLIDNAME]; 
    get_LineWidth(&lw); 
 
    if (iResizeHandle) 
		{ 
        for(i=0;iget_State(&dw); 
            if(dw&CTRLSTATE_SELECT) 
            { 
                pawc->get_GrpName(buf); 
		            if(strlen(buf)) 
			              pawc->get_GrpRect(&m_rect); 
                else 
                    pawc->getControlRect(m_rect); 
            } 
        } 
 
				rcTempPrev  = m_rect; 
				iRectStatus = RS_RESIZING; 
//        d::s("resizing rect %d %d %d %d",m_rect.left,m_rect.top,m_rect.right,m_rect.bottom); 
        drawSelectedRect(hdc,&rcTempPrev,2); 
				pPrevPos    = pt; 
		} 
		else if (i!=-1) 
		{ 
        CI2WBBaseCtrl* pawc=m_controllist.get_Items()[i]; 
        DWORD dw; 
        pawc->get_State(&dw); 
        if(dw&CTRLSTATE_SELECT) 
        { 
		    		iRectStatus   = RS_MOVING; 
		    		lpMouseStatus = IDC_SIZEALL; 
        } 
		} 
 
		SetCapture(m_hwnd); 
    ReleaseDC(m_hwnd,hdc); 
    if (lpMouseStatus != IDC_ARROW) 
        SetCursor(LoadCursor(NULL, lpMouseStatus)); 
    else 
        SetCursor(LoadCursor(NULL,IDC_ARROW)); 
 
} 
 
VOID CI2WBBaseWB::dragRectLU(SHORT x,SHORT y) 
{ 
    HDC hdc; 
    DWORD dw; 
  	POINT pt = {x,y}; 
    I2List l; 
    CI2WBBaseCtrl *pawc; 
 
    I2Point p(x,y); 
    I2Rect  r; 
 
    I2MemoryFileStream stm(1024); 
    hdc=GetWindowDC(m_hwnd); 
    INT i; 
    if (iRectStatus == RS_RESIZING) 
    { 
    		m_rect = rcTempPrev; 
 				iRectStatus = RS_NORMAL; 
 
        drawSelectedRect(hdc,&rcTempPrev,2); 
        drawSelectedRect(hdc,&rcTempPrev,0); 
//        d::s("resized rect %d %d %d %d",m_rect.left,m_rect.top,m_rect.right,m_rect.bottom); 
  
        getStateControlList(l,CTRLSTATE_SELECT); 
        if(l.get_Count()!=1) 
            return; 
        pawc=(CI2WBBaseCtrl*)l.get_Items()[0]; 
        pawc->OnChangeData(m_rect); 
        pawc->getControlRect(r); 
//        d::s("resized r %d %d %d %d",r.left,r.top,r.right,r.bottom); 
 
        InvalidateRect(m_hwnd,&r,TRUE); 
 
        writeHeader(&stm,WB32DATACODE_CHANGEDATA,l.get_Count(),0); 
        pawc->writeToStream(&stm,FALSE);    
        ((CI2WBBaseWBSet*)m_wbset)->sendData(stm); 
    } 
 
		if (iRectStatus == RS_MOVING) 
		{ 
		    HDC hdc=GetWindowDC(m_hwnd); 
        drawDragBorders(hdc,m_tmpstartx,m_tmpstarty,m_tmpoldx,m_tmpoldy); 
		    ReleaseDC(m_hwnd,hdc); 
        OnDragControl(x-m_tmpstartx,y-m_tmpstarty); 
        getStateControlList(l,CTRLSTATE_SELECT); 
 
        writeHeader(&stm,WB32DATACODE_DRAG,l.get_Count(),0); 
        for(i=0;iwriteToStream(&stm,FALSE);    
        } 
        ((CI2WBBaseWBSet*)m_wbset)->sendData(stm); 
 
		    lpMouseStatus = IDC_ARROW; 
 
        if(l.get_Count()==0) 
        { 
 				    iRectStatus = RS_NONE; 
//            return; 
        } 
        else if(l.get_Count() > 1) 
        { 
				    iRectStatus = RS_MOVE; 
            pawc=(CI2WBBaseCtrl*)l.get_Items()[0]; 
            pawc->get_GrpRect(&m_rect); 
        } 
        else  
        { 
            pawc=(CI2WBBaseCtrl*)l.get_Items()[0]; 
            pawc->get_Property(&dw); 
            pawc->getControlRect(m_rect); 
            if(dw & WB_PROP_CHANGE) 
				        iRectStatus = RS_NORMAL; 
            else 
				        iRectStatus = RS_MOVE; 
        }  
		} 
		ReleaseCapture(); 
    ReleaseDC(m_hwnd,hdc); 
		if (lpMouseStatus != IDC_ARROW) 
				SetCursor(LoadCursor(NULL, lpMouseStatus)); 
    else 
				SetCursor(LoadCursor(NULL, IDC_ARROW)); 
 
} 
 
VOID CI2WBBaseWB::OnLoseCapture() 
{ 
POINT p; 
GetCursorPos(&p); 
ScreenToClient(m_hwnd,&p); 
 
CancelCurrectState(p.x,p.y); 
} 
 
VOID CI2WBBaseWB::CancelCurrectState(INT x,INT y) 
{ 
adjustPoints((SHORT*)&x,(SHORT*)&y); 
POINT p={x,y}; 
WhiteBoardState wbs=m_wbs; 
I2Rect r; 
I2MemoryFileStream stm(1024); 
//if(m_wbs==wbsDragControl || m_wbs==wbsRangeSelect) 
//	m_wbs=wbsNone; 
switch(wbs) 
  { 
  case wbsNone: 
    ReleaseCapture(); 
    break; 
   
  case wbsDragControl: 
  { 
    RECT r; 
    m_wbs=wbsNone; 
    ReleaseCapture(); 
    r=m_rect; 
	  InflateRect(&r,5,5); 
    InvalidateRect(m_hwnd,&r,TRUE); 
    dragRectLU(x,y); 
  } 
  break; 
   
  case wbsRangeSelect: 
//    dragRectLU(x,y); 
    endWBTrackRect(); 
    ReleaseCapture(); 
    m_wbs=wbsNone; 
    SetRect(&r,m_tmpstartx,m_tmpstarty,x,y); 
    OnRangeSelect(&r); 
    if(((CI2WBBaseWBSet*)m_wbset)->m_erase) 
	    deleteControl(); 
    break; 
   
  case wbsControlTrackPoint: 
  break; 
 
  case wbsWBTrackPoint: 
  break; 
 
  case wbsControlTrackRect: 
  break; 
 
  case wbsWBTrackRect: 
  break; 
 
  case wbsControlTrackClick: 
  break; 
 
  case wbsWBTrackClick: 
  break; 
 
  case wbsCreateControl: 
	{ 
    m_wbs=wbsNone; 
    ReleaseCapture(); 
    m_controllist.Delete(m_controllist.get_Count()-1); 
    delete m_curcontrol; 
    ((CI2WBBaseWBSet*)m_wbset)->setControlSetID(GUID_NULL); 
    ((CI2WBBaseWBSet*)m_wbset)->setControlID(0); 
  } 
  break; 
} 
 
m_wbs=wbsNone; 
}