summaryrefslogtreecommitdiff
path: root/cui/source/dialogs/scriptdlg.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'cui/source/dialogs/scriptdlg.cxx')
-rw-r--r--cui/source/dialogs/scriptdlg.cxx1694
1 files changed, 1694 insertions, 0 deletions
diff --git a/cui/source/dialogs/scriptdlg.cxx b/cui/source/dialogs/scriptdlg.cxx
new file mode 100644
index 000000000000..d68792732d7e
--- /dev/null
+++ b/cui/source/dialogs/scriptdlg.cxx
@@ -0,0 +1,1694 @@
+/**********************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: scriptdlg.cxx,v $
+ * $Revision: 1.26 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_cui.hxx"
+
+#include <memory>
+
+#include <sfx2/objsh.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/msgbox.hxx>
+#include <vos/mutex.hxx>
+
+#include <cuires.hrc>
+#include "scriptdlg.hrc"
+#include "scriptdlg.hxx"
+#include <dialmgr.hxx>
+#include "selector.hxx"
+
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/frame/XDesktop.hpp>
+#include <com/sun/star/script/XInvocation.hpp>
+#include <com/sun/star/script/provider/XScriptProviderSupplier.hpp>
+#include <com/sun/star/script/provider/XScriptProvider.hpp>
+#include <com/sun/star/script/browse/BrowseNodeTypes.hpp>
+#include <com/sun/star/script/browse/XBrowseNodeFactory.hpp>
+#include <com/sun/star/script/browse/BrowseNodeFactoryViewTypes.hpp>
+#include <com/sun/star/script/provider/ScriptErrorRaisedException.hpp>
+#include <com/sun/star/script/provider/ScriptExceptionRaisedException.hpp>
+#include <com/sun/star/script/provider/ScriptFrameworkErrorType.hpp>
+#include <com/sun/star/frame/XModuleManager.hpp>
+#include <com/sun/star/script/XInvocation.hpp>
+#include <com/sun/star/document/XEmbeddedScripts.hpp>
+
+#include <cppuhelper/implbase1.hxx>
+#include <comphelper/documentinfo.hxx>
+#include <comphelper/uno3.hxx>
+#include <comphelper/processfactory.hxx>
+#include <comphelper/broadcasthelper.hxx>
+#include <comphelper/propertycontainer.hxx>
+#include <comphelper/proparrhlp.hxx>
+
+#include <basic/sbx.hxx>
+#include <svtools/imagemgr.hxx>
+#include <tools/urlobj.hxx>
+#include <vector>
+#include <algorithm>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::script;
+using namespace ::com::sun::star::frame;
+using namespace ::com::sun::star::document;
+
+void ShowErrorDialog( const Any& aException )
+{
+ SvxScriptErrorDialog* pDlg = new SvxScriptErrorDialog( NULL, aException );
+ pDlg->Execute();
+ delete pDlg;
+}
+
+SFTreeListBox::SFTreeListBox( Window* pParent, const ResId& rResId ) :
+ SvTreeListBox( pParent, ResId( rResId.GetId(),*rResId.GetResMgr() ) ),
+ m_hdImage(ResId(IMG_HARDDISK,*rResId.GetResMgr())),
+ m_hdImage_hc(ResId(IMG_HARDDISK_HC,*rResId.GetResMgr())),
+ m_libImage(ResId(IMG_LIB,*rResId.GetResMgr())),
+ m_libImage_hc(ResId(IMG_LIB_HC,*rResId.GetResMgr())),
+ m_macImage(ResId(IMG_MACRO,*rResId.GetResMgr())),
+ m_macImage_hc(ResId(IMG_MACRO_HC,*rResId.GetResMgr())),
+ m_docImage(ResId(IMG_DOCUMENT,*rResId.GetResMgr())),
+ m_docImage_hc(ResId(IMG_DOCUMENT_HC,*rResId.GetResMgr())),
+ m_sMyMacros(String(ResId(STR_MYMACROS,*rResId.GetResMgr()))),
+ m_sProdMacros(String(ResId(STR_PRODMACROS,*rResId.GetResMgr())))
+{
+ FreeResource();
+ SetSelectionMode( SINGLE_SELECTION );
+
+ SetWindowBits( GetStyle() | WB_CLIPCHILDREN | WB_HSCROLL |
+ WB_HASBUTTONS | WB_HASBUTTONSATROOT | WB_HIDESELECTION |
+ WB_HASLINES | WB_HASLINESATROOT );
+ SetNodeDefaultImages();
+
+ nMode = 0xFF; // Alles
+}
+
+SFTreeListBox::~SFTreeListBox()
+{
+ deleteAllTree();
+}
+
+void SFTreeListBox::delUserData( SvLBoxEntry* pEntry )
+{
+ if ( pEntry )
+ {
+
+ String text = GetEntryText( pEntry );
+ SFEntry* pUserData = (SFEntry*)pEntry->GetUserData();
+ if ( pUserData )
+ {
+ delete pUserData;
+ // TBD seem to get a Select event on node that is remove ( below )
+ // so need to be able to detect that this node is not to be
+ // processed in order to do this, setting userData to NULL ( must
+ // be a better way to do this )
+ pUserData = 0;
+ pEntry->SetUserData( pUserData );
+ }
+ }
+}
+
+void SFTreeListBox::deleteTree( SvLBoxEntry* pEntry )
+{
+
+ delUserData( pEntry );
+ pEntry = FirstChild( pEntry );
+ while ( pEntry )
+ {
+ SvLBoxEntry* pNextEntry = NextSibling( pEntry );
+ deleteTree( pEntry );
+ GetModel()->Remove( pEntry );
+ pEntry = pNextEntry;
+ }
+}
+
+void SFTreeListBox::deleteAllTree()
+{
+ SvLBoxEntry* pEntry = GetEntry( 0 );
+
+ // TBD - below is a candidate for a destroyAllTrees method
+ if ( pEntry )
+ {
+ while ( pEntry )
+ {
+ String text = GetEntryText( pEntry );
+ SvLBoxEntry* pNextEntry = NextSibling( pEntry ) ;
+ deleteTree( pEntry );
+ GetModel()->Remove( pEntry );
+ pEntry = pNextEntry;
+ }
+ }
+}
+
+void SFTreeListBox::Init( const ::rtl::OUString& language )
+{
+ SetUpdateMode( FALSE );
+
+ deleteAllTree();
+
+ Reference< browse::XBrowseNode > rootNode;
+ Reference< XComponentContext > xCtx;
+
+ Sequence< Reference< browse::XBrowseNode > > children;
+
+ ::rtl::OUString userStr = ::rtl::OUString::createFromAscii("user");
+ ::rtl::OUString shareStr = ::rtl::OUString::createFromAscii("share");
+
+ ::rtl::OUString singleton = ::rtl::OUString::createFromAscii(
+ "/singletons/com.sun.star.script.browse.theBrowseNodeFactory" );
+
+ try
+ {
+ Reference < beans::XPropertySet > xProps(
+ ::comphelper::getProcessServiceFactory(), UNO_QUERY_THROW );
+
+ xCtx.set( xProps->getPropertyValue( rtl::OUString(
+ RTL_CONSTASCII_USTRINGPARAM("DefaultContext" ))), UNO_QUERY_THROW );
+
+ Reference< browse::XBrowseNodeFactory > xFac(
+ xCtx->getValueByName( singleton ), UNO_QUERY_THROW );
+
+ rootNode.set( xFac->createView(
+ browse::BrowseNodeFactoryViewTypes::MACROORGANIZER ) );
+
+ if ( rootNode.is() && rootNode->hasChildNodes() == sal_True )
+ {
+ children = rootNode->getChildNodes();
+ }
+ }
+ catch( Exception& e )
+ {
+ OSL_TRACE("Exception getting root browse node from factory: %s",
+ ::rtl::OUStringToOString(
+ e.Message , RTL_TEXTENCODING_ASCII_US ).pData->buffer );
+ // TODO exception handling
+ }
+
+ Reference<XModel> xDocumentModel;
+ for ( sal_Int32 n = 0; n < children.getLength(); n++ )
+ {
+ bool app = false;
+ ::rtl::OUString uiName = children[ n ]->getName();
+ ::rtl::OUString factoryURL;
+ if ( uiName.equals( userStr ) || uiName.equals( shareStr ) )
+ {
+ app = true;
+ if ( uiName.equals( userStr ) )
+ {
+ uiName = m_sMyMacros;
+ }
+ else
+ {
+ uiName = m_sProdMacros;
+ }
+ }
+ else
+ {
+ xDocumentModel.set(getDocumentModel(xCtx, uiName ), UNO_QUERY);
+
+ if ( xDocumentModel.is() )
+ {
+ Reference< ::com::sun::star::frame::XModuleManager >
+ xModuleManager( xCtx->getServiceManager()->createInstanceWithContext(
+ ::rtl::OUString::createFromAscii("com.sun.star.frame.ModuleManager"), xCtx ),
+ UNO_QUERY_THROW );
+
+ Reference<container::XNameAccess> xModuleConfig(
+ xModuleManager, UNO_QUERY_THROW );
+ // get the long name of the document:
+ Sequence<beans::PropertyValue> moduleDescr;
+ try{
+ ::rtl::OUString appModule = xModuleManager->identify( xDocumentModel );
+ xModuleConfig->getByName(appModule) >>= moduleDescr;
+ } catch(const uno::Exception&)
+ {}
+
+ beans::PropertyValue const * pmoduleDescr =
+ moduleDescr.getConstArray();
+ for ( sal_Int32 pos = moduleDescr.getLength(); pos--; )
+ {
+ if (pmoduleDescr[ pos ].Name.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM(
+ "ooSetupFactoryEmptyDocumentURL") ))
+ {
+ pmoduleDescr[ pos ].Value >>= factoryURL;
+ break;
+ }
+ }
+ }
+ }
+
+ ::rtl::OUString lang( language );
+ Reference< browse::XBrowseNode > langEntries =
+ getLangNodeFromRootNode( children[ n ], lang );
+
+ /*SvLBoxEntry* pBasicManagerRootEntry =*/
+ insertEntry( uiName, app ? IMG_HARDDISK : IMG_DOCUMENT,
+ 0, true, std::auto_ptr< SFEntry >(new SFEntry( OBJTYPE_SFROOT, langEntries, xDocumentModel )), factoryURL );
+ }
+
+ SetUpdateMode( TRUE );
+}
+
+Reference< XInterface >
+SFTreeListBox::getDocumentModel( Reference< XComponentContext >& xCtx, ::rtl::OUString& docName )
+{
+ Reference< XInterface > xModel;
+ Reference< lang::XMultiComponentFactory > mcf =
+ xCtx->getServiceManager();
+ Reference< frame::XDesktop > desktop (
+ mcf->createInstanceWithContext(
+ ::rtl::OUString::createFromAscii("com.sun.star.frame.Desktop"), xCtx ),
+ UNO_QUERY );
+
+ Reference< container::XEnumerationAccess > componentsAccess =
+ desktop->getComponents();
+ Reference< container::XEnumeration > components =
+ componentsAccess->createEnumeration();
+ while (components->hasMoreElements())
+ {
+ Reference< frame::XModel > model(
+ components->nextElement(), UNO_QUERY );
+ if ( model.is() )
+ {
+ ::rtl::OUString sTdocUrl = ::comphelper::DocumentInfo::getDocumentTitle( model );
+ if( sTdocUrl.equals( docName ) )
+ {
+ xModel = model;
+ break;
+ }
+ }
+ }
+ return xModel;
+}
+
+Reference< browse::XBrowseNode >
+SFTreeListBox::getLangNodeFromRootNode( Reference< browse::XBrowseNode >& rootNode, ::rtl::OUString& language )
+{
+ Reference< browse::XBrowseNode > langNode;
+
+ try
+ {
+ Sequence < Reference< browse::XBrowseNode > > children = rootNode->getChildNodes();
+ for ( sal_Int32 n = 0; n < children.getLength(); n++ )
+ {
+ if ( children[ n ]->getName().equals( language ) )
+ {
+ langNode = children[ n ];
+ break;
+ }
+ }
+ }
+ catch ( Exception& )
+ {
+ // if getChildNodes() throws an exception we just return
+ // the empty Reference
+ }
+ return langNode;
+}
+
+void SFTreeListBox:: RequestSubEntries( SvLBoxEntry* pRootEntry, Reference< ::com::sun::star::script::browse::XBrowseNode >& node,
+ Reference< XModel >& model )
+{
+ if (! node.is() )
+ {
+ return;
+ }
+
+ Sequence< Reference< browse::XBrowseNode > > children;
+ try
+ {
+ children = node->getChildNodes();
+ }
+ catch ( Exception& )
+ {
+ // if we catch an exception in getChildNodes then no entries are added
+ }
+
+ for ( sal_Int32 n = 0; n < children.getLength(); n++ )
+ {
+ ::rtl::OUString name( children[ n ]->getName() );
+ if ( children[ n ]->getType() != browse::BrowseNodeTypes::SCRIPT)
+ {
+ insertEntry( name, IMG_LIB, pRootEntry, true, std::auto_ptr< SFEntry >(new SFEntry( OBJTYPE_SCRIPTCONTAINER, children[ n ],model )));
+ }
+ else
+ {
+ if ( children[ n ]->getType() == browse::BrowseNodeTypes::SCRIPT )
+ {
+ insertEntry( name, IMG_MACRO, pRootEntry, false, std::auto_ptr< SFEntry >(new SFEntry( OBJTYPE_METHOD, children[ n ],model )));
+
+ }
+ }
+ }
+}
+
+void SFTreeListBox::UpdateEntries()
+{
+}
+
+SvLBoxEntry* SFTreeListBox::FindEntry( SvLBoxEntry* , const String& , BYTE )
+{
+ return 0;
+}
+
+long SFTreeListBox::ExpandingHdl()
+{
+ return TRUE;
+}
+
+void SFTreeListBox::ExpandAllTrees()
+{
+}
+
+SvLBoxEntry * SFTreeListBox::insertEntry(
+ String const & rText, USHORT nBitmap, SvLBoxEntry * pParent,
+ bool bChildrenOnDemand, std::auto_ptr< SFEntry > aUserData, ::rtl::OUString factoryURL )
+{
+ SvLBoxEntry * p;
+ if( nBitmap == IMG_DOCUMENT && factoryURL.getLength() > 0 )
+ {
+ Image aImage = SvFileInformationManager::GetFileImage(
+ INetURLObject(factoryURL), false,
+ BMP_COLOR_NORMAL );
+ Image aHCImage = SvFileInformationManager::GetFileImage(
+ INetURLObject(factoryURL), false,
+ BMP_COLOR_HIGHCONTRAST );
+ p = InsertEntry(
+ rText, aImage, aImage, pParent, bChildrenOnDemand, LIST_APPEND,
+ aUserData.release()); // XXX possible leak
+ SetExpandedEntryBmp(p, aHCImage, BMP_COLOR_HIGHCONTRAST);
+ SetCollapsedEntryBmp(p, aHCImage, BMP_COLOR_HIGHCONTRAST);
+ }
+ else
+ {
+ p = insertEntry( rText, nBitmap, pParent, bChildrenOnDemand, aUserData );
+ }
+ return p;
+}
+
+SvLBoxEntry * SFTreeListBox::insertEntry(
+ String const & rText, USHORT nBitmap, SvLBoxEntry * pParent,
+ bool bChildrenOnDemand, std::auto_ptr< SFEntry > aUserData )
+{
+ Image aHCImage, aImage;
+ if( nBitmap == IMG_HARDDISK )
+ {
+ aImage = m_hdImage;
+ aHCImage = m_hdImage_hc;
+ }
+ else if( nBitmap == IMG_LIB )
+ {
+ aImage = m_libImage;
+ aHCImage = m_libImage_hc;
+ }
+ else if( nBitmap == IMG_MACRO )
+ {
+ aImage = m_macImage;
+ aHCImage = m_macImage_hc;
+ }
+ else if( nBitmap == IMG_DOCUMENT )
+ {
+ aImage = m_docImage;
+ aHCImage = m_docImage_hc;
+ }
+ SvLBoxEntry * p = InsertEntry(
+ rText, aImage, aImage, pParent, bChildrenOnDemand, LIST_APPEND,
+ aUserData.release()); // XXX possible leak
+ SetExpandedEntryBmp(p, aHCImage, BMP_COLOR_HIGHCONTRAST);
+ SetCollapsedEntryBmp(p, aHCImage, BMP_COLOR_HIGHCONTRAST);
+ return p;
+}
+
+void __EXPORT SFTreeListBox::RequestingChilds( SvLBoxEntry* pEntry )
+{
+ SFEntry* userData = 0;
+ if ( !pEntry )
+ {
+ return;
+ }
+ userData = (SFEntry*)pEntry->GetUserData();
+
+ Reference< browse::XBrowseNode > node;
+ Reference< XModel > model;
+ if ( userData && !userData->isLoaded() )
+ {
+ node = userData->GetNode();
+ model = userData->GetModel();
+ RequestSubEntries( pEntry, node, model );
+ userData->setLoaded();
+ }
+}
+
+void __EXPORT SFTreeListBox::ExpandedHdl()
+{
+/* SvLBoxEntry* pEntry = GetHdlEntry();
+ DBG_ASSERT( pEntry, "Was wurde zugeklappt?" );
+
+ if ( !IsExpanded( pEntry ) && pEntry->HasChildsOnDemand() )
+ {
+ SvLBoxEntry* pChild = FirstChild( pEntry );
+ while ( pChild )
+ {
+ GetModel()->Remove( pChild ); // Ruft auch den DTOR
+ pChild = FirstChild( pEntry );
+ }
+ }*/
+}
+
+// ----------------------------------------------------------------------------
+// InputDialog ------------------------------------------------------------
+// ----------------------------------------------------------------------------
+InputDialog::InputDialog(Window * pParent, USHORT nMode )
+ : ModalDialog( pParent, CUI_RES( RID_DLG_NEWLIB ) ),
+ aText( this, CUI_RES( FT_NEWLIB ) ),
+ aEdit( this, CUI_RES( ED_LIBNAME ) ),
+ aOKButton( this, CUI_RES( PB_OK ) ),
+ aCancelButton( this, CUI_RES( PB_CANCEL ) )
+{
+ aEdit.GrabFocus();
+ if ( nMode == INPUTMODE_NEWLIB )
+ {
+ SetText( String( CUI_RES( STR_NEWLIB ) ) );
+ }
+ else if ( nMode == INPUTMODE_NEWMACRO )
+ {
+ SetText( String( CUI_RES( STR_NEWMACRO ) ) );
+ aText.SetText( String( CUI_RES( STR_FT_NEWMACRO ) ) );
+ }
+ else if ( nMode == INPUTMODE_RENAME )
+ {
+ SetText( String( CUI_RES( STR_RENAME ) ) );
+ aText.SetText( String( CUI_RES( STR_FT_RENAME ) ) );
+ }
+ FreeResource();
+
+ // some resizing so that the text fits
+ Point point, newPoint;
+ Size siz, newSiz;
+ long gap;
+
+ USHORT style = TEXT_DRAW_MULTILINE | TEXT_DRAW_TOP |
+ TEXT_DRAW_LEFT | TEXT_DRAW_WORDBREAK;
+
+ // get dimensions of dialog instructions control
+ point = aText.GetPosPixel();
+ siz = aText.GetSizePixel();
+
+ // get dimensions occupied by text in the control
+ Rectangle rect =
+ GetTextRect( Rectangle( point, siz ), aText.GetText(), style );
+ newSiz = rect.GetSize();
+
+ // the gap is the difference between the text width and its control width
+ gap = siz.Height() - newSiz.Height();
+
+ //resize the text field
+ newSiz = Size( siz.Width(), siz.Height() - gap );
+ aText.SetSizePixel( newSiz );
+
+ //move the OK & cancel buttons
+ point = aEdit.GetPosPixel();
+ newPoint = Point( point.X(), point.Y() - gap );
+ aEdit.SetPosPixel( newPoint );
+
+}
+
+InputDialog::~InputDialog()
+{
+}
+// ----------------------------------------------------------------------------
+// ScriptOrgDialog ------------------------------------------------------------
+// ----------------------------------------------------------------------------
+SvxScriptOrgDialog::SvxScriptOrgDialog( Window* pParent, ::rtl::OUString language )
+ : SfxModalDialog( pParent, CUI_RES( RID_DLG_SCRIPTORGANIZER ) ),
+ aScriptsTxt( this, CUI_RES( SF_TXT_SCRIPTS ) ),
+ aScriptsBox( this, CUI_RES( SF_CTRL_SCRIPTSBOX ) ),
+ aRunButton( this, CUI_RES( SF_PB_RUN ) ),
+ aCloseButton( this, CUI_RES( SF_PB_CLOSE ) ),
+ aCreateButton( this, CUI_RES( SF_PB_CREATE ) ),
+ aEditButton( this, CUI_RES( SF_PB_EDIT ) ),
+ aRenameButton(this, CUI_RES( SF_PB_RENAME ) ),
+ aDelButton( this, CUI_RES( SF_PB_DEL ) ),
+ aHelpButton( this, CUI_RES( SF_PB_HELP ) ),
+ m_sLanguage( language ),
+ m_delErrStr( CUI_RES( RID_SVXSTR_DELFAILED ) ),
+ m_delErrTitleStr( CUI_RES( RID_SVXSTR_DELFAILED_TITLE ) ),
+ m_delQueryStr( CUI_RES( RID_SVXSTR_DELQUERY ) ),
+ m_delQueryTitleStr( CUI_RES( RID_SVXSTR_DELQUERY_TITLE ) ) ,
+ m_createErrStr( CUI_RES ( RID_SVXSTR_CREATEFAILED ) ),
+ m_createDupStr( CUI_RES ( RID_SVXSTR_CREATEFAILEDDUP ) ),
+ m_createErrTitleStr( CUI_RES( RID_SVXSTR_CREATEFAILED_TITLE ) ),
+ m_renameErrStr( CUI_RES ( RID_SVXSTR_RENAMEFAILED ) ),
+ m_renameErrTitleStr( CUI_RES( RID_SVXSTR_RENAMEFAILED_TITLE ) )
+{
+
+ // must be a neater way to deal with the strings than as above
+ // append the language to the dialog title
+ String winTitle( GetText() );
+ winTitle.SearchAndReplace( String::CreateFromAscii( "%MACROLANG" ), language.pData->buffer );
+ SetText( winTitle );
+
+ aScriptsBox.SetSelectHdl( LINK( this, SvxScriptOrgDialog, ScriptSelectHdl ) );
+ aRunButton.SetClickHdl( LINK( this, SvxScriptOrgDialog, ButtonHdl ) );
+ aCloseButton.SetClickHdl( LINK( this, SvxScriptOrgDialog, ButtonHdl ) );
+ aRenameButton.SetClickHdl( LINK( this, SvxScriptOrgDialog, ButtonHdl ) );
+ aEditButton.SetClickHdl( LINK( this, SvxScriptOrgDialog, ButtonHdl ) );
+ aDelButton.SetClickHdl( LINK( this, SvxScriptOrgDialog, ButtonHdl ) );
+ aCreateButton.SetClickHdl( LINK( this, SvxScriptOrgDialog, ButtonHdl ) );
+
+ aRunButton.Disable();
+ aRenameButton.Disable();
+ aEditButton.Disable();
+ aDelButton.Disable();
+ aCreateButton.Disable();
+
+ aScriptsBox.Init( m_sLanguage );
+ RestorePreviousSelection();
+ FreeResource();
+}
+
+__EXPORT SvxScriptOrgDialog::~SvxScriptOrgDialog()
+{
+ // clear the SelectHdl so that it isn't called during the dtor
+ aScriptsBox.SetSelectHdl( Link() );
+};
+
+short SvxScriptOrgDialog::Execute()
+{
+
+ SfxObjectShell *pDoc = SfxObjectShell::GetFirst();
+
+ // force load of MSPs for all documents
+ while ( pDoc )
+ {
+ Reference< provider::XScriptProviderSupplier > xSPS =
+ Reference< provider::XScriptProviderSupplier >
+ ( pDoc->GetModel(), UNO_QUERY );
+ if ( xSPS.is() )
+ {
+ Reference< provider::XScriptProvider > ScriptProvider =
+ xSPS->getScriptProvider();
+ }
+
+ pDoc = SfxObjectShell::GetNext(*pDoc);
+ }
+ aScriptsBox.ExpandAllTrees();
+
+ Window* pPrevDlgParent = Application::GetDefDialogParent();
+ Application::SetDefDialogParent( this );
+ short nRet = ModalDialog::Execute();
+ Application::SetDefDialogParent( pPrevDlgParent );
+ return nRet;
+}
+
+void SvxScriptOrgDialog::EnableButton( Button& , BOOL )
+{
+}
+
+void SvxScriptOrgDialog::CheckButtons( Reference< browse::XBrowseNode >& node )
+{
+ if ( node.is() )
+ {
+ if ( node->getType() == browse::BrowseNodeTypes::SCRIPT)
+ {
+ aRunButton.Enable();
+ }
+ else
+ {
+ aRunButton.Disable();
+ }
+ Reference< beans::XPropertySet > xProps( node, UNO_QUERY );
+
+ if ( !xProps.is() )
+ {
+ aEditButton.Disable();
+ aDelButton.Disable();
+ aCreateButton.Disable();
+ aRunButton.Disable();
+ return;
+ }
+
+ ::rtl::OUString sName;
+ sName = String::CreateFromAscii("Editable") ;
+
+ if ( getBoolProperty( xProps, sName ) )
+ {
+ aEditButton.Enable();
+ }
+ else
+ {
+ aEditButton.Disable();
+ }
+
+ sName = String::CreateFromAscii("Deletable") ;
+
+ if ( getBoolProperty( xProps, sName ) )
+ {
+ aDelButton.Enable();
+ }
+ else
+ {
+ aDelButton.Disable();
+ }
+
+ sName = String::CreateFromAscii("Creatable") ;
+
+ if ( getBoolProperty( xProps, sName ) )
+ {
+ aCreateButton.Enable();
+ }
+ else
+ {
+ aCreateButton.Disable();
+ }
+
+ sName = String::CreateFromAscii("Renamable") ;
+
+ if ( getBoolProperty( xProps, sName ) )
+ {
+ aRenameButton.Enable();
+ }
+ else
+ {
+ aRenameButton.Disable();
+ }
+ }
+ else
+ {
+ // no node info available, disable all configurable actions
+ aDelButton.Disable();
+ aCreateButton.Disable();
+ aEditButton.Disable();
+ aRunButton.Disable();
+ aRenameButton.Disable();
+ }
+}
+
+IMPL_LINK_INLINE_START( SvxScriptOrgDialog, MacroDoubleClickHdl, SvTreeListBox *, EMPTYARG )
+{
+ return 0;
+}
+
+IMPL_LINK_INLINE_END( SvxScriptOrgDialog, MacroDoubleClickHdl, SvTreeListBox *, EMPTYARG )
+
+IMPL_LINK( SvxScriptOrgDialog, ScriptSelectHdl, SvTreeListBox *, pBox )
+{
+ if ( !pBox->IsSelected( pBox->GetHdlEntry() ) )
+ {
+ return 0;
+ }
+
+ SvLBoxEntry* pEntry = pBox->GetHdlEntry();
+
+ SFEntry* userData = 0;
+ if ( !pEntry )
+ {
+ return 0;
+ }
+ userData = (SFEntry*)pEntry->GetUserData();
+
+ Reference< browse::XBrowseNode > node;
+ if ( userData )
+ {
+ node = userData->GetNode();
+ CheckButtons( node );
+ }
+
+ return 0;
+}
+
+IMPL_LINK( SvxScriptOrgDialog, ButtonHdl, Button *, pButton )
+{
+ if ( pButton == &aCloseButton )
+ {
+ StoreCurrentSelection();
+ EndDialog( 0 );
+ }
+ if ( pButton == &aEditButton ||
+ pButton == &aCreateButton ||
+ pButton == &aDelButton ||
+ pButton == &aRunButton ||
+ pButton == &aRenameButton )
+
+ {
+ if ( aScriptsBox.IsSelected( aScriptsBox.GetHdlEntry() ) )
+ {
+ SvLBoxEntry* pEntry = aScriptsBox.GetHdlEntry();
+ SFEntry* userData = 0;
+ if ( !pEntry )
+ {
+ return 0;
+ }
+ userData = (SFEntry*)pEntry->GetUserData();
+ if ( userData )
+ {
+ Reference< browse::XBrowseNode > node;
+ Reference< XModel > xModel;
+
+ node = userData->GetNode();
+ xModel = userData->GetModel();
+
+ if ( !node.is() )
+ {
+ return 0;
+ }
+
+ if ( pButton == &aRunButton )
+ {
+ ::rtl::OUString tmpString;
+ Reference< beans::XPropertySet > xProp( node, UNO_QUERY );
+ Reference< provider::XScriptProvider > mspNode;
+ if( !xProp.is() )
+ {
+ return 0;
+ }
+
+ if ( xModel.is() )
+ {
+ Reference< XEmbeddedScripts > xEmbeddedScripts( xModel, UNO_QUERY);
+ if( !xEmbeddedScripts.is() )
+ {
+ return 0;
+ }
+
+ if (!xEmbeddedScripts->getAllowMacroExecution())
+ {
+ // Please FIXME: Show a message box if AllowMacroExecution is false
+ return 0;
+ }
+ }
+
+
+ SvLBoxEntry* pParent = aScriptsBox.GetParent( pEntry );
+ while ( pParent && !mspNode.is() )
+ {
+ SFEntry* mspUserData = (SFEntry*)pParent->GetUserData();
+ mspNode.set( mspUserData->GetNode() , UNO_QUERY );
+ pParent = aScriptsBox.GetParent( pParent );
+ }
+ xProp->getPropertyValue( String::CreateFromAscii("URI" ) ) >>= tmpString;
+ const String scriptURL( tmpString );
+
+ if ( mspNode.is() )
+ {
+ try
+ {
+ Reference< provider::XScript > xScript(
+ mspNode->getScript( scriptURL ), UNO_QUERY_THROW );
+
+ const Sequence< Any > args(0);
+ Any aRet;
+ Sequence< sal_Int16 > outIndex;
+ Sequence< Any > outArgs( 0 );
+ aRet = xScript->invoke( args, outIndex, outArgs );
+ }
+ catch ( reflection::InvocationTargetException& ite )
+ {
+ ::com::sun::star::uno::Any a = makeAny(ite);
+ ShowErrorDialog(a);
+ }
+ catch ( provider::ScriptFrameworkErrorException& ite )
+ {
+ ::com::sun::star::uno::Any a = makeAny(ite);
+ ShowErrorDialog(a);
+ }
+ catch ( RuntimeException& re )
+ {
+ ::com::sun::star::uno::Any a = makeAny(re);
+ ShowErrorDialog(a);
+ }
+ catch ( Exception& e )
+ {
+ ::com::sun::star::uno::Any a = makeAny(e);
+ ShowErrorDialog(a);
+ }
+ }
+ StoreCurrentSelection();
+ EndDialog( 0 );
+ }
+ else if ( pButton == &aEditButton )
+ {
+ Reference< script::XInvocation > xInv( node, UNO_QUERY );
+ if ( xInv.is() )
+ {
+ StoreCurrentSelection();
+ EndDialog( 0 );
+ Sequence< Any > args(0);
+ Sequence< Any > outArgs( 0 );
+ Sequence< sal_Int16 > outIndex;
+ try
+ {
+ // ISSUE need code to run script here
+ xInv->invoke( ::rtl::OUString::createFromAscii( "Editable" ), args, outIndex, outArgs );
+ }
+ catch( Exception& e )
+ {
+ OSL_TRACE("Caught exception trying to invoke %s", ::rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US ).pData->buffer );
+
+ }
+ }
+ }
+ else if ( pButton == &aCreateButton )
+ {
+ createEntry( pEntry );
+ }
+ else if ( pButton == &aDelButton )
+ {
+ deleteEntry( pEntry );
+ }
+ else if ( pButton == &aRenameButton )
+ {
+ renameEntry( pEntry );
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+Reference< browse::XBrowseNode > SvxScriptOrgDialog::getBrowseNode( SvLBoxEntry* pEntry )
+{
+ Reference< browse::XBrowseNode > node;
+ if ( pEntry )
+ {
+ SFEntry* userData = (SFEntry*)pEntry->GetUserData();
+ if ( userData )
+ {
+ node = userData->GetNode();
+ }
+ }
+
+ return node;
+}
+
+Reference< XModel > SvxScriptOrgDialog::getModel( SvLBoxEntry* pEntry )
+{
+ Reference< XModel > model;
+ if ( pEntry )
+ {
+ SFEntry* userData = (SFEntry*)pEntry->GetUserData();
+ if ( userData )
+ {
+ model = userData->GetModel();
+ }
+ }
+
+ return model;
+}
+
+Reference< XInterface >
+SvxScriptOrgDialog::getDocumentModel( Reference< XComponentContext >& xCtx, ::rtl::OUString& docName )
+{
+ Reference< XInterface > xModel;
+ Reference< lang::XMultiComponentFactory > mcf =
+ xCtx->getServiceManager();
+ Reference< frame::XDesktop > desktop (
+ mcf->createInstanceWithContext(
+ ::rtl::OUString::createFromAscii("com.sun.star.frame.Desktop"), xCtx ),
+ UNO_QUERY );
+
+ Reference< container::XEnumerationAccess > componentsAccess =
+ desktop->getComponents();
+ Reference< container::XEnumeration > components =
+ componentsAccess->createEnumeration();
+ while (components->hasMoreElements())
+ {
+ Reference< frame::XModel > model(
+ components->nextElement(), UNO_QUERY );
+ if ( model.is() )
+ {
+ ::rtl::OUString sTdocUrl = ::comphelper::DocumentInfo::getDocumentTitle( model );
+ if( sTdocUrl.equals( docName ) )
+ {
+ xModel = model;
+ break;
+ }
+ }
+ }
+ return xModel;
+}
+
+void SvxScriptOrgDialog::createEntry( SvLBoxEntry* pEntry )
+{
+
+ Reference< browse::XBrowseNode > aChildNode;
+ Reference< browse::XBrowseNode > node = getBrowseNode( pEntry );
+ Reference< script::XInvocation > xInv( node, UNO_QUERY );
+
+ if ( xInv.is() )
+ {
+ ::rtl::OUString aNewName;
+ ::rtl::OUString aNewStdName;
+ USHORT nMode = INPUTMODE_NEWLIB;
+ if( aScriptsBox.GetModel()->GetDepth( pEntry ) == 0 )
+ {
+ aNewStdName = ::rtl::OUString::createFromAscii( "Library" ) ;
+ }
+ else
+ {
+ aNewStdName = ::rtl::OUString::createFromAscii( "Macro" ) ;
+ nMode = INPUTMODE_NEWMACRO;
+ }
+ //do we need L10N for this? ie somethng like:
+ //String aNewStdName( ResId( STR_STDMODULENAME ) );
+ BOOL bValid = FALSE;
+ USHORT i = 1;
+
+ Sequence< Reference< browse::XBrowseNode > > childNodes;
+ // no children => ok to create Parcel1 or Script1 without checking
+ try
+ {
+ if( node->hasChildNodes() == sal_False )
+ {
+ aNewName = aNewStdName;
+ aNewName += String::CreateFromInt32( i );
+ bValid = TRUE;
+ }
+ else
+ {
+ childNodes = node->getChildNodes();
+ }
+ }
+ catch ( Exception& )
+ {
+ // ignore, will continue on with empty sequence
+ }
+
+ ::rtl::OUString extn;
+ while ( !bValid )
+ {
+ aNewName = aNewStdName;
+ aNewName += String::CreateFromInt32( i );
+ BOOL bFound = FALSE;
+ if(childNodes.getLength() > 0 )
+ {
+ ::rtl::OUString nodeName = childNodes[0]->getName();
+ sal_Int32 extnPos = nodeName.lastIndexOf( '.' );
+ if(extnPos>0)
+ extn = nodeName.copy(extnPos);
+ }
+ for( sal_Int32 index = 0; index < childNodes.getLength(); index++ )
+ {
+ if ( (aNewName+extn).equals( childNodes[index]->getName() ) )
+ {
+ bFound = TRUE;
+ break;
+ }
+ }
+ if( bFound )
+ {
+ i++;
+ }
+ else
+ {
+ bValid = TRUE;
+ }
+ }
+
+ std::auto_ptr< InputDialog > xNewDlg( new InputDialog( static_cast<Window*>(this), nMode ) );
+ xNewDlg->SetObjectName( aNewName );
+
+ do
+ {
+ if ( xNewDlg->Execute() && xNewDlg->GetObjectName().Len() )
+ {
+ ::rtl::OUString aUserSuppliedName = xNewDlg->GetObjectName();
+ bValid = TRUE;
+ for( sal_Int32 index = 0; index < childNodes.getLength(); index++ )
+ {
+ if ( (aUserSuppliedName+extn).equals( childNodes[index]->getName() ) )
+ {
+ bValid = FALSE;
+ String aError( m_createErrStr );
+ aError.Append( m_createDupStr );
+ ErrorBox aErrorBox( static_cast<Window*>(this), WB_OK | RET_OK, aError );
+ aErrorBox.SetText( m_createErrTitleStr );
+ aErrorBox.Execute();
+ xNewDlg->SetObjectName( aNewName );
+ break;
+ }
+ }
+ if( bValid )
+ aNewName = aUserSuppliedName;
+ }
+ else
+ {
+ // user hit cancel or hit OK with nothing in the editbox
+
+ return;
+ }
+ }
+ while ( !bValid );
+
+ // open up parent node (which ensures it's loaded)
+ aScriptsBox.RequestingChilds( pEntry );
+
+ Sequence< Any > args( 1 );
+ args[ 0 ] <<= aNewName;
+ Sequence< Any > outArgs( 0 );
+ Sequence< sal_Int16 > outIndex;
+ try
+ {
+ Any aResult;
+ aResult = xInv->invoke( ::rtl::OUString::createFromAscii( "Creatable" ), args, outIndex, outArgs );
+ Reference< browse::XBrowseNode > newNode( aResult, UNO_QUERY );
+ aChildNode = newNode;
+
+ }
+ catch( Exception& e )
+ {
+ OSL_TRACE("Caught exception trying to Create %s",
+ ::rtl::OUStringToOString(
+ e.Message, RTL_TEXTENCODING_ASCII_US ).pData->buffer );
+ }
+ }
+ if ( aChildNode.is() )
+ {
+ String aChildName = aChildNode->getName();
+ SvLBoxEntry* pNewEntry = NULL;
+
+
+ ::rtl::OUString name( aChildName );
+ Reference<XModel> xDocumentModel = getModel( pEntry );
+
+ // ISSUE do we need to remove all entries for parent
+ // to achieve sort? Just need to determine position
+ // SvTreeListBox::InsertEntry can take position arg
+ // -- Basic doesn't do this on create.
+ // Suppose we could avoid this too. -> created nodes are
+ // not in alphabetical order
+ if ( aChildNode->getType() == browse::BrowseNodeTypes::SCRIPT )
+ {
+ pNewEntry = aScriptsBox.insertEntry( aChildName,
+ IMG_MACRO, pEntry, false, std::auto_ptr< SFEntry >(new SFEntry( OBJTYPE_METHOD, aChildNode,xDocumentModel ) ) );
+
+ }
+ else
+ {
+ pNewEntry = aScriptsBox.insertEntry( aChildName,
+ IMG_LIB, pEntry, false, std::auto_ptr< SFEntry >(new SFEntry( OBJTYPE_SCRIPTCONTAINER, aChildNode,xDocumentModel ) ) );
+ // If the Parent is not loaded then set to
+ // loaded, this will prevent RequestingChilds ( called
+ // from vcl via RequestingChilds ) from
+ // creating new ( duplicate ) children
+ SFEntry* userData = (SFEntry*)pEntry->GetUserData();
+ if ( userData && !userData->isLoaded() )
+ {
+ userData->setLoaded();
+ }
+ }
+ aScriptsBox.SetCurEntry( pNewEntry );
+ aScriptsBox.Select( aScriptsBox.GetCurEntry() );
+
+ }
+ else
+ {
+ //ISSUE L10N & message from exception?
+ String aError( m_createErrStr );
+ ErrorBox aErrorBox( static_cast<Window*>(this), WB_OK | RET_OK, aError );
+ aErrorBox.SetText( m_createErrTitleStr );
+ aErrorBox.Execute();
+ }
+}
+
+void SvxScriptOrgDialog::renameEntry( SvLBoxEntry* pEntry )
+{
+
+ Reference< browse::XBrowseNode > aChildNode;
+ Reference< browse::XBrowseNode > node = getBrowseNode( pEntry );
+ Reference< script::XInvocation > xInv( node, UNO_QUERY );
+
+ if ( xInv.is() )
+ {
+ ::rtl::OUString aNewName = node->getName();
+ sal_Int32 extnPos = aNewName.lastIndexOf( '.' );
+ ::rtl::OUString extn;
+ if(extnPos>0)
+ {
+ extn = aNewName.copy(extnPos);
+ aNewName = aNewName.copy(0,extnPos);
+ }
+ USHORT nMode = INPUTMODE_RENAME;
+
+ std::auto_ptr< InputDialog > xNewDlg( new InputDialog( static_cast<Window*>(this), nMode ) );
+ xNewDlg->SetObjectName( aNewName );
+
+ BOOL bValid;
+ do
+ {
+ if ( xNewDlg->Execute() && xNewDlg->GetObjectName().Len() )
+ {
+ ::rtl::OUString aUserSuppliedName = xNewDlg->GetObjectName();
+ bValid = TRUE;
+ /*
+ for( sal_Int32 index = 0; index < childNodes.getLength(); index++ )
+ {
+ if ( (aUserSuppliedName+extn).equals( childNodes[index]->getName() ) )
+ {
+ bValid = FALSE;
+ String aError( m_createErrStr );
+ aError.Append( m_createDupStr );
+ ErrorBox aErrorBox( static_cast<Window*>(this), WB_OK | RET_OK, aError );
+ aErrorBox.SetText( m_createErrTitleStr );
+ aErrorBox.Execute();
+ xNewDlg->SetObjectName( aNewName );
+ break;
+ }
+ } */
+ if( bValid )
+ aNewName = aUserSuppliedName;
+ }
+ else
+ {
+ // user hit cancel or hit OK with nothing in the editbox
+ return;
+ }
+ }
+ while ( !bValid );
+
+ Sequence< Any > args( 1 );
+ args[ 0 ] <<= aNewName;
+ Sequence< Any > outArgs( 0 );
+ Sequence< sal_Int16 > outIndex;
+ try
+ {
+ Any aResult;
+ aResult = xInv->invoke( ::rtl::OUString::createFromAscii( "Renamable" ), args, outIndex, outArgs );
+ Reference< browse::XBrowseNode > newNode( aResult, UNO_QUERY );
+ aChildNode = newNode;
+
+ }
+ catch( Exception& e )
+ {
+ OSL_TRACE("Caught exception trying to Rename %s",
+ ::rtl::OUStringToOString(
+ e.Message, RTL_TEXTENCODING_ASCII_US ).pData->buffer );
+ }
+ }
+ if ( aChildNode.is() )
+ {
+ aScriptsBox.SetEntryText( pEntry, aChildNode->getName() );
+ aScriptsBox.SetCurEntry( pEntry );
+ aScriptsBox.Select( aScriptsBox.GetCurEntry() );
+
+ }
+ else
+ {
+ //ISSUE L10N & message from exception?
+ String aError( m_renameErrStr );
+ ErrorBox aErrorBox( static_cast<Window*>(this), WB_OK | RET_OK, aError );
+ aErrorBox.SetText( m_renameErrTitleStr );
+ aErrorBox.Execute();
+ }
+}
+void SvxScriptOrgDialog::deleteEntry( SvLBoxEntry* pEntry )
+{
+ sal_Bool result = sal_False;
+ Reference< browse::XBrowseNode > node = getBrowseNode( pEntry );
+ // ISSUE L10N string & can we centre list?
+ String aQuery( m_delQueryStr );
+ aQuery.Append( getListOfChildren( node, 0 ) );
+ QueryBox aQueryBox( static_cast<Window*>(this), WB_YES_NO | WB_DEF_YES, aQuery );
+ aQueryBox.SetText( m_delQueryTitleStr );
+ if ( aQueryBox.Execute() == RET_NO )
+ {
+ return;
+ }
+
+ Reference< script::XInvocation > xInv( node, UNO_QUERY );
+ if ( xInv.is() )
+ {
+ Sequence< Any > args( 0 );
+ Sequence< Any > outArgs( 0 );
+ Sequence< sal_Int16 > outIndex;
+ try
+ {
+ Any aResult;
+ aResult = xInv->invoke( ::rtl::OUString::createFromAscii( "Deletable" ), args, outIndex, outArgs );
+ aResult >>= result; // or do we just assume true if no exception ?
+ }
+ catch( Exception& e )
+ {
+ OSL_TRACE("Caught exception trying to delete %s",
+ ::rtl::OUStringToOString(
+ e.Message, RTL_TEXTENCODING_ASCII_US ).pData->buffer );
+ }
+ }
+
+ if ( result == sal_True )
+ {
+ aScriptsBox.deleteTree( pEntry );
+ aScriptsBox.GetModel()->Remove( pEntry );
+ }
+ else
+ {
+ //ISSUE L10N & message from exception?
+ ErrorBox aErrorBox( static_cast<Window*>(this), WB_OK | RET_OK, m_delErrStr );
+ aErrorBox.SetText( m_delErrTitleStr );
+ aErrorBox.Execute();
+ }
+
+}
+
+BOOL SvxScriptOrgDialog::getBoolProperty( Reference< beans::XPropertySet >& xProps,
+ ::rtl::OUString& propName )
+{
+ BOOL result = false;
+ try
+ {
+ sal_Bool bTemp = sal_False;
+ xProps->getPropertyValue( propName ) >>= bTemp;
+ result = ( bTemp == sal_True );
+ }
+ catch ( Exception& )
+ {
+ return result;
+ }
+ return result;
+}
+
+String SvxScriptOrgDialog::getListOfChildren( Reference< browse::XBrowseNode > node, int depth )
+{
+ String result;
+ result.Append( String::CreateFromAscii( "\n" ) );
+ for( int i=0;i<=depth;i++ )
+ {
+ result.Append( String::CreateFromAscii( "\t" ) );
+ }
+ result.Append( String( node->getName() ) );
+
+ try
+ {
+ if ( node->hasChildNodes() == sal_True )
+ {
+ Sequence< Reference< browse::XBrowseNode > > children
+ = node->getChildNodes();
+ for ( sal_Int32 n = 0; n < children.getLength(); n++ )
+ {
+ result.Append( getListOfChildren( children[ n ] , depth+1 ) );
+ }
+ }
+ }
+ catch ( Exception& )
+ {
+ // ignore, will return an empty string
+ }
+
+ return result;
+}
+
+Selection_hash SvxScriptOrgDialog::m_lastSelection;
+
+void SvxScriptOrgDialog::StoreCurrentSelection()
+{
+ String aDescription;
+ if ( aScriptsBox.IsSelected( aScriptsBox.GetHdlEntry() ) )
+ {
+ SvLBoxEntry* pEntry = aScriptsBox.GetHdlEntry();
+ while( pEntry )
+ {
+ aDescription.Insert( aScriptsBox.GetEntryText( pEntry ), 0 );
+ pEntry = aScriptsBox.GetParent( pEntry );
+ if ( pEntry )
+ aDescription.Insert( ';', 0 );
+ }
+ ::rtl::OUString sDesc( aDescription );
+ m_lastSelection[ m_sLanguage ] = sDesc;
+ }
+}
+
+void SvxScriptOrgDialog::RestorePreviousSelection()
+{
+ String aStoredEntry = String( m_lastSelection[ m_sLanguage ] );
+ if( aStoredEntry.Len() <= 0 )
+ return;
+ SvLBoxEntry* pEntry = 0;
+ USHORT nIndex = 0;
+ while ( nIndex != STRING_NOTFOUND )
+ {
+ String aTmp( aStoredEntry.GetToken( 0, ';', nIndex ) );
+ SvLBoxEntry* pTmpEntry = aScriptsBox.FirstChild( pEntry );
+ ::rtl::OUString debugStr(aTmp);
+ while ( pTmpEntry )
+ {
+ debugStr = ::rtl::OUString(aScriptsBox.GetEntryText( pTmpEntry ));
+ if ( aScriptsBox.GetEntryText( pTmpEntry ) == aTmp )
+ {
+ pEntry = pTmpEntry;
+ break;
+ }
+ pTmpEntry = aScriptsBox.NextSibling( pTmpEntry );
+ }
+ if ( !pTmpEntry )
+ break;
+ aScriptsBox.RequestingChilds( pEntry );
+ }
+ aScriptsBox.SetCurEntry( pEntry );
+}
+
+BOOL SFTreeListBox::dialogSort1( Reference< browse::XBrowseNode > node1,
+ Reference< browse::XBrowseNode > node2 )
+{
+ ::rtl::OUString userStr = ::rtl::OUString::createFromAscii("user");
+ ::rtl::OUString shareStr = ::rtl::OUString::createFromAscii("share");
+ if( node1->getName().equals( userStr ) )
+ return true;
+ if( node2->getName().equals( userStr ) )
+ return false;
+ if( node1->getName().equals( shareStr ) )
+ return true;
+ if( node2->getName().equals( shareStr ) )
+ return false;
+ return dialogSort2( node1, node2 );
+}
+
+BOOL SFTreeListBox::dialogSort2( Reference< browse::XBrowseNode > node1,
+ Reference< browse::XBrowseNode > node2 )
+{
+ return ( node1->getName().compareTo( node2->getName() ) < 0 );
+}
+
+::rtl::OUString ReplaceString(
+ const ::rtl::OUString& source,
+ const ::rtl::OUString& token,
+ const ::rtl::OUString& value )
+{
+ sal_Int32 pos = source.indexOf( token );
+
+ if ( pos != -1 && value.getLength() != 0 )
+ {
+ return source.replaceAt( pos, token.getLength(), value );
+ }
+ else
+ {
+ return source;
+ }
+}
+
+::rtl::OUString FormatErrorString(
+ const ::rtl::OUString& unformatted,
+ const ::rtl::OUString& language,
+ const ::rtl::OUString& script,
+ const ::rtl::OUString& line,
+ const ::rtl::OUString& type,
+ const ::rtl::OUString& message )
+{
+ ::rtl::OUString result = unformatted.copy( 0 );
+
+ result = ReplaceString(
+ result, ::rtl::OUString::createFromAscii( "%LANGUAGENAME" ), language );
+ result = ReplaceString(
+ result, ::rtl::OUString::createFromAscii( "%SCRIPTNAME" ), script );
+ result = ReplaceString(
+ result, ::rtl::OUString::createFromAscii( "%LINENUMBER" ), line );
+
+ if ( type.getLength() != 0 )
+ {
+ result += ::rtl::OUString::createFromAscii( "\n\n" );
+ result += ::rtl::OUString(String(CUI_RES(RID_SVXSTR_ERROR_TYPE_LABEL)));
+ result += ::rtl::OUString::createFromAscii( " " );
+ result += type;
+ }
+
+ if ( message.getLength() != 0 )
+ {
+ result += ::rtl::OUString::createFromAscii( "\n\n" );
+ result += ::rtl::OUString(String(CUI_RES(RID_SVXSTR_ERROR_MESSAGE_LABEL)));
+ result += ::rtl::OUString::createFromAscii( " " );
+ result += message;
+ }
+
+ return result;
+}
+
+::rtl::OUString GetErrorMessage(
+ const provider::ScriptErrorRaisedException& eScriptError )
+{
+ ::rtl::OUString unformatted = String( CUI_RES( RID_SVXSTR_ERROR_AT_LINE ) );
+
+ ::rtl::OUString unknown = ::rtl::OUString::createFromAscii( "UNKNOWN" );
+ ::rtl::OUString language = unknown;
+ ::rtl::OUString script = unknown;
+ ::rtl::OUString line = unknown;
+ ::rtl::OUString type = ::rtl::OUString();
+ ::rtl::OUString message = eScriptError.Message;
+
+ if ( eScriptError.language.getLength() != 0 )
+ {
+ language = eScriptError.language;
+ }
+
+ if ( eScriptError.scriptName.getLength() != 0 )
+ {
+ script = eScriptError.scriptName;
+ }
+
+ if ( eScriptError.Message.getLength() != 0 )
+ {
+ message = eScriptError.Message;
+ }
+ if ( eScriptError.lineNum != -1 )
+ {
+ line = ::rtl::OUString::valueOf( eScriptError.lineNum );
+ unformatted = String(
+ CUI_RES( RID_SVXSTR_ERROR_AT_LINE ) );
+ }
+ else
+ {
+ unformatted = String(
+ CUI_RES( RID_SVXSTR_ERROR_RUNNING ) );
+ }
+
+ return FormatErrorString(
+ unformatted, language, script, line, type, message );
+}
+
+::rtl::OUString GetErrorMessage(
+ const provider::ScriptExceptionRaisedException& eScriptException )
+{
+ ::rtl::OUString unformatted =
+ String( CUI_RES( RID_SVXSTR_EXCEPTION_AT_LINE ) );
+
+ ::rtl::OUString unknown = ::rtl::OUString::createFromAscii( "UNKNOWN" );
+ ::rtl::OUString language = unknown;
+ ::rtl::OUString script = unknown;
+ ::rtl::OUString line = unknown;
+ ::rtl::OUString type = unknown;
+ ::rtl::OUString message = eScriptException.Message;
+
+ if ( eScriptException.language.getLength() != 0 )
+ {
+ language = eScriptException.language;
+ }
+ if ( eScriptException.scriptName.getLength() != 0 )
+ {
+ script = eScriptException.scriptName;
+ }
+
+ if ( eScriptException.Message.getLength() != 0 )
+ {
+ message = eScriptException.Message;
+ }
+
+ if ( eScriptException.lineNum != -1 )
+ {
+ line = ::rtl::OUString::valueOf( eScriptException.lineNum );
+ unformatted = String(
+ CUI_RES( RID_SVXSTR_EXCEPTION_AT_LINE ) );
+ }
+ else
+ {
+ unformatted = String(
+ CUI_RES( RID_SVXSTR_EXCEPTION_RUNNING ) );
+ }
+
+ if ( eScriptException.exceptionType.getLength() != 0 )
+ {
+ type = eScriptException.exceptionType;
+ }
+
+ return FormatErrorString(
+ unformatted, language, script, line, type, message );
+
+}
+::rtl::OUString GetErrorMessage(
+ const provider::ScriptFrameworkErrorException& sError )
+{
+ ::rtl::OUString unformatted = String(
+ CUI_RES( RID_SVXSTR_FRAMEWORK_ERROR_RUNNING ) );
+
+ ::rtl::OUString language =
+ ::rtl::OUString::createFromAscii( "UNKNOWN" );
+
+ ::rtl::OUString script =
+ ::rtl::OUString::createFromAscii( "UNKNOWN" );
+
+ ::rtl::OUString message;
+
+ if ( sError.scriptName.getLength() > 0 )
+ {
+ script = sError.scriptName;
+ }
+ if ( sError.language.getLength() > 0 )
+ {
+ language = sError.language;
+ }
+ if ( sError.errorType == provider::ScriptFrameworkErrorType::NOTSUPPORTED )
+ {
+ message = String(
+ CUI_RES( RID_SVXSTR_ERROR_LANG_NOT_SUPPORTED ) );
+ message = ReplaceString(
+ message, ::rtl::OUString::createFromAscii( "%LANGUAGENAME" ), language );
+
+ }
+ else
+ {
+ message = sError.Message;
+ }
+ return FormatErrorString(
+ unformatted, language, script, ::rtl::OUString(), ::rtl::OUString(), message );
+}
+
+::rtl::OUString GetErrorMessage( const RuntimeException& re )
+{
+ Type t = ::getCppuType( &re );
+ ::rtl::OUString message = t.getTypeName();
+ message += re.Message;
+
+ return message;
+}
+
+::rtl::OUString GetErrorMessage( const Exception& e )
+{
+ Type t = ::getCppuType( &e );
+ ::rtl::OUString message = t.getTypeName();
+ message += e.Message;
+
+ return message;
+}
+
+::rtl::OUString GetErrorMessage( const com::sun::star::uno::Any& aException )
+{
+ ::rtl::OUString exType;
+ if ( aException.getValueType() ==
+ ::getCppuType( (const reflection::InvocationTargetException* ) NULL ) )
+ {
+ reflection::InvocationTargetException ite;
+ aException >>= ite;
+ if ( ite.TargetException.getValueType() == ::getCppuType( ( const provider::ScriptErrorRaisedException* ) NULL ) )
+ {
+ // Error raised by script
+ provider::ScriptErrorRaisedException scriptError;
+ ite.TargetException >>= scriptError;
+ return GetErrorMessage( scriptError );
+ }
+ else if ( ite.TargetException.getValueType() == ::getCppuType( ( const provider::ScriptExceptionRaisedException* ) NULL ) )
+ {
+ // Exception raised by script
+ provider::ScriptExceptionRaisedException scriptException;
+ ite.TargetException >>= scriptException;
+ return GetErrorMessage( scriptException );
+ }
+ else
+ {
+ // Unknown error, shouldn't happen
+ // OSL_ASSERT(...)
+ }
+
+ }
+ else if ( aException.getValueType() == ::getCppuType( ( const provider::ScriptFrameworkErrorException* ) NULL ) )
+ {
+ // A Script Framework error has occured
+ provider::ScriptFrameworkErrorException sfe;
+ aException >>= sfe;
+ return GetErrorMessage( sfe );
+
+ }
+ // unknown exception
+ Exception e;
+ RuntimeException rte;
+ if ( aException >>= rte )
+ {
+ return GetErrorMessage( rte );
+ }
+
+ aException >>= e;
+ return GetErrorMessage( e );
+
+}
+
+SvxScriptErrorDialog::SvxScriptErrorDialog(
+ Window* , ::com::sun::star::uno::Any aException )
+ : m_sMessage()
+{
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+ m_sMessage = GetErrorMessage( aException );
+}
+
+SvxScriptErrorDialog::~SvxScriptErrorDialog()
+{
+}
+
+short SvxScriptErrorDialog::Execute()
+{
+ // Show Error dialog asynchronously
+ //
+ // Pass a copy of the message to the ShowDialog method as the
+ // SvxScriptErrorDialog may be deleted before ShowDialog is called
+ Application::PostUserEvent(
+ LINK( this, SvxScriptErrorDialog, ShowDialog ),
+ new rtl::OUString( m_sMessage ) );
+
+ return 0;
+}
+
+IMPL_LINK( SvxScriptErrorDialog, ShowDialog, ::rtl::OUString*, pMessage )
+{
+ ::rtl::OUString message;
+
+ if ( pMessage && pMessage->getLength() != 0 )
+ {
+ message = *pMessage;
+ }
+ else
+ {
+ message = String( CUI_RES( RID_SVXSTR_ERROR_TITLE ) );
+ }
+
+ MessBox* pBox = new WarningBox( NULL, WB_OK, message );
+ pBox->SetText( CUI_RES( RID_SVXSTR_ERROR_TITLE ) );
+ pBox->Execute();
+
+ if ( pBox ) delete pBox;
+ if ( pMessage ) delete pMessage;
+
+ return 0;
+}