| /************************************************************** |
| * |
| * 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; |
| } |
| } |