/************************************************************** * * 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 complex.persistent_window_states; import com.sun.star.uno.Any; import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.frame.XFramesSupplier; import com.sun.star.frame.XFrames; import com.sun.star.container.XIndexAccess; import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.AnyConverter; import com.sun.star.frame.XComponentLoader; import com.sun.star.awt.Rectangle; import com.sun.star.util.XCloseable; import helper.ConfigurationRead; // import org.junit.After; import org.junit.AfterClass; // import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.openoffice.test.OfficeConnection; import static org.junit.Assert.*; /** * Parameters: * */ public class PersistentWindowTest { // private XMultiServiceFactory xMSF; // private OfficeProvider oProvider; private int iOfficeCloseTime = 0; /** * A frunction to tell the framework, which test functions are available. * Right now, it's only 'checkPersistentWindowState'. * @return All test methods. */ // public String[] getTestMethodNames() // { // return new String[] // { // "checkPersistentWindowState" // }; // } /** * The test parameters */ // private static TestParameters param = null; /** * Test if all available document types change the * persistent Window Attributes * * The test follows basically these steps: * - Create a configuration reader and a componentloader * - Look for all document types in the configuration * - Do for every doc type * - start office * - read configuration attibute settings * - create a new document * - resize the document and close it * - close office * - start office * - read configuration attribute settings * - create another new document * - compare old settings with new ones: should be different * - compare the document size with the resized document: should be equal * - close office * - Test finished */ @Test public void checkPersistentWindowState() { // final XMultiServiceFactory xMsf = getMSF(); // some Tests need the qadevOOo TestParameters, it is like a Hashmap for Properties. // param = new TestParameters(); // param.put("ServiceFactory", xMsf); // some qadevOOo functions need the ServiceFactory try { // At first we are already connected // if (!connect()) // { // return; // } // fetch the multi service factory for setup // XMultiServiceFactory xCP = getMSF(); // create the configuration reader // ConfigurationRead cfgRead = new ConfigurationRead(xCP); // just test the wrong ones, not all. String[] els = new String[] { "Office/Factories/com.sun.star.drawing.DrawingDocument", "Office/Factories/com.sun.star.formula.FormulaProperties", //"Office/Factories/com.sun.star.presentation.PresentationDocument", "Office/Factories/com.sun.star.sheet.SpreadsheetDocument", "Office/Factories/com.sun.star.text.GlobalDocument", "Office/Factories/com.sun.star.text.TextDocument", "Office/Factories/com.sun.star.text.WebDocument", }; // uncomment the following line for all doc types // String [] els = cfgRead.getSubNodeNames("Office/Factories"); System.out.println("Found " + els.length + " document types to test.\n"); disconnect(); // for all types for (int i = 0; i < els.length; i++) { System.out.println("\tStart test for document type " + i + ": " + els[i]); // exclude chart documents: cannot be created this way. if (els[i].indexOf("ChartDocument") != -1) { System.out.println("Skipping chart document: cannot be create like this."); continue; } // start an office connect(); // get configuration String[] settings = getConfigurationAndLoader(getMSF(), els[i]); if (settings == null) { System.out.println("Skipping document type " + els[i]); disconnect(); continue; } String cfg = settings[1]; // load a document DocumentHandle handle = loadDocument(getMSF(), settings[0]); // first size Rectangle rect1 = handle.getDocumentPosSize(); // resize handle.resizeDocument(); // after resize Rectangle rect2 = handle.getDocumentPosSize(); // disposeManager and start a new office disconnect(); connect(); // get configuration settings = getConfigurationAndLoader(getMSF(), els[i]); String newCfg = settings[1]; // load a document handle = loadDocument(getMSF(), settings[0]); Rectangle newRect = handle.getDocumentPosSize(); // print the settings and window sizes System.out.println("----------------------------"); System.out.println("Initial Config String : " + cfg); System.out.println("Config String after restart: " + newCfg); System.out.println("----------------------------"); System.out.println("Initial window (X,Y,Width,Height): " + rect1.X + ";" + rect1.Y + ";" + rect1.Width + ";" + rect1.Height); System.out.println("Window after resize (X,Y,Width,Height): " + rect2.X + ";" + rect2.Y + ";" + rect2.Width + ";" + rect2.Height); System.out.println("Window after restart (X,Y,Width,Height): " + newRect.X + ";" + newRect.Y + ";" + newRect.Width + ";" + newRect.Height); // compare to see if resize worked System.out.println("----------------------------"); if (els[i].indexOf("SpreadsheetDocument") == -1 && els[i].indexOf("DrawingDocument") == -1) { // leave out Spreadsheet- and DrawingDocumnt assertTrue("Resize values for " + els[i] + " are equal.", !compareRectangles(rect1, rect2)); } // compare settings and sizes assertTrue("Config settings for " + els[i] + " were not changed.", !cfg.equals(newCfg)); assertTrue("Resized and restarted window for " + els[i] + " are not equal.", compareRectangles(rect2, newRect)); System.out.println("----------------------------"); // disposeManager disconnect(); System.out.println("\tFinish test for document type " + i + ": " + els[i]); } } catch (Exception e) { e.printStackTrace(); } } /** * Get the configuration settings and the document loader * @param xMSF A MultiServiceFactory from an office * @param cfgString A configuration string * @return Settings and Loader */ private static String[] getConfigurationAndLoader(XMultiServiceFactory xMSF, String cfgString) { String[] conf = new String[2]; try { Object o = xMSF.createInstance( "com.sun.star.configuration.ConfigurationProvider"); // fetch the multi service factory for setup XMultiServiceFactory xCP = UnoRuntime.queryInterface(XMultiServiceFactory.class, o); // create the configuration reader ConfigurationRead cfgRead = new ConfigurationRead(xCP); // get the document loader String loader = getStringFromObject( cfgRead.getByHierarchicalName(cfgString + "/ooSetupFactoryEmptyDocumentURL")); if (loader == null) { return null; } System.out.println("\tLoader: " + loader); // read attributes String hierchName = cfgString + "/ooSetupFactoryWindowAttributes"; String setupSettings = getStringFromObject(cfgRead.getByHierarchicalName(hierchName)); // remove slots: just plain document types have to start if (loader.indexOf("?slot") != -1) { loader = loader.substring(0, loader.indexOf("?slot")); System.out.println("Loader: " + loader); } conf[0] = loader; conf[1] = setupSettings; } catch (com.sun.star.uno.Exception e) { } return conf; } /** * Load a document * @param xMSF A MultiServiceFactory from an office * @param docLoader A documet loader * @return A handle to the document */ private DocumentHandle loadDocument(XMultiServiceFactory xMSF, String docLoader) { DocumentHandle docHandle = null; try { // create component loaader XComponentLoader xCompLoader = UnoRuntime.queryInterface(XComponentLoader.class, xMSF.createInstance("com.sun.star.frame.Desktop")); XFramesSupplier xFrameSupp = UnoRuntime.queryInterface(XFramesSupplier.class, xCompLoader); // close all existing frames XFrames xFrames = xFrameSupp.getFrames(); XIndexAccess xAcc = UnoRuntime.queryInterface(XIndexAccess.class, xFrames); for (int i = 0; i < xAcc.getCount(); i++) { XCloseable xClose = UnoRuntime.queryInterface(XCloseable.class, xAcc.getByIndex(i)); try { if (xClose != null) { xClose.close(false); } else { fail("Could not query frame for XCloseable!"); } } catch (com.sun.star.uno.Exception e) { e.printStackTrace(); fail("Could not query frame for XCloseable!"); } } docHandle = new DocumentHandle(xCompLoader); docHandle.loadDocument(docLoader, false); } catch (com.sun.star.uno.Exception e) { e.printStackTrace(); } catch (java.lang.Exception e) { e.printStackTrace(); } return docHandle; } private boolean connect() { try { connection.setUp(); } catch (java.lang.InterruptedException e) { fail("can't connect."); } catch (Exception e) { fail("can't connect."); } return true; } private boolean disconnect() { try { connection.tearDown(); } catch (java.lang.InterruptedException e) { fail("can't disconnect."); } catch (Exception e) { fail("can't disconnect."); } return true; } private static String getStringFromObject(Object oName) { if (oName instanceof String) { return (String) oName; } String value = null; if (oName instanceof Any) { try { value = AnyConverter.toString(oName); if (value == null) { System.out.println("Got a void css.uno.Any as loading string."); } } catch (Exception e) { System.out.println("This document type cannot be opened directly."); } } return value; } /** * Compare two rectangles. Return true, if both are equal, false * otherwise. * @param rect1 First Rectangle. * @param rect2 Second Rectangle. * @return True, if the rectangles are equal. */ private boolean compareRectangles(Rectangle rect1, Rectangle rect2) { boolean result = true; result &= (rect1.X == rect2.X); result &= (rect1.Y == rect2.Y); result &= (rect1.Width == rect2.Width); result &= (rect1.Height == rect2.Height); return result; } private XMultiServiceFactory getMSF() { final XMultiServiceFactory xMSF1 = UnoRuntime.queryInterface(XMultiServiceFactory.class, connection.getComponentContext().getServiceManager()); return xMSF1; } // setup and close connections @BeforeClass public static void setUpConnection() throws Exception { System.out.println("setUpConnection()"); connection.setUp(); } @AfterClass public static void tearDownConnection() throws InterruptedException, com.sun.star.uno.Exception { System.out.println("tearDownConnection()"); connection.tearDown(); } private static final OfficeConnection connection = new OfficeConnection(); }