All Downloads are FREE. Search and download functionalities are using the official Maven repository.
Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
fr.opensagres.xdocreport.document.odt.textstyling.ODTDefaultStylesGenerator Maven / Gradle / Ivy
/**
* Copyright (C) 2011-2015 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 java.util.regex.Matcher;
import java.util.regex.Pattern;
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 Pattern HEADER_PATTERN = Pattern.compile(HEADER_PREFIX + "(\\d+).*");
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 ) {
return -1;
}
Matcher matcher = HEADER_PATTERN.matcher(styleName);
if ( !matcher.find() )
{
return -1;
}
String headerIdx = matcher.group(1);
return Integer.parseInt( headerIdx );
}
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(), properties.getStyleName());
dynamicStyles.append( "fo:text-align=\"center\" style:justify-single-word=\"false\" " );
break;
case Justify:
startStyleIfNeeded(properties.getType(), properties.getStyleName());
dynamicStyles.append( "fo:text-align=\"justify\" " );
break;
case Left:
startStyleIfNeeded(properties.getType(), properties.getStyleName());
dynamicStyles.append( "fo:text-align=\"left\" " );
break;
case Right:
startStyleIfNeeded(properties.getType(), properties.getStyleName());
dynamicStyles.append( "fo:text-align=\"right\" " );
break;
}
}
endStyleIfNeeded();
if (styleName == null && properties.getStyleName() != null) {
styleName = properties.getStyleName();
}
return styleName;
}
private void setPropertiesKind( ODTStyleProperties propertiesKind )
{
this.propertiesKind = propertiesKind;
this.hasPropertiesKind = false;
}
private void startStyleIfNeeded(ContainerType type, String baseStyleName) {
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( " " );
}
}
}