All Downloads are FREE. Search and download functionalities are using the official Maven repository.

fr.opensagres.xdocreport.document.odt.textstyling.ODTDefaultStylesGenerator Maven / Gradle / Ivy

/**
 * Copyright (C) 2011-2012 The XDocReport Team 
 *
 * All rights reserved.
 *
 * Permission is hereby granted, free  of charge, to any person obtaining
 * a  copy  of this  software  and  associated  documentation files  (the
 * "Software"), to  deal in  the Software without  restriction, including
 * without limitation  the rights to  use, copy, modify,  merge, publish,
 * distribute,  sublicense, and/or sell  copies of  the Software,  and to
 * permit persons to whom the Software  is furnished to do so, subject to
 * the following conditions:
 *
 * The  above  copyright  notice  and  this permission  notice  shall  be
 * included in all copies or substantial portions of the Software.
 *
 * THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
 * EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
 * MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 * OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
package fr.opensagres.xdocreport.document.odt.textstyling;

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;

import fr.opensagres.xdocreport.document.textstyling.properties.ContainerProperties;
import fr.opensagres.xdocreport.document.textstyling.properties.ContainerProperties.ContainerType;
import fr.opensagres.xdocreport.document.textstyling.properties.TextAlignment;

/**
 * Default implementation : - uses OOo default styles for headers - uses default but renamed styles for others
 * 
 * @author Tiry
 */
