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