| /************************************************************** |
| * |
| * 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.wizards.common; |
| |
| import com.sun.star.lang.XMultiServiceFactory; |
| import com.sun.star.ui.dialogs.*; |
| import com.sun.star.uno.XInterface; |
| import com.sun.star.uno.UnoRuntime; |
| import com.sun.star.uno.AnyConverter; |
| import com.sun.star.util.XStringSubstitution; |
| import com.sun.star.lang.XComponent; |
| import com.sun.star.lang.XInitialization; |
| import com.sun.star.frame.XFrame; |
| import com.sun.star.awt.XWindowPeer; |
| import com.sun.star.awt.XToolkit; |
| import com.sun.star.awt.XMessageBox; |
| import com.sun.star.beans.PropertyValue; |
| |
| public class SystemDialog |
| { |
| |
| Object systemDialog; |
| XFilePicker xFilePicker; |
| XFolderPicker xFolderPicker; |
| XFilterManager xFilterManager; |
| XInitialization xInitialize; |
| XExecutableDialog xExecutable; |
| XComponent xComponent; |
| XFilePickerControlAccess xFilePickerControlAccess; |
| XMultiServiceFactory xMSF; |
| public XStringSubstitution xStringSubstitution; |
| public String sStorePath; |
| |
| /** |
| * |
| * @param xMSF |
| * @param ServiceName |
| * @param type according to com.sun.star.ui.dialogs.TemplateDescription |
| */ |
| public SystemDialog(XMultiServiceFactory xMSF, String ServiceName, short type) |
| { |
| try |
| { |
| this.xMSF = xMSF; |
| systemDialog = xMSF.createInstance(ServiceName); |
| xFilePicker = UnoRuntime.queryInterface(XFilePicker.class, systemDialog); |
| xFolderPicker = UnoRuntime.queryInterface(XFolderPicker.class, systemDialog); |
| xFilterManager = UnoRuntime.queryInterface(XFilterManager.class, systemDialog); |
| xInitialize = UnoRuntime.queryInterface(XInitialization.class, systemDialog); |
| xExecutable = UnoRuntime.queryInterface(XExecutableDialog.class, systemDialog); |
| xComponent = UnoRuntime.queryInterface(XComponent.class, systemDialog); |
| xFilePickerControlAccess = UnoRuntime.queryInterface(XFilePickerControlAccess.class, systemDialog); |
| xStringSubstitution = createStringSubstitution(xMSF); |
| Short[] listAny = new Short[] |
| { |
| new Short(type) |
| }; |
| if (xInitialize != null) |
| { |
| xInitialize.initialize(listAny); |
| } |
| } |
| catch (com.sun.star.uno.Exception exception) |
| { |
| exception.printStackTrace(); |
| } |
| } |
| |
| public static SystemDialog createStoreDialog(XMultiServiceFactory xmsf) |
| { |
| return new SystemDialog(xmsf, "com.sun.star.ui.dialogs.FilePicker", TemplateDescription.FILESAVE_AUTOEXTENSION); |
| } |
| |
| public static SystemDialog createOpenDialog(XMultiServiceFactory xmsf) |
| { |
| return new SystemDialog(xmsf, "com.sun.star.ui.dialogs.FilePicker", TemplateDescription.FILEOPEN_SIMPLE); |
| } |
| |
| public static SystemDialog createFolderDialog(XMultiServiceFactory xmsf) |
| { |
| return new SystemDialog(xmsf, "com.sun.star.ui.dialogs.FolderPicker", (short) 0); |
| } |
| |
| public static SystemDialog createOfficeFolderDialog(XMultiServiceFactory xmsf) |
| { |
| return new SystemDialog(xmsf, "com.sun.star.ui.dialogs.OfficeFolderPicker", (short) 0); |
| } |
| |
| private String subst(String path) |
| { |
| try |
| { |
| return xStringSubstitution.substituteVariables(path, false); |
| } |
| catch (Exception ex) |
| { |
| ex.printStackTrace(); |
| return path; |
| } |
| } |
| |
| /** |
| * ATTENTION a BUG : The extension calculated |
| * here gives the last 3 chars of the filename - what |
| * if the extension is of 4 or more chars? |
| * |
| * @param DisplayDirectory |
| * @param DefaultName |
| * @param sDocuType |
| * @return |
| */ |
| public String callStoreDialog(String DisplayDirectory, String DefaultName, String sDocuType) |
| { |
| String sExtension = DefaultName.substring(DefaultName.length() - 3, DefaultName.length()); |
| addFilterToDialog(sExtension, sDocuType, true); |
| return callStoreDialog(DisplayDirectory, DefaultName); |
| } |
| |
| /** |
| * |
| * @param displayDir |
| * @param defaultName |
| * given url to a local path. |
| * @return |
| */ |
| public String callStoreDialog(String displayDir, String defaultName) |
| { |
| sStorePath = null; |
| try |
| { |
| xFilePickerControlAccess.setValue(com.sun.star.ui.dialogs.ExtendedFilePickerElementIds.CHECKBOX_AUTOEXTENSION, (short) 0, Boolean.TRUE); |
| xFilePicker.setDefaultName(defaultName); |
| xFilePicker.setDisplayDirectory(subst(displayDir)); |
| if (execute(xExecutable)) |
| { |
| String[] sPathList = xFilePicker.getFiles(); |
| sStorePath = sPathList[0]; |
| } |
| } |
| catch (com.sun.star.uno.Exception exception) |
| { |
| exception.printStackTrace(); |
| } |
| return sStorePath; |
| } |
| |
| public String callFolderDialog(String title, String description, String displayDir) |
| { |
| try |
| { |
| xFolderPicker.setDisplayDirectory(subst(displayDir)); |
| } |
| catch (com.sun.star.lang.IllegalArgumentException iae) |
| { |
| iae.printStackTrace(); |
| throw new IllegalArgumentException(iae.getMessage()); |
| } |
| xFolderPicker.setTitle(title); |
| xFolderPicker.setDescription(description); |
| if (execute(xFolderPicker)) |
| { |
| return xFolderPicker.getDirectory(); |
| } |
| else |
| { |
| return null; |
| } |
| } |
| |
| private boolean execute(XExecutableDialog execDialog) |
| { |
| return execDialog.execute() == 1; |
| } |
| |
| public String[] callOpenDialog(boolean multiSelect, String displayDirectory) |
| { |
| |
| try |
| { |
| xFilePicker.setMultiSelectionMode(multiSelect); |
| xFilePicker.setDisplayDirectory(subst(displayDirectory)); |
| if (execute(xExecutable)) |
| { |
| return xFilePicker.getFiles(); |
| } |
| } |
| catch (com.sun.star.uno.Exception exception) |
| { |
| exception.printStackTrace(); |
| } |
| return null; |
| } |
| |
| //("writer_StarOffice_XML_Writer_Template") 'StarOffice XML (Writer) |
| public void addFilterToDialog(String sExtension, String filterName, boolean setToDefault) |
| { |
| try |
| { |
| //get the localized filtername |
| String uiName = getFilterUIName(filterName); |
| String pattern = "*." + sExtension; |
| |
| //add the filter |
| addFilter(uiName, pattern, setToDefault); |
| } |
| catch (Exception exception) |
| { |
| exception.printStackTrace(System.out); |
| } |
| } |
| |
| public void addFilter(String uiName, String pattern, boolean setToDefault) |
| { |
| try |
| { |
| xFilterManager.appendFilter(uiName, pattern); |
| if (setToDefault) |
| { |
| xFilterManager.setCurrentFilter(uiName); |
| } |
| } |
| catch (Exception ex) |
| { |
| ex.printStackTrace(); |
| } |
| } |
| |
| /** |
| * converts the name returned from getFilterUIName_(...) so the |
| * product name is correct. |
| * @param filterName |
| * @return |
| */ |
| private String getFilterUIName(String filterName) |
| { |
| String prodName = Configuration.getProductName(xMSF); |
| String[][] s = new String[][] |
| { |
| { |
| getFilterUIName_(filterName) |
| } |
| }; |
| s[0][0] = JavaTools.replaceSubString(s[0][0], prodName, "%productname%"); |
| return s[0][0]; |
| } |
| |
| /** |
| * note the result should go through conversion of the product name. |
| * @param filterName |
| * @return the UI localized name of the given filter name. |
| */ |
| private String getFilterUIName_(String filterName) |
| { |
| try |
| { |
| Object oFactory = xMSF.createInstance("com.sun.star.document.FilterFactory"); |
| Object oObject = Helper.getUnoObjectbyName(oFactory, filterName); |
| Object oArrayObject = AnyConverter.toArray(oObject); |
| PropertyValue[] xPropertyValue = (PropertyValue[]) oArrayObject; //UnoRuntime.queryInterface(XPropertyValue.class, oObject); |
| int MaxCount = xPropertyValue.length; |
| for (int i = 0; i < MaxCount; i++) |
| { |
| PropertyValue aValue = xPropertyValue[i]; |
| if (aValue != null && aValue.Name.equals("UIName")) |
| { |
| return AnyConverter.toString(aValue.Value); |
| } |
| } |
| throw new NullPointerException("UIName property not found for Filter " + filterName); |
| } |
| catch (com.sun.star.uno.Exception exception) |
| { |
| exception.printStackTrace(System.out); |
| return null; |
| } |
| } |
| |
| public static int showErrorBox(XMultiServiceFactory xMSF, String ResName, String ResPrefix, int ResID, String AddTag, String AddString) |
| { |
| Resource oResource; |
| String ProductName = Configuration.getProductName(xMSF); |
| oResource = new Resource(xMSF, ResName, ResPrefix); |
| String sErrorMessage = oResource.getResText(ResID); |
| sErrorMessage = JavaTools.replaceSubString(sErrorMessage, ProductName, "%PRODUCTNAME"); |
| sErrorMessage = JavaTools.replaceSubString(sErrorMessage, String.valueOf((char) 13), "<BR>"); |
| sErrorMessage = JavaTools.replaceSubString(sErrorMessage, AddString, AddTag); |
| return SystemDialog.showMessageBox(xMSF, "ErrorBox", com.sun.star.awt.VclWindowPeerAttribute.OK, sErrorMessage); |
| } |
| |
| public static int showErrorBox(XMultiServiceFactory xMSF, String ResName, String ResPrefix, int ResID) |
| { |
| Resource oResource; |
| String ProductName = Configuration.getProductName(xMSF); |
| oResource = new Resource(xMSF, ResName, ResPrefix); |
| String sErrorMessage = oResource.getResText(ResID); |
| sErrorMessage = JavaTools.replaceSubString(sErrorMessage, ProductName, "%PRODUCTNAME"); |
| sErrorMessage = JavaTools.replaceSubString(sErrorMessage, String.valueOf((char) 13), "<BR>"); |
| return showMessageBox(xMSF, "ErrorBox", com.sun.star.awt.VclWindowPeerAttribute.OK, sErrorMessage); |
| } |
| |
| /* |
| * example: |
| * (xMSF, "ErrorBox", com.sun.star.awt.VclWindowPeerAttribute.OK, "message") |
| */ |
| /** |
| * @param windowServiceName one of the following strings: |
| * "ErrorBox", "WarningBox", "MessBox", "InfoBox", "QueryBox". |
| * There are other values possible, look |
| * under src/toolkit/source/awt/vcltoolkit.cxx |
| * @param windowAttribute see com.sun.star.awt.VclWindowPeerAttribute |
| * @return 0 = cancel, 1 = ok, 2 = yes, 3 = no(I'm not sure here) |
| * other values check for yourself ;-) |
| */ |
| public static int showMessageBox(XMultiServiceFactory xMSF, String windowServiceName, int windowAttribute, String MessageText) |
| { |
| |
| short iMessage = 0; |
| try |
| { |
| if (MessageText == null) |
| { |
| return 0; |
| } |
| XFrame xFrame = Desktop.getActiveFrame(xMSF); |
| XWindowPeer xWindowPeer = UnoRuntime.queryInterface(XWindowPeer.class, xFrame.getComponentWindow()); |
| return showMessageBox(xMSF, xWindowPeer, windowServiceName, windowAttribute, MessageText); |
| } |
| catch (Exception exception) |
| { |
| exception.printStackTrace(System.out); |
| } |
| return iMessage; |
| } |
| |
| /** |
| * just like the other showMessageBox(...) method, but recieves a |
| * peer argument to use to create the message box. |
| * @param xMSF |
| * @param peer |
| * @param windowServiceName |
| * @param windowAttribute |
| * @param MessageText |
| * @return |
| */ |
| public static int showMessageBox(XMultiServiceFactory xMSF, XWindowPeer peer, String windowServiceName, int windowAttribute, String MessageText) |
| { |
| // If the peer is null we try to get one from the desktop... |
| if (peer == null) |
| { |
| return showMessageBox(xMSF, windowServiceName, windowAttribute, MessageText); |
| } |
| short iMessage = 0; |
| try |
| { |
| XInterface xAWTToolkit = (XInterface) xMSF.createInstance("com.sun.star.awt.Toolkit"); |
| XToolkit xToolkit = UnoRuntime.queryInterface(XToolkit.class, xAWTToolkit); |
| com.sun.star.awt.WindowDescriptor oDescriptor = new com.sun.star.awt.WindowDescriptor(); |
| oDescriptor.WindowServiceName = windowServiceName; |
| oDescriptor.Parent = peer; |
| oDescriptor.Type = com.sun.star.awt.WindowClass.MODALTOP; |
| oDescriptor.WindowAttributes = windowAttribute; |
| XWindowPeer xMsgPeer = xToolkit.createWindow(oDescriptor); |
| XMessageBox xMsgbox = UnoRuntime.queryInterface(XMessageBox.class, xMsgPeer); |
| XComponent xComponent = UnoRuntime.queryInterface(XComponent.class, xMsgbox); |
| xMsgbox.setMessageText(MessageText); |
| iMessage = xMsgbox.execute(); |
| xComponent.dispose(); |
| } |
| catch (Exception e) |
| { |
| // TODO Auto-generated catch block |
| e.printStackTrace(System.out); |
| } |
| return iMessage; |
| } |
| |
| public static XStringSubstitution createStringSubstitution(XMultiServiceFactory xMSF) |
| { |
| Object xPathSubst = null; |
| try |
| { |
| xPathSubst = xMSF.createInstance( |
| "com.sun.star.util.PathSubstitution"); |
| } |
| catch (com.sun.star.uno.Exception e) |
| { |
| e.printStackTrace(); |
| } |
| if (xPathSubst != null) |
| { |
| return UnoRuntime.queryInterface( |
| XStringSubstitution.class, xPathSubst); |
| } |
| else |
| { |
| return null; |
| } |
| } |
| } |