public class ODTDefaultStylesGenerator
    implements IODTStylesGenerator
{
    protected static final String HEADER_PREFIX = "Heading_20_";

    protected static final String[] BULLET_CHARS = { "\u2022", "\u25e6", "\u25aa" };

    protected static final String OL_STYLE_NAME = "XDocReport_OL";

    protected static final String UL_STYLE_NAME = "XDocReport_UL";

    protected static final String LIST_P_STYLE_NAME_SUFFIX = "_P";

    protected static final double BULLET_STEP = 0.635;

    protected static final String BOLD_STYLE_NAME = "XDocReport_Bold";

    protected static final String ITALIC_STYLE_NAME = "XDocReport_Italic";

    protected static final String UNDERLINE_STYLE_NAME = "XDocReport_Underline";

    protected static final String STRIKE_STYLE_NAME = "XDocReport_Strike";

    protected static final String SUBSCRIPT_STYLE_NAME = "XDocReport_Subscript";

    protected static final String SUPERSCRIPT_STYLE_NAME = "XDocReport_Superscript";

    protected static final String PAGE_BREAK_BEFORE_PARAGRAPH_STYLE_NAME = "XDocReport_ParaBreakBefore";

    protected static final String PAGE_BREAK_AFTER_PARAGRAPH_STYLE_NAME = "XDocReport_ParaBreakAfter";

    protected static final String EMPTY_TEXT_STYLE_NAME = "XDocReport_EmptyText";

    // font size for the default OOo Headers
    protected static String[] TITLE_FONT_SIZE = { "115%", "14pt", "14pt", "85%", "85%", "75%" };

    private long dynamicParagraphStylesNb = 0;

    private long dynamicTextStylesNb = 0;

    private final StringBuilder dynamicStyles;

    private String styleName = null;

    private ODTStyleProperties propertiesKind;

    private boolean hasPropertiesKind;

    private enum ODTStyleProperties
    {
        TEXT, PARAGRAPH
    }

    /**
     * protected static String[] HEADING_STYLES = new String[] {
     * ""
     * ,
     * ""
     * ,
     * ""
     * ,
     * ""
     * ,
     * ""
     * ,
     * ""
     * };
     */

    public ODTDefaultStylesGenerator()
    {
        this.dynamicParagraphStylesNb = 0;
        this.dynamicTextStylesNb = 0;
        this.dynamicStyles = new StringBuilder();
    }

    protected String getBulletChar( int level )
    {
        return BULLET_CHARS[( level - 1 ) % 3];
    }

    public String getHeaderStyleName( int level )
    {
        return HEADER_PREFIX + level;
    }

    public String generateHeaderStyle( int level )
    {
        StringBuilder style = new StringBuilder( "" );
        return style.toString();
    }

    public String generateTextStyles()
    {
        StringBuilder region = new StringBuilder();
        region.append( generateStyle( EMPTY_TEXT_STYLE_NAME, "" ) );
        region.append( generateStyle( BOLD_STYLE_NAME, "fo:font-weight=\"bold\"" ) );
        region.append( generateStyle( ITALIC_STYLE_NAME, "fo:font-style=\"italic\"" ) );
        region.append( generateStyle( UNDERLINE_STYLE_NAME,
                                      "style:text-underline-style=\"solid\" style:text-underline-width=\"auto\" style:text-underline-color=\"font-color\"" ) );
        region.append( generateStyle( STRIKE_STYLE_NAME,
                                      "style:text-line-through-style=\"solid\" style:text-underline-style=\"none\"" ) );
        region.append( generateStyle( SUBSCRIPT_STYLE_NAME, "style:text-position=\"sub\"" ) );
        region.append( generateStyle( SUPERSCRIPT_STYLE_NAME, "style:text-position=\"super\"" ) );
        return region.toString();
    }

    public String generateParagraphStyles()
    {
        StringBuilder region = new StringBuilder();
        region.append( generateStylePageBreak( true ) );
        region.append( generateStylePageBreak( false ) );
        return region.toString();
    }

    private String generateStyle( String styleName, String style )
    {
        StringBuilder region = new StringBuilder();
        region.append( "" );
        region.append( "" );
        return region.toString();
    }

    public String generateListStyle()
    {
        StringBuilder region = new StringBuilder();
        region.append( generateListStyle( true ) );
        region.append( generateListStyle( false ) );
        return region.toString();
    }

    protected String generateListStyle( boolean ordered )
    {
        StringBuilder region = new StringBuilder();

        String styleName = UL_STYLE_NAME;
        if ( ordered )
        {
            styleName = OL_STYLE_NAME;
        }

        // generate Paragraph styles reference
        region.append( "" );

        // generate the list style
        region.append( "" );

        // generate styles for 10 levels
        for ( int level = 1; level <= 10; level++ )
        {
            region.append( generateBulletStyle( level, ordered ) );
        }
        region.append( "" );

        return region.toString();
    }

    protected String generateBulletStyle( Integer level, boolean ordered )
    {
        StringBuilder region = new StringBuilder();

        if ( ordered )
        {
            region.append( "" );
        }
        else
        {
            region.append( "text:bullet-char=\"" + getBulletChar( level ) + "\">" );
        }
        region.append( "" );
        region.append( "" );

        region.append( "" );

        if ( ordered )
        {
            region.append( "" );
        }
        else
        {
            region.append( "" );
        }
        return region.toString();
    }

    public int getHeaderStylesCount()
    {
        return 6;
    }

    public int getHeaderStyleNameLevel( String styleName )
    {
        if ( styleName != null && styleName.startsWith( HEADER_PREFIX ) )
        {
            String headerIdx = styleName.substring( 11 );
            return Integer.parseInt( headerIdx );
        }
        else
        {
            return -1;
        }
    }

    public String getOLStyleName()
    {
        return OL_STYLE_NAME;
    }

    public String getULStyleName()
    {
        return UL_STYLE_NAME;
    }

    public String getListItemParagraphStyleNameSuffix()
    {
        return LIST_P_STYLE_NAME_SUFFIX;
    }

    public String getBoldStyleName()
    {
        return BOLD_STYLE_NAME;
    }

    public String getItalicStyleName()
    {
        return ITALIC_STYLE_NAME;
    }

    //@Override
    public String getUnderlineStyleName()
    {
        return UNDERLINE_STYLE_NAME;
    }

    //@Override
    public String getStrikeStyleName()
    {
        return STRIKE_STYLE_NAME;
    }

    //@Override
    public String getSubscriptStyleName()
    {
        return SUBSCRIPT_STYLE_NAME;
    }

    //@Override
    public String getSuperscriptStyleName()
    {
        return SUPERSCRIPT_STYLE_NAME;
    }

    public String getParaBreakBeforeStyleName()
    {
        return PAGE_BREAK_BEFORE_PARAGRAPH_STYLE_NAME;
    }

    public String getParaBreakAfterStyleName()
    {
        return PAGE_BREAK_AFTER_PARAGRAPH_STYLE_NAME;
    }

    private String generateStylePageBreak( boolean pageBreakBefore )
    {
        String styleName =
            pageBreakBefore ? PAGE_BREAK_BEFORE_PARAGRAPH_STYLE_NAME : PAGE_BREAK_AFTER_PARAGRAPH_STYLE_NAME;
        StringBuilder style = new StringBuilder();
        style.append( "" );
        style.append( "" );
        style.append( "" );
        return style.toString();
    }

    //@Override
    public String generateAllStyles( ODTDefaultStyle defaultStyle )
    {
        StringBuilder styles = new StringBuilder();
        // Add bold, italic, bold+italic styles for text styling.
        styles.append( generateTextStyles() );
        // Add paragraph styles for text styling.
        styles.append( generateParagraphStyles() );
        // Add styles for lists
        styles.append( generateListStyle() );
        styles.append( getDynamicStyles() );
        return styles.toString();
    }

    public String getDynamicStyles()
    {
        return dynamicStyles.toString();
    }

    //@Override
    public String getTextStyleName( ContainerProperties properties )
    {
        if ( properties == null )
        {
            return EMPTY_TEXT_STYLE_NAME;
        }
        this.styleName = null;

        // 
        setPropertiesKind( ODTStyleProperties.PARAGRAPH );
        TextAlignment textAlignment = properties.getTextAlignment();
        if ( textAlignment != null )
        {
            switch ( textAlignment )
            {
                case Center:
                    startStyleIfNeeded( properties.getType() );
                    dynamicStyles.append( "fo:text-align=\"center\" style:justify-single-word=\"false\" " );
                    break;
                case Justify:
                    startStyleIfNeeded( properties.getType() );
                    dynamicStyles.append( "fo:text-align=\"justify\" " );
                    break;
                case Left:
                    startStyleIfNeeded( properties.getType() );
                    dynamicStyles.append( "fo:text-align=\"left\" " );
                    break;
                case Right:
                    startStyleIfNeeded( properties.getType() );
                    dynamicStyles.append( "fo:text-align=\"right\" " );
                    break;
            }
        }
        endStyleIfNeeded();
        return styleName;
    }

    private void setPropertiesKind( ODTStyleProperties propertiesKind )
    {
        this.propertiesKind = propertiesKind;
        this.hasPropertiesKind = false;
    }

    private void startStyleIfNeeded( ContainerType type )
    {
        if ( this.styleName == null )
        {

            if ( ContainerType.PARAGRAPH.equals( type ) )
            {
                this.styleName = "XDocReport_P" + dynamicParagraphStylesNb++;
            }
            else
            {
                this.styleName = "XDocReport_T" + dynamicTextStylesNb++;
            }
            dynamicStyles.append( "" );
            }
            else
            {
                dynamicStyles.append( "\" style:family=\"text\">" );
            }
        }
        if ( !this.hasPropertiesKind )
        {
            switch ( propertiesKind )
            {
                case TEXT:
                    dynamicStyles.append( "" );
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy