diff options
Diffstat (limited to 'scripting/java/com/sun/star/script/framework/browse/ProviderBrowseNode.java')
-rw-r--r-- | scripting/java/com/sun/star/script/framework/browse/ProviderBrowseNode.java | 291 |
1 files changed, 291 insertions, 0 deletions
diff --git a/scripting/java/com/sun/star/script/framework/browse/ProviderBrowseNode.java b/scripting/java/com/sun/star/script/framework/browse/ProviderBrowseNode.java new file mode 100644 index 000000000000..99aa4e44e91a --- /dev/null +++ b/scripting/java/com/sun/star/script/framework/browse/ProviderBrowseNode.java @@ -0,0 +1,291 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * 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. + * + ************************************************************************/ + +package com.sun.star.script.framework.browse; + +import com.sun.star.lib.uno.helper.PropertySet; +import com.sun.star.uno.Any; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.Type; +import com.sun.star.uno.XComponentContext; +import com.sun.star.uno.UnoRuntime; + +import com.sun.star.lang.XMultiComponentFactory; + +import com.sun.star.ucb.XSimpleFileAccess; + +import com.sun.star.beans.XIntrospectionAccess; +import com.sun.star.script.XInvocation; + +import com.sun.star.script.browse.XBrowseNode; +import com.sun.star.script.browse.BrowseNodeTypes; + +import com.sun.star.script.framework.provider.ScriptProvider; +import com.sun.star.script.framework.log.*; +import com.sun.star.script.framework.container.*; +import com.sun.star.script.framework.browse.DialogFactory; + +import java.util.*; +import javax.swing.JOptionPane; + +public class ProviderBrowseNode extends PropertySet + implements XBrowseNode, XInvocation +{ + protected ScriptProvider provider; + protected Collection browsenodes; + protected String name; + protected ParcelContainer container; + protected Parcel parcel; + protected XComponentContext m_xCtx; + + public boolean deletable = true; + public boolean creatable = true; + public boolean editable = false; + + public ProviderBrowseNode( ScriptProvider provider, ParcelContainer container, XComponentContext xCtx ) { + LogUtils.DEBUG("*** ProviderBrowseNode ctor"); + this.container = container; + this.name = this.container.getLanguage(); + this.provider = provider; + this.m_xCtx = xCtx; + + registerProperty("Deletable", new Type(boolean.class), + (short)0, "deletable"); + registerProperty("Creatable", new Type(boolean.class), + (short)0, "creatable"); + registerProperty("Editable", new Type(boolean.class), + (short)0, "editable"); + XSimpleFileAccess xSFA = null; + XMultiComponentFactory xFac = m_xCtx.getServiceManager(); + try + { + xSFA = ( XSimpleFileAccess) + UnoRuntime.queryInterface( XSimpleFileAccess.class, + xFac.createInstanceWithContext( + "com.sun.star.ucb.SimpleFileAccess", + xCtx ) ); + if ( container.isUnoPkg() || xSFA.isReadOnly( container.getParcelContainerDir() ) ) + { + deletable = false; + creatable = false; + } + } + // TODO propage errors + catch( com.sun.star.uno.Exception e ) + { + LogUtils.DEBUG("Caught exception in creation of ProviderBrowseNode "); + LogUtils.DEBUG( LogUtils.getTrace(e)); + + } + } + + public String getName() { + return name; + } + + public XBrowseNode[] getChildNodes() { + LogUtils.DEBUG("***** ProviderBrowseNode.getChildNodes()"); + if ( hasChildNodes() ) + { + // needs initialisation? + LogUtils.DEBUG("** ProviderBrowseNode.getChildNodes(), container is " + container ); + String[] parcels = container.getElementNames(); + browsenodes = new ArrayList( parcels.length ); + for ( int index = 0; index < parcels.length; index++ ) + { + try + { + XBrowseNode node = new ParcelBrowseNode( provider, container, parcels[ index ] ); + browsenodes.add( node ); + } + catch ( Exception e ) + { + LogUtils.DEBUG("*** Failed to create parcel node for " + parcels[ index ] ); + LogUtils.DEBUG( e.toString() ); + } + } + ParcelContainer[] packageContainers = container.getChildContainers(); + LogUtils.DEBUG("**** For container named " + container.getName() + " with root path " + container.getParcelContainerDir() + " has " + packageContainers.length + " child containers " ); + + for ( int i = 0; i < packageContainers.length; i++ ) + { + XBrowseNode node = new PkgProviderBrowseNode( provider, packageContainers[ i ], m_xCtx ); + browsenodes.add( node ); + } + } + else + { + LogUtils.DEBUG("*** No container available"); + return new XBrowseNode[0]; + } + return ( XBrowseNode[] )browsenodes.toArray( new XBrowseNode[0] ); + } + + public boolean hasChildNodes() { + boolean result = true; + + if ( container == null || + ( !container.hasElements() && + container.getChildContainers().length == 0 ) ) + { + result = false; + } + + LogUtils.DEBUG("***** ProviderBrowseNode.hasChildNodes(): " + + "name=" + name + + ", path=" + container.getParcelContainerDir() + + ", result=" + result ); + + return result; + } + + public short getType() { + return BrowseNodeTypes.CONTAINER; + } + + public String toString() + { + return getName(); + } + + // implementation of XInvocation interface + public XIntrospectionAccess getIntrospection() { + return null; + } + + public Object invoke(String aFunctionName, Object[] aParams, + short[][] aOutParamIndex, Object[][] aOutParam) + throws com.sun.star.lang.IllegalArgumentException, + com.sun.star.script.CannotConvertException, + com.sun.star.reflection.InvocationTargetException + { + // Initialise the out paramters - not used but prevents error in + // UNO bridge + aOutParamIndex[0] = new short[0]; + aOutParam[0] = new Object[0]; + + Any result = new Any(new Type(Boolean.class), Boolean.TRUE); + + if (aFunctionName.equals("Creatable")) + { + try + { + String name; + + if (aParams == null || aParams.length < 1 || + AnyConverter.isString(aParams[0]) == false) + { + String prompt = "Enter name for new Parcel"; + String title = "Create Parcel"; + + // try to get a DialogFactory instance, if it fails + // just use a Swing JOptionPane to prompt for the name + try + { + DialogFactory dialogFactory = + DialogFactory.getDialogFactory(); + + name = dialogFactory.showInputDialog(title, prompt); + } + catch (Exception e) + { + name = JOptionPane.showInputDialog(null, prompt, title, + JOptionPane.QUESTION_MESSAGE); + } + } + else { + name = (String) AnyConverter.toString(aParams[0]); + } + + if (name == null || name.equals("")) + { + result = new Any(new Type(Boolean.class), Boolean.FALSE); + } + else + { + + Object newParcel = container.createParcel( name ); + LogUtils.DEBUG("Parcel created " + name + " " + newParcel ); + if ( newParcel == null ) + { + result = new Any(new Type(Boolean.class), Boolean.FALSE); + } + else + { + ParcelBrowseNode parcel = new ParcelBrowseNode( provider, container, name ); + LogUtils.DEBUG("created parcel node "); + if ( browsenodes == null ) + { + browsenodes = new ArrayList( 5 ); + } + + browsenodes.add(parcel); + + + result = new Any(new Type(XBrowseNode.class), parcel); + } + } + } + catch (Exception e) + { + LogUtils.DEBUG("ProviderBrowseNode[create] failed with: " + e ); + LogUtils.DEBUG( LogUtils.getTrace( e ) ); + result = new Any(new Type(Boolean.class), Boolean.FALSE); + + // throw new com.sun.star.reflection.InvocationTargetException( + // "Error creating script: " + e.getMessage()); + } + } + else { + throw new com.sun.star.lang.IllegalArgumentException( + "Function " + aFunctionName + " not supported."); + } + + return result; + } + + public void setValue(String aPropertyName, Object aValue) + throws com.sun.star.beans.UnknownPropertyException, + com.sun.star.script.CannotConvertException, + com.sun.star.reflection.InvocationTargetException + { + } + + public Object getValue(String aPropertyName) + throws com.sun.star.beans.UnknownPropertyException + { + return null; + } + + public boolean hasMethod(String aName) { + return false; + } + + public boolean hasProperty(String aName) { + return false; + } +} |