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;
}