windows-nt/Source/XPSP1/NT/enduser/netmeeting/ui/wb/wrkspobj.cpp
2020-09-26 16:20:57 +08:00

1435 lines
32 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// DRAWOBJ.CPP
// Drawing objects: point, openpolyline, closepolyline, ellipse
//
// Copyright Microsoft 1998-
//
#include "precomp.h"
#include "NMWbObj.h"
WorkspaceObj* g_pCurrentWorkspace;
WorkspaceObj* g_pConferenceWorkspace;
//
// Created from UI
//
WorkspaceObj::WorkspaceObj ( void )
{
ResetAttrib();
SetOwnerID(g_MyMemberID);
SetType(workspaceCreatePDU_chosen);
//
// Workspace Identifier
//
SetWorkspaceHandle(0);
//
// Application Roster Instance
//
m_appRosterInstance = g_pNMWBOBJ->m_instanceNumber;
//
// Is Wokspace synchronized
//
m_bsynchronized = TRUE;
//
// Does workspace accept keyboard events
//
m_acceptKeyboardEvents = FALSE;
//
// Does workspace accept mouse events
//
m_acceptPointingDeviceEvents = FALSE;
SetViewState(focus_chosen);
SetUpdatesEnabled(!g_pDraw->IsLocked());
//
// Workspace max width and height
//
m_workspaceSize.x = DRAW_WIDTH; // Max width
m_workspaceSize.y = DRAW_HEIGHT; // Max height in Draw.hpp
RECT rect;
rect.top = 0;
rect.left = 0;
rect.right = m_workspaceSize.x;
rect.bottom = m_workspaceSize.y;
SetRect(&rect);
}
//
// Created from Remote
//
WorkspaceObj::WorkspaceObj (WorkspaceCreatePDU * pWorkspaceCreatePDU, BOOL bForcedResend)
{
ResetAttrib();
SetType(workspaceCreatePDU_chosen);
SetUpdatesEnabled(TRUE);
//
// Workspace Identifier
//
SetWorkspaceHandle(GetWorkspaceIdentifier(&pWorkspaceCreatePDU->workspaceIdentifier));
SetThisObjectHandle(GetWorkspaceHandle());
#ifdef _DEBUG
//
// Application Roster Instance
//
m_appRosterInstance = pWorkspaceCreatePDU->appRosterInstance;
TRACE_DEBUG(("m_appRosterInstance = %d", m_appRosterInstance));
//
// Is Wokspace synchronized
//
m_bsynchronized = pWorkspaceCreatePDU->synchronized;
TRACE_DEBUG(("m_bsynchronized = %d", m_bsynchronized));
//
// Does workspace accept keyboard events
//
m_acceptKeyboardEvents = pWorkspaceCreatePDU->acceptKeyboardEvents;
TRACE_DEBUG(("m_acceptKeyboardEvents = %d", m_acceptKeyboardEvents));
//
// Does workspace accept mouse events
//
m_acceptPointingDeviceEvents = pWorkspaceCreatePDU->acceptPointingDeviceEvents;
TRACE_DEBUG(("m_acceptPointingDeviceEvents = %d", m_acceptPointingDeviceEvents));
//
// List of nodes that can access workspace
//
if(pWorkspaceCreatePDU->bit_mask & protectedPlaneAccessList_present)
{
WorkspaceCreatePDU_protectedPlaneAccessList_Element *pNode;
pNode = pWorkspaceCreatePDU->protectedPlaneAccessList;
do
{
BYTE * pByte;
DBG_SAVE_FILE_LINE
pByte = new BYTE[1];
*pByte = (UCHAR)pNode->value;
m_protectedPlaneAccessList.AddTail(pByte);
pNode = pNode->next;
}while (pNode);
}
//
// Workspace max width and height
//
m_workspaceSize.x = pWorkspaceCreatePDU->workspaceSize.width;
m_workspaceSize.y = pWorkspaceCreatePDU->workspaceSize.height;
TRACE_DEBUG(("m_workspaceSize(x,y) = (%d, %d)", m_workspaceSize.x, m_workspaceSize.y));
RECT rect;
rect.top = 0;
rect.left = 0;
rect.right = m_workspaceSize.x;
rect.bottom = m_workspaceSize.y;
SetRect(&rect);
//
// Workspace attributes
//
if(pWorkspaceCreatePDU->bit_mask & workspaceAttributes_present)
{
GetWorkSpaceAttrib(pWorkspaceCreatePDU->workspaceAttributes);
}
//
// Workspace plane parameters
//
GetWorkSpacePlaneParam(pWorkspaceCreatePDU->planeParameters);
//
// Workspace view parameters
//
if(pWorkspaceCreatePDU->bit_mask & viewParameters_present)
{
m_viewHandle = pWorkspaceCreatePDU->viewParameters->value.viewHandle;
TRACE_DEBUG(("View Handle = %d", m_viewHandle));
if(pWorkspaceCreatePDU->viewParameters->value.bit_mask & viewAttributes_present)
{
GetWorkSpaceViewParam(pWorkspaceCreatePDU->viewParameters->value.viewAttributes);
}
}
#endif // 0
//
// Add it to the list of workspaces
//
AddNewWorkspace(this, bForcedResend);
}
WorkspaceObj::~WorkspaceObj( void )
{
RemoveObjectFromResendList(this);
RemoveObjectFromRequestHandleList(this);
//
// Tell other nodes that we are gone
//
if(WasDeletedLocally())
{
OnObjectDelete();
}
//
// Delete all the objects in this workspace
//
T126Obj * pObj;
while ((pObj = (T126Obj *)m_T126ObjectsInWorkspace.RemoveTail()) != NULL)
{
pObj->SetMyWorkspace(NULL);
delete pObj;
g_numberOfObjects--;
}
g_numberOfWorkspaces--;
}
void WorkspaceObj::WorkspaceEditObj ( WorkspaceEditPDU * pWorkspaceEditPDU )
{
//
// Workspace view parameters
//
if(pWorkspaceEditPDU->bit_mask & viewEdits_present)
{
GetWorkSpaceViewEditParam(pWorkspaceEditPDU->viewEdits);
}
if(HasUpatesEnabledStateChanged())
{
if(GetUpdatesEnabled())
{
g_pMain->UnlockDrawingArea();
}
else
{
g_pMain->LockDrawingArea();
}
g_pMain->UpdatePageButtons();
}
if(HasViewStateChanged() &&
pWorkspaceEditPDU->viewEdits &&
pWorkspaceEditPDU->viewEdits->value.action.choice == editView_chosen)
{
if(g_pDraw->IsSynced())
{
g_pMain->GotoPage(this, FALSE);
}
g_pConferenceWorkspace = this;
}
ResetAttrib();
#ifdef _DEBUG
//
// Workspace attributes
//
if(pWorkspaceEditPDU->bit_mask & WorkspaceEditPDU_attributeEdits_present)
{
GetWorkSpaceAttrib((WorkspaceCreatePDU_workspaceAttributes *)pWorkspaceEditPDU->attributeEdits);
}
//
// Workspace plane parameters
//
if(pWorkspaceEditPDU->bit_mask & planeEdits_present)
{
GetWorkSpacePlaneParam((WorkspaceCreatePDU_planeParameters *)pWorkspaceEditPDU->planeEdits);
}
#endif // 0
}
UINT WorkspaceObj::GetWorkspaceIdentifier(WorkspaceIdentifier *workspaceIdentifier)
{
TRACE_DEBUG(("GetWorkspaceIdentifier choice = %d", workspaceIdentifier->choice));
switch(workspaceIdentifier->choice)
{
case(activeWorkspace_chosen):
{
TRACE_MSG(("activeWorkspace = %d", workspaceIdentifier->u.activeWorkspace));
return(workspaceIdentifier->u.activeWorkspace);
break;
}
// case(archiveWorkspace_chosen):
// {
// break;
// }
default:
{
ERROR_OUT(("Invalid workspaceIdentifier choice"));
break;
}
}
return -1;
}
void WorkspaceObj::CreateWorkspaceCreatePDU(WorkspaceCreatePDU * pWorkspaceCreatePDU)
{
pWorkspaceCreatePDU->bit_mask = 0;
//
// Workspace Identifier, we have to ask GCC for an active unique workspace handle
//
pWorkspaceCreatePDU->workspaceIdentifier.choice = activeWorkspace_chosen;
pWorkspaceCreatePDU->workspaceIdentifier.u.activeWorkspace = GetWorkspaceHandle();
//
// Application Roster Instance
//
pWorkspaceCreatePDU->appRosterInstance = (ASN1uint16_t)g_pNMWBOBJ->m_instanceNumber;
//
// Is Wokspace synchronized
//
pWorkspaceCreatePDU->synchronized = (ASN1bool_t)m_bsynchronized;
//
// Does workspace accept keyboard events
//
pWorkspaceCreatePDU->acceptKeyboardEvents = (ASN1bool_t)m_acceptKeyboardEvents;
//
// Does workspace accept mouse events
//
pWorkspaceCreatePDU->acceptPointingDeviceEvents = (ASN1bool_t)m_acceptPointingDeviceEvents;
//
// Workspace max width and height
//
pWorkspaceCreatePDU->workspaceSize.width = (USHORT)m_workspaceSize.x;
pWorkspaceCreatePDU->workspaceSize.height = (USHORT)m_workspaceSize.y;
//
// Workspace plane parameters
//
PWorkspaceCreatePDU_planeParameters planeParameters;
PWorkspaceCreatePDU_planeParameters_Seq_usage usage;
PWorkspaceCreatePDU_planeParameters_Seq_usage pFirstUsage;
//
// Do the plane parameters
//
DBG_SAVE_FILE_LINE
planeParameters = (PWorkspaceCreatePDU_planeParameters)new BYTE[sizeof(WorkspaceCreatePDU_planeParameters)];
pWorkspaceCreatePDU->planeParameters = planeParameters;
planeParameters->value.bit_mask = planeAttributes_present;
planeParameters->value.editable = TRUE;
planeParameters->next = NULL;
DBG_SAVE_FILE_LINE
PWorkspaceCreatePDU_planeParameters_Seq_planeAttributes pPlaneAttrib;
pPlaneAttrib = (PWorkspaceCreatePDU_planeParameters_Seq_planeAttributes) new BYTE[sizeof(WorkspaceCreatePDU_planeParameters_Seq_planeAttributes)];
pPlaneAttrib->value.choice = protection_chosen;
pPlaneAttrib->value.u.protection.protectedplane = FALSE;
pPlaneAttrib->next = NULL;
planeParameters->value.planeAttributes = pPlaneAttrib;
DBG_SAVE_FILE_LINE
usage = (PWorkspaceCreatePDU_planeParameters_Seq_usage) new BYTE[sizeof(WorkspaceCreatePDU_planeParameters_Seq_usage)];
pFirstUsage = usage;
planeParameters->value.usage = usage;
usage->value.choice = image_chosen;
DBG_SAVE_FILE_LINE
usage = (PWorkspaceCreatePDU_planeParameters_Seq_usage) new BYTE[sizeof(WorkspaceCreatePDU_planeParameters_Seq_usage)];
planeParameters->value.usage->next = usage;
usage->value.choice = annotation_chosen;
usage->next = NULL;
//
// Do the plane parameters 2nd time
//
DBG_SAVE_FILE_LINE
planeParameters->next = (PWorkspaceCreatePDU_planeParameters)new BYTE[sizeof(WorkspaceCreatePDU_planeParameters)];
planeParameters = planeParameters->next;
planeParameters->value.bit_mask = planeAttributes_present;
planeParameters->value.editable = TRUE;
planeParameters->value.usage = pFirstUsage;
planeParameters->next = NULL;
planeParameters->value.planeAttributes = pPlaneAttrib;
//
// Do it hte 3rd time
//
planeParameters->next = (PWorkspaceCreatePDU_planeParameters)new BYTE[sizeof(WorkspaceCreatePDU_planeParameters)];
planeParameters = planeParameters->next;
planeParameters->value.bit_mask = planeAttributes_present;
planeParameters->value.editable = TRUE;
planeParameters->value.usage = pFirstUsage;
planeParameters->next = NULL;
planeParameters->value.planeAttributes = pPlaneAttrib;
pWorkspaceCreatePDU->viewParameters = NULL;
}
void WorkspaceObj::CreateWorkspaceDeletePDU(WorkspaceDeletePDU *pWorkspaceDeletePDU)
{
pWorkspaceDeletePDU->bit_mask = 0;
pWorkspaceDeletePDU->workspaceIdentifier.choice = activeWorkspace_chosen;
pWorkspaceDeletePDU->workspaceIdentifier.u.activeWorkspace = GetWorkspaceHandle();
pWorkspaceDeletePDU->reason.choice = userInitiated_chosen;
}
void WorkspaceObj::CreateWorkspaceEditPDU(WorkspaceEditPDU *pWorkspaceEditPDU)
{
pWorkspaceEditPDU->bit_mask = 0;
pWorkspaceEditPDU->workspaceIdentifier.choice = activeWorkspace_chosen;
pWorkspaceEditPDU->workspaceIdentifier.u.activeWorkspace = GetWorkspaceHandle();
PWorkspaceEditPDU_viewEdits_Set_action_editView pEditView = NULL;
pWorkspaceEditPDU->viewEdits = NULL;
if(HasUpatesEnabledStateChanged() || HasViewStateChanged())
{
pWorkspaceEditPDU->bit_mask |= viewEdits_present;
DBG_SAVE_FILE_LINE
pWorkspaceEditPDU->viewEdits = (PWorkspaceEditPDU_viewEdits)new BYTE[sizeof(WorkspaceEditPDU_viewEdits)];
pWorkspaceEditPDU->viewEdits->next = NULL;
pWorkspaceEditPDU->viewEdits->value.viewHandle = m_viewHandle;
pWorkspaceEditPDU->viewEdits->value.action.choice = (ASN1choice_t)m_viewActionChoice;
pWorkspaceEditPDU->viewEdits->value.action.u.editView = NULL;
}
if(HasUpatesEnabledStateChanged())
{
DBG_SAVE_FILE_LINE
pEditView = (PWorkspaceEditPDU_viewEdits_Set_action_editView) new BYTE[sizeof (WorkspaceEditPDU_viewEdits_Set_action_editView)];
pEditView->next = NULL;
pEditView->value.choice = updatesEnabled_chosen;
pEditView->value.u.updatesEnabled = (ASN1bool_t)GetUpdatesEnabled();
pWorkspaceEditPDU->viewEdits->value.action.u.editView = pEditView;
}
if(HasViewStateChanged())
{
DBG_SAVE_FILE_LINE
pEditView = (PWorkspaceEditPDU_viewEdits_Set_action_editView) new BYTE[sizeof (WorkspaceEditPDU_viewEdits_Set_action_editView)];
pEditView->next = pWorkspaceEditPDU->viewEdits->value.action.u.editView;
pEditView->value.choice = WorkspaceViewAttribute_viewState_chosen;
pEditView->value.u.viewState.choice = (ASN1choice_t)GetViewState();
pWorkspaceEditPDU->viewEdits->value.action.u.editView = pEditView;
}
}
void WorkspaceObj::RemoveT126Object(T126Obj *pObj)
{
//
// The contents of the wb just changed
//
g_bContentsChanged = TRUE;
//
// Remove it from the List Of objcets in the workspace
//
WBPOSITION pos = m_T126ObjectsInWorkspace.GetPosition(pObj);
m_T126ObjectsInWorkspace.RemoveAt(pos);
//
// Erase the drawing
//
pObj->DrawRect();
pObj->UnselectDrawingObject();
pObj->UnDraw();
//
// Put the object in the trash, don't delete it locally
// but tell the other nodes to delete it
//
g_numberOfObjects--;
g_pDraw->DeleteSelection();
if(pObj != g_pMain->m_pLocalRemotePointer && pObj->WasDeletedLocally())
{
pObj->SetMyPosition(NULL);
g_pTrash->AddTail( pObj );
pObj->OnObjectDelete();
}
else
{
delete pObj;
}
}
T126Obj* WorkspaceObj::FindObjectInWorkspace(UINT objectHandle)
{
T126Obj* pObj;
WBPOSITION pos;
pos = m_T126ObjectsInWorkspace.GetTailPosition();
while (pos != NULL)
{
pObj = (T126Obj*)m_T126ObjectsInWorkspace.GetPrevious(pos);
if(pObj && pObj->GetThisObjectHandle() == objectHandle)
{
return pObj;
}
}
return NULL;
}
BOOL WorkspaceObj::IsObjectInWorkspace(T126Obj* pObjToFind)
{
T126Obj* pObj;
WBPOSITION pos;
pos = m_T126ObjectsInWorkspace.GetHeadPosition();
while (pos != NULL)
{
pObj = (T126Obj*)m_T126ObjectsInWorkspace.GetNext(pos);
if(pObj == pObjToFind)
{
return TRUE;
}
}
return FALSE;
}
BOOL IsWorkspaceListed(T126Obj * pWorkspaceObj)
{
T126Obj * pObj;
WBPOSITION pos;
pos = g_pListOfWorkspaces->GetHeadPosition();
while (pos != NULL)
{
pObj =(T126Obj *) g_pListOfWorkspaces->GetNext(pos);
if(pObj == pWorkspaceObj)
{
return TRUE;
}
}
return FALSE;
}
//
// Add new workspace
//
void AddNewWorkspace(WorkspaceObj * pWorkspaceObj, BOOL bForcedResend)
{
g_bContentsChanged = TRUE;
//
// Add it to the list of workspace objects
//
if(g_pConferenceWorkspace)
{
WBPOSITION pos = g_pConferenceWorkspace->GetMyPosition();
pWorkspaceObj->SetMyPosition(g_pListOfWorkspaces->AddAt(pWorkspaceObj, pos));
}
else
{
pWorkspaceObj->SetMyPosition(g_pListOfWorkspaces->AddTail(pWorkspaceObj));
g_pConferenceWorkspace = pWorkspaceObj;
g_pCurrentWorkspace = pWorkspaceObj;
if(!g_pDraw->IsSynced())
{
g_pMain->OnSync();
}
}
g_numberOfWorkspaces++;
if(g_pDraw->IsSynced())
{
g_pMain->GotoPage(pWorkspaceObj, bForcedResend);
}
//
// We are not synced but update the page butons anyway
//
else
{
g_pConferenceWorkspace = pWorkspaceObj;
g_pMain->UpdatePageButtons();
}
}
BitmapObj * WorkspaceObj::RectHitRemotePointer(LPRECT hitRect, int penThickness , WBPOSITION pos)
{
if(pos == NULL)
{
pos = m_T126ObjectsInWorkspace.GetTailPosition();
}
else
{
m_T126ObjectsInWorkspace.GetPrevious(pos);
}
T126Obj* pPointer = (T126Obj*)m_T126ObjectsInWorkspace.GetFromPosition(pos);
RECT pointerRect;
RECT intersectRect;
while(pos && pPointer && pPointer->GraphicTool() == TOOLTYPE_REMOTEPOINTER)
{
pPointer->GetRect(&pointerRect);
::InflateRect(&pointerRect, penThickness , penThickness);
NormalizeRect(&pointerRect);
NormalizeRect(hitRect);
if(IntersectRect(&intersectRect, &pointerRect, hitRect))
{
return (BitmapObj *)pPointer;
}
pPointer = (T126Obj*) m_T126ObjectsInWorkspace.GetPrevious(pos);
}
return NULL;
}
void WorkspaceObj::AddTail(T126Obj * pObj)
{
//
// The contents of the wb just changed
//
g_bContentsChanged = TRUE;
pObj->SetMyWorkspace(this);
T126Obj* pPointer = (T126Obj*)m_T126ObjectsInWorkspace.GetTail();
//
// Add the local remote pointer in the tail position
// and other type of objects before all the remote pointers
//
if(!(pObj->GraphicTool() == TOOLTYPE_REMOTEPOINTER && pObj->IAmTheOwner()) &&
pPointer && pPointer->GraphicTool() == TOOLTYPE_REMOTEPOINTER)
{
WBPOSITION pos = m_T126ObjectsInWorkspace.GetTailPosition();
WBPOSITION insertPos = NULL;
//
// Find the first object that is not a remote pointer
//
while(pPointer->GraphicTool() == TOOLTYPE_REMOTEPOINTER)
{
insertPos = pos;
if(pos == NULL)
{
break;
}
pPointer = (T126Obj*) m_T126ObjectsInWorkspace.GetPrevious(pos);
}
if(insertPos)
{
pObj->SetMyPosition(m_T126ObjectsInWorkspace.AddAt(pObj, insertPos));
}
else
{
pObj->SetMyPosition(m_T126ObjectsInWorkspace.AddHead(pObj));
}
//
// Make sure we repaint the area, if there was a handle it could be under it
//
if(pObj->GraphicTool() == TOOLTYPE_REMOTEPOINTER)
{
((BitmapObj*)pObj)->CreateSaveBitmap();
}
RECT rect;
pObj->GetBoundsRect(&rect);
g_pDraw->InvalidateSurfaceRect(&rect,TRUE);
}
else
{
pObj->SetMyPosition(m_T126ObjectsInWorkspace.AddTail(pObj));
}
}
WorkspaceObj* RemoveWorkspace(WorkspaceObj * pWorkspaceObj)
{
WorkspaceObj * pWrkspc;
g_bContentsChanged = TRUE;
WBPOSITION pos = pWorkspaceObj->GetMyPosition();
WBPOSITION prevPos = pos;
g_pListOfWorkspaces->GetPrevious(prevPos);
g_pListOfWorkspaces->RemoveAt(pos);
//
// We just removed the first page
//
if(prevPos == NULL)
{
pWrkspc = (WorkspaceObj *)g_pListOfWorkspaces->GetHead();
}
else
{
pWrkspc = (WorkspaceObj *)g_pListOfWorkspaces->GetPrevious(prevPos);
}
//
// The current workspace is pointing to the deleted object
//
if(g_pCurrentWorkspace == pWorkspaceObj)
{
::InvalidateRect(g_pDraw->m_hwnd, NULL, TRUE);
//
// If we were drawing/selecting or dragging something, finish now
//
g_pDraw->OnLButtonUp(0,0,0);
//
// If we are deleting the current workspace and we have the text editor active
//
if (g_pDraw->TextEditActive())
{
//
// Finish the text
//
g_pDraw->EndTextEntry(FALSE);
}
g_pCurrentWorkspace = NULL;
}
if(g_pConferenceWorkspace == pWorkspaceObj)
{
g_pConferenceWorkspace = NULL;
}
delete pWorkspaceObj;
return pWrkspc;
}
UINT WorkspaceObj::EnumerateObjectsInWorkspace(void)
{
UINT objects = 0;
WBPOSITION pos;
T126Obj* pObj;
pos = GetHeadPosition();
while(pos)
{
pObj = GetNextObject(pos);
if(pObj && pObj->GraphicTool() != TOOLTYPE_REMOTEPOINTER)
{
objects++;
}
}
return objects;
}
void ResendAllObjects(void)
{
//
// Resend all objects
//
WBPOSITION pos;
WBPOSITION posObj;
WorkspaceObj* pWorkspace;
WorkspaceObj* pCurrentWorkspace;
pCurrentWorkspace = g_pCurrentWorkspace;
T126Obj* pObj;
pos = g_pListOfWorkspaces->GetHeadPosition();
while(pos)
{
pWorkspace = (WorkspaceObj*)g_pListOfWorkspaces->GetNext(pos);
if(pWorkspace)
{
pWorkspace->SetAllAttribs();
pWorkspace->SendNewObjectToT126Apps();
posObj = pWorkspace->GetHeadPosition();
while(posObj)
{
pObj = pWorkspace->GetNextObject(posObj);
if(pObj)
{
pObj->ClearSelectionFlags();
pObj->SetAllAttribs();
pObj->SendNewObjectToT126Apps();
//
// Lines need to be saved in various pdus with 256 points in each pdu
//
if(pObj->GraphicTool() == TOOLTYPE_PEN || pObj->GraphicTool() == TOOLTYPE_HIGHLIGHT)
{
int nPoints = ((DrawObj*)pObj)->m_points->GetSize();
int size = MAX_POINT_LIST_VALUES + 1;
if(nPoints > (MAX_POINT_LIST_VALUES + 1))
{
while(size != nPoints)
{
if(nPoints > (size + MAX_POINT_LIST_VALUES + 1))
{
size += MAX_POINT_LIST_VALUES + 1;
}
else
{
size = nPoints;
}
//
// Move to the next 256 points
//
((DrawObj*)pObj)->m_points->SetSize(size - 1);
//
// Send the next 256 points
//
pObj->ResetAttrib();
((DrawObj*)pObj)->ChangedPointList();
pObj->OnObjectEdit();
}
((DrawObj*)pObj)->m_points->SetSize(size);
}
}
}
}
}
}
//
// Syncronize page
//
if(g_pCurrentWorkspace)
{
g_pMain->GotoPage(g_pCurrentWorkspace);
g_pCurrentWorkspace->SetViewState(focus_chosen);
g_pCurrentWorkspace->SetViewActionChoice(editView_chosen);
g_pCurrentWorkspace->OnObjectEdit();
}
}
void RemoveObjectFromRequestHandleList(T126Obj * pObjRequest)
{
T126Obj* pObj;
WBPOSITION pos;
WBPOSITION prevPos;
pos = g_pListOfObjectsThatRequestedHandles->GetHeadPosition();
while (pos != NULL)
{
prevPos = pos;
pObj = (T126Obj*)g_pListOfObjectsThatRequestedHandles->GetNext(pos);
if(pObj == pObjRequest)
{
g_pListOfObjectsThatRequestedHandles->RemoveAt(prevPos);
break;
}
}
}
UINT GetSIPDUObjectHandle(SIPDU * sipdu)
{
UINT ObjectHandle = 0;
switch(sipdu->choice)
{
case bitmapAbortPDU_chosen:
ObjectHandle = sipdu->u.bitmapAbortPDU.bitmapHandle;
break;
case bitmapCheckpointPDU_chosen:
ObjectHandle = sipdu->u.bitmapCheckpointPDU.bitmapHandle;
break;
case bitmapCreatePDU_chosen:
ObjectHandle = sipdu->u.bitmapCreatePDU.bitmapHandle;
break;
case bitmapCreateContinuePDU_chosen:
ObjectHandle = sipdu->u.bitmapCreateContinuePDU.bitmapHandle;
break;
case bitmapDeletePDU_chosen:
ObjectHandle = sipdu->u.bitmapDeletePDU.bitmapHandle;
break;
case bitmapEditPDU_chosen:
ObjectHandle = sipdu->u.bitmapEditPDU.bitmapHandle;
break;
case drawingCreatePDU_chosen:
ObjectHandle = sipdu->u.drawingCreatePDU.drawingHandle;
break;
case drawingDeletePDU_chosen:
ObjectHandle = sipdu->u.drawingDeletePDU.drawingHandle;
break;
case drawingEditPDU_chosen:
ObjectHandle = sipdu->u.drawingEditPDU.drawingHandle;
break;
case siNonStandardPDU_chosen:
ObjectHandle = ((TEXTPDU_HEADER*) sipdu->u.siNonStandardPDU.nonStandardTransaction.data.value)->textHandle;
break;
case workspaceCreatePDU_chosen:
ObjectHandle = WorkspaceObj::GetWorkspaceIdentifier(&sipdu->u.workspaceCreatePDU.workspaceIdentifier);
break;
case workspaceCreateAcknowledgePDU_chosen:
ObjectHandle = WorkspaceObj::GetWorkspaceIdentifier(&sipdu->u.workspaceCreateAcknowledgePDU.workspaceIdentifier);
break;
case workspaceDeletePDU_chosen:
ObjectHandle = WorkspaceObj::GetWorkspaceIdentifier(&sipdu->u.workspaceDeletePDU.workspaceIdentifier);
break;
case workspaceEditPDU_chosen:
ObjectHandle = WorkspaceObj::GetWorkspaceIdentifier(&sipdu->u.workspaceEditPDU.workspaceIdentifier);
break;
case workspacePlaneCopyPDU_chosen:
ObjectHandle = WorkspaceObj::GetWorkspaceIdentifier(&sipdu->u.workspacePlaneCopyPDU.sourceWorkspaceIdentifier);
break;
case workspaceReadyPDU_chosen:
ObjectHandle = WorkspaceObj::GetWorkspaceIdentifier(&sipdu->u.workspaceReadyPDU.workspaceIdentifier);
break;
}
return ObjectHandle;
}
BOOL RemoveObjectFromResendList(T126Obj * pObjRequest)
{
BOOL bRemoved = FALSE;
SIPDU* pPDU;
WBPOSITION pos;
WBPOSITION prevPos;
UINT objectHandle = pObjRequest->GetThisObjectHandle();
pos = g_pRetrySendList->GetHeadPosition();
while (pos != NULL)
{
prevPos = pos;
pPDU = (SIPDU*)g_pRetrySendList->GetNext(pos);
if(GetSIPDUObjectHandle(pPDU) == objectHandle)
{
g_pRetrySendList->RemoveAt(prevPos);
SIPDUCleanUp(pPDU);
bRemoved = TRUE;
}
}
return bRemoved;
}
void RemoveRemotePointer(MEMBER_ID nMemberID)
{
//
// Resend all objects
//
WBPOSITION pos;
WBPOSITION posObj;
WorkspaceObj* pWorkspace;
ULONG ownerID;
T126Obj* pObj;
pos = g_pListOfWorkspaces->GetHeadPosition();
while(pos)
{
pWorkspace = (WorkspaceObj*)g_pListOfWorkspaces->GetNext(pos);
if(pWorkspace)
{
posObj = pWorkspace->GetHeadPosition();
while(posObj)
{
pObj = pWorkspace->GetNextObject(posObj);
if(pObj && pObj->GraphicTool() == TOOLTYPE_REMOTEPOINTER)
{
ownerID = GET_NODE_ID_FROM_MEMBER_ID(pObj->GetOwnerID());
TRACE_DEBUG(("RemoveRemotePointer ownerID=%x member that left =%x " , ownerID, nMemberID));
if(ownerID != g_MyMemberID)
{
if(nMemberID)
{
if(nMemberID == ownerID)
{
pWorkspace->RemoveT126Object(pObj);
}
}
else
{
pWorkspace->RemoveT126Object(pObj);
}
}
}
}
}
}
//
// Syncronize page
//
if(g_pCurrentWorkspace)
{
g_pCurrentWorkspace->SetViewActionChoice(editView_chosen);
g_pCurrentWorkspace->OnObjectEdit();
}
}
BOOL IsThereAnythingInAnyWorkspace(void)
{
WBPOSITION pos;
WBPOSITION posObj;
WorkspaceObj* pWorkspace;
T126Obj* pObj;
pos = g_pListOfWorkspaces->GetHeadPosition();
while(pos)
{
pWorkspace = (WorkspaceObj*)g_pListOfWorkspaces->GetNext(pos);
if(pWorkspace)
{
posObj = pWorkspace->GetHeadPosition();
while(posObj)
{
pObj = pWorkspace->GetNextObject(posObj);
if(pObj)
{
if(pObj->GraphicTool() != TOOLTYPE_REMOTEPOINTER)
{
return TRUE;
}
}
}
}
}
return FALSE;
}
//
// UI Edited the Workspace Object
//
void WorkspaceObj::OnObjectEdit(void)
{
g_bContentsChanged = TRUE;
//
// If we are not synced don't bug the other nodes
//
if(!g_pDraw->IsSynced())
{
return;
}
SIPDU *sipdu = NULL;
DBG_SAVE_FILE_LINE
sipdu = (SIPDU *) new BYTE[sizeof(SIPDU)];
if(!sipdu)
{
TRACE_MSG(("Failed to create sipdu"));
::PostMessage(g_pMain->m_hwnd, WM_USER_DISPLAY_ERROR, WBFE_RC_WINDOWS, 0);
return;
}
sipdu->choice = workspaceEditPDU_chosen;
CreateWorkspaceEditPDU(&sipdu->u.workspaceEditPDU);
T120Error rc = SendT126PDU(sipdu);
if(rc == T120_NO_ERROR)
{
SIPDUCleanUp(sipdu);
ResetAttrib();
}
}
//
// UI Deleted the Workspace Object
//
void WorkspaceObj::OnObjectDelete(void)
{
SIPDU *sipdu = NULL;
DBG_SAVE_FILE_LINE
sipdu = (SIPDU *) new BYTE[sizeof(SIPDU)];
if(sipdu)
{
sipdu->choice = workspaceDeletePDU_chosen;
CreateWorkspaceDeletePDU(&sipdu->u.workspaceDeletePDU);
T120Error rc = SendT126PDU(sipdu);
if(rc == T120_NO_ERROR)
{
SIPDUCleanUp(sipdu);
}
}
else
{
TRACE_MSG(("Failed to create sipdu"));
::PostMessage(g_pMain->m_hwnd, WM_USER_DISPLAY_ERROR, WBFE_RC_WINDOWS, 0);
}
}
void WorkspaceObj::GetEncodedCreatePDU(ASN1_BUF *pBuf)
{
SIPDU *sipdu = NULL;
sipdu = (SIPDU *) new BYTE[sizeof(SIPDU)];
if(sipdu)
{
sipdu->choice = workspaceCreatePDU_chosen;
CreateWorkspaceCreatePDU(&sipdu->u.workspaceCreatePDU);
ASN1_BUF encodedPDU;
g_pCoder->Encode(sipdu, pBuf);
delete sipdu->u.workspaceCreatePDU.planeParameters->value.usage;
delete sipdu->u.workspaceCreatePDU.planeParameters;
delete sipdu;
}
else
{
TRACE_MSG(("Failed to create sipdu"));
::PostMessage(g_pMain->m_hwnd, WM_USER_DISPLAY_ERROR, WBFE_RC_WINDOWS, 0);
}
}
void SendWorkspaceRefreshPDU(BOOL bImtheRefresher)
{
SIPDU *sipdu = NULL;
DBG_SAVE_FILE_LINE
sipdu = (SIPDU *) new BYTE[sizeof(SIPDU)];
if(sipdu)
{
sipdu->choice = workspaceRefreshStatusPDU_chosen;
sipdu->u.workspaceRefreshStatusPDU.bit_mask = 0;
sipdu->u.workspaceRefreshStatusPDU.refreshStatus = (ASN1bool_t)bImtheRefresher;
T120Error rc = SendT126PDU(sipdu);
if(rc == T120_NO_ERROR)
{
SIPDUCleanUp(sipdu);
}
}
else
{
TRACE_MSG(("Failed to create sipdu"));
::PostMessage(g_pMain->m_hwnd, WM_USER_DISPLAY_ERROR, WBFE_RC_WINDOWS, 0);
}
}
//
// UI Created a new Workspace Object
//
void WorkspaceObj::SendNewObjectToT126Apps(void)
{
SIPDU *sipdu = NULL;
DBG_SAVE_FILE_LINE
sipdu = (SIPDU *) new BYTE[sizeof(SIPDU)];
if(sipdu)
{
sipdu->choice = workspaceCreatePDU_chosen;
CreateWorkspaceCreatePDU(&sipdu->u.workspaceCreatePDU);
TRACE_DEBUG(("Sending Workspace >> Workspace handle = %d", sipdu->u.workspaceCreatePDU.workspaceIdentifier.u.activeWorkspace ));
T120Error rc = SendT126PDU(sipdu);
if(rc == T120_NO_ERROR)
{
SIPDUCleanUp(sipdu);
}
SetAllAttribs();
SetViewActionChoice(createNewView_chosen);
SetViewState(focus_chosen);
OnObjectEdit();
}
else
{
TRACE_MSG(("Failed to create sipdu"));
::PostMessage(g_pMain->m_hwnd, WM_USER_DISPLAY_ERROR, WBFE_RC_WINDOWS, 0);
}
}
void WorkspaceObj::GetWorkSpaceViewEditParam(PWorkspaceEditPDU_viewEdits pViewEdits)
{
m_viewHandle = pViewEdits->value.viewHandle;
TRACE_DEBUG(("GetWorkSpaceViewEditParam View Handle = %d", m_viewHandle));
TRACE_DEBUG(("GetWorkSpaceViewEditParam View Choice = %d", pViewEdits->value.action.choice));
switch(pViewEdits->value.action.choice)
{
case(createNewView_chosen):
{
GetWorkSpaceViewParam((PWorkspaceCreatePDU_viewParameters_Set_viewAttributes)pViewEdits->value.action.u.createNewView);
}
break;
case(editView_chosen):
{
GetWorkSpaceViewParam((PWorkspaceCreatePDU_viewParameters_Set_viewAttributes)pViewEdits->value.action.u.editView);
}
break;
case(deleteView_chosen):
{
;
}
break;
// case(nonStandardAction_chosen):
// {
// }
// break;
default:
WARNING_OUT(("Invalid workspace view attribute"));
break;
}
}
void WorkspaceObj::GetWorkSpaceViewParam(PWorkspaceCreatePDU_viewParameters_Set_viewAttributes pViewAttributes)
{
PWorkspaceCreatePDU_viewParameters_Set_viewAttributes attributes;
attributes = pViewAttributes;
while(attributes)
{
switch(attributes->value.choice)
{
case (viewRegion_chosen):
{
switch(attributes->value.u.viewRegion.choice)
{
case(fullWorkspace_chosen):
{
m_viewRegion.top = 0;
m_viewRegion.left = 0;
m_viewRegion.bottom = m_workspaceSize.x;
m_viewRegion.right = m_workspaceSize.y;
TRACE_DEBUG(("fullWorkspace_chosen View Region = (%d, %d)(%d, %d)",
m_viewRegion.top,
m_viewRegion.left,
m_viewRegion.bottom,
m_viewRegion.right));
}
case(partialWorkspace_chosen):
{
m_viewRegion.top = attributes->value.u.viewRegion.u.partialWorkspace.upperLeft.yCoordinate;
m_viewRegion.left = attributes->value.u.viewRegion.u.partialWorkspace.upperLeft.xCoordinate;
m_viewRegion.bottom = attributes->value.u.viewRegion.u.partialWorkspace.upperLeft.yCoordinate;
m_viewRegion.right = attributes->value.u.viewRegion.u.partialWorkspace.upperLeft.xCoordinate;
TRACE_DEBUG(("partialWorkspace_chosen View Region = (%d, %d)(%d, %d)",
m_viewRegion.top,
m_viewRegion.left,
m_viewRegion.bottom,
m_viewRegion.right));
}
break;
default:
ERROR_OUT(("Invalid view region choice"));
break;
}
}
break;
case (WorkspaceViewAttribute_viewState_chosen):
{
SetViewState(attributes->value.u.viewState.choice);
TRACE_DEBUG(("View state = %d", attributes->value.u.viewState.choice));
}
break;
case (updatesEnabled_chosen):
{
SetUpdatesEnabled(attributes->value.u.updatesEnabled);
if(!m_bUpdatesEnabled)
{
g_pNMWBOBJ->m_LockerID = GetOwnerID();
}
TRACE_DEBUG(("Updates enabled = %d", m_bUpdatesEnabled));
}
break;
// case (sourceDisplayIndicator_chosen):
// {
// JOSEF what we do with these??????
// attributes->value.u.sourceDisplayIndicator.displayAspectRatio;
// attributes->value.u.sourceDisplayIndicator.horizontalSizeRatio;
// attributes->value.u.sourceDisplayIndicator.horizontalPosition;
// attributes->value.u.sourceDisplayIndicator.verticalPosition;
//
// }
// break;
default:
WARNING_OUT(("Invalid workspace view attribute"));
break;
}
attributes = attributes->next;
}
}
//
// JOSEF The following is not used but is part of the standard
// It is removed because we don't need it now
// We may need to add it for interop in the future
//
#ifdef _DEBUG
void WorkspaceObj::SetBackGroundColor(COLORREF rgb)
{
m_backgroundColor.rgbtRed = GetRValue(rgb);
m_backgroundColor.rgbtGreen = GetGValue(rgb);
m_backgroundColor.rgbtBlue = GetBValue(rgb);
}
void WorkspaceObj::GetWorkSpaceAttrib(PWorkspaceCreatePDU_workspaceAttributes pWorkspaceAttributes)
{
PWorkspaceCreatePDU_workspaceAttributes attributes;
attributes = pWorkspaceAttributes;
COLORREF rgb;
while(attributes)
{
switch(attributes->value.choice)
{
case(backgroundColor_chosen):
{
switch(attributes->value.u.backgroundColor.choice)
{
// case(workspacePaletteIndex_chosen):
// {
// ASN1uint16_t workspacePaletteIndex = ((attributes->value.u.backgroundColor).u).workspacePaletteIndex;
// break;
// }
case(rgbTrueColor_chosen):
{
rgb = RGB(attributes->value.u.backgroundColor.u.rgbTrueColor.r,
attributes->value.u.backgroundColor.u.rgbTrueColor.g,
attributes->value.u.backgroundColor.u.rgbTrueColor.b);
SetBackGroundColor(rgb);
TRACE_DEBUG(("Attribute penColor (r,g,b)=(%d, %d,%d)",
attributes->value.u.backgroundColor.u.rgbTrueColor.r,
attributes->value.u.backgroundColor.u.rgbTrueColor.g,
attributes->value.u.backgroundColor.u.rgbTrueColor.b));
break;
}
case(transparent_chosen):
{
SetBackGroundColor(0);
TRACE_DEBUG(("Backgroundcolor transparent"));
break;
}
default:
ERROR_OUT(("Invalid backgroundColor choice"));
break;
}
break;
}
case(preserve_chosen):
{
m_bPreserve = attributes->value.u.preserve;
TRACE_DEBUG(("m_bPreserve %d", m_bPreserve));
}
break;
}
attributes = attributes->next;
}
}
void WorkspaceObj::GetWorkSpacePlaneParam(PWorkspaceCreatePDU_planeParameters pPlaneParameters)
{
TRACE_DEBUG(("GetWorkSpacePlaneParam NYI"));
;
}
#endif // 0
void TogleLockInAllWorkspaces(BOOL bLock, BOOL bResend)
{
WorkspaceObj * pWorkspace;
WBPOSITION pos = g_pListOfWorkspaces->GetHeadPosition();
while (pos)
{
pWorkspace = (WorkspaceObj *) g_pListOfWorkspaces->GetNext(pos);
pWorkspace->SetUpdatesEnabled(!bLock);
if(bResend)
{
pWorkspace->SetViewActionChoice(editView_chosen);
pWorkspace->OnObjectEdit();
}
}
}