blob: c4aef399dbcbbc40e2feb7c1b962a20bfd7b03de [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the 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;
}
}