fr.sewatech.sewatoool.impress.service.ImpressService.java Source code

Java tutorial

Introduction

Here is the source code for fr.sewatech.sewatoool.impress.service.ImpressService.java

Source

/*
 *  This file is part of sewatOOol.
 *  
 *  sewatOOol is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU Lesser General Public License version 3
 *  as published by the Free Software Foundation.
 *  
 *  sewatOOol is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Lesser General Public License for more details.
 *  
 *  You should have received a copy of the GNU Lesser General Public License
 *  along with sewatOOol; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *  
 *    Copyright 2008 sewatech
 */
package fr.sewatech.sewatoool.impress.service;

import static fr.sewatech.sewatoool.impress.helper.OOoHelper.unoCast;

import java.io.File;
import java.net.URI;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.sun.star.comp.helper.Bootstrap;
import com.sun.star.frame.XComponentLoader;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.uno.XComponentContext;
import com.sun.star.uri.ExternalUriReferenceTranslator;

import fr.sewatech.sewatoool.impress.exception.ImpressException;
import fr.sewatech.sewatoool.impress.helper.BundleHelper;
import fr.sewatech.sewatoool.impress.model.ImpressDocument;
import fr.sewatech.sewatoool.impress.model.TocDesc;

public class ImpressService {

    private static final Log logger = LogFactory.getLog(ImpressService.class);

    public ImpressService() throws Exception {
    }

    public ImpressDocument loadDocument(String location, boolean hidden) {
        try {

            // get the remote office component context
            XComponentContext xContext = Bootstrap.bootstrap();
            logger.trace("Bootstrap OK");
            XMultiComponentFactory xMCF = xContext.getServiceManager();
            logger.trace("ServiceManager OK");
            Object desktop = xMCF.createInstanceWithContext("com.sun.star.frame.Desktop", xContext);
            XComponentLoader loader = unoCast(XComponentLoader.class, desktop);

            String internalLocation = getSupportedLocation(location, xContext);
            // internalLocation = correctLocation;
            if (logger.isDebugEnabled()) {
                logger.debug("Chargement du fichier : " + internalLocation);
            }

            String mode;
            if (hidden) {
                mode = "_hidden";
            } else {
                mode = "_default";
            }
            XComponent component = loader.loadComponentFromURL(internalLocation, mode, 0, null);

            if (component == null) {
                throw new ImpressException("Probleme de chargement du fichier " + internalLocation);
            }

            return new ImpressDocument(component);

        } catch (Exception e) {
            throw new ImpressException(e);
        }
    }

    /**
     * Transforme un chemin d'accs au fichier, au format classique, en chemin
     * d'accs compatible OOo
     * 
     * @param requestedlocation
     * @param xContext
     * @return
     */
    private String getSupportedLocation(String requestedlocation, XComponentContext xContext) {
        // Construit correctement le chemin du fichier
        URI uri = URI.create(requestedlocation);
        File file = new File(uri.getPath());
        String path = file.getAbsolutePath();
        String correctLocation;

        if (System.getProperty("os.name").startsWith("Windows")) {
            // Format Windows
            correctLocation = "file:/" + path.replace('\\', '/');
        } else {
            // Format Unix
            correctLocation = "file://" + path;
        }

        logger.trace("Tentative d'ouverture du fichier " + correctLocation);
        // Resoud des problemes d'encodage
        String internalLocation = ExternalUriReferenceTranslator.create(xContext)
                .translateToInternal(correctLocation);
        return internalLocation;
    }

    /**
     * Genere la table des matieres<br/> <br/> - on etablit la liste des
     * pages<br/> - Recherche si une page de sommaire existe, en cree une
     * sinon<br/> - Ecrit la table des matieres dans la page<br/> - Deborde
     * eventuellement sur une autre page
     * 
     * @param document
     * @param longTOC
     * @param shortTOC
     * 
     * @throws Exception
     */
    public void generateToc(ImpressDocument document, boolean longTOC, boolean shortTOC) throws Exception {
        BundleHelper bundle = BundleHelper.getInstance();
        TocDesc toc = new TocDesc(document.listPages(), bundle.getTocTitle());
        toc.purge();

        TocDesc shortToc = new TocDesc(toc);

        if (longTOC) {
            logger.info("Gnration de la table des matires complte");
            int slideNumber = document.findPageByName(bundle.getTocPageName());

            int tocPageNumber = document.countPages();

            if (slideNumber == 0) {
                slideNumber = tocPageNumber;
                document.addSlide(tocPageNumber, toc.getTitle(), bundle.getTocPageStyle());
            }

            document.writeTOC(slideNumber, toc);

            if (toc.getAllSlides().size() > 0) {
                document.addSlide(slideNumber + 1, toc.getTitle() + "1", bundle.getTocPageStyle());
                toc.setTocIndex(1);
                document.writeTOC(slideNumber + 1, toc);
            }
        }

        if (shortTOC) {
            logger.info("Gnration de la table des matires simplifie");
            int shortTocNumber = document.findPageByName(bundle.getShortTocPageName());
            if (shortTocNumber > 0) {
                document.writeShortTOC(shortTocNumber, shortToc);
            }
        }
    }

    public void exportPdf(ImpressDocument document) {
        document.exportPdf();
    }

    public void print(ImpressDocument document, String printer) {
        document.print(printer);
    }

    public void save(ImpressDocument document) {
        document.save();
    }

    public void close(ImpressDocument document) {
        document.close();
    }

}