package org.glox4j.samples;
import java.util.Map.Entry;
import javax.xml.bind.JAXBElement;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.docx4j.XmlUtils;
import org.docx4j.dml.diagram.CTDataModel;
import org.docx4j.dml.diagram.CTDescription;
import org.docx4j.dml.diagram.CTDiagramDefinitionHeader;
import org.docx4j.dml.diagram.CTElemPropSet;
import org.docx4j.dml.diagram.CTName;
import org.docx4j.dml.diagram.CTPt;
import org.docx4j.dml.diagram.CTSampleData;
import org.docx4j.dml.diagram.ObjectFactory;
import org.docx4j.dml.wordprocessingDrawing.Inline;
import org.docx4j.jaxb.Context;
import org.docx4j.openpackaging.contenttype.ContentTypes;
import org.docx4j.openpackaging.packages.OpcPackage;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.Part;
import org.docx4j.openpackaging.parts.PartName;
import org.docx4j.openpackaging.parts.DrawingML.DiagramColorsPart;
import org.docx4j.openpackaging.parts.DrawingML.DiagramDataPart;
import org.docx4j.openpackaging.parts.DrawingML.DiagramLayoutHeaderPart;
import org.docx4j.openpackaging.parts.DrawingML.DiagramLayoutPart;
import org.docx4j.openpackaging.parts.DrawingML.DiagramStylePart;
import org.docx4j.samples.AbstractSample;
import org.docx4j.wml.P;
import org.glox4j.openpackaging.packages.GloxPackage;
/**
* This sample can be used to generate a
* SmartArt glox file from an exemplar
* docx or pptx containing SmartArt.
*
* The exemplar is assumed to contain
* only one piece of SmartArt.
*
* @author jharrop
*
*/
public class ExtractGloxFromExemplar extends AbstractSample {
private static Logger log = LoggerFactory.getLogger(ExtractGloxFromExemplar.class);
/**
* @param args
*/
public static void main(String[] args) throws Exception {
try {
getInputFilePath(args);
} catch (IllegalArgumentException e) {
inputfilepath = System.getProperty("user.dir") + "/sample-docs/glox/extracted/CirclePictureHierarchy.docx";
}
String outputdir = inputfilepath.substring(0, inputfilepath.lastIndexOf("/")+1);
String outputfilename = inputfilepath.substring(inputfilepath.lastIndexOf("/"))+ ".glox";
OpcPackage opcPackage = OpcPackage.load(new java.io.File(inputfilepath));
GloxPackage gloxPackage = new GloxPackage();
// DiagramLayoutPart - from the exemplar docx or pptx
// .. just the first one we encounter
DiagramLayoutPart source = null;
for (Entry<PartName,Part> entry : opcPackage.getParts().getParts().entrySet() ) {
if (entry.getValue().getContentType().equals(
ContentTypes.DRAWINGML_DIAGRAM_LAYOUT )) {
source = (DiagramLayoutPart)entry.getValue();
break;
}
}
if (source==null) {
System.out.println("No SmartArt found in " + inputfilepath);
return;
}
// .. don't bother cloning, just attach it
DiagramLayoutPart target = new DiagramLayoutPart(new PartName("/diagrams/layout1.xml"));
target.setJaxbElement(
XmlUtils.deepCopy(source.getJaxbElement()) );
gloxPackage.addTargetPart(target);
// DiagramLayoutHeaderPart
DiagramLayoutHeaderPart diagramLayoutHeaderPart = new DiagramLayoutHeaderPart();
ObjectFactory factory = new ObjectFactory();
CTDiagramDefinitionHeader header = factory.createCTDiagramDefinitionHeader();
diagramLayoutHeaderPart.setJaxbElement(header);
String uniqueId = target.getJaxbElement().getUniqueId();
if (uniqueId!=null) {
header.setUniqueId( uniqueId );
System.out.println("Creating glox for " + uniqueId);
// Can we make a filename out of this?
if (uniqueId.indexOf("/")>0
&& uniqueId.lastIndexOf("/")!= uniqueId.length()-1 ) {
outputfilename = uniqueId.substring(uniqueId.lastIndexOf("/")+1) + ".glox";
}
}
if (target.getJaxbElement().getTitle()==null
|| target.getJaxbElement().getTitle().isEmpty()
|| (target.getJaxbElement().getTitle().size()==1
&& target.getJaxbElement().getTitle().get(0).getVal().isEmpty())) {
CTName title = factory.createCTName();
title.setVal("some title");
header.getTitle().add(title);
} else {
header.getTitle().addAll(target.getJaxbElement().getTitle() );
}
if (target.getJaxbElement().getDesc()==null
|| target.getJaxbElement().getDesc().isEmpty()
|| (target.getJaxbElement().getDesc().size()==1
&& target.getJaxbElement().getDesc().get(0).getVal().isEmpty())) {
CTDescription desc = factory.createCTDescription();
desc.setVal("some desc");
header.getDesc().add(desc);
} else {
header.getDesc().addAll(target.getJaxbElement().getDesc() );
}
gloxPackage.addTargetPart(diagramLayoutHeaderPart);
// All done..
String outfile = outputdir + outputfilename;
System.out.println("Writing " + outfile);
gloxPackage.save(new java.io.File(outfile ));
System.out.println("Done!");
}
}