STDMETHODIMP CVWScale3DTool::OnUIEvent(IThing* pthing, BSTR bstrEventName, VARIANT varArg, BOOL bFromClient)
{
	if (CompareElements(&bstrAddSelection.m_str, &bstrEventName))
	{
		SetupTranformList();
	}
	else if (CompareElements(&bstrRemoveSelection.m_str, &bstrEventName))
	{
		SetupTranformList();
	}
	else if (CompareElements(&bstrAddCurrentTool.m_str, &bstrEventName))
	{
		SetupTranformList();
	}
	else if (CompareElements(&bstrClearSelection.m_str, &bstrEventName))
	{
		DestroyTransformList();
	}
	else if (CompareElements(&bstrScaleChanged.m_str, &bstrEventName))
	{
		SetupTranformList();
	}

	return S_OK;
};
//
// World Events
//
HRESULT CThingTreeCtrl::HandleOnUIEvent(IThing* pthing, BSTR bstrEventName, VARIANT varArg, BOOL bFromClient)
{
	static CComBSTR bstrNameChanged(VW_NAMECHANGED_EVENT_STR);
	static CComBSTR bstrOnEnter(VW_CONTENTENTER_EVENT_STR);
	static CComBSTR bstrOnLeave(VW_CONTENTLEAVE_EVENT_STR);

	CVWUIView::HandleOnUIEvent(pthing, bstrEventName, varArg, bFromClient);

	if (CompareElements(&bstrOnEnter, &bstrEventName))
		return OnEnter(pthing, varArg);
	else if (CompareElements(&bstrOnLeave, &bstrEventName))
		return OnLeave(pthing, varArg);
	else if (CompareElements(&bstrNameChanged, &bstrEventName))
		return NameChanged(pthing);

	return S_OK;
}
Exemplo n.º 3
0
SInt32
DMComparator::Compare(
	const void*		inItemOne,
	const void* 	inItemTwo,
	UInt32			/* inSizeOne */,
	UInt32			/* inSizeTwo */) const
{
	LSharable* item1Sh = *((LSharable**) inItemOne);
	LSharable* item2Sh = *((LSharable**) inItemTwo);

	ValidateObject_(item1Sh);
	ValidateObject_(item2Sh);

	DMElement* item1DM = (dynamic_cast<DMElement*>(item1Sh));
	DMElement* item2DM = (dynamic_cast<DMElement*>(item2Sh));

	ValidateObject_(item1DM);
	ValidateObject_(item2DM);

	return CompareElements(item1DM, item2DM);
}
//This function builds a list of scalable objects from the selection list.
//pfValid is FALSE if there's nothing to scale.
STDMETHODIMP CVWScale3DTool::IsValid(IVWUIView *pVw,VARIANT_BOOL * pfValid)
{

	HRESULT hr = S_OK;
	CVWTransformPtr TransPtr;
	BSTR bstrReturnValue = NULL;
	VARIANT_BOOL	fLastItem = VARIANT_TRUE;
	COleVariant varProperty;
	IVWFrame *pVWFrame = NULL;
	IVWFrame *pVWParentFrame = NULL;
	CVWThingPtr ThingPtr;
	IVector			*pvPos = NULL;
	float			fPosx, fPosy, fPosz;
	CTranslate3DObject* pTmpTransObj;
	VARIANT_BOOL vbMoveable;

	ASSERT( pfValid );
	if (!pfValid ) return E_POINTER;

	*pfValid = VARIANT_FALSE;
	
	DestroyTransformList();

	if(	m_pSelectionList )
	{
		hr = m_pSelectionList->get_IsEmpty( &fLastItem  );
		if( FAILED(hr) )  goto EXIT_FAIL;

		if( VARIANT_FALSE == fLastItem ) 
		{
			hr = m_pSelectionList->FirstItem( &bstrReturnValue, &varProperty, &fLastItem );
			if( FAILED(hr) ) goto EXIT_FAIL;

			while( VARIANT_FALSE == fLastItem ) 
			{
				SAFEFREESTRING(bstrReturnValue);
				ThingPtr = varProperty;

				if (ThingPtr != NULL)
				{
					COleVariant			var; // get the geometry property
					CComBSTR			bstrType;

					SAFERELEASE(m_pWorld);
					hr = ThingPtr->get_World(&m_pWorld);
					if(FAILED(hr) || !m_pWorld) 	goto EXIT_FAIL;

					//Create our event vector if we don't have one already.
					if (!m_pVector)
					{
						hr = m_pWorld->CreateObjectPropertyExt(CLSID_Vector, NULL, (IObjectProperty**) &m_pVector);
						if (FAILED(hr)) goto EXIT_FAIL;
					}

					hr = ThingPtr->get_ObjectProperty(bstrScale, (IObjectProperty**)&pvPos);
					if (FAILED(hr)) goto EXIT_FAIL;

					hr = pvPos->get(&fPosx, &fPosy, &fPosz);
					if (FAILED(hr)) goto EXIT_FAIL;
					SAFERELEASE(pvPos);

					if (FAILED(hr = ThingPtr->CheckPropertySecurityExt(bstrScale, PS_WRITE)))
					{
						goto SECURITY_ERROR;
					}

					vbMoveable = VARIANT_TRUE;
					if (SUCCEEDED(hr = ThingPtr->get_BOOL(CComBSTR("IsMoveable"), &vbMoveable)) && !vbMoveable)
					{
						goto SECURITY_ERROR;
					}

					if (FAILED(hr = ThingPtr->get_Type(&bstrType.m_str)) || CompareElements(&bstrAvatar.m_str, &bstrType.m_str))
					{
						goto SECURITY_ERROR;
					}

					hr = ThingPtr->InvokeMethodExt(CComBSTR("GetFrame"), NULL, &var);
					if (FAILED(hr)) goto EXIT_FAIL;

					TransPtr = var;
					if( TransPtr != NULL )
					// At least one selected item has an IVWTransform
					{
						hr = TransPtr->QueryInterface(IID_IVWFrame, (void **) &pVWFrame);
						if (SUCCEEDED(hr) && pVWFrame != NULL)
						{
							hr = pVWFrame->GetParent(&pVWParentFrame);
							if (SUCCEEDED(hr) && pVWParentFrame != NULL)
							{
								*pfValid = VARIANT_TRUE;
								POSITION pos = m_TransformList.AddTail( pTmpTransObj = new CTranslate3DObject( ThingPtr, TransPtr, pVWFrame ) );

								pTmpTransObj->currentLocation.x = fPosx;
								pTmpTransObj->currentLocation.y = fPosy;
								pTmpTransObj->currentLocation.z = fPosz;
							}
		    				if( FAILED(hr) ) goto EXIT_FAIL;
							SAFERELEASE(pVWParentFrame);
						}
	    				if( FAILED(hr) ) goto EXIT_FAIL;
						SAFERELEASE(pVWFrame);
					}
SECURITY_ERROR:
					SAFERELEASE(pvPos);
					var.Clear();
				}
				varProperty.Clear();
				hr = m_pSelectionList->NextItem( &bstrReturnValue, &varProperty, &fLastItem );
    			if( FAILED(hr) ) goto EXIT_FAIL;
			}
		}  
	}
	goto EXIT_SUCCEED;
EXIT_FAIL:
	if (!m_TransformList.IsEmpty())
		DeletePtrListElements(&m_TransformList);

	*pfValid = FALSE;

EXIT_SUCCEED:
	SAFERELEASE(pvPos);
	SAFEFREESTRING(bstrReturnValue);
	SAFERELEASE(pVWFrame);
	SAFERELEASE(pVWParentFrame);

	return hr;

}