Altova XMLSpy 2025 Professional Edition

The code below shows a simple implementation of an XMLSpy IDE plug-in. It adds a menu item and a separator (available with XMLSpy) to the Tools menu. Inside the OnUpdateCommand() method, the new command is only enabled when the active document is displayed using the Grid View. The command searches for the XML element which has the current focus, and opens any URL starting with "http://", from the textual value of the element.

 

 

/////////////////////////////////////////////////////////////////////////////

// CXMLSpyIDEPlugIn

 

#import "XMLSpy.tlb"

using namespace XMLSpyLib;

 

HRESULT CXMLSpyIDEPlugIn::OnCommand(long nID, IDispatch* pXMLSpy)

{

  USES_CONVERSION;

 

  if(nID == 1)        {

     IApplicationPtr        ipSpyApp;

 

     if(pXMLSpy)        {

        if(SUCCEEDED(pXMLSpy->QueryInterface(__uuidof(IApplication),(void **)&ipSpyApp))) {

           IDocumentPtr  ipDocPtr = ipSpyApp->ActiveDocument;

 

          // we assume that grid view is active

           if(ipDocPtr) {

              IGridViewPtr          ipGridPtr = ipDocPtr->GridView;

 

              if(ipGridPtr)        {

                 IXMLDataPtr        ipXMLData = ipGridPtr->CurrentFocus;

 

                 CString        strValue = W2T(ipXMLData->TextValue);

 

                 if(!strValue.IsEmpty() && (strValue.Left(7) == _T("http://")))

                    ::ShellExecute(NULL,_T("open"),W2T(ipXMLData->TextValue),NULL,NULL,SW_SHOWNORMAL);

              }

           }

        }

     }

  }

 

  return S_OK;

}

 

 

HRESULT CXMLSpyIDEPlugIn::OnUpdateCommand(long nID, IDispatch* pXMLSpy, SPYUpdateAction* pAction)

{

  *pAction = spyDisable;

 

  if(nID == 1)        {

     IApplicationPtr        ipSpyApp;

 

     if(pXMLSpy)        {

        if(SUCCEEDED(pXMLSpy->QueryInterface(__uuidof(IApplication),(void **)&ipSpyApp)))        {

           IDocumentPtr        ipDocPtr = ipSpyApp->ActiveDocument;

 

          // only enable if grid view is active

           if((ipDocPtr != NULL) && (ipDocPtr->CurrentViewMode == spyViewGrid))

              *pAction = spyEnable;

        }

     }

  }

 

  return S_OK;

}

 

 

HRESULT CXMLSpyIDEPlugIn::OnEvent(long nEventID, SAFEARRAY **arrayParameters, IDispatch* pXMLSpy, VARIANT* pReturnValue)

{

  return S_OK;

}

 

HRESULT CXMLSpyIDEPlugIn::GetUIModifications(BSTR* pModificationsXML)

{

  CComBSTR        bstrMods = _T(" \

           <ConfigurationData>        \

              <Modifications>        ");

  // add "Open URL..." to Tools menu

  bstrMods.Append (_T(" \

                 <Modification> \

                    <Action>Add</Action> \

                    <UIElement type=\"MenuItem\"> \

                       <ID>1</ID> \

                       <Name>Open URL...</Name> \

                       <Place>0</Place> \

                       <MenuID>129</MenuID> \

                       <Parent>:Tools</Parent> \

                    </UIElement> \

                 </Modification>        "));

  // add Seperator to Tools menu

  bstrMods.Append (_T(" \

                 <Modification> \

                    <Action>Add</Action> \

                    <UIElement type=\"MenuItem\"> \

                       <ID>0</ID> \

                       <Place>1</Place> \

                       <MenuID>129</MenuID> \

                       <Parent>:Tools</Parent> \

                    </UIElement> \

                 </Modification>        "));

  // finish modification description

  bstrMods.Append (_T(" \

              </Modifications> \

           </ConfigurationData>"));

 

  return bstrMods.CopyTo(pModificationsXML);

}

 

 

HRESULT CXMLSpyIDEPlugIn::GetDescription(BSTR* pDescription)

{

  CComBSTR        bstrDescr = _T("ATL C++ XMLSpy IDE PlugIn;This PlugIn demonstrates the implementation of a simple ATL DLL as a IDE PlugIn for XMLSpy.");

  return bstrDescr.CopyTo(pDescription);

}

© 2018-2024 Altova GmbH