| /************************************************************** |
| * |
| * 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.security; |
| |
| import com.sun.star.awt.ActionEvent; |
| import com.sun.star.awt.ItemEvent; |
| import com.sun.star.awt.XItemListener; |
| import com.sun.star.awt.XButton; |
| import com.sun.star.awt.XCheckBox; |
| import com.sun.star.awt.XControl; |
| import com.sun.star.awt.XControlModel; |
| import com.sun.star.awt.XControlContainer; |
| import com.sun.star.awt.XDialog; |
| import com.sun.star.awt.XToolkit; |
| import com.sun.star.awt.XWindow; |
| |
| import com.sun.star.beans.XPropertySet; |
| import com.sun.star.comp.loader.FactoryHelper; |
| import com.sun.star.container.XNameContainer; |
| import com.sun.star.lang.XComponent; |
| import com.sun.star.lang.EventObject; |
| import com.sun.star.lang.XMultiComponentFactory; |
| import com.sun.star.lang.XMultiServiceFactory; |
| import com.sun.star.lang.XSingleServiceFactory; |
| import com.sun.star.lang.XServiceInfo; |
| import com.sun.star.lang.XInitialization; |
| import com.sun.star.lang.IllegalArgumentException; |
| import com.sun.star.lib.uno.helper.WeakBase; |
| import com.sun.star.registry.XRegistryKey; |
| import com.sun.star.uno.UnoRuntime; |
| import com.sun.star.uno.AnyConverter; |
| import com.sun.star.uno.RuntimeException; |
| import com.sun.star.uno.XComponentContext; |
| |
| import com.sun.star.script.framework.log.LogUtils; |
| |
| public class SecurityDialog extends WeakBase implements XComponent, XServiceInfo, XDialog, |
| XInitialization { |
| |
| static final String __serviceName = "com.sun.star.script.framework.security.SecurityDialog"; |
| |
| private static final String _label1Name = "Label1"; |
| private static final String _label1String = "This document contains macros. Do you want to allow these macros to be run?"; |
| |
| private static final String _label2Name = "Label2"; |
| private static final String _label2String = "This document contains macros. According to the security settings, the"; |
| private static final String _label3Name = "Label3"; |
| private static final String _label3String = "macros in this document should not be run. Do you want to run them"; |
| private static final String _label4Name = "Label4"; |
| private static final String _label4String = "anyway?"; |
| |
| private static final String _checkBoxName = "CheckBox"; |
| private static final String _checkBoxString = "Add this directory to the list of secure paths: "; |
| private static final String _label5Name = "Label5"; |
| |
| private static final String _title = "Run Macro"; |
| private static final String _runMacro = "Run"; |
| private static final String _runButtonName = "Run"; |
| private static final String _doNotRunMacro = "Do Not Run"; |
| private static final String _doNotRunButtonName = "DoNotRun"; |
| |
| private static final int dialogX = 100; |
| private static final int dialogY = 100; |
| private static final int dialogW = 235; |
| private static final int dialogH = 47; |
| |
| private int cbIncrW = -20; |
| private int cbIncrH = 19; |
| |
| private static final int runButtonW = 40; |
| private static final int runButtonH = 13; |
| private static final int doNotRunButtonW = 40; |
| private static final int doNotRunButtonH = 13; |
| |
| // label for warning dialog |
| private static final int label1X = 20; |
| private static final int label1Y = 9; |
| private static final int label1W = 210; |
| private static final int label1H = 10; |
| |
| // labels for confirmation dialog |
| private static final int label2X = 22; |
| private static final int label2Y = 7; |
| private static final int label2W = 210; |
| private static final int label2H = 8; |
| private static final int label3X = 22; |
| private static final int label3Y = 15; |
| private static final int label3W = 210; |
| private static final int label3H = 8; |
| private static final int label4X = 22; |
| private static final int label4Y = 23; |
| private static final int label4W = 210; |
| private static final int label4H = 8; |
| |
| // checkbox for confirmation dialog |
| private static final int checkBoxX = 22; |
| private static final int checkBoxY = 40; |
| private static final int checkBoxW = 210; |
| private static final int checkBoxH = 9; |
| // extra label if path longer than 21 chars |
| private static final int label5X = 22; |
| private static final int label5Y = 48; |
| private static final int label5W = 210; |
| private static final int label5H = 9; |
| |
| private boolean checkBoxDialog; |
| private short _checkBoxState = 0; |
| private boolean extraPathLine=false; |
| private String checkBoxPath=""; |
| private String checkBoxPath2=""; |
| private static final int lineWrapLength = 21; |
| private static final int lineWrapH = 12; |
| private String _pushed = _doNotRunButtonName; |
| |
| private XComponentContext _xComponentContext; |
| private XDialog _xDialog; |
| |
| public SecurityDialog( XComponentContext xComponentContext ) |
| { |
| LogUtils.DEBUG( "SecurityDialog ctor" ); |
| _xComponentContext = xComponentContext; |
| } |
| |
| public void initialize( Object[] args ) throws RuntimeException |
| { |
| LogUtils.DEBUG( "SecurityDialog init" ); |
| // figure out if we need a checkbox |
| if ( args.length == 1 && AnyConverter.isString( args[0] ) ) |
| { |
| //check args is a path |
| // set checkBoxPath with the arg |
| LogUtils.DEBUG( "checkbox" ); |
| try |
| { |
| checkBoxPath = AnyConverter.toString( args[0] ); |
| } |
| catch ( IllegalArgumentException e ) |
| { |
| throw new RuntimeException( "SecurityDialog::initialize: " + e.getMessage() ); |
| } |
| LogUtils.DEBUG( "path: " + checkBoxPath ); |
| checkBoxDialog = true; |
| if( checkBoxPath.length() > lineWrapLength ) |
| { |
| extraPathLine = true; |
| cbIncrH += lineWrapH; |
| checkBoxPath2 = checkBoxPath.substring( lineWrapLength ); |
| checkBoxPath = checkBoxPath.substring( 0, lineWrapLength ); |
| } |
| |
| } |
| else |
| { |
| LogUtils.DEBUG( "no checkbox: # of args=" + |
| args.length ); |
| cbIncrW = 0; |
| cbIncrH = 0; |
| checkBoxDialog = false; |
| } |
| |
| // now try and create the dialog |
| try |
| { |
| _xDialog = createDialog(); |
| } |
| catch ( com.sun.star.uno.Exception e ) |
| { |
| LogUtils.DEBUG( "Couldn't create dialog" ); |
| LogUtils.DEBUG( "uno message: " + e.getMessage()); |
| throw new RuntimeException( e.getMessage() ); |
| } |
| catch ( Exception e ) |
| { |
| LogUtils.DEBUG( "Couldn't create dialog" ); |
| LogUtils.DEBUG( "message: " + e.getMessage()); |
| throw new RuntimeException( e.getMessage() ); |
| } |
| |
| } |
| |
| // static component operations |
| public static XSingleServiceFactory __getServiceFactory( String implName, |
| XMultiServiceFactory multiFactory, |
| XRegistryKey regKey ) { |
| XSingleServiceFactory xSingleServiceFactory = null; |
| if ( implName.equals( SecurityDialog.class.getName() ) ) { |
| xSingleServiceFactory = FactoryHelper.getServiceFactory( |
| SecurityDialog.class, SecurityDialog.__serviceName, multiFactory, regKey ); |
| } |
| return xSingleServiceFactory; |
| } |
| |
| // XServiceInfo |
| public String getImplementationName( ) { |
| return getClass().getName(); |
| } |
| |
| // XServiceInfo |
| public boolean supportsService( /*IN*/String serviceName ) { |
| if ( serviceName.equals( __serviceName)) |
| return true; |
| return false; |
| } |
| |
| // XServiceInfo |
| public String[] getSupportedServiceNames( ) { |
| String[] retValue= new String[0]; |
| retValue[0] = __serviceName; |
| return retValue; |
| } |
| |
| |
| /** method for creating a dialog at runtime |
| */ |
| private XDialog createDialog() throws com.sun.star.uno.Exception { |
| |
| // get the service manager from the component context |
| XMultiComponentFactory xMultiComponentFactory = _xComponentContext.getServiceManager(); |
| |
| // create the dialog model and set the properties |
| Object dialogModel = xMultiComponentFactory.createInstanceWithContext( |
| "com.sun.star.awt.UnoControlDialogModel", _xComponentContext ); |
| XPropertySet xPSetDialog = ( XPropertySet )UnoRuntime.queryInterface( |
| XPropertySet.class, dialogModel ); |
| xPSetDialog.setPropertyValue( "PositionX", new Integer( dialogX) ); |
| xPSetDialog.setPropertyValue( "PositionY", new Integer( dialogY)); |
| xPSetDialog.setPropertyValue( "Width", new Integer( dialogW+cbIncrW )); |
| xPSetDialog.setPropertyValue( "Height", new Integer( dialogH+cbIncrH )); |
| xPSetDialog.setPropertyValue( "Title", _title ); |
| |
| // get the service manager from the dialog model |
| XMultiServiceFactory xMultiServiceFactory = ( XMultiServiceFactory )UnoRuntime.queryInterface( |
| XMultiServiceFactory.class, dialogModel ); |
| |
| // create the Run Macro button model and set the properties |
| Object runButtonModel = xMultiServiceFactory.createInstance( |
| "com.sun.star.awt.UnoControlButtonModel" ); |
| XPropertySet xPSetButton = ( XPropertySet )UnoRuntime.queryInterface( |
| XPropertySet.class, runButtonModel ); |
| LogUtils.DEBUG("run: x="+(((dialogW+cbIncrW)/2)-runButtonW -1) ); |
| LogUtils.DEBUG("run: y="+(dialogH+cbIncrH-runButtonH-1)); |
| xPSetButton.setPropertyValue( "PositionX", new Integer( (((dialogW+cbIncrW)/2)-runButtonW -1) )); |
| xPSetButton.setPropertyValue( "PositionY", new Integer( dialogH+cbIncrH-runButtonH-1)); |
| xPSetButton.setPropertyValue( "Width", new Integer( runButtonW )); |
| xPSetButton.setPropertyValue( "Height", new Integer( runButtonH )); |
| xPSetButton.setPropertyValue( "Name", _runButtonName ); |
| xPSetButton.setPropertyValue( "TabIndex", new Short( (short)1 ) ); |
| xPSetButton.setPropertyValue( "Label", _runMacro ); |
| |
| // create the Dont Run Macro button model and set the properties |
| Object doNotRunButtonModel = xMultiServiceFactory.createInstance( |
| "com.sun.star.awt.UnoControlButtonModel" ); |
| xPSetButton = ( XPropertySet )UnoRuntime.queryInterface( |
| XPropertySet.class, doNotRunButtonModel ); |
| LogUtils.DEBUG("dontrun: x="+(((dialogW+cbIncrW)/2)-1) ); |
| LogUtils.DEBUG("dontrun: y="+(dialogH+cbIncrH-doNotRunButtonH-1 )); |
| xPSetButton.setPropertyValue( "PositionX", new Integer( (((dialogW+cbIncrW)/2) + 1) )); |
| xPSetButton.setPropertyValue( "PositionY", new Integer( (dialogH+cbIncrH-doNotRunButtonH-1 ) )); |
| xPSetButton.setPropertyValue( "Width", new Integer( doNotRunButtonW )); |
| xPSetButton.setPropertyValue( "Height", new Integer( doNotRunButtonH )); |
| xPSetButton.setPropertyValue( "Name", _doNotRunButtonName ); |
| xPSetButton.setPropertyValue( "TabIndex", new Short( (short)0 ) ); |
| xPSetButton.setPropertyValue( "Label", _doNotRunMacro ); |
| |
| // insert the control models into the dialog model |
| XNameContainer xNameCont = ( XNameContainer )UnoRuntime.queryInterface( |
| XNameContainer.class, dialogModel ); |
| xNameCont.insertByName( _runButtonName, runButtonModel ); |
| xNameCont.insertByName( _doNotRunButtonName, doNotRunButtonModel ); |
| |
| if ( checkBoxDialog ) |
| { |
| LogUtils.DEBUG("creating label & checkbox"); |
| // create the label model and set the properties |
| Object label2Model = xMultiServiceFactory.createInstance( |
| "com.sun.star.awt.UnoControlFixedTextModel" ); |
| XPropertySet xPSetLabel = ( XPropertySet )UnoRuntime.queryInterface( |
| XPropertySet.class, label2Model ); |
| xPSetLabel.setPropertyValue( "PositionX", new Integer( label2X )); |
| xPSetLabel.setPropertyValue( "PositionY", new Integer( label2Y )); |
| xPSetLabel.setPropertyValue( "Width", new Integer( label2W )); |
| xPSetLabel.setPropertyValue( "Height", new Integer( label2H )); |
| xPSetLabel.setPropertyValue( "Name", _label2Name ); |
| xPSetLabel.setPropertyValue( "TabIndex", new Short( (short)1 ) ); |
| xPSetLabel.setPropertyValue( "Label", _label2String ); |
| |
| // create the label model and set the properties |
| Object label3Model = xMultiServiceFactory.createInstance( |
| "com.sun.star.awt.UnoControlFixedTextModel" ); |
| XPropertySet xPSetLabel3 = ( XPropertySet )UnoRuntime.queryInterface( |
| XPropertySet.class, label3Model ); |
| xPSetLabel3.setPropertyValue( "PositionX", new Integer( label3X )); |
| xPSetLabel3.setPropertyValue( "PositionY", new Integer( label3Y )); |
| xPSetLabel3.setPropertyValue( "Width", new Integer( label3W )); |
| xPSetLabel3.setPropertyValue( "Height", new Integer( label3H )); |
| xPSetLabel3.setPropertyValue( "Name", _label3Name ); |
| xPSetLabel3.setPropertyValue( "TabIndex", new Short( (short)1 ) ); |
| xPSetLabel3.setPropertyValue( "Label", _label3String ); |
| |
| // create the label model and set the properties |
| Object label4Model = xMultiServiceFactory.createInstance( |
| "com.sun.star.awt.UnoControlFixedTextModel" ); |
| XPropertySet xPSetLabel4 = ( XPropertySet )UnoRuntime.queryInterface( |
| XPropertySet.class, label4Model ); |
| xPSetLabel4.setPropertyValue( "PositionX", new Integer( label4X )); |
| xPSetLabel4.setPropertyValue( "PositionY", new Integer( label4Y )); |
| xPSetLabel4.setPropertyValue( "Width", new Integer( label4W )); |
| xPSetLabel4.setPropertyValue( "Height", new Integer( label4H )); |
| xPSetLabel4.setPropertyValue( "Name", _label4Name ); |
| xPSetLabel4.setPropertyValue( "TabIndex", new Short( (short)1 ) ); |
| xPSetLabel4.setPropertyValue( "Label", _label4String ); |
| |
| // create the checkbox model and set the properties |
| Object checkBoxModel = xMultiServiceFactory.createInstance( |
| "com.sun.star.awt.UnoControlCheckBoxModel" ); |
| XPropertySet xPSetCheckBox = ( XPropertySet )UnoRuntime.queryInterface( |
| XPropertySet.class, checkBoxModel ); |
| xPSetCheckBox.setPropertyValue( "PositionX", new Integer( checkBoxX )); |
| xPSetCheckBox.setPropertyValue( "PositionY", new Integer( checkBoxY )); |
| xPSetCheckBox.setPropertyValue( "Width", new Integer( checkBoxW )); |
| xPSetCheckBox.setPropertyValue( "Height", new Integer( checkBoxH )); |
| xPSetCheckBox.setPropertyValue( "State", new Short((short)0) ); |
| xPSetCheckBox.setPropertyValue( "Name", _checkBoxName ); |
| xPSetCheckBox.setPropertyValue( "TabIndex", new Short( (short)1 ) ); |
| xPSetCheckBox.setPropertyValue( "Label", new String(_checkBoxString +checkBoxPath) ); |
| |
| // insert the control models into the dialog model |
| xNameCont.insertByName( _label2Name, label2Model ); |
| xNameCont.insertByName( _label3Name, label3Model ); |
| xNameCont.insertByName( _label4Name, label4Model ); |
| xNameCont.insertByName( _checkBoxName, checkBoxModel ); |
| |
| if ( extraPathLine == true ) |
| { |
| // create the label model and set the properties |
| Object label5Model = xMultiServiceFactory.createInstance( |
| "com.sun.star.awt.UnoControlFixedTextModel" ); |
| XPropertySet xPSetLabel5 = ( XPropertySet )UnoRuntime.queryInterface( |
| XPropertySet.class, label5Model ); |
| xPSetLabel5.setPropertyValue( "PositionX", new Integer( label5X )); |
| xPSetLabel5.setPropertyValue( "PositionY", new Integer( label5Y )); |
| xPSetLabel5.setPropertyValue( "Width", new Integer( label5W )); |
| xPSetLabel5.setPropertyValue( "Height", new Integer( label5H )); |
| xPSetLabel5.setPropertyValue( "Name", _label5Name ); |
| xPSetLabel5.setPropertyValue( "TabIndex", new Short( (short)1 ) ); |
| xPSetLabel5.setPropertyValue( "Label", checkBoxPath2 ); |
| xNameCont.insertByName( _label5Name, label5Model ); |
| } |
| } |
| else |
| { |
| // create the label model and set the properties |
| Object labelModel = xMultiServiceFactory.createInstance( |
| "com.sun.star.awt.UnoControlFixedTextModel" ); |
| XPropertySet xPSetLabel = ( XPropertySet )UnoRuntime.queryInterface( |
| XPropertySet.class, labelModel ); |
| xPSetLabel.setPropertyValue( "PositionX", new Integer( label1X )); |
| xPSetLabel.setPropertyValue( "PositionY", new Integer( label1Y )); |
| xPSetLabel.setPropertyValue( "Width", new Integer( label1W )); |
| xPSetLabel.setPropertyValue( "Height", new Integer( label1H )); |
| xPSetLabel.setPropertyValue( "Name", _label1Name ); |
| xPSetLabel.setPropertyValue( "TabIndex", new Short( (short)1 ) ); |
| xPSetLabel.setPropertyValue( "Label", _label1String ); |
| |
| // insert the control models into the dialog model |
| xNameCont.insertByName( _label1Name, labelModel ); |
| } |
| |
| // create the dialog control and set the model |
| Object dialog = xMultiComponentFactory.createInstanceWithContext( |
| "com.sun.star.awt.UnoControlDialog", _xComponentContext ); |
| XControl xControl = ( XControl )UnoRuntime.queryInterface( |
| XControl.class, dialog ); |
| XControlModel xControlModel = ( XControlModel )UnoRuntime.queryInterface( |
| XControlModel.class, dialogModel ); |
| xControl.setModel( xControlModel ); |
| |
| // add an action listener to the button control |
| XControlContainer xControlCont = ( XControlContainer )UnoRuntime.queryInterface( |
| XControlContainer.class, dialog ); |
| |
| // Add to yes button |
| Object objectButton = xControlCont.getControl( _runButtonName ); |
| XButton xButton = ( XButton )UnoRuntime.queryInterface( |
| XButton.class, objectButton ); |
| xButton.addActionListener( new ActionListenerImpl( xControlCont, _runButtonName ) ); |
| |
| // add to no button |
| objectButton = xControlCont.getControl( _doNotRunButtonName ); |
| xButton = ( XButton )UnoRuntime.queryInterface( |
| XButton.class, objectButton ); |
| xButton.addActionListener( new ActionListenerImpl( xControlCont, _doNotRunButtonName ) ); |
| |
| if ( checkBoxDialog ) |
| { |
| // add to checkbox |
| Object objectCheckBox = xControlCont.getControl( _checkBoxName ); |
| XCheckBox xCheckBox = ( XCheckBox )UnoRuntime.queryInterface( |
| XCheckBox.class, objectCheckBox ); |
| xCheckBox.addItemListener((XItemListener) new ItemListenerImpl( xControlCont ) ); |
| } |
| |
| // create a peer |
| Object toolkit = xMultiComponentFactory.createInstanceWithContext( |
| "com.sun.star.awt.ExtToolkit", _xComponentContext ); |
| XToolkit xToolkit = ( XToolkit )UnoRuntime.queryInterface( |
| XToolkit.class, toolkit ); |
| XWindow xWindow = ( XWindow )UnoRuntime.queryInterface( |
| XWindow.class, xControl ); |
| xWindow.setVisible( false ); |
| xControl.createPeer( xToolkit, null ); |
| |
| // return the dialog |
| XDialog xDialog = ( XDialog )UnoRuntime.queryInterface( |
| XDialog.class, dialog ); |
| return xDialog; |
| } |
| public short execute() |
| { |
| |
| short result = 0; |
| _pushed = _doNotRunButtonName; |
| LogUtils.DEBUG("*DF* Before execute " ); |
| _xDialog.execute(); |
| LogUtils.DEBUG("*DF* After execute " ); |
| |
| if ( _pushed.equals( _runButtonName ) ) |
| { |
| result += 1; |
| } |
| if ( _checkBoxState == 1 ) |
| { |
| result +=2; |
| } |
| return result; |
| } |
| |
| public void endExecute() |
| { |
| _xDialog.endExecute(); |
| } |
| |
| public String getTitle() |
| { |
| return _xDialog.getTitle(); |
| } |
| |
| public void setTitle( String Title ) |
| { |
| _xDialog.setTitle( Title ); |
| } |
| |
| public void dispose () |
| { |
| XComponent xComponent = ( XComponent )UnoRuntime.queryInterface( |
| XComponent.class, _xDialog ); |
| xComponent.dispose(); |
| } |
| |
| public void addEventListener ( com.sun.star.lang.XEventListener xListener ) |
| { |
| XComponent xComponent = ( XComponent )UnoRuntime.queryInterface( |
| XComponent.class, _xDialog ); |
| xComponent.addEventListener( xListener ); |
| } |
| |
| |
| public void removeEventListener ( com.sun.star.lang.XEventListener aListener ) |
| { |
| XComponent xComponent = ( XComponent )UnoRuntime.queryInterface( |
| XComponent.class, _xDialog ); |
| xComponent.removeEventListener( aListener ); |
| } |
| |
| public class ActionListenerImpl implements com.sun.star.awt.XActionListener { |
| private XControlContainer _xControlCont; |
| private String _buttonName; |
| public ActionListenerImpl( XControlContainer xControlCont, String buttonName ) { |
| _xControlCont = xControlCont; |
| _buttonName = buttonName; |
| } |
| |
| // XEventListener |
| public void disposing( EventObject eventObject ) { |
| _xControlCont = null; |
| } |
| |
| // XActionListener |
| public void actionPerformed( ActionEvent actionEvent ) { |
| _pushed = _buttonName; |
| LogUtils.DEBUG("** Button pushed ->" + _pushed ); |
| |
| _xDialog.endExecute(); |
| } |
| } |
| |
| public class ItemListenerImpl implements com.sun.star.awt.XItemListener { |
| private XCheckBox _xCheckBox; |
| public ItemListenerImpl( XControlContainer xControlCont ) { |
| Object objectCheckBox = xControlCont.getControl( _checkBoxName ); |
| _xCheckBox = ( XCheckBox )UnoRuntime.queryInterface( |
| XCheckBox.class, objectCheckBox ); |
| } |
| |
| // XEventListener |
| public void disposing( EventObject eventObject ) { |
| _xCheckBox = null; |
| } |
| |
| // XAdjustmentListener |
| public void itemStateChanged( ItemEvent itemEvent ) { |
| _checkBoxState = _xCheckBox.getState(); |
| LogUtils.DEBUG("** checkbox state ->" + _checkBoxState ); |
| } |
| } |
| } |