using System;
using System.Collections.Generic;
namespace FastReport.RichTextParser
{
///
/// This class represents a RTF text paragraph.
///
internal class RTF_Paragraph : RTF_CommonRichElement
{
private Paragraph paragraph;
public List Runs { get { return paragraph.runs; } }
public Paragraph Paragraph { get { return paragraph; } }
internal override RichObject RichObject
{
get
{
RichObject rich = new RichObject();
rich.type = RichObject.Type.Paragraph;
rich.pargraph = paragraph;
rich.size = paragraph.size;
return rich;
}
}
public void Fix(RTF_Parser parser)
{
paragraph.format = parser.current_paragraph_format;
}
internal void AddString(RTF_Parser parser, string text)
{
Run run = new Run(text, parser.current_run_format);
if (parser.ListItem)
{
if(parser.current_paragraph_format.list_id == null)
parser.current_paragraph_format.list_id = new List();
parser.current_paragraph_format.list_id.Add(run);
}
else
{
if (parser.Control != "pntxta" && parser.PreviousTag != "pntxtb")
Runs.Add(run);
else
; // run = null;
}
paragraph.size += text.Length;
}
internal override bool Parse(RTF_Parser parser, RTF_Header header)
{
bool status = true;
Style style;
if (parser.Text.Length != 0)
{
AddString(parser, parser.Text);
}
switch (parser.Control)
{
case "pard":
parser.ResetParagraphFormat();
parser.insideTable = false;
break;
case "intbl":
//System.Diagnostics.Trace.WriteLine(@"\intbl");
parser.insideTable = true;
break;
case "tab":
AddString(parser, "\t");
break;
case "line":
AddString(parser, "\r");
break;
case "emdash":
AddString(parser, "—");
break;
case "endash":
AddString(parser, "–");
break;
case "s":
parser.ListItem = false; // Disable list
style = header.FindStyle(parser, (int)parser.Number);
parser.current_paragraph_format = style.paragraph_style;
parser.current_run_format = style.run_style;
break;
case "widctlpar":
// Tell to the resterizer do not break first and last lines
break;
default:
status = RTF_DocumentParser.ParseParagraphFormat(parser);
if (status == true)
break;
status = RTF_DocumentParser.ParseRunFormat(parser, header);
////if (status == true)
//// break;
////if(parser.Status == ParserStatus.CloseBlock)
////{
//// return true;
////}
break;
}
return status;
}
internal RTF_Paragraph(RTF_Parser parser)
{
paragraph = new Paragraph();
paragraph.runs = new List();
paragraph.size = 1;
paragraph.format = parser.current_paragraph_format;
}
}
}