summaryrefslogtreecommitdiff
path: root/scripting/java/com/sun/star/script/framework/browse/ParcelBrowseNode.java
diff options
context:
space:
mode:
Diffstat (limited to 'scripting/java/com/sun/star/script/framework/browse/ParcelBrowseNode.java')
-rw-r--r--scripting/java/com/sun/star/script/framework/browse/ParcelBrowseNode.java376
1 files changed, 376 insertions, 0 deletions
diff --git a/scripting/java/com/sun/star/script/framework/browse/ParcelBrowseNode.java b/scripting/java/com/sun/star/script/framework/browse/ParcelBrowseNode.java
new file mode 100644
index 000000000000..974b001d5d35
--- /dev/null
+++ b/scripting/java/com/sun/star/script/framework/browse/ParcelBrowseNode.java
@@ -0,0 +1,376 @@
+/*************************************************************************
+ *
+ * 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.beans.XIntrospectionAccess;
+
+import com.sun.star.lib.uno.helper.PropertySet;
+
+import com.sun.star.uno.UnoRuntime;
+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.lang.XMultiComponentFactory;
+
+
+import com.sun.star.script.XInvocation;
+
+import com.sun.star.ucb.XSimpleFileAccess;
+
+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.LogUtils;
+import com.sun.star.script.framework.container.ScriptMetaData;
+import com.sun.star.script.framework.container.ScriptEntry;
+import com.sun.star.script.framework.container.Parcel;
+import com.sun.star.script.framework.container.ParcelContainer;
+import com.sun.star.script.framework.browse.DialogFactory;
+
+import java.util.*;
+import javax.swing.JOptionPane;
+
+public class ParcelBrowseNode extends PropertySet
+ implements XBrowseNode, XInvocation
+{
+ private ScriptProvider provider;
+ //private RootBrowseNode parent;
+ private Collection browsenodes;
+ private String name;
+ private ParcelContainer container;
+ private Parcel parcel;
+ public boolean deletable = true;
+ public boolean editable = false;
+ public boolean creatable = false;
+ public boolean renamable = true;
+
+ public ParcelBrowseNode( ScriptProvider provider, ParcelContainer container, String parcelName ) {
+ this.provider = provider;
+ this.name = parcelName;
+ this.container = container;
+
+ // TODO decide whether exception is propagated out or not
+ try
+ {
+ this.parcel = (Parcel)this.container.getByName( parcelName );
+ }
+ catch ( Exception e )
+ {
+
+ LogUtils.DEBUG("** Exception: " + e );
+ LogUtils.DEBUG(" ** Failed to get parcel named " +
+ parcelName + " from container" );
+ }
+ registerProperty("Deletable", new Type(boolean.class),
+ (short)0, "deletable");
+ registerProperty("Editable", new Type(boolean.class),
+ (short)0, "editable");
+ registerProperty("Creatable", new Type(boolean.class),
+ (short)0, "creatable");
+ registerProperty("Renamable", new Type(boolean.class),
+ (short)0, "renamable");
+ if (provider.hasScriptEditor() == true)
+ {
+ this.creatable = true;
+ }
+
+ String parcelDirUrl = parcel.getPathToParcel();
+ XComponentContext xCtx = provider.getScriptingContext().getComponentContext();
+ XMultiComponentFactory xFac = xCtx.getServiceManager();
+ try
+ {
+ XSimpleFileAccess xSFA = ( XSimpleFileAccess)
+ UnoRuntime.queryInterface( XSimpleFileAccess.class,
+ xFac.createInstanceWithContext(
+ "com.sun.star.ucb.SimpleFileAccess",
+ xCtx ) );
+ if ( xSFA != null && ( xSFA.isReadOnly( parcelDirUrl ) ||
+ container.isUnoPkg() ) )
+ {
+ deletable = false;
+ editable = false;
+ creatable = false;
+ renamable = false;
+ }
+ }
+ catch ( com.sun.star.uno.Exception e )
+ {
+ // TODO propagate potential errors
+ // Pthrow new com.sun.star.uno.RuntimeException( e.toString() );
+ LogUtils.DEBUG( "Caught exception creating ParcelBrowseNode " + e );
+ LogUtils.DEBUG( LogUtils.getTrace( e ) );
+ }
+
+ }
+
+ public String getName() {
+ return parcel.getName();
+ }
+
+ public XBrowseNode[] getChildNodes() {
+ try
+ {
+
+ if ( hasChildNodes() )
+ {
+ String[] names = parcel.getElementNames();
+ browsenodes = new ArrayList( names.length );
+
+ for ( int index = 0; index < names.length; index++ )
+ {
+ browsenodes.add( new ScriptBrowseNode( provider, parcel, names[ index ] ));
+ }
+ }
+ else
+ {
+ LogUtils.DEBUG("ParcelBrowseNode.getChildeNodes no children " );
+ return new XBrowseNode[0];
+ }
+ }
+ catch ( Exception e )
+ {
+ LogUtils.DEBUG("Failed to getChildeNodes, exception: " + e );
+ LogUtils.DEBUG( LogUtils.getTrace( e ) );
+ return new XBrowseNode[0];
+ }
+ return (XBrowseNode[])browsenodes.toArray(new XBrowseNode[0]);
+ }
+
+ public boolean hasChildNodes() {
+ if ( container != null && container.hasByName( getName() ) && parcel != null )
+ {
+ return parcel.hasElements();
+ }
+
+ return false;
+ }
+
+ 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
+ {
+ LogUtils.DEBUG("ParcelBrowseNode invoke for " + aFunctionName );
+ // 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 newName;
+
+ if (aParams == null || aParams.length < 1 ||
+ AnyConverter.isString(aParams[0]) == false)
+ {
+ String prompt = "Enter name for new Script";
+ String title = "Create Script";
+
+ // try to get a DialogFactory instance, if it fails
+ // just use a Swing JOptionPane to prompt for the name
+ try
+ {
+ DialogFactory dialogFactory =
+ DialogFactory.getDialogFactory();
+
+ newName = dialogFactory.showInputDialog(title, prompt);
+ }
+ catch (Exception e)
+ {
+ newName = JOptionPane.showInputDialog(null, prompt, title,
+ JOptionPane.QUESTION_MESSAGE);
+ }
+ }
+ else {
+ newName = (String) AnyConverter.toString(aParams[0]);
+ }
+
+ if ( newName == null || newName.equals(""))
+ {
+ result = new Any(new Type(Boolean.class), Boolean.FALSE);
+ }
+ else
+ {
+ String source = new String(provider.getScriptEditor().getTemplate().getBytes());
+ String languageName = newName + "." + provider.getScriptEditor().getExtension();
+ String language = container.getLanguage();
+
+ ScriptEntry entry = new ScriptEntry( language, languageName, languageName, "", new HashMap() );
+
+ Parcel parcel = (Parcel)container.getByName( getName() );
+ ScriptMetaData data = new ScriptMetaData( parcel, entry, source );
+ parcel.insertByName( languageName, data );
+
+ ScriptBrowseNode sbn = new ScriptBrowseNode( provider, parcel, languageName );
+
+ if(browsenodes==null)
+ {
+ LogUtils.DEBUG("browsenodes null!!");
+ browsenodes = new ArrayList(4);
+ }
+ browsenodes.add(sbn);
+
+ result = new Any(new Type(XBrowseNode.class), sbn);
+ }
+ }
+ catch (Exception e)
+ {
+ LogUtils.DEBUG("ParcelBrowseNode[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 if (aFunctionName.equals("Deletable"))
+ {
+ try
+ {
+ if ( container.deleteParcel(getName()) )
+ {
+ result = new Any(new Type(Boolean.class), Boolean.TRUE);
+ }
+ else
+ {
+ result = new Any(new Type(Boolean.class), Boolean.FALSE);
+ }
+ }
+ catch (Exception e)
+ {
+ result = new Any(new Type(Boolean.class), Boolean.FALSE);
+
+ // throw new com.sun.star.reflection.InvocationTargetException(
+ // "Error deleting parcel: " + e.getMessage());
+ }
+ }
+ else if (aFunctionName.equals("Renamable"))
+ {
+ String newName = null;
+ try
+ {
+
+ if (aParams == null || aParams.length < 1 ||
+ AnyConverter.isString(aParams[0]) == false)
+ {
+ String prompt = "Enter new name for Library";
+ String title = "Rename Library";
+
+ // try to get a DialogFactory instance, if it fails
+ // just use a Swing JOptionPane to prompt for the name
+ try
+ {
+ DialogFactory dialogFactory =
+ DialogFactory.getDialogFactory();
+
+ newName = dialogFactory.showInputDialog(title, prompt);
+ }
+ catch (Exception e)
+ {
+ newName = JOptionPane.showInputDialog(null, prompt, title,
+ JOptionPane.QUESTION_MESSAGE);
+ }
+ }
+ else {
+ newName = (String) AnyConverter.toString(aParams[0]);
+ }
+ container.renameParcel( getName(), newName );
+ Parcel p = (Parcel)container.getByName( newName );
+ if(browsenodes == null )
+ {
+ getChildNodes();
+ }
+ ScriptBrowseNode[] childNodes = (ScriptBrowseNode[])browsenodes.toArray(new ScriptBrowseNode[0]);
+
+ for ( int index = 0; index < childNodes.length; index++ )
+ {
+ childNodes[ index ].updateURI( p );
+ }
+ result = new Any(new Type(XBrowseNode.class), this);
+ }
+ catch (Exception e)
+ {
+ result = new Any(new Type(Boolean.class), Boolean.FALSE);
+
+ // throw new com.sun.star.reflection.InvocationTargetException(
+ // "Error renaming parcel: " + 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;
+ }
+}