Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package org.docx4j.model.styles;
  
  import java.util.HashMap;
  import java.util.Iterator;
  import java.util.List;
  import java.util.Map;
  import java.util.Set;
  
Represent a style hierarchy as a tree. TODO - need a way to update/refresh. This is useful for creating certain representations (eg CSS).

Author(s):
jharrop
 
 public class StyleTree {
 	
 	private static Logger log = LoggerFactory.getLogger(StyleTree.class);

Tree of table styles
 
 		return ;
 	}

Tree of paragraph styles
 
 	private Tree<AugmentedStylepTree = new Tree<AugmentedStyle>();
 		return ;
 	}

Tree of character styles
 
 	private Tree<AugmentedStylecTree = new Tree<AugmentedStyle>();
 		return ;
 	}


Build a StyleTree for stylesInUse.

Parameters:
stylesInUse styles actually in use in the main document part, headers/footers, footnotes/endnotes
allStyles styles defined in the style definitions part
 
 	public StyleTree(Set<StringstylesInUseMap<StringStyleallStyles) {
 		
 		
 		// Set up Table style tree 
 		.setRootElement(new Node<AugmentedStyle>("table-root"null)); // a dummy root node
         for (String styleId : stylesInUse ) {
         	if (.get(styleId)==null) {
         		
             	Style style = allStyles.get(styleId);
                 if (style == null ) {
                 	.warn("Couldn't find style: " + styleId);
                 	continue;
                 } 	        		
         		// Is it a table style?
         		if (style.getType().equals("table")) {                
 	            	// Need to create a node for this
 	        		this.addNode(styleIdallStyles);
         		}
         	}
         }
 		
 
 		// Set up Paragraph style tree 
         Style rootStyle = allStyles.get("DocDefaults");
         if (rootStyle==null) {
         	.setRootElement(new Node<AugmentedStyle>("p-root"null));
         } else {
         	AugmentedStyle as = new AugmentedStyle(rootStyle);        	
         	.setRootElement(new Node<AugmentedStyle>("DocDefaults"as));        	
         }
         	
         for (String styleId : stylesInUse ) {
         	if (.get(styleId)==null) {
         		
             	Style style = allStyles.get(styleId);
                 if (style == null ) {
                 	.warn("Couldn't find style: " + styleId);
                	continue;
                } 	        		
        		// Is it a paragraph style?
        		if (style.getType().equals("paragraph")) {                
	            	// Need to create a node for this
        			.debug("Adding '" +  styleId + "' to paragraph tree" );
	        		this.addNode(styleIdallStyles);
        		}
        	} else {
        		.debug(styleId + " is already in paragraph tree");
        	}
        }
        
		// Set up Character style tree 
		.setRootElement(new Node<AugmentedStyle>("c-root"null));
        for (String styleId : stylesInUse ) {
        	if (.get(styleId)==null) {
        		
            	Style style = allStyles.get(styleId);
                if (style == null ) {
                	.warn("Couldn't find style: " + styleId);
                	continue;
                } 	        		
        		// Is it a character style?
        		if (style.getType().equals("character")) {                
	            	// Need to create a node for this
	        		this.addNode(styleIdallStyles);
        		}
        	} else {
        		.debug(styleId + " is already in character tree");
        	}
        }        
	}
	private Node<AugmentedStyleaddNode(String styleIdMap<StringStyleallStyles,
		.debug(styleId);
    	Style style = allStyles.get(styleId);
        if (style == null ) {
        	.error("Couldn't find style: " + styleId);
        	return null;
        } 	        		
    	AugmentedStyle as = new AugmentedStyle(style);        	
    	Node<AugmentedStylen = 
    		 new Node<AugmentedStyle>(treestyleIdas); 
    	
    	// Find its parent
    	if (style.getBasedOn()==null) {
    		
    		// You can have more than 1 node which isn't based on anything
			.debug("Style " + styleId + " is not based on anything.");
			// TODO: this should be basedOn DocDefaults.    Consider whether to do this
			// at this point, or in SDP.createVirtualStylesForDocDefaults()
    	} else if (style.getBasedOn().getVal()!=null) {
        	String basedOnStyleName = style.getBasedOn().getVal();   
        	.debug("..based on " + basedOnStyleName);        	
        	if (tree.get(basedOnStyleName)==null) {
//            	log.debug("..can disregard that null, but it shouldn't happen again for this style");        	
        		Node<AugmentedStyleparent = addNode(basedOnStyleNameallStylestree);
        		parent.addChild(n);
        	} else {
        		tree.get(basedOnStyleName).addChild(n);
        	}
        	
    	} else {
    		.error("No basedOn set for: " + style.getStyleId() );
    	}
    	
    	return n;
	}
	public static void main(String[] argsthrows Exception {
		String inputfilepath = System.getProperty("user.dir") + "/sample-docs/StyleResolution.xml";
		WordprocessingMLPackage wmlPackage = WordprocessingMLPackage.load(new java.io.File(inputfilepath));		
		// Setup
    	Set<StringstylesInUse = wmlPackage.getMainDocumentPart().getStylesInUse();
    	
		Map<StringStyleallStyles = new HashMap<StringStyle>();
		for ( org.docx4j.wml.Style s : styles.getStyle() ) {				
			allStyles.put(s.getStyleId(), s);	
			.debug("live style: " + s.getStyleId() );
		}
    	
		StyleTree st = new StyleTree(stylesInUseallStyles);
		.debug("\nParagraph styles\n");
		.debug(st.pTree.toString());
		.debug("\nCharacter styles\n");
		.debug(st.cTree.toString());
		.debug("\nParagraph classes\n");
		Iterator it = st.pTree.nodes.entrySet().iterator();
	    while (it.hasNext()) {
	        Map.Entry pairs = (Map.Entry)it.next();
	        
	        // Eclipse is fine with this, but not Ant.
	        // Underlying problem is http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6665356 (fixed in  7(b44) )   
	        // Preview Milestone 4 is b66.  
	        // Which fixes this problem (remember, you need jdk1.7.0/jre/lib/endorsed/jaxb-*
	        
	        Node<AugmentedStylen 
	        	= (Node<AugmentedStyle>)pairs.getValue();
	        List<Node<AugmentedStyle>> classVals =  st.pTree.climb(n);
	        
	        .debug(n.name + ":'" + 
	        		getHtmlClassAttributeValue(st.pTreen)
	        		+ "'");
	    }
	    .debug("\nRun classes\n");
		it = st.cTree.nodes.entrySet().iterator();
	    while (it.hasNext()) {
	        Map.Entry pairs = (Map.Entry)it.next();
	        	        
	        Node<AugmentedStylen 
	        	= (Node<AugmentedStyle>)pairs.getValue();
	        List<Node<AugmentedStyle>> classVals =  st.cTree.climb(n);
	        
	        .debug(n.name + ":'" + 
	        		getHtmlClassAttributeValue(st.cTreen)
	        		+ "'");
	    }
	    
	}
    	if (n==null) {
    		.error("Null node passed");
    		return null;
    	}
        List<Node<AugmentedStyle>> classVals =  tree.climb(n);
    	StringBuffer sb = new StringBuffer();
        for (Node<AugmentedStylevalNode : classVals) { 
        	// Avoid including root node (eg dummy character root node)
        	if (valNode.getData()!=null) {
        		sb.append(valNode.name + " ");
        	}
        }
        return sb.toString();
	}
	public class AugmentedStyle {
		private Style s;		
		public AugmentedStyle(Style s) {
			this. = s;
		}
		public Style getStyle() {
			return ;
		}
	}
New to GrepCode? Check out our FAQ X