/*
* Copyright 2008, Plutext Pty Ltd.
*
* This file is part of Docx4all.
Docx4all is free software: you can redistribute it and/or modify
it under the terms of version 3 of the GNU General Public License
as published by the Free Software Foundation.
Docx4all 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with Docx4all. If not, see <http://www.gnu.org/licenses/>.
*/
package org.plutext.client.state;
import java.io.IOException;
import java.io.StringReader;
import java.util.Map;
import javax.xml.transform.Source;
import javax.xml.transform.Templates;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.stream.StreamSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.docx4j.XmlUtils;
import org.docx4j.wml.Id;
import org.docx4j.wml.SdtBlock;
import org.docx4j.wml.Tag;
import org.plutext.client.SdtWrapper;
/* Represent the state of a chunk.
*
* Intent is to be able to compare the
* state at a time we might save it to the
* server with some previously known "clean" state.
*
* We never directly look at the content
* control itself
*/
public class StateChunk
{
private static Logger log = LoggerFactory.getLogger(StateChunk.class);
public StateChunk(SdtBlock cc) {
this.cc = cc;
sdtWrapper = new SdtWrapper(cc);
xml = getContentControlXML(cc);
}
private SdtWrapper sdtWrapper;
private SdtBlock cc;
public SdtBlock getSdt() {
return cc;
}
public String getIdAsString() {
// return getId().getVal().toString();
return sdtWrapper.getPlutextId();
}
public long getIdAsLong() {
//return cc.getSdtPr().getId();
return Long.parseLong(sdtWrapper.getPlutextId());
}
public long getVersionAsLong() {
return Long.parseLong(sdtWrapper.getVersionNumber());
}
public String getVersionAsString() {
return sdtWrapper.getVersionNumber();
}
private String xml = null;
public String getXml() {
return xml;
}
// set { xml = value; }
// }
private String markedUpSdt = null;
public String getMarkedUpSdt() {
return markedUpSdt;
}
public void setMarkedUpSdt(String s) {
markedUpSdt = s;
}
/*
* cc.Range.WordOpenXML returns an XML document which contains all
* associates Parts eg style.xml etc. But all we want is the XML for the
* content control itself!
*/
public static String getContentControlXML(SdtBlock cc) {
boolean suppressDeclaration = true;
return org.docx4j.XmlUtils.marshaltoString(cc, suppressDeclaration);
// return "<w:sdt
// xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">"
// + node.InnerXml + "</w:sdt>";
}
private Boolean transformUpdatesExist = false;
// TODO - reset this to false each time thread starts
public Boolean containsTrackedChanges()
{
if (xml.contains("w:del")
|| xml.contains("w:delText")
|| xml.contains("w:ins"))
return true;
else
return false;
}
static Templates xsltChangesAccept;
public void acceptTrackedChanges()
{
if (xsltChangesAccept==null) {
try {
Source xsltSource = new StreamSource(
org.docx4j.utils.ResourceUtils.getResource(
"org/plutext/client/state/ChangesAccept.xslt"));
xsltChangesAccept = XmlUtils.getTransformerTemplate(xsltSource);
} catch (IOException e) {
e.printStackTrace();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
}
}
transform(xsltChangesAccept);
}
static Templates xsltChangesReject;
public void rejectTrackedChanges()
{
if (xsltChangesReject==null) {
try {
Source xsltSource = new StreamSource(
org.docx4j.utils.ResourceUtils.getResource(
"org/plutext/client/state/ChangesReject.xslt"));
xsltChangesReject = XmlUtils.getTransformerTemplate(xsltSource);
} catch (IOException e) {
e.printStackTrace();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
}
}
transform(xsltChangesReject);
}
private void transform(Templates xslt)
{
log.debug("In: " + xml);
java.io.StringWriter sw = new java.io.StringWriter();
javax.xml.transform.Result result = new javax.xml.transform.stream.StreamResult(sw);
try {
StreamSource src = new StreamSource(new StringReader(xml));
Map<String, Object> transformParameters = new java.util.HashMap<String, Object>();
XmlUtils.transform(src, xslt, transformParameters, result);
} catch (Exception exc) {
exc.printStackTrace();
}
// Ouptut
xml = sw.toString();
log.debug("Transformed: " + xml);
}
// public Word.ContentControl getContentControl()
// {
// foreach (Word.ContentControl ctrl in Globals.ThisAddIn.Application.ActiveDocument.ContentControls)
// {
// if (ctrl.ID.Equals(id) )
// {
// //diagnostics("DEBUG - Got control");
// return ctrl;
// }
// }
// return null;
// }
}