2010-10-12 15:57:08 +02:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
2009-10-31 00:36:06 +01:00
|
|
|
/**********************************************************************
|
|
|
|
*
|
|
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
|
|
*
|
2010-02-12 15:01:35 +01:00
|
|
|
* Copyright 2000, 2010 Oracle and/or its affiliates.
|
2009-10-31 00:36:06 +01:00
|
|
|
*
|
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
|
|
|
*
|
|
|
|
* 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>
|
|
|
|
|
2009-11-02 20:49:14 +01:00
|
|
|
#include <cuires.hrc>
|
2009-10-31 00:36:06 +01:00
|
|
|
#include "scriptdlg.hrc"
|
|
|
|
#include "scriptdlg.hxx"
|
2009-11-02 20:49:14 +01:00
|
|
|
#include <dialmgr.hxx>
|
2009-10-31 00:36:06 +01:00
|
|
|
#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 )
|
2009-11-02 20:49:14 +01:00
|
|
|
: 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 ) )
|
2009-10-31 00:36:06 +01:00
|
|
|
{
|
|
|
|
aEdit.GrabFocus();
|
|
|
|
if ( nMode == INPUTMODE_NEWLIB )
|
|
|
|
{
|
2009-11-02 20:49:14 +01:00
|
|
|
SetText( String( CUI_RES( STR_NEWLIB ) ) );
|
2009-10-31 00:36:06 +01:00
|
|
|
}
|
|
|
|
else if ( nMode == INPUTMODE_NEWMACRO )
|
|
|
|
{
|
2009-11-02 20:49:14 +01:00
|
|
|
SetText( String( CUI_RES( STR_NEWMACRO ) ) );
|
|
|
|
aText.SetText( String( CUI_RES( STR_FT_NEWMACRO ) ) );
|
2009-10-31 00:36:06 +01:00
|
|
|
}
|
|
|
|
else if ( nMode == INPUTMODE_RENAME )
|
|
|
|
{
|
2009-11-02 20:49:14 +01:00
|
|
|
SetText( String( CUI_RES( STR_RENAME ) ) );
|
|
|
|
aText.SetText( String( CUI_RES( STR_FT_RENAME ) ) );
|
2009-10-31 00:36:06 +01:00
|
|
|
}
|
|
|
|
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 )
|
2009-11-02 20:49:14 +01:00
|
|
|
: 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 ) ),
|
2009-10-31 00:36:06 +01:00
|
|
|
m_sLanguage( language ),
|
2009-11-02 20:49:14 +01:00
|
|
|
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 ) )
|
2009-10-31 00:36:06 +01:00
|
|
|
{
|
|
|
|
|
|
|
|
// 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" );
|
2009-11-02 20:49:14 +01:00
|
|
|
result += ::rtl::OUString(String(CUI_RES(RID_SVXSTR_ERROR_TYPE_LABEL)));
|
2009-10-31 00:36:06 +01:00
|
|
|
result += ::rtl::OUString::createFromAscii( " " );
|
|
|
|
result += type;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( message.getLength() != 0 )
|
|
|
|
{
|
|
|
|
result += ::rtl::OUString::createFromAscii( "\n\n" );
|
2009-11-02 20:49:14 +01:00
|
|
|
result += ::rtl::OUString(String(CUI_RES(RID_SVXSTR_ERROR_MESSAGE_LABEL)));
|
2009-10-31 00:36:06 +01:00
|
|
|
result += ::rtl::OUString::createFromAscii( " " );
|
|
|
|
result += message;
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
::rtl::OUString GetErrorMessage(
|
|
|
|
const provider::ScriptErrorRaisedException& eScriptError )
|
|
|
|
{
|
2009-11-02 20:49:14 +01:00
|
|
|
::rtl::OUString unformatted = String( CUI_RES( RID_SVXSTR_ERROR_AT_LINE ) );
|
2009-10-31 00:36:06 +01:00
|
|
|
|
|
|
|
::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(
|
2009-11-02 20:49:14 +01:00
|
|
|
CUI_RES( RID_SVXSTR_ERROR_AT_LINE ) );
|
2009-10-31 00:36:06 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
unformatted = String(
|
2009-11-02 20:49:14 +01:00
|
|
|
CUI_RES( RID_SVXSTR_ERROR_RUNNING ) );
|
2009-10-31 00:36:06 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return FormatErrorString(
|
|
|
|
unformatted, language, script, line, type, message );
|
|
|
|
}
|
|
|
|
|
|
|
|
::rtl::OUString GetErrorMessage(
|
|
|
|
const provider::ScriptExceptionRaisedException& eScriptException )
|
|
|
|
{
|
|
|
|
::rtl::OUString unformatted =
|
2009-11-02 20:49:14 +01:00
|
|
|
String( CUI_RES( RID_SVXSTR_EXCEPTION_AT_LINE ) );
|
2009-10-31 00:36:06 +01:00
|
|
|
|
|
|
|
::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(
|
2009-11-02 20:49:14 +01:00
|
|
|
CUI_RES( RID_SVXSTR_EXCEPTION_AT_LINE ) );
|
2009-10-31 00:36:06 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
unformatted = String(
|
2009-11-02 20:49:14 +01:00
|
|
|
CUI_RES( RID_SVXSTR_EXCEPTION_RUNNING ) );
|
2009-10-31 00:36:06 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
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(
|
2009-11-02 20:49:14 +01:00
|
|
|
CUI_RES( RID_SVXSTR_FRAMEWORK_ERROR_RUNNING ) );
|
2009-10-31 00:36:06 +01:00
|
|
|
|
|
|
|
::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(
|
2009-11-02 20:49:14 +01:00
|
|
|
CUI_RES( RID_SVXSTR_ERROR_LANG_NOT_SUPPORTED ) );
|
2009-10-31 00:36:06 +01:00
|
|
|
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
|
|
|
|
{
|
2009-11-02 20:49:14 +01:00
|
|
|
message = String( CUI_RES( RID_SVXSTR_ERROR_TITLE ) );
|
2009-10-31 00:36:06 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
MessBox* pBox = new WarningBox( NULL, WB_OK, message );
|
2009-11-02 20:49:14 +01:00
|
|
|
pBox->SetText( CUI_RES( RID_SVXSTR_ERROR_TITLE ) );
|
2009-10-31 00:36:06 +01:00
|
|
|
pBox->Execute();
|
|
|
|
|
|
|
|
if ( pBox ) delete pBox;
|
|
|
|
if ( pMessage ) delete pMessage;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
2010-10-12 15:57:08 +02:00
|
|
|
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|