Type TDocxStyles = Class
	//段落格式
	Function Create(docx);
	Begin
		docx_ := docx;
		stylesXml_ := docx.Zip().Get('word/styles.xml');
		idMap_ := array();
		nameMap_ := array();
		maxStyleId_ := 1;
		
		if ifObj(stylesXml_) then Begin
			stylesNode := stylesXml_.FirstChildElement('w:styles');
			if ifObj(stylesNode) then Begin
				node := stylesNode.FirstChildElement('w:style');
				while ifObj(node) do Begin
					o := TOfficeObj('TDocxStyle');
					o.Init(node);
					id := StrToIntDef(o.StyleId, 0);
					if id > 0 and maxStyleId_ <= id then
						maxStyleId_ := id + 1;
					_addStyle(o);
					node := node.NextElement('w:style');
				End;
				pNode := class(TSXml).GetNode(stylesNode, 'w:docDefaults/w:pPrDefault');
				if ifObj(pNode) then
					defaultPpr_ := Class(TSXml).ReadPprFormat(pNode);

				rNode := class(TSXml).GetNode(stylesNode, 'w:docDefaults/w:rPrDefault');
				if ifObj(rNode) then
					defaultRpr_ := Class(TSXml).ReadRprFormat(rNode);					
			End;
		End;
	End;

	///缺省样式
	///styleType：样式类型（paragraph、character、table）
	///返回：TDocxStyle对象
	Function Default(styleType);
	Begin
		for k, obj in idMap_ do Begin
			if obj.wType = styleType then Begin
				v := obj.node_.GetAttribute('w:default');
				if v <> '1' then
					return obj;
			End;
		End
		return nil;
	End;
	
	///返回指定名称的TDocxStyle
	///name：样式名称
	///返回：TDocxStyle对象
	Function GetStyle(name);
	Begin
		return nameMap_[ lowercase(name) ];
	End;
	
	///返回指定StyleId名称的TDocxStyle
	///id：StyleID号（数字ID号或名称字符串）
	///返回：TDocxStyle对象
	Function GetStyleById(id);
	Begin
		return idMap_[ id ];
	End;
	
	//返回全部LatentStyles对象列表
	//返回：TDocxStyle对象列表
	Function LatentStyles();
	Begin
		r := array();
		node := stylesXml_.FirstChildElement('w:styles');
		if ifObj(node) then 
			node := node.FirstChildElement('w:latentStyles');
		if ifObj(node) then Begin
			node := node.FirstChildElement('w:lsdException');
			while ifObj(node) do Begin
				o := TOfficeObj('TDocxStyle');
				o.Init(node);
				r[ length(r) ] := o;
				node := node.NextElement('w:lsdException');
			End;
		End;
		return r;
	End;
	
	///返回全部Styles对象列表
	///返回：TDocxStyle对象列表
	Function Styles();
	Begin
		return idMap_;
	End;
	
	///插入新的段落样式
	///styleId：样式ID，可以是自定义名称
	///xmlStr：InnerXml串
	///返回：TDocxStyle对象
	Function AddStyleByInnerXml(styleId, xmlStr);
	Begin
		if ifstring(styleId) and styleId <> '' then Begin
			style := GetStyle(styleId);
			if ifObj(style) then 
				return style;
			node := stylesXml_.FirstChildElement('w:styles').InsertEndChild(xmlStr);
			node.SetAttribute('w:styleId', styleId);
		End
		else Begin
			node := stylesXml_.FirstChildElement('w:styles').InsertEndChild(xmlStr);
			node.SetAttribute('w:styleId', maxStyleId_++);
		End;
		o := TOfficeObj('TDocxStyle');
		o.Init(node);
		_addStyle(o);
		return o;
	End;
	
	///插入新的段落样式
	///o：TDocxStyle对象
	///StyleId：样式ID，可以是自定义名称
	///返回：TDocxStyle对象
	Function AddStyle(o, StyleId);
	Begin
		if ifObj(o) then Begin
			if ifString(StyleId) and StyleId <> '' and not ifObj(idMap_[ StyleId ]) then
				o.StyleId := StyleId;
			else
				o.StyleId := maxStyleId_++;
			node := stylesXml_.FirstChildElement('w:styles').InsertEndChild(o.Marshal());
			obj := TOfficeObj('TDocxStyle');
			obj.Init(node);
			_addStyle(obj);
			return obj;
		End;
		return nil;
	End;
	
	///插入新的LatentStyle段落样式
	///o：TDocxStyle对象
	///返回：TDocxStyle对象
	Function AddLatentStyle(o);
	Begin
		if ifObj(o) then Begin
			latentStyles := stylesXml_.FirstChildElement('w:styles').InsertEndChild('w:latentStyles');
			node := latentStyles.InsertEndChild('lsdException');
			node.UnMarshal(o);
			latentStyles.SetAttribute('w:count', length(LatentStyles()));
			return node;
		End;
		return nil;
	End;
	
	///插入缺省的段落样式（Title、Heading1-9）
	///返回：TDocxStyle对象
	Function AddDefaultStyle(Name);
	Begin
		styleId := AnsiReplaceText(Name, ' ', '');
		charId := StyleId + 'Char';
		styleFname := 'wStyle/' + styleId + '.xml';
		cStyleFname := 'wStyle/' + charId + '.xml';
		xmlData := TOfficeTemplate(styleFname);
		if ifnil(xmlData) then
			return xmlData;
		o := AddStyleByInnerXml(styleId, xmlData);
		
		charStyle := idMap_[charId];
		if not ifObj(charStyle) then Begin
			xmlData := TOfficeTemplate(cStyleFname);
			if ifstring(xmlData) then Begin
				AddStyleByInnerXml(charId, xmlData);
			End;
		End;
		return o;
	End;
	
	Function _addStyle(o);
	Begin
		idMap_[ o.StyleId ] := o;
		nameMap_[ lowercase(o.Name) ] := o;
	End;
	
	defaultPpr_;
	defaultRpr_;
private	
	docx_;
	stylesXml_;
	idMap_;
	nameMap_;
	maxStyleId_:integer;
End;