// ---------------------------------------------------------------------------- // PropertySequence_cmd_RedoActions // ---------------------------------------------------------------------------- void PropertySequence_cmd_RedoActions (ebHTHREAD hThread, int iNumArgs, ebARGS lpArgs) { BASIC_OP_TRACE(PropertySequence_cmd_RedoActions); WPropertyActionSequence Seq ((IPropertyActionSequence *)ebGetObject (lpArgs, 1)); WDataObject InData; _DGeoObjects *pIObjs = iNumArgs > 1 ? (_DGeoObjects *)ebGetObject (lpArgs, 2) : NULL; HRESULT hr = NOERROR; if (NULL != pIObjs) { WEnumLONG EnumObjs; hr = GetEnumLongFromGeoObjects (pIObjs, EnumObjs.ppi()); if (SUCCEEDED(hr)) { hr = CoCreateInstance (CLSID_DataTransferObject, NULL, CLSCTX_INPROC_SERVER, IID_IDataObject, InData.ppv()); if (SUCCEEDED(hr)) hr = SetEnumLONGData (EnumObjs, InData); else InData.Assign (NULL); // freigeben } pIObjs = NULL; // wird nicht mehr benötigt } Seq -> RedoActions (__hWndM, NULL, InData, NULL); }
STDMETHODIMP COleObjectPropertyDual::SearchObjects(BSTR bstrToMatch, SEARCHMODE rgFlags, IEnumObjectsByNumber **ppvObj) { if (NULL == ppvObj) return E_POINTER; *ppvObj = NULL; _ASSERTE(m_fSearchAble); // muß suchen können COM_TRY { WDSearchAbleObjectProperty Search(m_ObjProp); WDGeoObjects Objs; THROW_FAILED_HRESULT(Search -> SearchObjects(bstrToMatch, GetSearchMode(rgFlags), Objs.ppi())); WQueryEnumLONG QueryEnum(Objs); WEnumLONG Enum; THROW_FAILED_HRESULT(QueryEnum -> QueryEnumLONG (Enum.ppi())); WEnumObjectsByNumber EnumObjs(Enum); *ppvObj = EnumObjs.detach(); } COM_CATCH; return S_OK; }
// -------------------------------------------------------------------------------------------- // Ermittlung des Startindex lStartInd aus einer (evtl.) gemeinsamen Strecke mit einem schon // rechtwinklig gemachten Objekt, das aus zur gleichen Objektklasse wie das lONr-Objekt gehört; // gibt es kein solches Objekt, dann ist der return-Wert "S_FALSE", lStartInd ist in // diesem Fall unbestimmt HRESULT CGeoEditExtension::CommonLineWithRectObject (long lONr, KoOrd* plXK, KoOrd* plYK, long lCnt0, long& lStartInd) { KoOrd x0, y0, x1, y1; // Anfangs- und Endkoordinaten des längsten Konturabschnitts try { // Objektnummern aller Objekte der Objektklasse des lONr-Objektes bereitstellen WEnumLONG wEnumIn (CLSID_EnumObjectsByNumber); // throws_com_error ENUMLONGKEY ELK; ELK.eKey = DEX_GetObjIdentEx (lONr); ELK.eFcn = (ENUMLONGKEYPROC) GetRectObjects; ELK.ePtr = wEnumIn; DEX_EnumIdentObjects (ELK); if (0 == wEnumIn->Count()) // kein Objekt gefunden, das schon rechtwinklig gemacht return S_FALSE; // wurde ulong ulIdent = 0; // Identifikator für die Ergebnisobjekte (wird hier nicht // weiter benötigt) DWORD dwLageAusw = LAUSS; // nur die wEnumIn-Flächen für Vergleich heranziehen, die // außerhalb der lONr-Fläche liegen SpForm sfSForm = SFORM_TEMP; // temporäre Abspeicherung WEnumLONG wComCont (CLSID_EnumObjectsByNumber); // Objektnummern der gemeinsamen // Konturabschnitte if (! m_wObjOper.IsValid()) // (wenn noch nicht, dann) IExtendObjOper-Interface für { // CommonContour_ONr() zuschalten WUnknown wObjOper; ObjOperInterface (wObjOper.ppi()); m_wObjOper = wObjOper; } if (m_wObjOper.IsValid()) m_wObjOper->CommonContour_ONr (lONr, ulIdent, wEnumIn, dwLageAusw, sfSForm, wComCont.ppi()); else _ASSERTE (false); if (0 == wComCont->Count()) // keines der schon rechtwinklig gemachten Objekte hat return S_FALSE; // einen gemeinsamen Konturabschnitt mit dem lONr-Objekt // wenn es mindestens 1 gemeinsamen Konturabschnitt gibt, dann die längste Strecke // bestimmen THROW_FAILED_HRESULT (GiveLongestLine (wComCont, x0, y0, x1, y1)); VisualCommonContour (wComCont); } catch (_com_error& e) { return _COM_ERROR (e); } return StartIndex (plXK, plYK, lCnt0, x0, y0, x1, y1, lStartInd); } // CommonLineWithRectObject
// -------------------------------------------------------------------------------------------- STDMETHODIMP CRegOperatPropAct::EndAction (DWORD, IDataObject** ppDataOut) { _ASSERTE (m_ObjsIter != m_InObjs.end()); *ppDataOut = 0; try { WEnumLONG wEnumInObj (*m_ObjsIter); // die zu bearbeitenden Objekte WEnumLONG wEnumOutObj; // Ergebnisobjekte der ausgewählten Operation // Optionen abfragen DWORD dwOptions = 0x00; if (SUCCEEDED(EnsureOptionsIF())) { _ASSERTE(m_wOperOptions.IsValid()); m_wOperOptions->GetOptions (&dwOptions); } // im Dialog ausgewählte Operation ausführen THROW_FAILED_HRESULT (m_pRegOperDlg->ExecuteOperation (m_hPr, wEnumInObj, dwOptions, wEnumOutObj.ppi())); m_ObjsIter++; if (wEnumOutObj.IsValid()) { // IDataObject abfragen WDataObject IDO (CLSID_DataTransferObject); // Ergebnisobjekte im DataObjekt IDO speichern THROW_FAILED_HRESULT (SetEnumLONGData ( (IEnum<LONG>*)(IEnumLONG*)wEnumOutObj, IDO)); // Resultat setzen *ppDataOut = IDO.detach(); if (0 == wEnumOutObj->Count()) { ResString resTitel (ResID (IDS_LONGCLASSNAME, pRF), 50); ResString resText (ResID (IDS_BOXTEXT1, pRF), 200); MessageBox (__hWndM, resText.Addr(), resTitel.Addr(), MB_ICONINFORMATION | MB_OK); } } } catch (_com_error& hr_result) // 23.09.99 { DELETE_OBJ (m_pRegOperDlg); // bei Fehler Dialog wieder freigeben return _COM_ERROR(hr_result); // 23.09.99 } if (m_ObjsIter != m_InObjs.end()) // es kommen noch weitere Daten return S_FALSE; DELETE_OBJ (m_pRegOperDlg); // es kommen keine Daten mehr return S_OK; } // EndAction
// ---------------------------------------------------------------------------- // PropertySequence_func_RedoActions // ---------------------------------------------------------------------------- void PropertySequence_func_RedoActions (ebHTHREAD hThread, int iNumArgs, ebARGS lpArgs) { BASIC_OP_TRACE(PropertySequence_func_RedoActions); ebSetObject (lpArgs, 0, (DWORD)NULL); WPropertyActionSequence Seq ((IPropertyActionSequence *)ebGetObject (lpArgs, 1)); WDataObject InData, OutData; _DGeoObjects *pIObjs = iNumArgs > 1 ? (_DGeoObjects *)ebGetObject (lpArgs, 2) : NULL; HRESULT hr = NOERROR; if (NULL != pIObjs) { WEnumLONG EnumObjs; hr = GetEnumLongFromGeoObjects (pIObjs, EnumObjs.ppi()); if (SUCCEEDED(hr)) { hr = CoCreateInstance (CLSID_DataTransferObject, NULL, CLSCTX_INPROC_SERVER, IID_IDataObject, InData.ppv()); if (SUCCEEDED(hr)) hr = SetEnumLONGData (EnumObjs, InData); else InData.Assign (NULL); // freigeben } pIObjs = NULL; // wird nicht mehr benötigt } hr = Seq -> RedoActions (__hWndM, NULL, InData, OutData.ppi()); if (SUCCEEDED(hr)) { WEnumLONG EnumObjs; if (NULL != (IUnknown *)OutData) hr = GetEnumLONGData (OutData, EnumObjs.ppi()); if (SUCCEEDED(hr)) // jetzt Collection der GeoObjects generieren hr = GetGeoObjectsFromEnumlong (EnumObjs, &pIObjs); } if (SUCCEEDED(hr)) ebSetObject (lpArgs, 0, (DWORD)pIObjs); }
// -------------------------------------------------------------------------------------------- STDMETHODIMP CRegOperatPropAct::DoAction (IDataObject* pDataObj, DWORD) { WEnumLONG wEnumObj; HRESULT hr = GetEnumLONGData (pDataObj, (IEnum<LONG>**)(IEnumLONG**)wEnumObj.ppi()); if (FAILED(hr)) return hr; // Enumerator (an PropertyPage übergebene Objekte) in Liste speichern m_InObjs.push_back (wEnumObj); // Enumerator am Ende der Liste anfügen if (1 == m_InObjs.size()) m_ObjsIter = m_InObjs.begin(); // Iterator zeigt auf das 1. Element der Liste return hr; } // DoAction
// -------------------------------------------------------------------------------------------- // Ermittlung des Startindex lStartInd aus einer (evtl.) gemeinsamen Strecke mit einem // pEnumIn-Objekt; gibt es kein solches Objekt, dann ist der return-Wert "S_FALSE", lStartInd // ist in diesem Fall unbestimmt HRESULT CGeoEditExtension::CommonLine (long lONr, KoOrd* plXK, KoOrd* plYK, long lCnt0, IEnumLONG* pEnumIn, long& lStartInd) { if (NULL == pEnumIn) return S_FALSE; KoOrd x0, y0, x1, y1; // Anfangs- und Endkoordinaten des längsten Konturabschnitts try { ulong ulIdent = 0; // Identifikator für die Ergebnisobjekte (wird hier nicht // weiter benötigt) DWORD dwLageAusw = LINAU; // nur die pEnumIn-Flächen für Vergleich heranziehen, die // sowohl innerhalb als auch außerhalb der lONr-Fläche // liegen SpForm sfSForm = SFORM_TEMP; // temporäre Abspeicherung WEnumLONG wComCont (CLSID_EnumObjectsByNumber); // Objektnummern der gemeinsamen // Konturabschnitte if (! m_wObjOper.IsValid()) // (wenn noch nicht, dann) IExtendObjOper-Interface für { // CommonContour_ONr() zuschalten WUnknown wObjOper; ObjOperInterface (wObjOper.ppi()); m_wObjOper = wObjOper; } if (m_wObjOper.IsValid()) m_wObjOper->CommonContour_ONr (lONr, ulIdent, pEnumIn, dwLageAusw, sfSForm, wComCont.ppi()); else _ASSERTE (false); if (0 == wComCont->Count()) // keines der pEnumIn-Objekt hat einen gemeinsamen return S_FALSE; // Konturabschnitt mit dem lONr-Objekt // wenn es mindestens 1 gemeinsamen Konturabschnitt gibt, dann die längste Strecke // bestimmen THROW_FAILED_HRESULT (GiveLongestLine (wComCont, x0, y0, x1, y1)); VisualCommonContour (wComCont); } catch (_com_error& e) { return _COM_ERROR (e); } return StartIndex (plXK, plYK, lCnt0, x0, y0, x1, y1, lStartInd); } // CommonLine
STDMETHODIMP CTextSearchEngine::DoAction (IDataObject *pIDataObj, DWORD) { if (NULL == m_pCfgDlg) return E_UNEXPECTED; WEnumLONG EnumObj; HRESULT hr = GetEnumLONGData (pIDataObj, EnumObj.ppi()); if (S_OK == hr) { // JG 980916 für ProgInd vorbereiten m_pCfgDlg -> SetAction(this); hr = m_pCfgDlg -> SetEnumLONG (EnumObj); } return hr; }
// -------------------------------------------------------------------------------------------- // Fügt extern bereitgestellte Objekte zu den ausgewählten Objekten hinzu STDMETHODIMP CGeoEditExtension::AddObjects (IDispatch* pIDisp) { try { WQueryEnumLONG QE (pIDisp); WEnumLONG Enum; THROW_FAILED_HRESULT(QE->QueryEnumLONG (Enum.ppi())); return m_wTopObjs->InitWithExternalObjects (WEnumObjectsByNumber(Enum)); } catch (_com_error& e) { return _COM_ERROR (e); } } // AddObjects
// -------------------------------------------------------------------------------------------- STDMETHODIMP CAreaBuildPropAct::EndAction (DWORD, IDataObject** ppDataOut) { _ASSERTE (m_ObjsIter != m_InObjs.end()); *ppDataOut = 0; COM_TRY { WEnumLONG wEnumInObj (*m_ObjsIter); // die zu bearbeitenden Objekte WEnumLONG wEnumOutObj; // Ergebnisobjekte der ausgewählten Operation // Optionen abfragen DWORD dwOptions = 0x00; if (m_wOperOptions.IsValid()) m_wOperOptions->GetOptions (&dwOptions); // im Dialog ausgewählte Operation ausführen THROW_FAILED_HRESULT (m_pAreaBuildDlg->ExecuteOperation (m_hPr, wEnumInObj, dwOptions, wEnumOutObj.ppi())); m_ObjsIter++; if (wEnumOutObj.IsValid()) { // IDataObject abfragen WDataObject IDO (CLSID_DataTransferObject); // Ergebnisobjekte im DataObjekt IDO speichern THROW_FAILED_HRESULT (SetEnumLONGData ((IEnum<LONG>*)(IEnumLONG*)wEnumOutObj, IDO)); // Resultat setzen *ppDataOut = IDO.detach(); if (0 == wEnumOutObj->Count()) { ResString resTitel (ResID (IDS_LONGCLASSNAME, pRF), 50); ResString resText (ResID (IDS_BOXTEXT7, pRF), 200); MessageBox (__hWndM, resText.Addr(), resTitel.Addr(), MB_ICONINFORMATION | MB_OK); } } } COM_CATCH_OP( delete m_pAreaBuildDlg; // bei Fehler Dialog wieder freigeben );
STDMETHODIMP CTextSearchEngine::EndAction (DWORD, IDataObject **ppDataObj) { if (NULL == m_pCfgDlg) return E_UNEXPECTED; if (NULL == ppDataObj) return E_POINTER; *ppDataObj = NULL; COM_TRY { // DataObject generieren und mit EnumObj füllen WEnumLONG EnumObj; THROW_FAILED_HRESULT(m_pCfgDlg -> GetEnumLONG (EnumObj.ppi())); WDataObject IDO (CLSID_DataTransferObject); THROW_FAILED_HRESULT(SetEnumLONGData (EnumObj, IDO)); *ppDataObj = IDO.detach(); } COM_CATCH_OP((delete m_pCfgDlg, m_pCfgDlg = NULL)); // rechercvhe liefert immer nur eine Objektmenge DELETE_OBJ(m_pCfgDlg); // Dialog wird nicht mehr gebraucht return S_OK; }