diff --git a/docx/TSDocxApplication.tsf b/docx/TSDocxApplication.tsf index 6275594..d117ea1 100644 --- a/docx/TSDocxApplication.tsf +++ b/docx/TSDocxApplication.tsf @@ -357,7 +357,7 @@ Begin End; -// property +// Properties Function TSDocxApplication.ReadDocuments(Index) Begin if ifnil(Index) then return documents_; diff --git a/docx/TSDocxCell.tsf b/docx/TSDocxCell.tsf index 6193bc1..ce2c988 100644 --- a/docx/TSDocxCell.tsf +++ b/docx/TSDocxCell.tsf @@ -118,6 +118,9 @@ Function TSDocxCell.Init(node);overload; Begin cell_ := TOfficeObj("tcell"); cell_.Create(node); + tcpr_node := class(TSXml).GetNode(node, "w:tcPr", "first"); + tcpr_ := TOfficeObj("TwTcPr"); + tcpr_.InitRootNode(tcpr_node); End; Function TSDocxCell.GetCell(); @@ -418,7 +421,7 @@ End; Function TSDocxCell.ReadShading(); Begin shading_obj := new TSDocxShading(self.Application, self.Creator, self); - shading_obj.Init(tcpr_); + shading_obj.Init(tcpr_.Shading); return shading_obj; End; @@ -562,12 +565,9 @@ Function TSDocxCell.ReadRange(); Begin if ifnil(range_) then begin - pbegin := 0; - pend := 0; - arr := array(); - class(TSWdCommon).CalculateRange(table_.Root(), docx_.Body().Root(), GetCell().Root(), false, pbegin, pend, arr); + obj := new TSWdRange(docx_.Body().Root(), GetCell().Root()); range_ := new TSDocxRange(self.Application, self.Creator, self); - range_.Init(pbegin, pend, arr); + range_.Init(docx_, obj); end return range_; End; diff --git a/docx/TSDocxDocument.tsf b/docx/TSDocxDocument.tsf index 215eeab..75bfb49 100644 --- a/docx/TSDocxDocument.tsf +++ b/docx/TSDocxDocument.tsf @@ -1,7 +1,8 @@ Type TSDocxDocument = Class(TSVbaBase) +Uses TSDocxEnumerations; public - Function Init(docx, name, fullname); + Function Init(docx, collection, name, fullname); private collection_; @@ -12,6 +13,7 @@ private paragraphs_; public + // Methods Function AcceptAllRevisions(); Function AcceptAllRevisionsShown(); Function Activate(); // Completed @@ -63,7 +65,7 @@ public Function PresentIt(); Function PrintOut(Background, Append, Range, OutputFileName, _From, _To, Item, Copies, Pages, PageType, PrintToFile, Collate, FileName, ActivePrinterMacGX, ManualDuplexPrint, PrintZoomColumn, PrintZoomRow, PrintZoomPaperWidth, PrintZoomPaperHeight); Function PrintPreview(); - Function Protect(Type, NoReset, Password, UseIRM, EnforceStyleLock); + Function Protect(_Type, NoReset, Password, UseIRM, EnforceStyleLock); Function Range(Start, _End); Function Redo(Times); Function RejectAllRevisions(); @@ -112,6 +114,7 @@ public Function ViewPropertyBrowser(); Function WebPagePreview(); + // Properties property ActiveTheme read ReadActiveTheme; property ActiveThemeDisplayName read ReadActiveThemeDisplayName; property ActiveWindow read ReadActiveWindow; @@ -579,12 +582,12 @@ public End; // ============== 实现 ================= // -Function TSDocxDocument.Init(docx, name, fullname); +Function TSDocxDocument.Init(docx, collection, name, fullname); Begin docx_ := docx; file_name_ := name; full_name_ := fullname; - collection_ := class(Collection).GetInstance('document'); + collection_ := collection; tables_ := new TSDocxTables(self.Application, self.Creator, self); tables.Init(docx_); paragraphs_ := new TSDocxParagraphs(self.Application, self.Creator, self); @@ -599,8 +602,18 @@ End; Function TSDocxDocument.Close(SaveChanges, OriginalFormat, RouteTSDocxDocument) Begin - [err, msg] := docx_.Save(); - if not err then collection_.RemoveCollection(file_name_); + if ifnil(SaveChanges) then SaveChanges := TSDocxEnumerations.wdDoNotSaveChanges(); + case SaveChanges of + TSDocxEnumerations.wdDoNotSaveChanges(): + collection_.RemoveCollection(file_name_); + TSDocxEnumerations.wdPromptToSaveChanges(): + return; + TSDocxEnumerations.wdSaveChanges(): + begin + [err, msg] := docx_.Save(); + if not err then collection_.RemoveCollection(file_name_); + end + end; End; Function TSDocxDocument.Save(); @@ -619,13 +632,10 @@ End; Function TSDocxDocument.Range(Start, _End); Begin - // Range(0, 1) 左开右闭 - node := docx_.Body().Node(); // - total_position := 0; - arr := array(); - class(TSWdCommon).SplitRange(node, node, Start, _End, total_position, arr); + // Range[0, 1) 左开右闭 + obj := new TSWdRange(docx_.Body().Root(), Start, _End); range_obj := new TSDocxRange(self.Application, self.Creator, self); - range_obj.Init(Start, _End, arr); + range_obj.Init(docx_, obj); return range_obj; End; diff --git a/docx/TSDocxDocuments.tsf b/docx/TSDocxDocuments.tsf index 678d2c5..279bb24 100644 --- a/docx/TSDocxDocuments.tsf +++ b/docx/TSDocxDocuments.tsf @@ -35,15 +35,16 @@ End; // ============== 实现 ================= // Function TSDocxDocuments.Init(); Begin - collection_ := class(Collection).GetInstance('document'); + collection_ := new Collection(); End; Function TSDocxDocuments.AddDocument(docx, fullname); Begin name := ExtractFileName(fullname); document := new TSDocxDocument(self.Application, self.Creator, self); - document.Init(docx, name, fullname); + document.Init(docx, collection_, name, fullname); collection_.AddCollection(document, name); + return document; End; Function Operator TSDocxDocuments.[](index); @@ -56,12 +57,19 @@ Begin return collection_.GetActivation(); End; -// function +// Methods Function TSDocxDocuments.Add(Template, NewTemplate, DocumentType, Visible); Begin docx := new TSDocxFile(); docx.NewFile(); - AddDocument(docx, collection_.CalNewName("文档")); + return AddDocument(docx, collection_.CalNewName("文档")); +End; + +Function TSDocxDocuments.Close(SaveChanges, OriginalFormat, RouteDocument); +Begin + num := self.Count; + for i:=1 to num do + self[i].Close(SaveChanges, OriginalFormat, RouteDocument); End; Function TSDocxDocuments.Item(Index); @@ -76,7 +84,7 @@ Begin docx := new TSDocxFile(); [err, msg] := docx.OpenFile("", FileName, PasswordDocument); if err then return; - AddDocument(docx, docx.FileName()); + return AddDocument(docx, docx.FileName()); End; Function TSDocxDocuments.Save(NoPrompt, OriginalFormat); @@ -86,7 +94,7 @@ Begin self[i].Save(); End; -// property +// Properties Function TSDocxDocuments.ReadCount(); Begin return collection_.GetCount(); diff --git a/docx/TSDocxEnumerations.tsf b/docx/TSDocxEnumerations.tsf index a812c51..d699e85 100644 --- a/docx/TSDocxEnumerations.tsf +++ b/docx/TSDocxEnumerations.tsf @@ -489,6 +489,98 @@ Interface Function wdLineWidth450pt(); Function wdLineWidth600pt(); + // WdLineSpacing + Function wdLineSpace1pt5(); + Function wdLineSpaceAtLeast(); + Function wdLineSpaceDouble(); + Function wdLineSpaceExactly(); + Function wdLineSpaceMultiple(); + Function wdLineSpaceSingle(); + + // WdParagraphAlignment + Function wdAlignParagraphCenter(); + Function wdAlignParagraphDistribute(); + Function wdAlignParagraphJustify(); + Function wdAlignParagraphJustifyHi(); + Function wdAlignParagraphJustifyLow(); + Function wdAlignParagraphJustifyMed(); + Function wdAlignParagraphLeft(); + Function wdAlignParagraphRight(); + Function wdAlignParagraphThaiJustify(); + + // WdBaselineAlignment + Function wdBaselineAlignAuto(); + Function wdBaselineAlignBaseline(); + Function wdBaselineAlignCenter(); + Function wdBaselineAlignFarEast50(); + Function wdBaselineAlignTop(); + + // WdOutlineLevel + Function wdOutlineLevel1(); + Function wdOutlineLevel2(); + Function wdOutlineLevel3(); + Function wdOutlineLevel4(); + Function wdOutlineLevel5(); + Function wdOutlineLevel6(); + Function wdOutlineLevel7(); + Function wdOutlineLevel8(); + Function wdOutlineLevel9(); + Function wdOutlineLevelBodyText(); + + // WdReadingOrder + Function wdReadingOrderLtr(); + Function wdReadingOrderRtl(); + + // WdTextboxTightWrap + Function wdTightAll(); + Function wdTightFirstAndLastLines(); + Function wdTightFirstLineOnly(); + Function wdTightLastLineOnly(); + Function wdTightNone(); + + // WdInformation + Function wdActiveEndAdjustedPageNumber(); + Function wdActiveEndPageNumber(); + Function wdActiveEndSectionNumber(); + Function wdAtEndOfRowMarker(); + Function wdCapsLock(); + Function wdEndOfRangeColumnNumber(); + Function wdEndOfRangeRowNumber(); + Function wdFirstCharacterColumnNumber(); + Function wdFirstCharacterLineNumber(); + Function wdFrameIsSelected(); + Function wdHeaderFooterType(); + Function wdHorizontalPositionRelativeToPage(); + Function wdHorizontalPositionRelativeToTextBoundary(); + Function wdInBibliography(); + Function wdInCitation(); + Function wdInClipboard(); + Function wdInCommentPane(); + Function wdInContentControl(); + Function wdInCoverPage(); + Function wdInEndnote(); + Function wdInFieldCode(); + Function wdInFieldResult(); + Function wdInFootnote(); + Function wdInFootnoteEndnotePane(); + Function wdInHeaderFooter(); + Function wdInMasterDocument(); + Function wdInWordMail(); + Function wdMaximumNumberOfColumns(); + Function wdMaximumNumberOfRows(); + Function wdNumberOfPagesInDocument(); + Function wdNumLock(); + Function wdOverType(); + Function wdReferenceOfType(); + Function wdRevisionMarking(); + Function wdSelectionMode(); + Function wdStartOfRangeColumnNumber(); + Function wdStartOfRangeRowNumber(); + Function wdVerticalPositionRelativeToPage(); + Function wdVerticalPositionRelativeToTextBoundary(); + Function wdWithInTable(); + Function wdZoomPercentage(); + Implementation // WdConstants enumeration @@ -2311,5 +2403,331 @@ Implementation return 48; End; + // WdLineSpacing + Function wdLineSpace1pt5(); + Begin + return 1; + End; + Function wdLineSpaceAtLeast(); + Begin + return 3; + End; + Function wdLineSpaceDouble(); + Begin + return 2; + End; + Function wdLineSpaceExactly(); + Begin + return 4; + End; + Function wdLineSpaceMultiple(); + Begin + return 5; + End; + Function wdLineSpaceSingle(); + Begin + return 0; + End; + + // WdParagraphAlignment + Function wdAlignParagraphCenter(); + Begin + return 1; + End; + Function wdAlignParagraphDistribute(); + Begin + return 4; + End; + Function wdAlignParagraphJustify(); + Begin + return 3; + End; + Function wdAlignParagraphJustifyHi(); + Begin + return 7; + End; + Function wdAlignParagraphJustifyLow(); + Begin + return 8; + End; + Function wdAlignParagraphJustifyMed(); + Begin + return 5; + End; + Function wdAlignParagraphLeft(); + Begin + return 0; + End; + Function wdAlignParagraphRight(); + Begin + return 2; + End; + Function wdAlignParagraphThaiJustify(); + Begin + return 9; + End; + + // WdBaselineAlignment + Function wdBaselineAlignAuto(); + Begin + return 4; + End; + Function wdBaselineAlignBaseline(); + Begin + return 2; + End; + Function wdBaselineAlignCenter(); + Begin + return 1; + End; + Function wdBaselineAlignFarEast50(); + Begin + return 3; + End; + Function wdBaselineAlignTop(); + Begin + return 0; + End; + + // WdOutlineLevel + Function wdOutlineLevel1(); + Begin + return 1; + End; + Function wdOutlineLevel2(); + Begin + return 2; + End; + Function wdOutlineLevel3(); + Begin + return 3; + End; + Function wdOutlineLevel4(); + Begin + return 4; + End; + Function wdOutlineLevel5(); + Begin + return 5; + End; + Function wdOutlineLevel6(); + Begin + return 6; + End; + Function wdOutlineLevel7(); + Begin + return 7; + End; + Function wdOutlineLevel8(); + Begin + return 8; + End; + Function wdOutlineLevel9(); + Begin + return 9; + End; + Function wdOutlineLevelBodyText(); + Begin + return 10; + End; + + // WdReadingOrder + Function wdReadingOrderLtr(); + Begin + return 1; + End; + Function wdReadingOrderRtl(); + Begin + return 0; + End; + + // WdTextboxTightWrap + Function wdTightAll(); + Begin + return 1; + End; + Function wdTightFirstAndLastLines(); + Begin + return 2; + End; + Function wdTightFirstLineOnly(); + Begin + return 3; + End; + Function wdTightLastLineOnly(); + Begin + return 4; + End; + Function wdTightNone(); + Begin + return 0; + End; + + // WdInformation + Function wdActiveEndAdjustedPageNumber(); + Begin + return 1; + End; + Function wdActiveEndPageNumber(); + Begin + return 3; + End; + Function wdActiveEndSectionNumber(); + Begin + return 2; + End; + Function wdAtEndOfRowMarker(); + Begin + return 31; + End; + Function wdCapsLock(); + Begin + return 21; + End; + Function wdEndOfRangeColumnNumber(); + Begin + return 17; + End; + Function wdEndOfRangeRowNumber(); + Begin + return 14; + End; + Function wdFirstCharacterColumnNumber(); + Begin + return 9; + End; + Function wdFirstCharacterLineNumber(); + Begin + return 10; + End; + Function wdFrameIsSelected(); + Begin + return 11; + End; + Function wdHeaderFooterType(); + Begin + return 33; + End; + Function wdHorizontalPositionRelativeToPage(); + Begin + return 5; + End; + Function wdHorizontalPositionRelativeToTextBoundary(); + Begin + return 7; + End; + Function wdInBibliography(); + Begin + return 42; + End; + Function wdInCitation(); + Begin + return 43; + End; + Function wdInClipboard(); + Begin + return 38; + End; + Function wdInCommentPane(); + Begin + return 26; + End; + Function wdInContentControl(); + Begin + return 46; + End; + Function wdInCoverPage(); + Begin + return 41; + End; + Function wdInEndnote(); + Begin + return 36; + End; + Function wdInFieldCode(); + Begin + return 44; + End; + Function wdInFieldResult(); + Begin + return 45; + End; + Function wdInFootnote(); + Begin + return 35; + End; + Function wdInFootnoteEndnotePane(); + Begin + return 25; + End; + Function wdInHeaderFooter(); + Begin + return 28; + End; + Function wdInMasterDocument(); + Begin + return 34; + End; + Function wdInWordMail(); + Begin + return 37; + End; + Function wdMaximumNumberOfColumns(); + Begin + return 18; + End; + Function wdMaximumNumberOfRows(); + Begin + return 15; + End; + Function wdNumberOfPagesInDocument(); + Begin + return 4; + End; + Function wdNumLock(); + Begin + return 22; + End; + Function wdOverType(); + Begin + return 23; + End; + Function wdReferenceOfType(); + Begin + return 32; + End; + Function wdRevisionMarking(); + Begin + return 24; + End; + Function wdSelectionMode(); + Begin + return 20; + End; + Function wdStartOfRangeColumnNumber(); + Begin + return 16; + End; + Function wdStartOfRangeRowNumber(); + Begin + return 13; + End; + Function wdVerticalPositionRelativeToPage(); + Begin + return 6; + End; + Function wdVerticalPositionRelativeToTextBoundary(); + Begin + return 8; + End; + Function wdWithInTable(); + Begin + return 12; + End; + Function wdZoomPercentage(); + Begin + return 19; + End; + End. diff --git a/docx/TSDocxParagraph.tsf b/docx/TSDocxParagraph.tsf index e1f1c15..3f8c06e 100644 --- a/docx/TSDocxParagraph.tsf +++ b/docx/TSDocxParagraph.tsf @@ -1,183 +1,58 @@ -Type TSDocxParagraph = Class(TSVbaBase) +Type TSDocxParagraph = Class(TSDocxParagraphFormat) public - Function Init(body, paragraph, index); + Function Init(docx, paragraph, index); private - body_; paragraph_; // TOfficeObj("TParagraph") index_; // 第N个段落,1开始计数 range_; public - Function CloseUp(); + // Methods Function Indent(); - Function IndentCharWidth(Count); - Function IndentFirstLineCharWidth(Count); Function JoinList(); Function ListAdvanceTo(); Function Next(Count); - Function OpenOrCloseUp(); - Function OpenUp(); Function Outdent(); Function OutlineDemote(); Function OutlineDemoteToBody(); Function OutlinePromote(); Function Previous(Count); - Function Reset(); Function ResetAdvanceTo(); Function SelectNumber(); Function SeparateList(); - Function Space1(); - Function Space15(); - Function Space2(); - Function TabHangingIndent(Count); - Function TabIndent(Count); - property AddSpaceBetweenFarEastAndAlpha read ReadAddSpaceBetweenFarEastAndAlpha write WriteAddSpaceBetweenFarEastAndAlpha; - property AddSpaceBetweenFarEastAndDigit read ReadAddSpaceBetweenFarEastAndDigit write WriteAddSpaceBetweenFarEastAndDigit; - property Alignment read ReadAlignment write WriteAlignment; - property AutoAdjustRightIndent read ReadAutoAdjustRightIndent write WriteAutoAdjustRightIndent; - property BaseLineAlignment read ReadBaseLineAlignment write WriteBaseLineAlignment; - property Borders read ReadBorders; - property CharacterUnitFirstLineIndent read ReadCharacterUnitFirstLineIndent write WriteCharacterUnitFirstLineIndent; - property CharacterUnitLeftIndent read ReadCharacterUnitLeftIndent write WriteCharacterUnitLeftIndent; - property CharacterUnitRightIndent read ReadCharacterUnitRightIndent write WriteCharacterUnitRightIndent; property CollapsedState read ReadCollapsedState write WriteCollapsedState; - property CollapseHeadingByDefault read ReadCollapseHeadingByDefault write WriteCollapseHeadingByDefault; - property DisableLineHeightGrid read ReadDisableLineHeightGrid write WriteDisableLineHeightGrid; property DropCap read ReadDropCap; - property FarEastLineBreakControl read ReadFarEastLineBreakControl write WriteFarEastLineBreakControl; - property FirstLineIndent read ReadFirstLineIndent write WriteFirstLineIndent; property Format read ReadFormat write WriteFormat; - property HalfWidthPunctuationOnTopOfLine read ReadHalfWidthPunctuationOnTopOfLine write WriteHalfWidthPunctuationOnTopOfLine; - property HangingPunctuation read ReadHangingPunctuation write WriteHangingPunctuation; - property Hyphenation read ReadHyphenation write WriteHyphenation; property ID read ReadID write WriteID; property IsStyleSeparator read ReadIsStyleSeparator; - property KeepTogether read ReadKeepTogether write WriteKeepTogether; - property KeepWithNext read ReadKeepWithNext write WriteKeepWithNext; - property LeftIndent read ReadLeftIndent write WriteLeftIndent; - property LineSpacing read ReadLineSpacing write WriteLineSpacing; - property LineSpacingRule read ReadLineSpacingRule write WriteLineSpacingRule; - property LineUnitAfter read ReadLineUnitAfter write WriteLineUnitAfter; - property LineUnitBefore read ReadLineUnitBefore write WriteLineUnitBefore; property ListNumberOriginal read ReadListNumberOriginal; - property MirrorIndents read ReadMirrorIndents write WriteMirrorIndents; - property NoLineNumber read ReadNoLineNumber write WriteNoLineNumber; - property OutlineLevel read ReadOutlineLevel write WriteOutlineLevel; - property PageBreakBefore read ReadPageBreakBefore write WritePageBreakBefore; property Range read ReadRange; - property ReadingOrder read ReadReadingOrder write WriteReadingOrder; - property RightIndent read ReadRightIndent write WriteRightIndent; - property Shading read ReadShading; - property SpaceAfter read ReadSpaceAfter write WriteSpaceAfter; - property SpaceAfterAuto read ReadSpaceAfterAuto write WriteSpaceAfterAuto; - property SpaceBefore read ReadSpaceBefore write WriteSpaceBefore; - property SpaceBeforeAuto read ReadSpaceBeforeAuto write WriteSpaceBeforeAuto; - property Style read ReadStyle write WriteStyle; - property TabStops read ReadTabStops write WriteTabStops; - property TextboxTightWrap read ReadTextboxTightWrap write WriteTextboxTightWrap; - property WidowControl read ReadWidowControl write WriteWidowControl; - property WordWrap read ReadWordWrap write WriteWordWrap; - Function WriteWordWrap(value); - Function ReadWordWrap(); - Function WriteWidowControl(value); - Function ReadWidowControl(); - Function WriteTextboxTightWrap(value); - Function ReadTextboxTightWrap(); - Function WriteTabStops(value); - Function ReadTabStops(); - Function WriteStyle(value); - Function ReadStyle(); - Function WriteSpaceBeforeAuto(value); - Function ReadSpaceBeforeAuto(); - Function WriteSpaceBefore(value); - Function ReadSpaceBefore(); - Function WriteSpaceAfterAuto(value); - Function ReadSpaceAfterAuto(); - Function WriteSpaceAfter(value); - Function ReadSpaceAfter(); - Function ReadShading(); - Function WriteRightIndent(value); - Function ReadRightIndent(); - Function WriteReadingOrder(value); - Function ReadReadingOrder(); - Function ReadRange(); - Function WritePageBreakBefore(value); - Function ReadPageBreakBefore(); - Function WriteOutlineLevel(value); - Function ReadOutlineLevel(); - Function WriteNoLineNumber(value); - Function ReadNoLineNumber(); - Function WriteMirrorIndents(value); - Function ReadMirrorIndents(); - Function ReadListNumberOriginal(); - Function WriteLineUnitBefore(value); - Function ReadLineUnitBefore(); - Function WriteLineUnitAfter(value); - Function ReadLineUnitAfter(); - Function WriteLineSpacingRule(value); - Function ReadLineSpacingRule(); - Function WriteLineSpacing(value); - Function ReadLineSpacing(); - Function WriteLeftIndent(value); - Function ReadLeftIndent(); - Function WriteKeepWithNext(value); - Function ReadKeepWithNext(); - Function WriteKeepTogether(value); - Function ReadKeepTogether(); - Function ReadIsStyleSeparator(); - Function WriteID(value); - Function ReadID(); - Function WriteHyphenation(value); - Function ReadHyphenation(); - Function WriteHangingPunctuation(value); - Function ReadHangingPunctuation(); - Function WriteHalfWidthPunctuationOnTopOfLine(value); - Function ReadHalfWidthPunctuationOnTopOfLine(); - Function WriteFormat(value); - Function ReadFormat(); - Function WriteFirstLineIndent(value); - Function ReadFirstLineIndent(); - Function WriteFarEastLineBreakControl(value); - Function ReadFarEastLineBreakControl(); - Function ReadDropCap(); - Function WriteDisableLineHeightGrid(value); - Function ReadDisableLineHeightGrid(); - Function WriteCollapseHeadingByDefault(value); - Function ReadCollapseHeadingByDefault(); Function WriteCollapsedState(value); Function ReadCollapsedState(); - Function WriteCharacterUnitRightIndent(value); - Function ReadCharacterUnitRightIndent(); - Function WriteCharacterUnitLeftIndent(value); - Function ReadCharacterUnitLeftIndent(); - Function WriteCharacterUnitFirstLineIndent(value); - Function ReadCharacterUnitFirstLineIndent(); - Function ReadBorders(index); - Function WriteBaseLineAlignment(value); - Function ReadBaseLineAlignment(); - Function WriteAutoAdjustRightIndent(value); - Function ReadAutoAdjustRightIndent(); - Function WriteAlignment(value); - Function ReadAlignment(); - Function WriteAddSpaceBetweenFarEastAndDigit(value); - Function ReadAddSpaceBetweenFarEastAndDigit(); - Function WriteAddSpaceBetweenFarEastAndAlpha(value); - Function ReadAddSpaceBetweenFarEastAndAlpha(); + Function ReadDropCap(); + Function WriteFormat(value); + Function ReadFormat(); + Function WriteID(value); + Function ReadID(); + Function ReadIsStyleSeparator(); + Function ReadListNumberOriginal(); + Function ReadRange(); + End; // ============== 实现 ================= // -Function TSDocxParagraph.Init(body, paragraph, index); +Function TSDocxParagraph.Init(docx, paragraph, index); Begin - body_ := body; paragraph_ := paragraph; index_ := index; range_ := nil; + class(TSDocxParagraphFormat).Init(docx, paragraph_.pPr); End; -// function +// Methods Function TSDocxParagraph.Next(Count); Begin return self.Parent.Item(index + Count); @@ -187,25 +62,25 @@ Function TSDocxParagraph.Previous(Count); Begin return self.Parent.Item(index - Count); End; -// property -Function TSDocxParagraph.ReadBorders(index); -Begin - borders_obj := new TSDocxBordersParagraph(self.Application, self.Creator, self.Parent); - borders_obj.Init(paragraph_); - return ifnil(index) ? borders_obj : borders_obj[index]; -End; +// Properties Function TSDocxParagraph.ReadRange(); Begin if ifnil(range_) then begin - pbegin := 0; - pend := 0; - arr := array(); - node := body_.Root(); - class(TSWdCommon).CalculateRange(node, node, paragraph_.Root(), false, pbegin, pend, arr); + obj := new TSWdRange(docx_.Body().Root(), paragraph_.Root()); range_ := new TSDocxRange(self.Application, self.Creator, self); - range_.Init(pbegin, pend, arr); + range_.Init(docx_, obj); end return range_; End; + +Function TSDocxParagraph.ReadFormat(); +Begin + return self; +End; + +Function TSDocxParagraph.WriteFormat(value); +Begin + self.ReWrite(value); +End; diff --git a/docx/TSDocxParagraphs.tsf b/docx/TSDocxParagraphs.tsf index 3fd9ad9..ce0eca3 100644 --- a/docx/TSDocxParagraphs.tsf +++ b/docx/TSDocxParagraphs.tsf @@ -7,7 +7,7 @@ public private docx_; - body_; + lastnode_; paragraphs_; // TOfficeObj("TParagraph")数组 public @@ -154,9 +154,9 @@ End; Function TSDocxParagraphs.Init(docx); Begin docx_ := docx; - body_ := docx_.Body(); paragraphs_ := array(); - SerializeParagraphs(body_.Node()); + lastnode_ := nil; + SerializeParagraphs(docx_.Body().Node()); End; Function TSDocxParagraphs.SerializeParagraphs(root); @@ -170,6 +170,7 @@ Begin obj := TOfficeObj("TParagraph"); obj.Init(node); paragraphs_[length(paragraphs_)] := obj; + lastnode_ := node; end else if name = "w:tbl" then begin @@ -185,6 +186,7 @@ Begin paragraphs_[length(paragraphs_)] := TOfficeObj("TParagraph"); tr := tr.NextElement("w:tr"); end + lastnode_ := node; end node := node.NextElement(); End; @@ -193,11 +195,24 @@ End; Function Operator TSDocxParagraphs.[](index); Begin paragraph_obj := new TSDocxParagraph(self.Application, self.Creator, self.Parent); - paragraph_obj.Init(body_, paragraphs_[index], index + 1); + paragraph_obj.Init(docx_, paragraphs_[index], index + 1); return paragraph_obj; End; -// function +// Methods +Function TSDocxParagraphs.Add(Range); +Begin + if lastnode_ then + node := docx_.Body().Root().InsertAfterChild(lastnode_, "element", "w:p"); + else + node := docx_.Body().Root().InsertFirstChild("element", "w:p"); + lastnode_ := node; + obj := TOfficeObj("TParagraph"); + obj.Init(node); + paragraphs_[length(paragraphs_)] := obj; + return self.Item(length(paragraphs_) - 1); +End; + Function TSDocxParagraphs.Item(Index); Begin return self[Index - 1]; @@ -207,3 +222,13 @@ Function TSDocxParagraphs.ReadCount(); Begin return length(paragraphs_); End; + +Function TSDocxParagraphs.ReadFirst(); +Begin + return self.Item(1); +End; + +Function TSDocxParagraphs.ReadLast(); +Begin + return self.Item(self.Count); +End; diff --git a/docx/TSDocxRange.tsf b/docx/TSDocxRange.tsf index 79b889a..7973f60 100644 --- a/docx/TSDocxRange.tsf +++ b/docx/TSDocxRange.tsf @@ -2,16 +2,15 @@ Type TSDocxRange = class(TSVbaBase) Uses TSDocxEnumerations; public - Function Init(pbegin, pend, arr); - Function SetRangeArr(arr); - Function SetRangeFont(); + Function Init(docx, rangeObj); Function CopyRunFormat(sourceRun, destRun); private - range_arr_; + docx_; + range_obj_; // TSWdRange range_font_; // TSDocxFontRange - begin_; - end_; + paragraph_format_range_; // TSDocxParagraphFormatRange + borders_range_; // TSDocxBordersRange public Function AutoFormat(); @@ -254,7 +253,7 @@ public Function ReadItalic(); Function ReadIsEndOfRowMark(); Function ReadInlineShapes(); - Function ReadInformation(); + Function ReadInformation(Type); Function WriteID(value); Function ReadID(); Function ReadHyperlinks(); @@ -313,20 +312,16 @@ public End; // ============== 实现 ================= // -Function TSDocxRange.Init(pbegin, pend, arr); +Function TSDocxRange.Init(docx, rangeObj); Begin - range_arr_ := arr; - begin_ := pbegin; - end_ := pend; + docx_ := docx; + range_obj_ := rangeObj; range_font_ := new TSDocxFontRange(self.Application, self.Creator, self); - range_font_.Init(range_arr_); -End; - -Function TSDocxRange.SetRangeArr(arr); -Begin - range_arr_ := arr; - range_font_ := new TSDocxFontRange(self.Application, self.Creator, self); - range_font_.Init(range_arr_); + range_font_.Init(range_obj_); + paragraph_format_range_ := new TSDocxParagraphFormatRange(self.Application, self.Creator, self); + paragraph_format_range_.Init(docx_, range_obj_); + borders_range_ := new TSDocxBordersRange(self.Application, self.Creator, self); + borders_range_.Init(range_obj_); End; Function TSDocxRange.CopyRunFormat(sourceRun, destRun); @@ -337,7 +332,8 @@ Begin class(TSXml).UpdateNode(node, marshal[0]["attribute"], marshal[0]["children"]); End; -// function +// Methods +// TODO Function TSDocxRange.InsertAfter(Text); Begin paragraph := range_arr_[length(range_arr_)-1]["tparagraph"]; @@ -355,6 +351,7 @@ Begin end End; +// TODO Function TSDocxRange.InsertBefore(Text); Begin paragraph := range_arr_[0]["tparagraph"]; @@ -374,6 +371,7 @@ Begin end End; +// TODO Function TSDocxRange.InsertBreak(Type); Begin pf := function(t, c); @@ -440,7 +438,102 @@ End; Function TSDocxRange.ReadBorders(index); Begin - borders_obj := new TSDocxBordersRange(self.Application, self.Creator, self); - borders_obj.Init(range_arr_); - return ifnil(index) ? borders_obj : borders_obj.Item(index); + return ifnil(index) ? borders_range_ : borders_range_.Item(index); +End; + +Function TSDocxRange.WriteParagraphFormat(value); +Begin + paragraph_format_range_.ReWrite(value); +End; + +Function TSDocxRange.ReadParagraphFormat(); +Begin + return paragraph_format_range_; +End; + +Function TSDocxRange.ReadInformation(Type); +Begin + case Type of + // TSDocxEnumerations.wdActiveEndAdjustedPageNumber(): + // TSDocxEnumerations.wdActiveEndPageNumber(): + // TSDocxEnumerations.wdActiveEndSectionNumber(): + // TSDocxEnumerations.wdAtEndOfRowMarker(): + // TSDocxEnumerations.wdCapsLock(): + // TSDocxEnumerations.wdEndOfRangeColumnNumber(): + // TSDocxEnumerations.wdEndOfRangeRowNumber(): + // TSDocxEnumerations.wdFirstCharacterColumnNumber(): + // TSDocxEnumerations.wdFirstCharacterLineNumber(): + // TSDocxEnumerations.wdFrameIsSelected(): + // TSDocxEnumerations.wdHeaderFooterType(): + // TSDocxEnumerations.wdHorizontalPositionRelativeToPage(): + // TSDocxEnumerations.wdHorizontalPositionRelativeToTextBoundary(): + // TSDocxEnumerations.wdInBibliography(): + // TSDocxEnumerations.wdInCitation(): + // TSDocxEnumerations.wdInClipboard(): + // TSDocxEnumerations.wdInCommentPane(): + // TSDocxEnumerations.wdInContentControl(): + // TSDocxEnumerations.wdInCoverPage(): + // TSDocxEnumerations.wdInEndnote(): + // TSDocxEnumerations.wdInFieldCode(): + // TSDocxEnumerations.wdInFieldResult(): + // TSDocxEnumerations.wdInFootnote(): + // TSDocxEnumerations.wdInFootnoteEndnotePane(): + // TSDocxEnumerations.wdInHeaderFooter(): + // TSDocxEnumerations.wdInMasterDocument(): + // TSDocxEnumerations.wdInWordMail(): + // TSDocxEnumerations.wdMaximumNumberOfColumns(): + // TSDocxEnumerations.wdMaximumNumberOfRows(): + // TSDocxEnumerations.wdNumberOfPagesInDocument(): + // TSDocxEnumerations.wdNumLock(): + // TSDocxEnumerations.wdOverType(): + // TSDocxEnumerations.wdReferenceOfType(): + // TSDocxEnumerations.wdRevisionMarking(): + // TSDocxEnumerations.wdSelectionMode(): + // TSDocxEnumerations.wdStartOfRangeColumnNumber(): + // TSDocxEnumerations.wdStartOfRangeRowNumber(): + // TSDocxEnumerations.wdVerticalPositionRelativeToPage(): + // TSDocxEnumerations.wdVerticalPositionRelativeToTextBoundary(): + TSDocxEnumerations.wdWithInTable(): + begin + for i:=0 to length(range_arr_) do + begin + node := range_arr_[i]["parent"]; + if node.GetName() <> "w:tbl" then return false; + end + return true; + end + // TSDocxEnumerations.wdZoomPercentage(): + end; +End; + +Function TSDocxRange.WriteStyle(value); +Begin + paragraph_format_range_.Style := value; +End; +Function TSDocxRange.ReadStyle(); +Begin + return paragraph_format_range_.Style; +End; + +Function TSDocxRange.WriteText(value); +Begin + range_obj_.Clear(); + run := range_obj_.Data[0]["trun"]; + if ifObj(run.Root()) then run.SetText(value); + else begin + run := range_obj_.Data[0]["tparagraph"].AppendRun(); + run.SetText(value); + range_obj_.Data[0]["trun"] := run; + end +End; +Function TSDocxRange.ReadText(); +Begin + txt := ""; + prev := range_obj_.Data[0]["tparagraph"]; + for i:=0 to length(range_obj_.Data)-1 do + begin + run := range_obj_.Data[i]["trun"]; + txt += prev = range_obj_.Data[i]["tparagraph"] ? run.Text() : "\n" + run.Text(); + end + return txt; End; diff --git a/docx/TSDocxShading.tsf b/docx/TSDocxShading.tsf deleted file mode 100644 index 93545fd..0000000 --- a/docx/TSDocxShading.tsf +++ /dev/null @@ -1,49 +0,0 @@ -Type TSDocxShading = Class(TSVbaBase) -Uses TSDocxEnumerations; - -public - Function Init(pr); - -private - pr_; // xxPr对象,比如Cell: tr.tcPr,或Paragraph: p.pPr - -public - property BackgroundPatternColor read ReadBackgroundPatternColor write WriteBackgroundPatternColor; - property BackgroundPatternColorIndex read ReadBackgroundPatternColorIndex write WriteBackgroundPatternColorIndex; - property ForegroundPatternColor read ReadForegroundPatternColor write WriteForegroundPatternColor; - property ForegroundPatternColorIndex read ReadForegroundPatternColorIndex write WriteForegroundPatternColorIndex; - property Texture read ReadTexture write WriteTexture; - Function WriteTexture(texture); - Function ReadTexture(); - Function WriteForegroundPatternColorIndex(); - Function ReadForegroundPatternColorIndex(); - Function WriteForegroundPatternColor(); - Function ReadForegroundPatternColor(); - Function WriteBackgroundPatternColorIndex(); - Function ReadBackgroundPatternColorIndex(); - Function WriteBackgroundPatternColor(); - Function ReadBackgroundPatternColor(); - -End; - - -// ============== 实现 ================= // -Function TSDocxShading.Init(pr); -Begin - pr_ := pr; -End; - -// property -Function TSDocxShading.WriteTexture(texture); -Begin - case texture of - TSDocxEnumerations.wdTextureHorizontal(): - begin - pr_.Shading.Val := "thinHorzStripe"; - pr_.Update(); - end - end; -End; -Function TSDocxShading.ReadTexture(); -Begin -End; diff --git a/docx/TSDocxTable.tsf b/docx/TSDocxTable.tsf index 92a95ac..635b25d 100644 --- a/docx/TSDocxTable.tsf +++ b/docx/TSDocxTable.tsf @@ -209,13 +209,9 @@ Function TSDocxTable.ReadRange(); Begin if ifnil(range_) then begin - pbegin := 0; - pend := 0; - arr := array(); - root := docx_.Body().Root(); - class(TSWdCommon).CalculateRange(root, root, table_.Root(), false, pbegin, pend, arr); + obj := new TSWdRange(docx_.Body().Root(), table_.Root()); range_ := new TSDocxRange(self.Application, self.Creator, self); - range_.Init(pbegin, pend, arr); + range_.Init(docx_, obj); end return range_; End; diff --git a/docx/border/TSDocxBorderRange.tsf b/docx/border/TSDocxBorderRange.tsf index 032509c..ac47419 100644 --- a/docx/border/TSDocxBorderRange.tsf +++ b/docx/border/TSDocxBorderRange.tsf @@ -2,7 +2,7 @@ Type TSDocxBorderRange = Class(TSDocxBorder) Uses TSDocxEnumerations; public - Function Init(arr, borderType); + Function Init(rangeObj, borderType); private Function GetBorderObjectByNode(node); @@ -12,9 +12,8 @@ private Function SplitRun(); private - range_arr_; + range_obj_; border_type_; - split_flag_; public Function WriteVisible(value);override; @@ -36,20 +35,17 @@ End; // ============== 实现 ================= // -Function TSDocxBorderRange.Init(arr, borderType); +Function TSDocxBorderRange.Init(rangeObj, borderType); Begin - range_arr_ := arr; + range_obj_ := rangeObj; border_type_ := borderType; - split_flag_ := false; class(TSDocxBorder).Init(nil); End; Function TSDocxBorderRange.SplitRun(); Begin - if split_flag_ then return; - class(TSWdCommon).SplitRangeRun(range_arr_); - self.Parent.SetRangeArr(range_arr_); - split_flag_ := true; + range_obj_.SplitRangeRun(); + self.Parent.SetRangeObj(range_obj_); End; Function TSDocxBorderRange.GetBorder(arr, hash); @@ -100,9 +96,10 @@ Function TSDocxBorderRange.CallFunction(fname, value);overload; Begin SplitRun(); hash := array(); - for i:=0 to length(range_arr_)-1 do + range_arr := rangeObj.GetInfo(); + for i:=0 to length(range_arr)-1 do begin - border := GetBorder(range_arr_[i], hash); + border := GetBorder(range_arr[i], hash); if ifnil(border) then continue; pf := FindFunction(fname, border); pf.Do(value); @@ -112,10 +109,11 @@ End; Function TSDocxBorderRange.CallFunction(fname);overload; Begin hash := array(); + range_arr := rangeObj.GetInfo(); ret := nil; - for i:=0 to length(range_arr_)-1 do + for i:=0 to length(range_arr)-1 do begin - border := GetBorder(range_arr_[i], hash); + border := GetBorder(range_arr[i], hash); if ifnil(border) then continue; pf := FindFunction(fname, border); r := pf.Do(); diff --git a/docx/border/TSDocxBordersParagraph.tsf b/docx/border/TSDocxBordersParagraph.tsf index 5d7f906..a2b2e3b 100644 --- a/docx/border/TSDocxBordersParagraph.tsf +++ b/docx/border/TSDocxBordersParagraph.tsf @@ -6,20 +6,20 @@ public Function GetBorder(index);override; private - paragraph_; // TOfficeObj("TParagraph") + pr_; // TOfficeObj("TwpPr") End; // ============== 实现 ================= // -Function TSDocxBordersParagraph.Init(paragraph); +Function TSDocxBordersParagraph.Init(pr); Begin - paragraph_ := paragraph; + pr_ := pr; End; Function TSDocxBordersParagraph.GetBorder(index);override; Begin - obj := paragraph_.pPr.Bdr; + obj := pr_.Bdr; case index of TSDocxEnumerations.wdBorderBottom(): border := obj.Bottom; diff --git a/docx/border/TSDocxBordersRange.tsf b/docx/border/TSDocxBordersRange.tsf index 3cd06ed..e03691e 100644 --- a/docx/border/TSDocxBordersRange.tsf +++ b/docx/border/TSDocxBordersRange.tsf @@ -1,11 +1,11 @@ Type TSDocxBordersRange = Class(TSDocxBorders) public - Function Init(arr); + Function Init(rangeObj); Function Operator[](index);override; private - range_arr_; + range_obj_; public Function Item(Index);override; @@ -14,15 +14,15 @@ End; // ============== 实现 ================= // -Function TSDocxBordersRange.Init(arr); +Function TSDocxBordersRange.Init(rangeObj); Begin - range_arr_ := arr; + range_obj_ := rangeObj; End; Function Operator TSDocxBordersRange.[](index);override; Begin border_obj := new TSDocxBorderRange(self.Application, self.Creator, self.Parent); - border_obj.Init(range_arr_, index); + border_obj.Init(range_obj_, index); return border_obj; End; diff --git a/docx/font/TSDocxFont.tsf b/docx/font/TSDocxFont.tsf index e1c3755..72b2afd 100644 --- a/docx/font/TSDocxFont.tsf +++ b/docx/font/TSDocxFont.tsf @@ -3,6 +3,7 @@ Uses TSDocxEnumerations; public Function Init(pr); + Function Apply();virtual; protected pr_; @@ -161,17 +162,21 @@ Begin color_ := TSWdColor(); End; -// function +Function TSDocxFont.Apply();virtual; +Begin + pr_.Update("first"); +End; + +// Methods Function TSDocxFont.Reset();virtual; Begin pr_.Delete(); End; -// property +// Properties Function TSDocxFont.WriteAllCaps(value);virtual; Begin pr_.Caps := value = TSDocxEnumerations.wdToggle() ? _Not(self.Caps) : value; - pr_.Update("first"); End; Function TSDocxFont.ReadAllCaps();virtual; Begin @@ -181,7 +186,6 @@ End; Function TSDocxFont.WriteBold(value);virtual; Begin pr_.Bold := value = TSDocxEnumerations.wdToggle() ? _Not(self.Bold) : value; - pr_.Update("first"); End; Function TSDocxFont.ReadBold();virtual; Begin @@ -191,7 +195,6 @@ End; Function TSDocxFont.WriteBoldBi(value);virtual; Begin pr_.BoldBi := value = TSDocxEnumerations.wdToggle() ? _Not(self.BoldBi) : value; - pr_.Update("first"); End; Function TSDocxFont.ReadBoldBi();virtual; Begin @@ -204,7 +207,6 @@ Begin if ifnil(color) then pr_.Root().DeleteChild("w:color"); else begin pr_.Color := color; - pr_.Update("first"); end End; Function TSDocxFont.ReadColorIndex();virtual; @@ -224,7 +226,6 @@ End; Function TSDocxFont.WriteContextualAlternates(value);virtual; Begin pr_.ContextualAlternates := value; - pr_.Update("first"); End; Function TSDocxFont.ReadContextualAlternates();virtual; Begin @@ -234,7 +235,6 @@ End; Function TSDocxFont.WriteDisableCharacterSpaceGrid(value);virtual; Begin pr_.SnapToGrid := value ? false : true; - pr_.Update("first"); End; Function TSDocxFont.ReadDisableCharacterSpaceGrid();virtual; Begin @@ -244,7 +244,6 @@ End; Function TSDocxFont.WriteDoubleStrikeThrough(value);virtual; Begin pr_.dStrike := value; - pr_.Update("first"); End; Function TSDocxFont.ReadDoubleStrikeThrough();virtual; Begin @@ -260,7 +259,6 @@ End; Function TSDocxFont.WriteEmboss(value);override; Begin pr_.Emboss := value; - pr_.Update("first"); End; Function TSDocxFont.ReadEmboss();override; Begin @@ -281,7 +279,6 @@ Begin TSDocxEnumerations.wdEmphasisMarkUnderSolidCircle: pr_.Em := "underDot"; end; - pr_.Update("first"); End; Function TSDocxFont.ReadEmphasisMark();virtual; Begin @@ -302,7 +299,6 @@ End; Function TSDocxFont.WriteEngrave(value);virtual; Begin pr_.ImPrint := value; - pr_.Update("first"); End; Function TSDocxFont.ReadEngrave();virtual; Begin @@ -312,7 +308,6 @@ End; Function TSDocxFont.WriteHidden(value);virtual; Begin pr_.Vanish := value; - pr_.Update("first"); End; Function TSDocxFont.ReadHidden();virtual; Begin @@ -322,7 +317,6 @@ End; Function TSDocxFont.WriteItalic(value);virtual; Begin pr_.Italic := value; - pr_.Update("first"); End; Function TSDocxFont.ReadItalic();virtual; Begin @@ -332,7 +326,6 @@ End; Function TSDocxFont.WriteItalicBi(value);virtual; Begin pr_.ICs := value; - pr_.Update("first"); End; Function TSDocxFont.ReadItalicBi();virtual; Begin @@ -342,7 +335,6 @@ End; Function TSDocxFont.WriteKerning(value);virtual; Begin pr_.Kern := value * 2; - pr_.Update("first"); End; Function TSDocxFont.ReadKerning();virtual; Begin @@ -385,7 +377,6 @@ Begin TSDocxEnumerations.wdLigaturesStandardHistoricalDiscretional(): pr_.Ligatures := "standardHistoricalDiscretional"; end; - pr_.Update("first"); End; Function TSDocxFont.ReadLigatures();virtual; Begin @@ -429,7 +420,6 @@ Function TSDocxFont.WriteName(value);virtual; Begin pr_.rFont.EastAsia := value; pr_.rFont.Ascii := value; - pr_.Update("first"); End; Function TSDocxFont.ReadName();virtual; @@ -440,7 +430,6 @@ End; Function TSDocxFont.WriteNameAscii(value);virtual; Begin pr_.rFont.Ascii := value; - pr_.Update("first"); End; Function TSDocxFont.ReadNameAscii();virtual; Begin @@ -450,7 +439,6 @@ End; Function TSDocxFont.WriteNameBi(value);virtual; Begin pr_.rFont.Cs := value; - pr_.Update("first"); End; Function TSDocxFont.ReadNameBi();virtual; Begin @@ -460,7 +448,6 @@ End; Function TSDocxFont.WriteNameFarEast(value);virtual; Begin pr_.rFont.EastAsia := value; - pr_.Update("first"); End; Function TSDocxFont.ReadNameFarEast();virtual; Begin @@ -471,7 +458,6 @@ End; Function TSDocxFont.WriteNameOther(value);virtual; Begin pr_.rFont.HAnsi := value; - pr_.Update("first"); End; Function TSDocxFont.ReadNameOther();virtual; @@ -489,7 +475,6 @@ Begin TSDocxEnumerations.wdNumberFormOldstyle(): pr_.NumForm := "oldStyle"; end; - pr_.Update("first"); End; Function TSDocxFont.ReadNumberForm();virtual; Begin @@ -513,7 +498,6 @@ Begin TSDocxEnumerations.wdNumberSpacingTabular(): pr_.NumSpacing := "tabular"; end; - pr_.Update("first"); End; Function TSDocxFont.ReadNumberSpacing();virtual; Begin @@ -530,7 +514,6 @@ End; Function TSDocxFont.WriteOutline(value);virtual; Begin pr_.Outline := value = TSDocxEnumerations.wdToggle() ? _Not(self.Outline) : value; - pr_.Update("first"); End; Function TSDocxFont.ReadOutline();virtual; Begin @@ -540,7 +523,6 @@ End; Function TSDocxFont.WritePosition(value);virtual; Begin pr_.Position := value * 2; - pr_.Update("first"); End; Function TSDocxFont.ReadPosition();virtual; Begin @@ -550,7 +532,6 @@ End; Function TSDocxFont.WriteScaling(value);virtual; Begin pr_.W := value; - pr_.Update("first"); End; Function TSDocxFont.ReadScaling();virtual; Begin @@ -560,7 +541,6 @@ End; Function TSDocxFont.WriteShadow(value);virtual; Begin pr_.Shadow := value; - pr_.Update("first"); End; Function TSDocxFont.ReadShadow();virtual; Begin @@ -570,7 +550,6 @@ End; Function TSDocxFont.WriteSize(value);virtual; Begin pr_.Sz := value * 2; - pr_.Update("first"); End; Function TSDocxFont.ReadSize();virtual; Begin @@ -580,7 +559,6 @@ End; Function TSDocxFont.WriteSizeBi(value);virtual; Begin pr_.SzCs := value * 2; - pr_.Update("first"); End; Function TSDocxFont.ReadSizeBi();virtual; Begin @@ -590,7 +568,6 @@ End; Function TSDocxFont.WriteSmallCaps(value);virtual; Begin pr_.SmallCaps := value = TSDocxEnumerations.wdToggle() ? _Not(self.SmallCaps) : value; - pr_.Update("first"); End; Function TSDocxFont.ReadSmallCaps();virtual; Begin @@ -600,7 +577,6 @@ End; Function TSDocxFont.WriteSpacing(value);virtual; Begin pr_.Spacing := value * 20; - pr_.Update("first"); End; Function TSDocxFont.ReadSpacing();virtual; Begin @@ -610,7 +586,6 @@ End; Function TSDocxFont.WriteStrikeThrough(value);virtual; Begin pr_.Strike := value; - pr_.Update("first"); End; Function TSDocxFont.ReadStrikeThrough();virtual; Begin @@ -620,7 +595,6 @@ End; Function TSDocxFont.WriteSubscript(value);virtual; Begin pr_.VertAlign := "subscript"; - pr_.Update("first"); End; Function TSDocxFont.ReadSubscript();virtual; Begin @@ -630,7 +604,6 @@ End; Function TSDocxFont.WriteSuperscript(value);virtual; Begin pr_.VertAlign := "supercript"; - pr_.Update("first"); End; Function TSDocxFont.ReadSuperscript();virtual; Begin @@ -677,7 +650,6 @@ Begin TSDocxEnumerations.wdUnderlineWords(): pr_.U := "words"; end; - pr_.Update("first"); End; Function TSDocxFont.ReadUnderline();virtual; Begin @@ -724,7 +696,6 @@ End; Function TSDocxFont.WriteUnderlineColor(value);virtual; Begin pr_.UColor := color_[value]; - pr_.Update("first"); End; Function TSDocxFont.ReadUnderlineColor();virtual; Begin diff --git a/docx/font/TSDocxFontRange.tsf b/docx/font/TSDocxFontRange.tsf index b604ca7..7728608 100644 --- a/docx/font/TSDocxFontRange.tsf +++ b/docx/font/TSDocxFontRange.tsf @@ -2,15 +2,15 @@ Type TSDocxFontRange = Class(TSDocxFont) Uses TSDocxEnumerations; public - Function Init(arr); + Function Init(rangeObj); + Function Apply();overload; private Function CallFunction(pf, value);overload; Function CallFunction(pf);overload; - Function SplitRun(); private - range_arr_; + range_obj_; split_flag_; // 写之前切割run,切割后设为true public @@ -107,32 +107,29 @@ public End; // ============== 实现 ================= // -Function TSDocxFontRange.Init(arr); +Function TSDocxFontRange.Init(rangeObj); Begin - range_arr_ := arr; - split_flag_ := false; + range_obj_ := rangeObj; class(TSDocxFont).Init(nil); End; -Function TSDocxFontRange.SplitRun(); +Function TSDocxFontRange.Apply();overload; Begin - if split_flag_ then return; - class(TSWdCommon).SplitRangeRun(range_arr_); - self.Parent.SetRangeArr(range_arr_); - split_flag_ := true; + CallFunction(ThisFunction(class(TSDocxFont).Apply)); End; Function TSDocxFontRange.CallFunction(pf, value);overload; Begin - SplitRun(); - for i:=0 to length(range_arr_)-1 do + range_obj_.SplitRun(); + range_arr := range_obj_.GetInfo(); + for i:=0 to length(range_arr)-1 do begin - paragraph := range_arr_[i]["tparagraph"]; + paragraph := range_arr[i]["tparagraph"]; pr_ := paragraph.pPr.rPr; ##pf(value); - for i:=0 to length(range_arr_)-1 do + for i:=0 to length(range_arr)-1 do begin - pr_ := range_arr_[i]["trun"].rPr; + pr_ := range_arr[i]["trun"].rPr; ##pf(value); end end; @@ -141,9 +138,10 @@ End; Function TSDocxFontRange.CallFunction(pf);overload; Begin ret := nil; - for i:=0 to length(range_arr_)-1 do + range_arr := range_obj_.GetInfo(); + for i:=0 to length(range_arr)-1 do begin - pr_ := range_arr_[i]["trun"].rPr; + pr_ := range_arr[i]["trun"].rPr; if not ifObj(pr_.Root()) then continue; cur := ##pf(); if ifnil(ret) then ret := cur; diff --git a/docx/prargraphformat/TSDocxParagraphFormat.tsf b/docx/prargraphformat/TSDocxParagraphFormat.tsf new file mode 100644 index 0000000..46d59af --- /dev/null +++ b/docx/prargraphformat/TSDocxParagraphFormat.tsf @@ -0,0 +1,713 @@ +Type TSDocxParagraphFormat = Class(TSVbaBase) +Uses TSDocxEnumerations; + +public + Function Init(docx, pPr); + Function Apply();virtual; + Function ReWrite(pr);virtual; + +protected + docx_; + pr_; // TOfficeObj("TwpPr") + +public + // Methods + Function CloseUp();virtual; + Function IndentCharWidth(Count);virtual; + Function IndentFirstLineCharWidth(Count);virtual; + Function OpenOrCloseUp();virtual; + Function OpenUp();virtual; + Function Reset();virtual; + Function Space1();virtual; + Function Space15();virtual; + Function Space2();virtual; + Function TabHangingIndent(Count);virtual; + Function TabIndent(Count);virtual; + + // property + property AddSpaceBetweenFarEastAndAlpha read ReadAddSpaceBetweenFarEastAndAlpha write WriteAddSpaceBetweenFarEastAndAlpha; + property AddSpaceBetweenFarEastAndDigit read ReadAddSpaceBetweenFarEastAndDigit write WriteAddSpaceBetweenFarEastAndDigit; + property Alignment read ReadAlignment write WriteAlignment; + property AutoAdjustRightIndent read ReadAutoAdjustRightIndent write WriteAutoAdjustRightIndent; + property BaseLineAlignment read ReadBaseLineAlignment write WriteBaseLineAlignment; + property Borders read ReadBorders; + property CharacterUnitFirstLineIndent read ReadCharacterUnitFirstLineIndent write WriteCharacterUnitFirstLineIndent; + property CharacterUnitLeftIndent read ReadCharacterUnitLeftIndent write WriteCharacterUnitLeftIndent; + property CharacterUnitRightIndent read ReadCharacterUnitRightIndent write WriteCharacterUnitRightIndent; + property CollapsedByDefault read ReadCollapsedByDefault write WriteCollapsedByDefault; + property DisableLineHeightGrid read ReadDisableLineHeightGrid write WriteDisableLineHeightGrid; + property Duplicate read ReadDuplicate; + property FarEastLineBreakControl read ReadFarEastLineBreakControl write WriteFarEastLineBreakControl; + property FirstLineIndent read ReadFirstLineIndent write WriteFirstLineIndent; + property HalfWidthPunctuationOnTopOfLine read ReadHalfWidthPunctuationOnTopOfLine write WriteHalfWidthPunctuationOnTopOfLine; + property HangingPunctuation read ReadHangingPunctuation write WriteHangingPunctuation; + property Hyphenation read ReadHyphenation write WriteHyphenation; + property KeepTogether read ReadKeepTogether write WriteKeepTogether; + property KeepWithNext read ReadKeepWithNext write WriteKeepWithNext; + property LeftIndent read ReadLeftIndent write WriteLeftIndent; + property LineSpacing read ReadLineSpacing write WriteLineSpacing; + property LineSpacingRule read ReadLineSpacingRule write WriteLineSpacingRule; + property LineUnitAfter read ReadLineUnitAfter write WriteLineUnitAfter; + property LineUnitBefore read ReadLineUnitBefore write WriteLineUnitBefore; + property MirrorIndents read ReadMirrorIndents write WriteMirrorIndents; + property NoLineNumber read ReadNoLineNumber write WriteNoLineNumber; + property OutlineLevel read ReadOutlineLevel write WriteOutlineLevel; + property PageBreakBefore read ReadPageBreakBefore write WritePageBreakBefore; + property ReadingOrder read ReadReadingOrder write WriteReadingOrder; + property RightIndent read ReadRightIndent write WriteRightIndent; + property Shading read ReadShading; + property SpaceAfter read ReadSpaceAfter write WriteSpaceAfter; + property SpaceAfterAuto read ReadSpaceAfterAuto write WriteSpaceAfterAuto; + property SpaceBefore read ReadSpaceBefore write WriteSpaceBefore; + property SpaceBeforeAuto read ReadSpaceBeforeAuto write WriteSpaceBeforeAuto; + property Style read ReadStyle write WriteStyle; + property TabStops read ReadTabStops write WriteTabStops; + property TextboxTightWrap read ReadTextboxTightWrap write WriteTextboxTightWrap; + property WidowControl read ReadWidowControl write WriteWidowControl; + property WordWrap read ReadWordWrap write WriteWordWrap; + Function WriteWordWrap(value);virtual; + Function ReadWordWrap();virtual; + Function WriteWidowControl(value);virtual; + Function ReadWidowControl();virtual; + Function WriteTextboxTightWrap(value);virtual; + Function ReadTextboxTightWrap();virtual; + Function WriteTabStops(value);virtual; + Function ReadTabStops();virtual; + Function WriteStyle(value);virtual; + Function ReadStyle();virtual; + Function WriteSpaceBeforeAuto(value);virtual; + Function ReadSpaceBeforeAuto();virtual; + Function WriteSpaceBefore(value);virtual; + Function ReadSpaceBefore();virtual; + Function WriteSpaceAfterAuto(value);virtual; + Function ReadSpaceAfterAuto();virtual; + Function WriteSpaceAfter(value);virtual; + Function ReadSpaceAfter();virtual; + Function ReadShading();virtual; + Function WriteRightIndent(value);virtual; + Function ReadRightIndent();virtual; + Function WriteReadingOrder(value);virtual; + Function ReadReadingOrder();virtual; + Function WritePageBreakBefore(value);virtual; + Function ReadPageBreakBefore();virtual; + Function WriteOutlineLevel(value);virtual; + Function ReadOutlineLevel();virtual; + Function WriteNoLineNumber(value);virtual; + Function ReadNoLineNumber();virtual; + Function WriteMirrorIndents(value);virtual; + Function ReadMirrorIndents();virtual; + Function WriteLineUnitBefore(value);virtual; + Function ReadLineUnitBefore();virtual; + Function WriteLineUnitAfter(value);virtual; + Function ReadLineUnitAfter();virtual; + Function WriteLineSpacingRule(value);virtual; + Function ReadLineSpacingRule();virtual; + Function WriteLineSpacing(value);virtual; + Function ReadLineSpacing();virtual; + Function WriteLeftIndent(value);virtual; + Function ReadLeftIndent();virtual; + Function WriteKeepWithNext(value);virtual; + Function ReadKeepWithNext();virtual; + Function WriteKeepTogether(value);virtual; + Function ReadKeepTogether();virtual; + Function WriteHyphenation(value);virtual; + Function ReadHyphenation();virtual; + Function WriteHangingPunctuation(value);virtual; + Function ReadHangingPunctuation();virtual; + Function WriteHalfWidthPunctuationOnTopOfLine(value);virtual; + Function ReadHalfWidthPunctuationOnTopOfLine();virtual; + Function WriteFirstLineIndent(value);virtual; + Function ReadFirstLineIndent();virtual; + Function WriteFarEastLineBreakControl(value);virtual; + Function ReadFarEastLineBreakControl();virtual; + Function ReadDuplicate();virtual; + Function WriteDisableLineHeightGrid(value);virtual; + Function ReadDisableLineHeightGrid();virtual; + Function WriteCollapsedByDefault(value);virtual; + Function ReadCollapsedByDefault();virtual; + Function WriteCharacterUnitRightIndent(value);virtual; + Function ReadCharacterUnitRightIndent();virtual; + Function WriteCharacterUnitLeftIndent(value);virtual; + Function ReadCharacterUnitLeftIndent();virtual; + Function WriteCharacterUnitFirstLineIndent(value);virtual; + Function ReadCharacterUnitFirstLineIndent();virtual; + Function ReadBorders(index);virtual; + Function WriteBaseLineAlignment(value);virtual; + Function ReadBaseLineAlignment();virtual; + Function WriteAutoAdjustRightIndent(value);virtual; + Function ReadAutoAdjustRightIndent();virtual; + Function WriteAlignment(value);virtual; + Function ReadAlignment();virtual; + Function WriteAddSpaceBetweenFarEastAndDigit(value);virtual; + Function ReadAddSpaceBetweenFarEastAndDigit();virtual; + Function WriteAddSpaceBetweenFarEastAndAlpha(value);virtual; + Function ReadAddSpaceBetweenFarEastAndAlpha();virtual; + +End; + + +// ============== 实现 ================= // +Function TSDocxParagraphFormat.Init(docx, pPr); +Begin + docx_ := docx; + pr_ := pPr; +End; + +Function TSDocxParagraphFormat.Apply();virtual; +Begin + pr_.Update("first"); +End; + +Function TSDocxParagraphFormat.ReWrite(pr);virtual; +Begin + self.Reset(); + marshal := pr.Marshal()[0]; + pr_.Root().InsertAfterChild(marshal["children"]); +End; + +// Methods +Function TSDocxParagraphFormat.CloseUp();virtual; +Begin + self.SpaceBefore := 0; +End; + +Function TSDocxParagraphFormat.IndentCharWidth(Count);virtual; +Begin + pr_.LeftIndent := Count * 210; +End; + +Function TSDocxParagraphFormat.IndentFirstLineCharWidth(Count);virtual; +Begin + self.FirstLineIndent := Count; +End; + +Function TSDocxParagraphFormat.OpenOrCloseUp();virtual; +Begin + self.SpaceBefore := self.SpaceBefore > 0 ? 0 : 12; +End; + +Function TSDocxParagraphFormat.OpenUp();virtual; +Begin + self.SpaceBefore := 12; +End; + +Function TSDocxParagraphFormat.Reset();virtual; +Begin + pr_.Delete(); +End; + +Function TSDocxParagraphFormat.Space1();virtual; +Begin + self.LineSpacingRule := TSDocxEnumerations.wdLineSpaceSingle(); +End; + +Function TSDocxParagraphFormat.Space15();virtual; +Begin + self.LineSpacingRule := TSDocxEnumerations.wdLineSpace1pt5(); +End; + +Function TSDocxParagraphFormat.Space2();virtual; +Begin + self.LineSpacingRule := TSDocxEnumerations.wdLineSpaceDouble(); +End; + +// property +Function TSDocxParagraphFormat.WriteWordWrap(value);virtual; +Begin + pr_.WordWrap := value ? true : false; +End; +Function TSDocxParagraphFormat.ReadWordWrap();virtual; +Begin + return pr_.Value("WordWrap"); +End; + +Function TSDocxParagraphFormat.WriteWidowControl(value);virtual; +Begin + pr_.WidowControl := value ? true : false; +End; +Function TSDocxParagraphFormat.ReadWidowControl();virtual; +Begin + return pr_.Value("WidowControl"); +End; + +Function TSDocxParagraphFormat.WriteTextboxTightWrap(value);virtual; +Begin + case value of + TSDocxEnumerations.wdTightAll(): + pr_.TextboxTightWrap := "allLines"; + TSDocxEnumerations.wdTightFirstAndLastLines(): + pr_.TextboxTightWrap := "firstAndLastLine"; + TSDocxEnumerations.wdTightFirstLineOnly(): + pr_.TextboxTightWrap := "firstLineOnly"; + TSDocxEnumerations.wdTightLastLineOnly(): + pr_.TextboxTightWrap := "LastLineOnly"; + TSDocxEnumerations.wdTightNone(): + pr_.TextboxTightWrap := "none"; + end; +End; +Function TSDocxParagraphFormat.ReadTextboxTightWrap();virtual; +Begin + value := pr_.Value("TextboxTightWrap"); + case value of + "allLines": + return TSDocxEnumerations.wdTightAll(); + "firstAndLastLine": + return TSDocxEnumerations.wdTightFirstAndLastLines(); + "firstLineOnly": + return TSDocxEnumerations.wdTightFirstLineOnly(); + "LastLineOnly": + return TSDocxEnumerations.wdTightLastLineOnly(); + "none": + return TSDocxEnumerations.wdTightNone(); + end; +End; + +Function TSDocxParagraphFormat.WriteStyle(value);virtual; +Begin + obj := docx_.StyleObject().GetStyle(value); + pr_.StyleId := obj.StyleId; +End; +Function TSDocxParagraphFormat.ReadStyle();virtual; +Begin + id := pr_.Value("StyleId", 1); + obj := docx_.StyleObject().GetStyleById(id); + return obj.Name; +End; + +Function TSDocxParagraphFormat.WriteSpaceBeforeAuto(value);virtual; +Begin + pr_.SpaceBeforeAuto := value ? true : false; +End; +Function TSDocxParagraphFormat.ReadSpaceBeforeAuto();virtual; +Begin + return pr_.Value("SpaceBeforeAuto") ? true : false; +End; + +Function TSDocxParagraphFormat.WriteSpaceBefore(value);virtual; +Begin + pr_.SpaceBefore := value * 20; +End; +Function TSDocxParagraphFormat.ReadSpaceBefore();virtual; +Begin + return pr_.Value("SpaceBefore") / 20; +End; + +Function TSDocxParagraphFormat.WriteSpaceAfterAuto(value);virtual; +Begin + pr_.SpaceAfterAuto := value ? true : false; +End; +Function TSDocxParagraphFormat.ReadSpaceAfterAuto();virtual; +Begin + return pr_.Value("SpaceAfterAuto") ? true : false; +End; + +Function TSDocxParagraphFormat.WriteSpaceAfter(value);virtual; +Begin + pr_.SpaceAfter := value * 20; +End; +Function TSDocxParagraphFormat.ReadSpaceAfter();virtual; +Begin + return pr_.Value("SpaceAfter") / 20; +End; + +Function TSDocxParagraphFormat.ReadShading();virtual; +Begin + shading_obj := new TSDocxShading(self.Application, self.Creator, self.Parent); + shading_obj.Init(pr_.Shading); + return shading_obj; +End; + +Function TSDocxParagraphFormat.WriteRightIndent(value);virtual; +Begin + pr_.RightIndent := value * 20; +End; +Function TSDocxParagraphFormat.ReadRightIndent();virtual; +Begin + return pr_.Value("RightIndent") / 20; +End; + +Function TSDocxParagraphFormat.WriteReadingOrder(value);virtual; +Begin + case value of + TSDocxEnumerations.wdReadingOrderLtr(): + pr_.Bidi := false; + TSDocxEnumerations.wdReadingOrderRtl(): + pr_.Bidi := true; + end; +End; +Function TSDocxParagraphFormat.ReadReadingOrder();virtual; +Begin + value := pr_.Value("Bidi"); + case value of + false: return TSDocxEnumerations.wdReadingOrderLtr(); + true: return TSDocxEnumerations.wdReadingOrderRtl(); + end; +End; + +Function TSDocxParagraphFormat.WritePageBreakBefore(value);virtual; +Begin + pr_.PageBreakBefore := value ? true : false; +End; +Function TSDocxParagraphFormat.ReadPageBreakBefore();virtual; +Begin + return pr_.Value("PageBreakBefore"); +End; + +Function TSDocxParagraphFormat.WriteOutlineLevel(value);virtual; +Begin + case value of + TSDocxEnumerations.wdOutlineLevel1(): + pr_.OutlineLevel := 0; + TSDocxEnumerations.wdOutlineLevel2(): + pr_.OutlineLevel := 1; + TSDocxEnumerations.wdOutlineLevel3(): + pr_.OutlineLevel := 2; + TSDocxEnumerations.wdOutlineLevel4(): + pr_.OutlineLevel := 3; + TSDocxEnumerations.wdOutlineLevel5(): + pr_.OutlineLevel := 4; + TSDocxEnumerations.wdOutlineLevel6(): + pr_.OutlineLevel := 5; + TSDocxEnumerations.wdOutlineLevel7(): + pr_.OutlineLevel := 6; + TSDocxEnumerations.wdOutlineLevel8(): + pr_.OutlineLevel := 7; + TSDocxEnumerations.wdOutlineLevel9(): + pr_.OutlineLevel := 8; + TSDocxEnumerations.wdOutlineLevelBodyText(): + class(TSXml).RemoveNode(pr_.Root(), "w:outlineLvl"); + end; +End; +Function TSDocxParagraphFormat.ReadOutlineLevel();virtual; +Begin + value := pr_.Value("OutlineLevel"); + case value of + 0: return TSDocxEnumerations.wdOutlineLevel1(); + 1: return TSDocxEnumerations.wdOutlineLevel2(); + 2: return TSDocxEnumerations.wdOutlineLevel3(); + 3: return TSDocxEnumerations.wdOutlineLevel4(); + 4: return TSDocxEnumerations.wdOutlineLevel5(); + 5: return TSDocxEnumerations.wdOutlineLevel6(); + 6: return TSDocxEnumerations.wdOutlineLevel7(); + 7: return TSDocxEnumerations.wdOutlineLevel8(); + 8: return TSDocxEnumerations.wdOutlineLevel9(); + nil: return TSDocxEnumerations.wdOutlineLevelBodyText(); + end; +End; + +Function TSDocxParagraphFormat.WriteNoLineNumber(value);virtual; +Begin + pr_.SuppressLineNumbers := value ? true : false; +End; +Function TSDocxParagraphFormat.ReadNoLineNumber();virtual; +Begin + return pr_.Value("SuppressLineNumbers"); +End; + +Function TSDocxParagraphFormat.WriteMirrorIndents(value);virtual; +Begin + pr_.MirrorIndents := value ? true : false; +End; +Function TSDocxParagraphFormat.ReadMirrorIndents();virtual; +Begin + return pr_.Value("MirrorIndents"); +End; + +Function TSDocxParagraphFormat.WriteLineUnitBefore(value);virtual; +Begin + pr_.BeforeLines := value * 100; +End; +Function TSDocxParagraphFormat.ReadLineUnitBefore();virtual; +Begin + return pr_.Value("BeforeLines") / 100; +End; + +Function TSDocxParagraphFormat.WriteLineUnitAfter(value);virtual; +Begin + pr_.AfterLines := value * 100; +End; +Function TSDocxParagraphFormat.ReadLineUnitAfter();virtual; +Begin + return pr_.Value("AfterLines") / 100; +End; + +Function TSDocxParagraphFormat.WriteLineSpacingRule(value);virtual; +Begin + case value of + TSDocxEnumerations.wdLineSpace1pt5(): + pr_.LineSpacingRule := "auto"; + TSDocxEnumerations.wdLineSpaceAtLeast(): + pr_.LineSpacingRule := "atLeast"; + TSDocxEnumerations.wdLineSpaceDouble(): + pr_.LineSpacingRule := "auto"; + TSDocxEnumerations.wdLineSpaceExactly(): + pr_.LineSpacingRule := "exact"; + TSDocxEnumerations.wdLineSpaceMultiple(): + pr_.LineSpacingRule := "auto"; + TSDocxEnumerations.wdLineSpaceSingle(): + pr_.LineSpacingRule := "auto"; + end; +End; +Function TSDocxParagraphFormat.ReadLineSpacingRule();virtual; +Begin + value := pr_.Value("LineSpacingRule"); + case value of + "atLeast": + return TSDocxEnumerations.wdLineSpaceAtLeast(); + "exact": + return TSDocxEnumerations.wdLineSpaceExactly(); + "auto": + return TSDocxEnumerations.wdLineSpaceMultiple(); + end; +End; + +Function TSDocxParagraphFormat.WriteLineSpacing(value);virtual; +Begin + pr_.LineSpacing := value * 20; +End; +Function TSDocxParagraphFormat.ReadLineSpacing();virtual; +Begin + return pr_.Value("LineSpacing") / 20; +End; + +Function TSDocxParagraphFormat.WriteLeftIndent(value);virtual; +Begin + pr_.LeftIndent := value * 20; +End; +Function TSDocxParagraphFormat.ReadLeftIndent();virtual; +Begin + return pr_.Value("LeftIndent") / 20; +End; + +Function TSDocxParagraphFormat.WriteKeepWithNext(value);virtual; +Begin + pr_.KeepWithNext := value ? true : false; +End; +Function TSDocxParagraphFormat.ReadKeepWithNext();virtual; +Begin + return pr_.Value("KeepWithNext"); +End; + +Function TSDocxParagraphFormat.WriteKeepTogether(value);virtual; +Begin + pr_.KeepTogether := value ? true : false; +End; +Function TSDocxParagraphFormat.ReadKeepTogether();virtual; +Begin + return pr_.Value("KeepTogether"); +End; + +Function TSDocxParagraphFormat.WriteHyphenation(value);virtual; +Begin + pr_.SuppressAutoHyphens := value ? false : true; +End; +Function TSDocxParagraphFormat.ReadHyphenation();virtual; +Begin + return pr_.Value("SuppressAutoHyphens") ? false : true; +End; + +Function TSDocxParagraphFormat.WriteHangingPunctuation(value);virtual; +Begin + pr_.OverflowPunct := value ? true : false; +End; +Function TSDocxParagraphFormat.ReadHangingPunctuation();virtual; +Begin + return pr_.Value("TopLinePunct"); +End; + +Function TSDocxParagraphFormat.WriteHalfWidthPunctuationOnTopOfLine(value);virtual; +Begin + pr_.TopLinePunct := value ? true : false; +End; +Function TSDocxParagraphFormat.ReadHalfWidthPunctuationOnTopOfLine();virtual; +Begin + return pr_.Value("TopLinePunct"); +End; + +Function TSDocxParagraphFormat.WriteFirstLineIndent(value);virtual; +Begin + pr_.FirstLineIndent := value * 20; +End; +Function TSDocxParagraphFormat.ReadFirstLineIndent();virtual; +Begin + return pr_.Value("FirstLineIndent") / 20; +End; + +Function TSDocxParagraphFormat.WriteFarEastLineBreakControl(value);virtual; +Begin + pr_.Kinsoku := value ? true : false; +End; +Function TSDocxParagraphFormat.ReadFarEastLineBreakControl();virtual; +Begin + return pr_.Value("Kinsoku"); +End; + +Function TSDocxParagraphFormat.ReadDuplicate();virtual; +Begin + return pr_; +End; + +Function TSDocxParagraphFormat.WriteDisableLineHeightGrid(value);virtual; +Begin + pr_.SnapToGrid := value ? false : true; +End; +Function TSDocxParagraphFormat.ReadDisableLineHeightGrid();virtual; +Begin + return pr_.Value("SnapToGrid") ? false : true; +End; + +Function TSDocxParagraphFormat.WriteCollapsedByDefault(value);virtual; +Begin + pr_.Collapsed := value ? true : false; +End; +Function TSDocxParagraphFormat.ReadCollapsedByDefault();virtual; +Begin + return pr_.Value("Collapsed"); +End; + +Function TSDocxParagraphFormat.WriteCharacterUnitRightIndent(value);virtual; +Begin + pr_.RightChars := value * 100; +End; +Function TSDocxParagraphFormat.ReadCharacterUnitRightIndent();virtual; +Begin + return pr_.Value("RightChars") / 100; +End; + +Function TSDocxParagraphFormat.WriteCharacterUnitLeftIndent(value);virtual; +Begin + pr_.LeftChars := value * 100; +End; +Function TSDocxParagraphFormat.ReadCharacterUnitLeftIndent();virtual; +Begin + return pr_.Value("LeftChars") / 100; +End; + +Function TSDocxParagraphFormat.WriteCharacterUnitFirstLineIndent(value);virtual; +Begin + if value > 0 then pr_.FirstLineChars := value * 100; + else pr_.HangingChars := abs(value) * 100; +End; +Function TSDocxParagraphFormat.ReadCharacterUnitFirstLineIndent();virtual; +Begin + first_val := pr_.Value("FirstLineChars"); + if first_val then return integer(first_val / 100); + hanging_val := pr_.Value("HangingChars"); + if hanging_val then return -integer(hanging_val / 100); + return 0; +End; + +Function TSDocxParagraphFormat.ReadBorders(index);virtual; +Begin + borders_obj := new TSDocxBordersParagraph(self.Application, self.Creator, self.Parent); + borders_obj.Init(pr_); + return ifnil(index) ? borders_obj : borders_obj[index]; +End; + +Function TSDocxParagraphFormat.WriteBaseLineAlignment(value);virtual; +Begin + case value of + TSDocxEnumerations.wdBaselineAlignAuto(): + pr_.TextAlignment := "auto"; + TSDocxEnumerations.wdBaselineAlignBaseline(): + pr_.TextAlignment := "baseline"; + TSDocxEnumerations.wdBaselineAlignCenter(): + pr_.TextAlignment := "center"; + TSDocxEnumerations.wdBaselineAlignFarEast50(): + pr_.TextAlignment := "bottom"; + TSDocxEnumerations.wdBaselineAlignTop(): + pr_.TextAlignment := "top"; + end; +End; +Function TSDocxParagraphFormat.ReadBaseLineAlignment();virtual; +Begin + value := pr_.Value("TextAlignment"); + case value of + "auto", nil: + return TSDocxEnumerations.wdBaselineAlignAuto(); + "baseline": + return TSDocxEnumerations.wdBaselineAlignBaseline(); + "center": + return TSDocxEnumerations.wdBaselineAlignCenter(); + "bottom": + return TSDocxEnumerations.wdBaselineAlignFarEast50(); + "top": + return TSDocxEnumerations.wdBaselineAlignTop(); + end; +End; + +Function TSDocxParagraphFormat.WriteAutoAdjustRightIndent(value);virtual; +Begin + pr_.AdjustRightInd := value ? true : false; +End; +Function TSDocxParagraphFormat.ReadAutoAdjustRightIndent();virtual; +Begin + return pr_.Value("AdjustRightInd"); +End; + +Function TSDocxParagraphFormat.WriteAlignment(value);virtual; +Begin + case value of + TSDocxEnumerations.wdAlignParagraphCenter(): + pr_.Alignment := "center"; + TSDocxEnumerations.wdAlignParagraphDistribute(): + pr_.Alignment := "distribute"; + TSDocxEnumerations.wdAlignParagraphJustify(): + pr_.Alignment := "both"; + TSDocxEnumerations.wdAlignParagraphJustifyHi(): + pr_.Alignment := "highKashida"; + TSDocxEnumerations.wdAlignParagraphJustifyLow(): + pr_.Alignment := "lowKashida"; + TSDocxEnumerations.wdAlignParagraphJustifyMed(): + pr_.Alignment := "mediumKashida"; + TSDocxEnumerations.wdAlignParagraphLeft(): + pr_.Alignment := "left"; + TSDocxEnumerations.wdAlignParagraphRight(): + pr_.Alignment := "right"; + TSDocxEnumerations.wdAlignParagraphThaiJustify(): + pr_.Alignment := "thaiDistribute"; + end; +End; +Function TSDocxParagraphFormat.ReadAlignment();virtual; +Begin + value := pr_.Value("Alignment"); + case value of + "center": + return TSDocxEnumerations.wdAlignParagraphCenter(); + "distribute": + return TSDocxEnumerations.wdAlignParagraphDistribute(); + "both", nil: + return TSDocxEnumerations.wdAlignParagraphJustify(); + "highKashida": + return TSDocxEnumerations.wdAlignParagraphJustifyHi(); + "lowKashida": + return TSDocxEnumerations.wdAlignParagraphJustifyLow(); + "mediumKashida": + return TSDocxEnumerations.wdAlignParagraphJustifyMed(); + "left": + return TSDocxEnumerations.wdAlignParagraphLeft(); + "right": + return TSDocxEnumerations.wdAlignParagraphRight(); + "thaiDistribute": + return TSDocxEnumerations.wdAlignParagraphThaiJustify(); + end; +End; + +Function TSDocxParagraphFormat.WriteAddSpaceBetweenFarEastAndDigit(value);virtual; +Begin + pr_.AutoSpaceDN := value ? true : false; +End; +Function TSDocxParagraphFormat.ReadAddSpaceBetweenFarEastAndDigit();virtual; +Begin + return pr_.Value("AutoSpaceDN"); +End; + +Function TSDocxParagraphFormat.WriteAddSpaceBetweenFarEastAndAlpha(value);virtual; +Begin + pr_.AutoSpaceDE := value ? true : false; +End; +Function TSDocxParagraphFormat.ReadAddSpaceBetweenFarEastAndAlpha();virtual; +Begin + return pr_.Value("AutoSpaceDE"); +End; + diff --git a/docx/prargraphformat/TSDocxParagraphFormatRange.tsf b/docx/prargraphformat/TSDocxParagraphFormatRange.tsf new file mode 100644 index 0000000..63ee31d --- /dev/null +++ b/docx/prargraphformat/TSDocxParagraphFormatRange.tsf @@ -0,0 +1,563 @@ +Type TSDocxParagraphFormatRange = Class(TSDocxParagraphFormat) +Uses TSDocxEnumerations; + +public + Function Init(docx, rangeObj); + Function Apply();override; + Function ReWrite(value);override; + +private + Function CallFunction(pf, value);overload; + Function CallFunction(pf);overload; + +private + paragraph_arr_; + +public + // Methods + Function CloseUp();override; + Function IndentCharWidth(Count);override; + Function IndentFirstLineCharWidth(Count);override; + Function OpenOrCloseUp();override; + Function OpenUp();override; + Function Reset();override; + Function Space1();override; + Function Space15();override; + Function Space2();override; + Function TabHangingIndent(Count);override; + Function TabIndent(Count);override; + + // property + Function WriteWordWrap(value);override; + Function ReadWordWrap();override; + Function WriteWidowControl(value);override; + Function ReadWidowControl();override; + Function WriteTextboxTightWrap(value);override; + Function ReadTextboxTightWrap();override; + Function WriteTabStops(value);override; + Function ReadTabStops();override; + Function WriteStyle(value);override; + Function ReadStyle();override; + Function WriteSpaceBeforeAuto(value);override; + Function ReadSpaceBeforeAuto();override; + Function WriteSpaceBefore(value);override; + Function ReadSpaceBefore();override; + Function WriteSpaceAfterAuto(value);override; + Function ReadSpaceAfterAuto();override; + Function WriteSpaceAfter(value);override; + Function ReadSpaceAfter();override; + Function ReadShading();override; + Function WriteRightIndent(value);override; + Function ReadRightIndent();override; + Function WriteReadingOrder(value);override; + Function ReadReadingOrder();override; + Function WritePageBreakBefore(value);override; + Function ReadPageBreakBefore();override; + Function WriteOutlineLevel(value);override; + Function ReadOutlineLevel();override; + Function WriteNoLineNumber(value);override; + Function ReadNoLineNumber();override; + Function WriteMirrorIndents(value);override; + Function ReadMirrorIndents();override; + Function WriteLineUnitBefore(value);override; + Function ReadLineUnitBefore();override; + Function WriteLineUnitAfter(value);override; + Function ReadLineUnitAfter();override; + Function WriteLineSpacingRule(value);override; + Function ReadLineSpacingRule();override; + Function WriteLineSpacing(value);override; + Function ReadLineSpacing();override; + Function WriteLeftIndent(value);override; + Function ReadLeftIndent();override; + Function WriteKeepWithNext(value);override; + Function ReadKeepWithNext();override; + Function WriteKeepTogether(value);override; + Function ReadKeepTogether();override; + Function WriteHyphenation(value);override; + Function ReadHyphenation();override; + Function WriteHangingPunctuation(value);override; + Function ReadHangingPunctuation();override; + Function WriteHalfWidthPunctuationOnTopOfLine(value);override; + Function ReadHalfWidthPunctuationOnTopOfLine();override; + Function WriteFirstLineIndent(value);override; + Function ReadFirstLineIndent();override; + Function WriteFarEastLineBreakControl(value);override; + Function ReadFarEastLineBreakControl();override; + Function ReadDuplicate();override; + Function WriteDisableLineHeightGrid(value);override; + Function ReadDisableLineHeightGrid();override; + Function WriteCollapsedByDefault(value);override; + Function ReadCollapsedByDefault();override; + Function WriteCharacterUnitRightIndent(value);override; + Function ReadCharacterUnitRightIndent();override; + Function WriteCharacterUnitLeftIndent(value);override; + Function ReadCharacterUnitLeftIndent();override; + Function WriteCharacterUnitFirstLineIndent(value);override; + Function ReadCharacterUnitFirstLineIndent();override; + Function ReadBorders(index);override; + Function WriteBaseLineAlignment(value);override; + Function ReadBaseLineAlignment();override; + Function WriteAutoAdjustRightIndent(value);override; + Function ReadAutoAdjustRightIndent();override; + Function WriteAlignment(value);override; + Function ReadAlignment();override; + Function WriteAddSpaceBetweenFarEastAndDigit(value);override; + Function ReadAddSpaceBetweenFarEastAndDigit();override; + Function WriteAddSpaceBetweenFarEastAndAlpha(value);override; + Function ReadAddSpaceBetweenFarEastAndAlpha();override; + +End; + + +// ============== 实现 ================= // +Function TSDocxParagraphFormatRange.Init(docx, rangeObj); +Begin + class(TSDocxParagraphFormat).Init(docx, nil); + paragraph_arr_ := sselect distinct(["tparagraph"]) from rangeObj.Data end; +End; + +Function TSDocxParagraphFormatRange.Apply();override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).Apply), nil); +End; + +Function TSDocxParagraphFormatRange.ReWrite(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).ReWrite), value); +End; + +Function TSDocxParagraphFormatRange.CallFunction(pf, value);overload; +Begin + for i:=0 to length(paragraph_arr_)-1 do + begin + pr_ := paragraph_arr_[i].pPr; + if not ifObj(pr_.Root()) then continue; + ##pf(value); + end +End; + +Function TSDocxParagraphFormatRange.CallFunction(pf);overload; +Begin + ret := nil; + for i:=0 to length(paragraph_arr_)-1 do + begin + pr_ := paragraph_arr_[i].pPr; + if not ifObj(pr_.Root()) then continue; + cur := ##pf(); + if ifnil(ret) then ret := cur; + if ret <> cur then return TSDocxEnumerations.wdUndefined(); + end + return ret; +End; + +// Methods +Function TSDocxParagraphFormatRange.CloseUp();override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).CloseUp), nil); +End; + +Function TSDocxParagraphFormatRange.IndentCharWidth(Count);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).IndentCharWidth), Count); +End; + +Function TSDocxParagraphFormatRange.IndentFirstLineCharWidth(Count);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).IndentFirstLineCharWidth), Count); +End; + +Function TSDocxParagraphFormatRange.OpenOrCloseUp();override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).OpenOrCloseUp), nil); +End; + +Function TSDocxParagraphFormatRange.OpenUp();override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).OpenOrCloseUp), nil); +End; + +Function TSDocxParagraphFormatRange.Reset();override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).Reset), nil); +End; + +Function TSDocxParagraphFormatRange.Space1();override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).Space1), nil); +End; + +Function TSDocxParagraphFormatRange.Space15();override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).Space15), nil); +End; + +Function TSDocxParagraphFormatRange.Space2();override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).Space2), nil); +End; + +Function TSDocxParagraphFormatRange.TabHangingIndent(Count);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).TabHangingIndent), Count); +End; + +Function TSDocxParagraphFormatRange.TabIndent(Count);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).TabIndent), Count); +End; + +// property +Function TSDocxParagraphFormatRange.WriteWordWrap(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteWordWrap), value); +End; +Function TSDocxParagraphFormatRange.ReadWordWrap();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadWordWrap)); +End; + +Function TSDocxParagraphFormatRange.WriteWidowControl(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteWidowControl), value); +End; +Function TSDocxParagraphFormatRange.ReadWidowControl();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadWidowControl)); +End; + +Function TSDocxParagraphFormatRange.WriteTextboxTightWrap(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteTextboxTightWrap), value); +End; +Function TSDocxParagraphFormatRange.ReadTextboxTightWrap();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadTextboxTightWrap)); +End; + +Function TSDocxParagraphFormatRange.WriteTabStops(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteTabStops), value); +End; +Function TSDocxParagraphFormatRange.ReadTabStops();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadTabStops)); +End; + +Function TSDocxParagraphFormatRange.WriteStyle(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteStyle), value); +End; +Function TSDocxParagraphFormatRange.ReadStyle();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadStyle)); +End; + +Function TSDocxParagraphFormatRange.WriteSpaceBeforeAuto(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteSpaceBeforeAuto), value); +End; +Function TSDocxParagraphFormatRange.ReadSpaceBeforeAuto();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadSpaceBeforeAuto)); +End; + +Function TSDocxParagraphFormatRange.WriteSpaceBefore(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteSpaceBefore), value); +End; +Function TSDocxParagraphFormatRange.ReadSpaceBefore();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadSpaceBefore)); +End; + +Function TSDocxParagraphFormatRange.WriteSpaceAfterAuto(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteSpaceAfterAuto), value); +End; +Function TSDocxParagraphFormatRange.ReadSpaceAfterAuto();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadSpaceAfterAuto)); +End; + +Function TSDocxParagraphFormatRange.WriteSpaceAfter(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteSpaceAfter), value); +End; +Function TSDocxParagraphFormatRange.ReadSpaceAfter();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadSpaceAfter)); +End; + +// TODO +Function TSDocxParagraphFormatRange.ReadShading();override; +Begin +End; + +Function TSDocxParagraphFormatRange.WriteRightIndent(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteRightIndent), value); +End; +Function TSDocxParagraphFormatRange.ReadRightIndent();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadRightIndent)); +End; + +Function TSDocxParagraphFormatRange.WriteReadingOrder(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteReadingOrder), value); +End; +Function TSDocxParagraphFormatRange.ReadReadingOrder();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadReadingOrder)); +End; + +Function TSDocxParagraphFormatRange.WritePageBreakBefore(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WritePageBreakBefore), value); +End; +Function TSDocxParagraphFormatRange.ReadPageBreakBefore();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadPageBreakBefore)); +End; + +Function TSDocxParagraphFormatRange.WriteOutlineLevel(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteOutlineLevel), value); +End; +Function TSDocxParagraphFormatRange.ReadOutlineLevel();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadOutlineLevel)); +End; + +Function TSDocxParagraphFormatRange.WriteNoLineNumber(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteNoLineNumber), value); +End; +Function TSDocxParagraphFormatRange.ReadNoLineNumber();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadNoLineNumber)); +End; + +Function TSDocxParagraphFormatRange.WriteMirrorIndents(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteMirrorIndents), value); +End; +Function TSDocxParagraphFormatRange.ReadMirrorIndents();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadMirrorIndents)); +End; + +Function TSDocxParagraphFormatRange.WriteLineUnitBefore(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteLineUnitBefore), value); +End; +Function TSDocxParagraphFormatRange.ReadLineUnitBefore();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadLineUnitBefore)); +End; + +Function TSDocxParagraphFormatRange.WriteLineUnitAfter(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteLineUnitAfter), value); +End; +Function TSDocxParagraphFormatRange.ReadLineUnitAfter();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadLineUnitAfter)); +End; + +Function TSDocxParagraphFormatRange.WriteLineSpacingRule(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteLineSpacingRule), value); +End; +Function TSDocxParagraphFormatRange.ReadLineSpacingRule();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadLineSpacingRule)); +End; + +Function TSDocxParagraphFormatRange.WriteLineSpacing(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteLineSpacing), value); +End; +Function TSDocxParagraphFormatRange.ReadLineSpacing();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadLineSpacing)); +End; + +Function TSDocxParagraphFormatRange.WriteLeftIndent(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteLeftIndent), value); +End; +Function TSDocxParagraphFormatRange.ReadLeftIndent();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadLeftIndent)); +End; + +Function TSDocxParagraphFormatRange.WriteKeepWithNext(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteKeepWithNext), value); +End; +Function TSDocxParagraphFormatRange.ReadKeepWithNext();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadKeepWithNext)); +End; + +Function TSDocxParagraphFormatRange.WriteKeepTogether(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteKeepTogether), value); +End; +Function TSDocxParagraphFormatRange.ReadKeepTogether();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadKeepTogether)); +End; + +Function TSDocxParagraphFormatRange.WriteHyphenation(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteHyphenation), value); +End; +Function TSDocxParagraphFormatRange.ReadHyphenation();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadHyphenation)); +End; + +Function TSDocxParagraphFormatRange.WriteHangingPunctuation(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteHangingPunctuation), value); +End; +Function TSDocxParagraphFormatRange.ReadHangingPunctuation();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadHangingPunctuation)); +End; + +Function TSDocxParagraphFormatRange.WriteHalfWidthPunctuationOnTopOfLine(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteHalfWidthPunctuationOnTopOfLine), value); +End; +Function TSDocxParagraphFormatRange.ReadHalfWidthPunctuationOnTopOfLine();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadHalfWidthPunctuationOnTopOfLine)); +End; + +Function TSDocxParagraphFormatRange.WriteFirstLineIndent(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteFirstLineIndent), value); +End; +Function TSDocxParagraphFormatRange.ReadFirstLineIndent();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadFirstLineIndent)); +End; + +Function TSDocxParagraphFormatRange.WriteFarEastLineBreakControl(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteFarEastLineBreakControl), value); +End; +Function TSDocxParagraphFormatRange.ReadFarEastLineBreakControl();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadFarEastLineBreakControl)); +End; + +Function TSDocxParagraphFormatRange.ReadDuplicate();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadDuplicate)); +End; + +Function TSDocxParagraphFormatRange.WriteDisableLineHeightGrid(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteDisableLineHeightGrid), value); +End; +Function TSDocxParagraphFormatRange.ReadDisableLineHeightGrid();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadDisableLineHeightGrid)); +End; + +Function TSDocxParagraphFormatRange.WriteCollapsedByDefault(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteCollapsedByDefault), value); +End; +Function TSDocxParagraphFormatRange.ReadCollapsedByDefault();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadCollapsedByDefault)); +End; + +Function TSDocxParagraphFormatRange.WriteCharacterUnitRightIndent(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteCharacterUnitRightIndent), value); +End; +Function TSDocxParagraphFormatRange.ReadCharacterUnitRightIndent();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadCharacterUnitRightIndent)); +End; + +Function TSDocxParagraphFormatRange.WriteCharacterUnitLeftIndent(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteCharacterUnitLeftIndent), value); +End; +Function TSDocxParagraphFormatRange.ReadCharacterUnitLeftIndent();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadCharacterUnitLeftIndent)); +End; + +Function TSDocxParagraphFormatRange.WriteCharacterUnitFirstLineIndent(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteCharacterUnitFirstLineIndent), value); +End; +Function TSDocxParagraphFormatRange.ReadCharacterUnitFirstLineIndent();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadCharacterUnitFirstLineIndent)); +End; + +Function TSDocxParagraphFormatRange.ReadBorders(index);override; +Begin + // 重组一个新的range_arr_ + arr := array(); + for i:=0 to length(paragraph_arr_)-1 do + arr[i]["entirety"] := paragraph_arr_[i].Root(); + borders_obj := new TSDocxBordersRange(self.Application, self.Creator, self.Parent); + borders_obj.Init(arr); + return ifnil(index) ? borders_obj : borders_obj.Item(index); +End; + +Function TSDocxParagraphFormatRange.WriteBaseLineAlignment(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteBaseLineAlignment), value); +End; +Function TSDocxParagraphFormatRange.ReadBaseLineAlignment();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadBaseLineAlignment)); +End; + +Function TSDocxParagraphFormatRange.WriteAutoAdjustRightIndent(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteAutoAdjustRightIndent), value); +End; +Function TSDocxParagraphFormatRange.ReadAutoAdjustRightIndent();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadAutoAdjustRightIndent)); +End; + +Function TSDocxParagraphFormatRange.WriteAlignment(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteAlignment), value); +End; +Function TSDocxParagraphFormatRange.ReadAlignment();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadAlignment)); +End; + +Function TSDocxParagraphFormatRange.WriteAddSpaceBetweenFarEastAndDigit(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteAddSpaceBetweenFarEastAndDigit), value); +End; +Function TSDocxParagraphFormatRange.ReadAddSpaceBetweenFarEastAndDigit();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadAddSpaceBetweenFarEastAndDigit)); +End; + +Function TSDocxParagraphFormatRange.WriteAddSpaceBetweenFarEastAndAlpha(value);override; +Begin + CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteAddSpaceBetweenFarEastAndAlpha), value); +End; +Function TSDocxParagraphFormatRange.ReadAddSpaceBetweenFarEastAndAlpha();override; +Begin + return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadAddSpaceBetweenFarEastAndAlpha)); +End; + diff --git a/docx/shading/TSDocxShading.tsf b/docx/shading/TSDocxShading.tsf new file mode 100644 index 0000000..4124039 --- /dev/null +++ b/docx/shading/TSDocxShading.tsf @@ -0,0 +1,305 @@ +Type TSDocxShading = Class(TSVbaBase) +Uses TSDocxEnumerations; + +public + Function Init(shading); + Function Apply();virtual; + +private + shading_; // TOfficeObj("TwShading") + color_index_; + color_; + +public + property BackgroundPatternColor read ReadBackgroundPatternColor write WriteBackgroundPatternColor; + property BackgroundPatternColorIndex read ReadBackgroundPatternColorIndex write WriteBackgroundPatternColorIndex; + property ForegroundPatternColor read ReadForegroundPatternColor write WriteForegroundPatternColor; + property ForegroundPatternColorIndex read ReadForegroundPatternColorIndex write WriteForegroundPatternColorIndex; + property Texture read ReadTexture write WriteTexture; + Function WriteTexture(value);virtual; + Function ReadTexture();virtual; + Function WriteForegroundPatternColorIndex(value);virtual; + Function ReadForegroundPatternColorIndex();virtual; + Function WriteForegroundPatternColor(value);virtual; + Function ReadForegroundPatternColor();virtual; + Function WriteBackgroundPatternColorIndex(value);virtual; + Function ReadBackgroundPatternColorIndex();virtual; + Function WriteBackgroundPatternColor(value);virtual; + Function ReadBackgroundPatternColor();virtual; + +End; + + +// ============== 实现 ================= // +Function TSDocxShading.Init(shading); +Begin + shading_ := shading; + color_index_ := TSWdColorIndex(); + color_ := TSWdColor(); +End; + +Function TSDocxShading.Apply();virtual; +Begin + shading_.Update(); +End; + +// property +Function TSDocxShading.WriteTexture(value); +Begin + case value of + TSDocxEnumerations.wdTexture10Percent(): + shading_.Val := "pct10"; + TSDocxEnumerations.wdTexture12Pt5Percent(): + shading_.Val := "pct12"; + TSDocxEnumerations.wdTexture15Percent(): + shading_.Val := "pct15"; + TSDocxEnumerations.wdTexture17Pt5Percent(): + shading_.Val := "pct17"; + TSDocxEnumerations.wdTexture20Percent(): + shading_.Val := "pct20"; + TSDocxEnumerations.wdTexture22Pt5Percent(): + shading_.Val := "pct22"; + TSDocxEnumerations.wdTexture25Percent(): + shading_.Val := "pct25"; + TSDocxEnumerations.wdTexture27Pt5Percent(): + shading_.Val := "clear"; + TSDocxEnumerations.wdTexture2Pt5Percent(): + shading_.Val := "clear"; + TSDocxEnumerations.wdTexture30Percent(): + shading_.Val := "pct30"; + TSDocxEnumerations.wdTexture32Pt5Percent(): + shading_.Val := "pct32"; + TSDocxEnumerations.wdTexture35Percent(): + shading_.Val := "pct35"; + TSDocxEnumerations.wdTexture37Pt5Percent(): + shading_.Val := "pct37"; + TSDocxEnumerations.wdTexture40Percent(): + shading_.Val := "pct40"; + TSDocxEnumerations.wdTexture42Pt5Percent(): + shading_.Val := "pct42"; + TSDocxEnumerations.wdTexture45Percent(): + shading_.Val := "pct45"; + TSDocxEnumerations.wdTexture47Pt5Percent(): + shading_.Val := "pct47"; + TSDocxEnumerations.wdTexture50Percent(): + shading_.Val := "pct50"; + TSDocxEnumerations.wdTexture52Pt5Percent(): + shading_.Val := "pct52"; + TSDocxEnumerations.wdTexture55Percent(): + shading_.Val := "pct55"; + TSDocxEnumerations.wdTexture57Pt5Percent(): + shading_.Val := "clear"; + TSDocxEnumerations.wdTexture5Percent(): + shading_.Val := "pct5"; + TSDocxEnumerations.wdTexture60Percent(): + shading_.Val := "pct60"; + TSDocxEnumerations.wdTexture62Pt5Percent(): + shading_.Val := "pct62"; + TSDocxEnumerations.wdTexture65Percent(): + shading_.Val := "pct65"; + TSDocxEnumerations.wdTexture67Pt5Percent(): + shading_.Val := "pct67"; + TSDocxEnumerations.wdTexture70Percent(): + shading_.Val := "pct70"; + TSDocxEnumerations.wdTexture72Pt5Percent(): + shading_.Val := "pct72"; + TSDocxEnumerations.wdTexture75Percent(): + shading_.Val := "pct75"; + TSDocxEnumerations.wdTexture77Pt5Percent(): + shading_.Val := "pct77"; + TSDocxEnumerations.wdTexture7Pt5Percent(): + shading_.Val := "clear"; + TSDocxEnumerations.wdTexture80Percent(): + shading_.Val := "pct80"; + TSDocxEnumerations.wdTexture82Pt5Percent(): + shading_.Val := "pct82"; + TSDocxEnumerations.wdTexture85Percent(): + shading_.Val := "pct85"; + TSDocxEnumerations.wdTexture87Pt5Percent(): + shading_.Val := "pct87"; + TSDocxEnumerations.wdTexture90Percent(): + shading_.Val := "pct90"; + TSDocxEnumerations.wdTexture92Pt5Percent(): + shading_.Val := "pct92"; + TSDocxEnumerations.wdTexture95Percent(): + shading_.Val := "pct95"; + TSDocxEnumerations.wdTexture97Pt5Percent(): + shading_.Val := "pct97"; + TSDocxEnumerations.wdTextureCross(): + shading_.Val := "thinHorzCross"; + TSDocxEnumerations.wdTextureDarkCross(): + shading_.Val := "HorzCross"; + TSDocxEnumerations.wdTextureDarkDiagonalCross(): + shading_.Val := "diagCross"; + TSDocxEnumerations.wdTextureDarkDiagonalDown(): + shading_.Val := "reverseDiagStripe"; + TSDocxEnumerations.wdTextureDarkDiagonalUp(): + shading_.Val := "diagStripe"; + TSDocxEnumerations.wdTextureDarkHorizontal(): + shading_.Val := "horzStripe"; + TSDocxEnumerations.wdTextureDarkVertical(): + shading_.Val := "vertStripe"; + TSDocxEnumerations.wdTextureDiagonalCross(): + shading_.Val := "thinDiagCross"; + TSDocxEnumerations.wdTextureDiagonalDown(): + shading_.Val := "thinReverseDiagStripe"; + TSDocxEnumerations.wdTextureDiagonalUp(): + shading_.Val := "thinDiagStripe"; + TSDocxEnumerations.wdTextureHorizontal(): + shading_.Val := "thinHorzStripe"; + TSDocxEnumerations.wdTextureNone(): + shading_.Val := "none"; + TSDocxEnumerations.wdTextureSolid(): + shading_.Val := "solid"; + TSDocxEnumerations.wdTextureVertical(): + shading_.Val := "thinVertStripe"; + end; +End; +Function TSDocxShading.ReadTexture(); +Begin + value := shading_.Value("Val"); + case value of + "pct10": + return TSDocxEnumerations.wdTexture10Percent(); + "pct12": + return TSDocxEnumerations.wdTexture12Pt5Percent(); + "pct15": + return TSDocxEnumerations.wdTexture15Percent(); + "pct17": + return TSDocxEnumerations.wdTexture17Pt5Percent(); + "pct20": + return TSDocxEnumerations.wdTexture20Percent(); + "pct22": + return TSDocxEnumerations.wdTexture22Pt5Percent(); + "pct25": + return TSDocxEnumerations.wdTexture25Percent(); + "clear": + return TSDocxEnumerations.wdTexture27Pt5Percent(); + "clear": + return TSDocxEnumerations.wdTexture2Pt5Percent(); + "pct30": + return TSDocxEnumerations.wdTexture30Percent(); + "pct32": + return TSDocxEnumerations.wdTexture32Pt5Percent(); + "pct35": + return TSDocxEnumerations.wdTexture35Percent(); + "pct37": + return TSDocxEnumerations.wdTexture37Pt5Percent(); + "pct40": + return TSDocxEnumerations.wdTexture40Percent(); + "pct42": + return TSDocxEnumerations.wdTexture42Pt5Percent(); + "pct45": + return TSDocxEnumerations.wdTexture45Percent(); + "pct47": + return TSDocxEnumerations.wdTexture47Pt5Percent(); + "pct50": + return TSDocxEnumerations.wdTexture50Percent(); + "pct52": + return TSDocxEnumerations.wdTexture52Pt5Percent(); + "pct55": + return TSDocxEnumerations.wdTexture55Percent(); + "clear": + return TSDocxEnumerations.wdTexture57Pt5Percent(); + "pct5": + return TSDocxEnumerations.wdTexture5Percent(); + "pct60": + return TSDocxEnumerations.wdTexture60Percent(); + "pct62": + return TSDocxEnumerations.wdTexture62Pt5Percent(); + "pct65": + return TSDocxEnumerations.wdTexture65Percent(); + "pct67": + return TSDocxEnumerations.wdTexture67Pt5Percent(); + "pct70": + return TSDocxEnumerations.wdTexture70Percent(); + "pct72": + return TSDocxEnumerations.wdTexture72Pt5Percent(); + "pct75": + return TSDocxEnumerations.wdTexture75Percent(); + "pct77": + return TSDocxEnumerations.wdTexture77Pt5Percent(); + "clear": + return TSDocxEnumerations.wdTexture7Pt5Percent(); + "pct80": + return TSDocxEnumerations.wdTexture80Percent(); + "pct82": + return TSDocxEnumerations.wdTexture82Pt5Percent(); + "pct85": + return TSDocxEnumerations.wdTexture85Percent(); + "pct87": + return TSDocxEnumerations.wdTexture87Pt5Percent(); + "pct90": + return TSDocxEnumerations.wdTexture90Percent(); + "pct92": + return TSDocxEnumerations.wdTexture92Pt5Percent(); + "pct95": + return TSDocxEnumerations.wdTexture95Percent(); + "pct97": + return TSDocxEnumerations.wdTexture97Pt5Percent(); + "thinHorzCross": + return TSDocxEnumerations.wdTextureCross(); + "HorzCross": + return TSDocxEnumerations.wdTextureDarkCross(); + "diagCross": + return TSDocxEnumerations.wdTextureDarkDiagonalCross(); + "reverseDiagStripe": + return TSDocxEnumerations.wdTextureDarkDiagonalDown(); + "diagStripe": + return TSDocxEnumerations.wdTextureDarkDiagonalUp(); + "horzStripe": + return TSDocxEnumerations.wdTextureDarkHorizontal(); + "vertStripe": + return TSDocxEnumerations.wdTextureDarkVertical(); + "thinDiagCross": + return TSDocxEnumerations.wdTextureDiagonalCross(); + "thinReverseDiagStripe": + return TSDocxEnumerations.wdTextureDiagonalDown(); + "thinDiagStripe": + return TSDocxEnumerations.wdTextureDiagonalUp(); + "thinHorzStripe": + return TSDocxEnumerations.wdTextureHorizontal(); + "none": + return TSDocxEnumerations.wdTextureNone(); + "solid": + return TSDocxEnumerations.wdTextureSolid(); + "thinVertStripe": + return TSDocxEnumerations.wdTextureVertical(); + end; +End; + +Function TSDocxShading.WriteForegroundPatternColorIndex(value); +Begin + shading_.Color := color_index_[value]; +End; +Function TSDocxShading.ReadForegroundPatternColorIndex(); +Begin + return color_index_[shading_.Value("Color")]; +End; + +Function TSDocxShading.WriteForegroundPatternColor(value); +Begin + shading_.Color := color_[value]; +End; +Function TSDocxShading.ReadForegroundPatternColor(); +Begin + return color_[shading_.Value("Color")]; +End; + +Function TSDocxShading.WriteBackgroundPatternColorIndex(value); +Begin + shading_.Fill := color_index_[value]; +End; +Function TSDocxShading.ReadBackgroundPatternColorIndex(); +Begin + return color_index_[shading_.Value("Fill")]; +End; + +Function TSDocxShading.WriteBackgroundPatternColor(value); +Begin + shading_.Fill := color_[value]; +End; +Function TSDocxShading.ReadBackgroundPatternColor(); +Begin + return color_[shading_.Value("Fill")]; +End; diff --git a/docx/shading/TSDocxShadingRange.tsf b/docx/shading/TSDocxShadingRange.tsf new file mode 100644 index 0000000..4a1f1f1 --- /dev/null +++ b/docx/shading/TSDocxShadingRange.tsf @@ -0,0 +1,169 @@ +Type TSDocxShadingRange = Class(TSDocxShading) +Uses TSDocxEnumerations; + +public + Function Init(rangeObj); + +private + Function GetShadingObjectByNode(node); + Function GetShading(arr, hash); + Function CallFunction(fname, value);overload; + Function CallFunction(fname);overload; + Function SplitRun(); + +private + range_obj_; + +public + Function WriteTexture(value);override; + Function ReadTexture();override; + Function WriteForegroundPatternColorIndex(value);override; + Function ReadForegroundPatternColorIndex();override; + Function WriteForegroundPatternColor(value);override; + Function ReadForegroundPatternColor();override; + Function WriteBackgroundPatternColorIndex(value);override; + Function ReadBackgroundPatternColorIndex();override; + Function WriteBackgroundPatternColor(value);override; + Function ReadBackgroundPatternColor();override; + +End; + + +// ============== 实现 ================= // +Function TSDocxShadingRange.Init(rangeObj); +Begin + range_obj_ := rangeObj; + class(TSDocxShading).Init(nil); +End; + +Function TSDocxShadingRange.SplitRun(); +Begin + range_obj_.SplitRangeRun(); + self.Parent.SetRangeObj(range_obj_); +End; + +Function TSDocxShadingRange.GetShading(arr, hash); +Begin + if arr["entirety"] then + begin + if not ifnil(hash[arr["entirety"]]) then nil; + hash[arr["entirety"]] := true; + shading := GetShadingObjectByNode(arr["entirety"]); + end + else begin + trun := arr["trun"]; + if not ifObj(trun.Root()) then return nil; + shading := new TSDocxShading(self.Application, self.Creator, self.Parent); + shading.Init(trun.rPr.Shading); + end + return shading; +End; + +Function TSDocxShadingRange.GetShadingObjectByNode(node); +Begin + name := node.GetName(); + if name = "w:p" then + begin + obj := TOfficeObj("TParagraph"); + obj.Init(node); + paragraph_obj := new TSDocxParagraph(self.Application, self.Creator, self.Parent); + paragraph_obj.Init(nil, obj, nil); + return paragraph_obj.Shading(); + end + else if name = "w:tbl" then + begin + obj := TOfficeObj("TTable"); + obj.Init(node); + table_obj := new TSDocxTable(self.Application, self.Creator, self.Parent); + table_obj.Init(nil, obj); + return table_obj.Shading(); + end + else if name = "w:tc" then + begin + cell_obj := new TSDocxCell(self.Application, self.Creator, self.Parent); + cell_obj.Init(node); + return cell_obj.Shading(); + end +End; + +Function TSDocxShadingRange.CallFunction(fname, value);overload; +Begin + // 这样设计是为了段落走走段落的shading,table走table的,cell走cell的 + SplitRun(); + hash := array(); + range_arr := rangeObj.GetInfo(); + for i:=0 to length(range_arr)-1 do + begin + shading := GetShading(range_arr[i], hash); + if ifnil(shading) then continue; + pf := FindFunction(fname, shading); + pf.Do(value); + end +End; + +Function TSDocxShadingRange.CallFunction(fname);overload; +Begin + hash := array(); + ret := nil; + range_arr := rangeObj.GetInfo(); + for i:=0 to length(range_arr)-1 do + begin + shading := GetShading(range_arr[i], hash); + if ifnil(shading) then continue; + pf := FindFunction(fname, shading); + r := pf.Do(); + if ifnil(ret) then ret := r; + if ret <> r then return TSDocxEnumerations.WdUnderline(); + end + return ret; +End; + +// property +Function TSDocxShadingRange.WriteTexture(value);override; +Begin + CallFunction("WriteTexture", value); +End; +Function TSDocxShadingRange.ReadTexture();override; +Begin + CallFunction("ReadTexture"); +End; + +Function TSDocxShadingRange.WriteForegroundPatternColorIndex(value);override; +Begin + CallFunction("WriteForegroundPatternColorIndex", value); +End; +Function TSDocxShadingRange.ReadForegroundPatternColorIndex();override; +Begin + CallFunction("ReadForegroundPatternColorIndex"); +End; + +Function TSDocxShadingRange.WriteForegroundPatternColor(value);override; +Begin + + CallFunction("WriteForegroundPatternColor", value); +End; +Function TSDocxShadingRange.ReadForegroundPatternColor();override; +Begin + CallFunction("ReadForegroundPatternColor"); +End; + +Function TSDocxShadingRange.WriteBackgroundPatternColorIndex(value);override; +Begin + + CallFunction("WriteBackgroundPatternColorIndex", value); +End; +Function TSDocxShadingRange.ReadBackgroundPatternColorIndex();override; +Begin + CallFunction("ReadBackgroundPatternColorIndex"); +End; + +Function TSDocxShadingRange.WriteBackgroundPatternColor(value);override; +Begin + + CallFunction("WriteBackgroundPatternColor", value); +End; +Function TSDocxShadingRange.ReadBackgroundPatternColor();override; +Begin + CallFunction("ReadBackgroundPatternColor"); +End; + diff --git a/docx/utils/TSWdCommon.tsf b/docx/utils/TSWdCommon.tsf index b4aeb40..b1a03a1 100644 --- a/docx/utils/TSWdCommon.tsf +++ b/docx/utils/TSWdCommon.tsf @@ -10,17 +10,17 @@ Type TSWdCommon = Class if pTotal + len > pStart then begin length := length(arr); + arr[length]["tparagraph"] := tparagraph; + arr[length]["trun"] := run_obj; + arr[length]["text"] := text; + arr[length]["root"] := rootNode; + arr[length]["parent"] := parentNode; // 左边切割 if pTotal < pstart and pTotal + len > pStart + 1 then arr[length]["lsplit"] := pStart - pTotal; // 左边丢弃的字符数 // 右边切割 if pTotal + len > pEnd then arr[length]["rsplit"] := pTotal + len - pEnd; // 右边丢弃的字符数 - arr[length]["tparagraph"] := tparagraph; - arr[length]["trun"] := run_obj; - arr[length]["text"] := text; - arr[length]["root"] := rootNode; - arr[length]["parent"] := parentNode; end return len; End; @@ -37,7 +37,7 @@ Type TSWdCommon = Class paragraph_obj.Init(node); if paragraph_obj.Empty() then begin - class(TSWdCommon).AddRun(root, startNode, nil, paragraph_obj, pStart, pEnd, pTotal, arr); + AddRun(root, startNode, nil, paragraph_obj, pStart, pEnd, pTotal, arr); end else begin paragraph_len := length(arr); // 标记段落完整的起始位置 @@ -47,7 +47,7 @@ Type TSWdCommon = Class case sub_node.GetName() of "w:r": begin - pTotal += class(TSWdCommon).AddRun(root, startNode, sub_node, paragraph_obj, pStart, pEnd, pTotal, arr); + pTotal += AddRun(root, startNode, sub_node, paragraph_obj, pStart, pEnd, pTotal, arr); if pTotal >= pEnd then return 1; end @@ -56,7 +56,7 @@ Type TSWdCommon = Class run_node := sub_node.FirstChildElement("w:r"); while ifObj(run_node) do begin - class(TSWdCommon).AddRun(paragraph_obj, root, run_node, pStart, pEnd, pTotal, arr); + AddRun(paragraph_obj, root, run_node, pStart, pEnd, pTotal, arr); run_node := run_node.NextElement("w:r"); end end @@ -80,7 +80,7 @@ Type TSWdCommon = Class while ifObj(tc) do begin cell_len := length(arr); - flag := class(TSWdCommon).SplitRange(root, tc, pStart, pEnd, pTotal, arr); + flag := SplitRange(root, tc, pStart, pEnd, pTotal, arr); if flag then return 1; tc := tc.NextElement("w:tc"); if pTotal >= pEnd then return 1; @@ -119,21 +119,21 @@ Type TSWdCommon = Class paragraph_obj.Init(node); if paragraph_obj.Empty() then begin - class(TSWdCommon).AddRange(root, startNode, findNode, paragraph_obj, nil, arr); + AddRange(root, startNode, findNode, paragraph_obj, nil, arr); end else begin sub_node := node.FirstChildElement(); while ifObj(sub_node) do begin case sub_node.GetName() of - "w:r": pend += class(TSWdCommon).AddRange(root, startNode, findNode, paragraph_obj, sub_node, arr); + "w:r": pend += AddRange(root, startNode, findNode, paragraph_obj, sub_node, arr); "w:ins", "w:del": begin run_node := sub_node.FirstChildElement("w:r"); while ifObj(run_node) do begin - pend += class(TSWdCommon).AddRange(root, findNode, paragraph_obj, run_node, arr); + pend += AddRange(root, findNode, paragraph_obj, run_node, arr); run_node := run_node.NextElement("w:r"); end end @@ -156,7 +156,7 @@ Type TSWdCommon = Class arr := array(); end case node.GetName() of - "w:p": class(TSWdCommon).ParagraphRange(root, startNode, findNode, node, pend, arr); + "w:p": ParagraphRange(root, startNode, findNode, node, pend, arr); "w:tbl": begin tr := node.FirstChildElement("w:tr"); @@ -188,7 +188,7 @@ Type TSWdCommon = Class Class Function SplitRangeRun(rangeArr);overload; Begin for i:=0 to length(rangeArr)-1 do - rangeArr[i] := class(TSWdCommon).SplitSingleRangeRun(rangeArr[i]); + rangeArr[i] := SplitSingleRangeRun(rangeArr[i]); End; Class Function SplitSingleRangeRun(arr);overload; diff --git a/docx/utils/TSWdRange.tsf b/docx/utils/TSWdRange.tsf new file mode 100644 index 0000000..4f8ebfc --- /dev/null +++ b/docx/utils/TSWdRange.tsf @@ -0,0 +1,340 @@ +Type TSWdRange = Class + +public + Function Create(rootNode, startP, endP);overload; + Function Create(rootNode, targetNode);overload; + Function Init(); + Function Run(); + Function GetStart(); + Function GetEnd(); + Function SplitRun();overload; + Function SplitRun(arr);overload; + Function Clear(); + Function Print(); + +public + Data; // 管理range结构的数组,字段如下 + // lsplit: 左边丢弃的字符数 + // rsplit: 右边丢弃的字符数 + // tparagraph: TOfficeObj("TParagraph")对象 + // trun: TOfficeObj("TRun")对象 + // text: 文本内容 + // root: 根节点 + // parent: 父节点 + // entirety: 是否是完整的段落/表格/单元格 + +private + Function FindRangeByPosition(startNode); + Function FindRangeByNode(startNode); + Function AddEntirety(len, node); + Function AddRunInfo(parentNode, runNode, tParagraph); + Function AddRunInfo2(parentNode, runNode, tParagraph); + Function ParagraphRange(node); + +private + start_position_; // 开始位置 + end_position_; // 结束位置, 开始与结束遵循左闭右开原则 + cur_position_; // 当前位置 + root_node_; // 根节点 + target_node_; // 目标节点,使用paragraph.Range,table.Range, cell.Range时用 + split_flag_; // 切割标志 + +End; + +Function TSWdRange.Create(rootNode, startP, endP);overload; +Begin + root_node_ := rootNode; + start_position_ := startP; + end_position_ := endP; + targetNode := nil; + Init(); +End; + +Function TSWdRange.Create(rootNode, targetNode);overload; +Begin + root_node_ := rootNode; + target_node_ := targetNode; + start_position_ := nil; + end_position_ := nil; + Init(); +End; + +Function TSWdRange.Init(); +Begin + cur_position_ := 0; + split_flag_ := false; + Data := array(); + Run(); +End; + +Function TSWdRange.Run(); +Begin + if target_node_ then + FindRangeByNode(target_node_); + else + FindRangeByPosition(root_node_); +End; + +Function TSWdRange.Print(); +Begin + println("print... {}", Data); +End; + +Function TSWdRange.GetStart(); +Begin + if ifnil(start_position_) then return 0; + return start_position_; +End; + +Function TSWdRange.GetEnd(); +Begin + if ifnil(end_position_) then return 0; + return end_position_; +End; + +Function TSWdRange.SplitRun();overload; +Begin + if split_flag_ then return; + for i:=0 to length(Data)-1 do + Data[i] := SplitRun(Data[i]); + split_flag_ := true; +End; + +Function TSWdRange.SplitRun(arr);overload; +Begin + insert_run := function(root, node); + begin + new_node := root.InsertAfterChild(node, "element", "w:r"); + run := TOfficeObj("TRun"); + run.Init(new_node); + return run; + end + if ifnil(arr["lsplit"]) and ifnil(arr["rsplit"]) then return arr; + paragraph := arr["tparagraph"]; + run := arr["trun"]; + text := arr["text"]; + if arr["lsplit"] then // 分割左边 + begin + lpos := arr["lsplit"]; + run.SetText(text[:lpos]); + run := ##insert_run(paragraph.Root(), run.Root()); + text := text[lpos + 1:]; + run.SetText(text); + arr["text"] := text; + arr["lsplit"] := nil; + end + if arr["rsplit"] then // 分割右边的run + begin + rpos := length(text) - arr["rsplit"]; + run.SetText(text[1:rpos]); + new_run := ##insert_run(paragraph.Root(), run.Root()); + new_run.SetText(text[rpos+1:]); + arr["rsplit"] := nil; + arr["text"] := text[1:rpos]; + end + arr["trun"] := run; + return arr; +End; + +Function TSWdRange.FindRangeByPosition(startNode); +Begin + node := startNode.FirstChildElement(); + while ifObj(node) do + begin + len := length(Data); // 标记完整段落/表格的起始位置 + case node.GetName() of + "w:p": + begin + paragraph_obj := TOfficeObj("TParagraph"); + paragraph_obj.Init(node); + if paragraph_obj.Empty() then // 空段落 + begin + AddRunInfo(startNode, nil, paragraph_obj); + end + else begin + sub_node := node.FirstChildElement(); + while ifObj(sub_node) do + begin + case sub_node.GetName() of + "w:r": + begin + AddRunInfo(startNode, sub_node, paragraph_obj); + if cur_position_ >= end_position_ then return 1; + end + + "w:ins", "w:del": + begin + run_node := sub_node.FirstChildElement("w:r"); + while ifObj(run_node) do + begin + AddRunInfo(startNode, run_node, paragraph_obj); + if cur_position_ >= end_position_ then return 1; + run_node := run_node.NextElement("w:r"); + end + end + end; + sub_node := sub_node.NextElement(); + end + // 完整段落 + cur_position_ += 1; + end + end + + "w:tbl": + begin + tr := node.FirstChildElement("w:tr"); + while ifObj(tr) do + begin + tc := tr.FirstChildElement("w:tc"); + while ifObj(tc) do + begin + cell_len := length(Data); + flag := FindRangeByPosition(tc); + if flag then return 1; + if cur_position_ >= end_position_ then return 1; + AddEntirety(cell_len, tc); + tc := tc.NextElement("w:tc"); + end + cur_position_ += 1; + if cur_position_ >= end_position_ then return 1; + tr := tr.NextElement("w:tr"); + end + end + end; + AddEntirety(len, node); + if cur_position_ >= end_position_ then return 1; + node := node.NextElement(); + end +End; + +Function TSWdRange.AddEntirety(len, node); +Begin + for i:=len to length(Data)-1 do + Data[i]["entirety"] := node; +End; + +Function TSWdRange.AddRunInfo(parentNode, runNode, tParagraph); +Begin + run_obj := TOfficeObj("TRun"); + run_obj.Init(runNode); + text := ifObj(runNode) ? run_obj.Text() : ""; + len := text ? length(text) : 1; + + if cur_position_ + len > start_position_ then + begin + length := length(Data); + Data[length]["tparagraph"] := tparagraph; + Data[length]["trun"] := run_obj; + Data[length]["text"] := text; + Data[length]["root"] := root_node_; + Data[length]["parent"] := parentNode; + + // 左边切割,左边丢弃的字符数 + if cur_position_ < start_position_ and cur_position_ + len > start_position_ + 1 then + Data[length]["lsplit"] := start_position_ - cur_position_; + // 右边切割,右边丢弃的字符数 + if cur_position_ + len > end_position_ then + Data[length]["rsplit"] := cur_position_ + len - end_position_; + end + cur_position_ += len; +End; + +Function TSWdRange.FindRangeByNode(startNode); +Begin + tc_pf := function(tc); + begin + node := tc.FirstChildElement(); + while ifObj(node) do + begin + FindRangeByNode(node); + node := node.NextElement(); + end + end + case startNode.GetName() of + "w:p": ParagraphRange(startNode); + "w:tbl": + begin + tr := startNode.FirstChildElement("w:tr"); + while ifObj(tr) do + begin + tc := tr.FirstChildElement("w:tc"); + while ifObj(tc) do + begin + ##tc_pf(tc); + tc := tc.NextElement("w:tc"); + end + tr := tr.NextElement("w:tr"); + end + end + "w:tc": + begin + ##tc_pf(startNode); + end + end; +End; + +Function TSWdRange.ParagraphRange(node); +Begin + paragraph_obj := TOfficeObj("TParagraph"); + paragraph_obj.Init(node); + if paragraph_obj.Empty() then + begin + AddRunInfo2(nil, nil, paragraph_obj); + end + else begin + sub_node := node.FirstChildElement(); + while ifObj(sub_node) do + begin + case sub_node.GetName() of + "w:r": AddRunInfo2(nil, sub_node, paragraph_obj); + + "w:ins", "w:del": + begin + run_node := sub_node.FirstChildElement("w:r"); + while ifObj(run_node) do + begin + AddRunInfo2(nil, run_obj, paragraph_obj); + run_node := run_node.NextElement("w:r"); + end + end + end; + sub_node := sub_node.NextElement(); + end + end +End; + +Function TSWdRange.AddRunInfo2(parentNode, runNode, tParagraph); +Begin + run_obj := TOfficeObj("TRun"); + run_obj.Init(runNode); + + length := length(Data); + Data[length]["tparagraph"] := tParagraph; + Data[length]["trun"] := run_obj; + Data[length]["root"] := root_node_; + Data[length]["parent"] := parentNode; + Data[length]["entirety"] := target_node_; +End; + +Function TSWdRange.Clear(); +Begin + SplitRun(); + first := Data[0]; + para := first["tparagraph"]; + index := 0; + for i:=1 to length(Data)-1 do + begin + if Data[i]["tparagraph"] <> para then + begin + parent := Data[i]["parent"]; + parent.DeleteChild(Data[i]["tparagraph"].Root()); + end + else begin + p := Data[i]["tparagraph"]; + r := Data[i]["trun"]; + if ifObj(p.Root()) and ifObj(r.Root()) then p.Root().DeleteChild(r.Root()); + end + end + Data := array(); + Data[0] := first; +End; diff --git a/test/docx_test.tsl b/test/docx_test.tsl index 607c86e..8daa053 100644 --- a/test/docx_test.tsl +++ b/test/docx_test.tsl @@ -17,19 +17,25 @@ Begin println("ActiveDocument.Name = {}", application.ActiveDocument.Name); println("ActiveDocument.Tables.Count = {}", application.ActiveDocument.Tables.Count); + ActiveDocument := application.ActiveDocument; + ActiveDocument.Paragraphs.Add; + + prange := ActiveDocument.Range(2, 4); + prange.Font.Size := 20; + prange.ParagraphFormat.Alignment := 1; + return; // TestTableCell(application); // TestTableColumns(application); // TestTables(application); // TestParagraphs(application); // TestRange(application); -TestBorders(application); +// TestBorders(application); + // arr := application.ActiveDocument.Range(0, 10); // println("arr = {}", arr); Documents[2].SaveAs2(FileName : savepath); println("savepath = {}", savepath); -return; - End; @@ -54,8 +60,6 @@ Begin crange.InsertAfter(Text: ".after"); crange.InsertBefore(Text: ".before"); - return; - ActiveDocument.Range(2, 17).Font.Size := 20; println("ActiveDocument.Range(2, 4).Font.Size = {}", ActiveDocument.Range(2, 4).Font.Size); println("ActiveDocument.Range(2, 5).Font.Size = {}", ActiveDocument.Range(2, 5).Font.Size); diff --git a/test/docx_vba_help.tsl b/test/docx_vba_help.tsl new file mode 100644 index 0000000..35bfcb7 --- /dev/null +++ b/test/docx_vba_help.tsl @@ -0,0 +1,24 @@ +Uses TSDocxEnumerations; + +Application := new TSDocxApplication(); + +openpath := "D://temp//default.docx"; +savepath := "D://temp//docx_vba_help.docx"; + +document := Application.Documents.Open(FileName: openpath); +document.Activate; +println("Documents.Count = {}", Application.Documents.Count); +ActiveDocument := Application.ActiveDocument; +println("ActiveDocument.Name = {}", ActiveDocument.Name); +println("\n"); + +ActiveDocument.Paragraphs.Add; +para := ActiveDocument.Paragraphs.Last; +para.Range.Text := "TSVBA帮助文档"; +println("para = {}", para); +// para.Range.Font.Size := 20; +para.Format.Alignment := TSDocxEnumerations.wdAlignParagraphCenter(); +para.Format.Apply(); // 写属性后要apply +// ActiveDocument.SaveAs2(FileName : savepath); +// println("ActiveDocument.SaveAs2 = {}", savepath); + diff --git a/test/test.tsl b/test/test.tsl new file mode 100644 index 0000000..257f8d5 --- /dev/null +++ b/test/test.tsl @@ -0,0 +1,4 @@ +Uses SampleUnit; +InterfaceFunction(); +return; + diff --git a/test/xlsx_test.tsl b/test/xlsx_test.tsl index 7ac1503..e38f647 100644 --- a/test/xlsx_test.tsl +++ b/test/xlsx_test.tsl @@ -2,7 +2,7 @@ // xlsx.NewFile(); // xlsx.OpenFile("", "D:\\temp\\vba_new.xlsx"); -application := new Application(); +application := new XlsxApplication(); application.Workbooks.Add; Workbooks := application.Workbooks; Workbooks.Open(FileName : "D:/temp/vba_new.xlsx"); diff --git a/utils/Collection.tsf b/utils/Collection.tsf index 9053a50..5b8dcea 100644 --- a/utils/Collection.tsf +++ b/utils/Collection.tsf @@ -19,18 +19,12 @@ private fp_; // 函数指针 -- 用来比较 activation_; // 激活的对象 -public - class Function GetInstance(value); - -private - static collection_; - End; // ============== 实现 ================= // Function Collection.Create(); Begin - container_ := ContainerList(); + container_ := new LinkList(); ignorecase_ := false; fp_ := FindFunction("CompareFunction", self); End; @@ -66,14 +60,6 @@ Begin return name; End; -class Function Collection.GetInstance(value); -Begin - if not istable(collection_) then collection_ := array(); - if not collection_[value] then - collection_[value] := new Collection(); - return collection_[value]; -End; - Function Collection.AddCollection(obj, name); Begin data := new Data(); diff --git a/utils/ContainerList.tsf b/utils/LinkList.tsf similarity index 95% rename from utils/ContainerList.tsf rename to utils/LinkList.tsf index 6c9992c..a0eeb4a 100644 --- a/utils/ContainerList.tsf +++ b/utils/LinkList.tsf @@ -1,8 +1,3 @@ -Function ContainerList(); -Begin - return new LinkList(); -End; - Type LinkList = class private diff --git a/utils/TSVbaBase.tsf b/utils/TSVbaBase.tsf index e1c63ed..7c238d3 100644 --- a/utils/TSVbaBase.tsf +++ b/utils/TSVbaBase.tsf @@ -4,9 +4,9 @@ public Function Create(app, cre, par); private - application_; - creator_; - parent_; + [weakref]application_; + [weakref]parent_; + [autoref]creator_; public property Application read ReadApplication; @@ -26,7 +26,7 @@ Begin parent_ := par; End; -// property +// Properties Function TSVbaBase.ReadApplication(); Begin return application_;