/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
* Copyright (c) 2014, MPL CodeInside http://codeinside.ru
*/
package ru.codeinside.gses.form.docx;
import org.docx4j.wml.BooleanDefaultTrue;
import org.docx4j.wml.CTBorder;
import org.docx4j.wml.CTLanguage;
import org.docx4j.wml.HpsMeasure;
import org.docx4j.wml.Jc;
import org.docx4j.wml.JcEnumeration;
import org.docx4j.wml.PPr;
import org.docx4j.wml.PPrBase;
import org.docx4j.wml.RFonts;
import org.docx4j.wml.RPr;
import org.docx4j.wml.STBorder;
import org.docx4j.wml.Style;
import org.docx4j.wml.U;
import org.docx4j.wml.UnderlineEnumeration;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
final class StyleBuilder {
final List<Style> styles;
StyleBuilder(List<Style> styles) {
this.styles = styles;
}
void build() {
removeUnused();
Style defaultFont = createFontStyle(RStyle.fs, "Шрифт", true, false);
Style uFont = createFontStyle(RStyle.ufs, "Шрифт1", false, true);
Style defaultStyle = createDefaultStyle();
Style orgStyle = createStyle(PStyle.orgStyle, "Организация", 14, true, JcEnumeration.CENTER);
Style receiptStyle = createStyle(PStyle.receiptStyle, "Заявление", 14, true, JcEnumeration.CENTER);
Style serviceStyle = createStyle(PStyle.serviceStyle, "Услуга", 12, true, JcEnumeration.LEFT);
Style field1Style = createStyle(PStyle.field1Style, "Поле1", 10, false, JcEnumeration.LEFT);
Style field2Style = createStyle(PStyle.field2Style, "Поле2", 10, false, JcEnumeration.LEFT);
Style field3Style = createStyle(PStyle.field3Style, "Поле3", 10, false, JcEnumeration.LEFT);
Style field4Style = createStyle(PStyle.field4Style, "Поле4", 10, false, JcEnumeration.LEFT);
Style field5Style = createStyle(PStyle.field5Style, "Поле5", 10, false, JcEnumeration.LEFT);
Style field6Style = createStyle(PStyle.field6Style, "Поле6", 10, false, JcEnumeration.LEFT);
addBorder(orgStyle);
addSpacing(orgStyle, 0, 400);
addSpacing(receiptStyle, 200, 200);
addSpacing(serviceStyle, 100, 200);
addSpacing(field1Style, 100, 0);
addSpacing(field2Style, 100, 0);
addSpacing(field3Style, 100, 0);
addSpacing(field4Style, 100, 0);
addSpacing(field5Style, 100, 0);
addSpacing(field6Style, 100, 0);
addIndentLeft(field2Style, 110);
addIndentLeft(field3Style, 220);
addIndentLeft(field4Style, 330);
addIndentLeft(field5Style, 440);
addIndentLeft(field6Style, 550);
styles.add(defaultFont);
styles.add(uFont);
styles.add(defaultStyle);
styles.add(orgStyle);
styles.add(receiptStyle);
styles.add(serviceStyle);
styles.add(field1Style);
styles.add(field2Style);
styles.add(field3Style);
styles.add(field4Style);
styles.add(field5Style);
styles.add(field6Style);
}
private void removeUnused() {
List<Style> toDelete = new ArrayList<Style>();
for (Style s : styles) {
if (!"style0".equals(s.getStyleId())) {
toDelete.add(s);
}
}
for (Style s : toDelete) {
styles.remove(s);
}
}
private Style createFontStyle(RStyle rStyle, String name, boolean def, boolean underline) {
Style style = new Style();
if (def) {
style.setDefault(true);
}
style.setType("character");
style.setStyleId(rStyle.name());
style.setName(newStyleName(name));
RPr run = new RPr();
if (underline) {
U u = new U();
u.setVal(UnderlineEnumeration.SINGLE);
run.setU(u);
}
style.setRPr(run);
return style;
}
private Style createDefaultStyle() {
Style style = new Style();
style.setDefault(true);
style.setType("paragraph");
style.setStyleId("DocDefaults");
style.setName(newStyleName("Базовый"));
style.setPPr(new PPr());
RPr run = new RPr();
run.setRFonts(newFont());
run.setLang(newLanguage());
style.setRPr(run);
return style;
}
private void addSpacing(Style style, int before, int after) {
PPrBase.Spacing spacing = new PPrBase.Spacing();
spacing.setBefore(BigInteger.valueOf(before));
spacing.setAfter(BigInteger.valueOf(after));
style.getPPr().setSpacing(spacing);
}
private void addIndentLeft(Style style, int n) {
PPrBase.Ind indent = new PPrBase.Ind();
indent.setLeft(BigInteger.valueOf(n));
style.getPPr().setInd(indent);
}
private void addBorder(Style style) {
CTBorder singeBlackBorder = new CTBorder();
singeBlackBorder.setSz(BigInteger.valueOf(4));
singeBlackBorder.setVal(STBorder.SINGLE);
singeBlackBorder.setColor("000000");
PPrBase.PBdr pBdr = new PPrBase.PBdr();
pBdr.setBottom(singeBlackBorder);
style.getPPr().setPBdr(pBdr);
}
private Style createStyle(PStyle pStyle, String name, int fontSize, boolean bold, JcEnumeration justify) {
RPr r = new RPr();
r.setSz(newMeasure(fontSize));
if (bold) {
r.setB(new BooleanDefaultTrue());
}
PPr p = new PPr();
Jc jc = newJustify(justify);
p.setJc(jc);
Style style = new Style();
style.setBasedOn(newBaseOn("DocDefaults"));
style.setType("paragraph");
style.setStyleId(pStyle.name());
style.setName(newStyleName(name));
style.setPPr(p);
style.setRPr(r);
return style;
}
private Jc newJustify(JcEnumeration value) {
Jc jc = new Jc();
jc.setVal(value);
return jc;
}
private Style.Name newStyleName(String value) {
Style.Name name = new Style.Name();
name.setVal(value);
return name;
}
private RFonts newFont() {
RFonts font = new RFonts();
font.setAscii("Arial");
font.setHAnsi("Arial");
return font;
}
private Style.BasedOn newBaseOn(String value) {
Style.BasedOn basedOn = new Style.BasedOn();
basedOn.setVal(value);
return basedOn;
}
private HpsMeasure newMeasure(int value) {
HpsMeasure measure = new HpsMeasure();
measure.setVal(BigInteger.valueOf(value * 2));
return measure;
}
private CTLanguage newLanguage() {
CTLanguage lang = new CTLanguage();
lang.setVal("ru-RU");
return lang;
}
}