Skip to content

Commit

Permalink
LT-21672: Add styles to table cells
Browse files Browse the repository at this point in the history
This adds support for when a style is applied to a specific
cell or when different styles are applied to different pieces
of the text in a cell.

Note: The changes in SetRunStyle() also add support for styles
that are applied to all or a portion of the text in other
fields (notes, custom fields …).

Change-Id: Id1ca7ccfaeaad7e7ea7e781263151b1714d9d90f
  • Loading branch information
mark-sil committed Mar 27, 2024
1 parent 8095b5e commit 9dd6df0
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 16 deletions.
6 changes: 3 additions & 3 deletions Src/xWorks/ConfiguredLcmGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2807,8 +2807,8 @@ private static void GenerateRunWithPossibleLink(GeneratorSettings settings, stri
var cssStyle = CssGenerator.GenerateCssStyleFromLcmStyleSheet(style,
settings.Cache.WritingSystemFactory.GetWsFromStr(writingSystem), settings.PropertyTable);
var css = cssStyle.ToString();
if (!String.IsNullOrEmpty(css))
settings.ContentGenerator.SetRunStyle(writer, config, css);

settings.ContentGenerator.SetRunStyle(writer, config, writingSystem, css, style);
}
if (linkDestination != Guid.Empty)
{
Expand Down Expand Up @@ -3031,7 +3031,7 @@ private static void GenerateError(string text, IFragmentWriter writer, Generator
new ExCSS.Property("color") { Term = new HtmlColor(222, 0, 0) },
new ExCSS.Property("font-size") { Term = new PrimitiveTerm(UnitType.Ems, 1.5f) }
};
settings.ContentGenerator.SetRunStyle(writer, null, css.ToString());
settings.ContentGenerator.SetRunStyle(writer, null, writingSystem, css.ToString(), null);
if (text.Contains(TxtLineSplit))
{
var txtContents = text.Split(TxtLineSplit);
Expand Down
2 changes: 1 addition & 1 deletion Src/xWorks/ILcmContentGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ IFragment GenerateGroupingNode(object field, string className, ConfigurableDicti
void EndBiDiWrapper(IFragmentWriter writer);
void StartRun(IFragmentWriter writer, string writingSystem);
void EndRun(IFragmentWriter writer);
void SetRunStyle(IFragmentWriter writer, ConfigurableDictionaryNode config, string css);
void SetRunStyle(IFragmentWriter writer, ConfigurableDictionaryNode config, string writingSystem, string css, string runStyle);
void StartLink(IFragmentWriter writer, ConfigurableDictionaryNode config, Guid destination);
void StartLink(IFragmentWriter writer, ConfigurableDictionaryNode config, string externalDestination);
void EndLink(IFragmentWriter writer);
Expand Down
2 changes: 1 addition & 1 deletion Src/xWorks/LcmJsonGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ public void EndRun(IFragmentWriter writer)
m_runBuilder.Value.Clear();
}

public void SetRunStyle(IFragmentWriter writer, ConfigurableDictionaryNode config, string css)
public void SetRunStyle(IFragmentWriter writer, ConfigurableDictionaryNode config, string writingSystem, string css, string runStyle)
{
if(!string.IsNullOrEmpty(css))
((JsonFragmentWriter)writer).InsertJsonProperty("style", css);
Expand Down
42 changes: 33 additions & 9 deletions Src/xWorks/LcmWordGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -677,14 +677,27 @@ public void EndRun(IFragmentWriter writer)
// Beginning a new run is sufficient to end the old run
// and to ensure new styles/content are applied to the new run.
}
public void SetRunStyle(IFragmentWriter writer, ConfigurableDictionaryNode config, string css)
{
// TODO: Many runs don't ever call this function; this is not where we want to set the character styles.

/*if (config != null && !string.IsNullOrEmpty(config.Style))
/// <summary>
/// Set the style for a specific run.
/// This is needed to set the specific style for any field that allows the
/// default style to be overridden (Table Cell, Custom Field, Note...).
/// </summary>
public void SetRunStyle(IFragmentWriter writer, ConfigurableDictionaryNode config, string writingSystem, string _, string runStyle)
{
if (!string.IsNullOrEmpty(runStyle))
{
((WordFragmentWriter)writer).WordFragment.AddStyleLink(config.Style, ConfigurableDictionaryNode.StyleTypes.Character);
}*/
// Add the style link.
((WordFragmentWriter)writer).WordFragment.AddStyleLink(runStyle, ConfigurableDictionaryNode.StyleTypes.Character);

// Only add the style to the styleSheet if not already there.
if (!_styleSheet.ChildElements.Any(p => ((Style)p).StyleId == runStyle))
{
int ws = Cache.WritingSystemFactory.GetWsFromStr(writingSystem);
var wpStyle = WordStylesGenerator.GenerateWordStyleFromLcmStyleSheet(runStyle, ws, _propertyTable);
_styleSheet.Append(wpStyle);
}
}
}
public void StartLink(IFragmentWriter writer, ConfigurableDictionaryNode config, Guid destination)
{
Expand Down Expand Up @@ -751,9 +764,20 @@ public void StartTableRow(IFragmentWriter writer)
}
public void AddTableCell(IFragmentWriter writer, bool isHead, int colSpan, HorizontalAlign alignment, IFragment content)
{
WP.TableCell tableCell = new WP.TableCell();
tableCell.Append(new WP.Paragraph(new WP.Run(new WP.Text(content.ToString()))));
((WordFragmentWriter)writer).CurrentTableRow.Append(tableCell);
// The runs contain the text and any cell-specific styling (in the run properties).
// Note: multiple runs will exist if the cell contains multiple styles.
WP.Paragraph paragraph = new WP.Paragraph();
foreach (WP.Run run in ((DocFragment)content).DocBody.Elements<WP.Run>())
{
paragraph.Append(run.CloneNode(true));
}

if (paragraph.HasChildren)
{
WP.TableCell tableCell = new WP.TableCell();
tableCell.Append(paragraph);
((WordFragmentWriter)writer).CurrentTableRow.Append(tableCell);
}
}
public void EndTableRow(IFragmentWriter writer)
{
Expand Down
5 changes: 3 additions & 2 deletions Src/xWorks/LcmXhtmlGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -732,9 +732,10 @@ public void EndRun(IFragmentWriter writer)
((XmlFragmentWriter)writer).Writer.WriteEndElement(); // span
}

public void SetRunStyle(IFragmentWriter writer, ConfigurableDictionaryNode config, string css)
public void SetRunStyle(IFragmentWriter writer, ConfigurableDictionaryNode config, string writingSystem, string css, string runStyle)
{
((XmlFragmentWriter)writer).Writer.WriteAttributeString("style", css);
if (!String.IsNullOrEmpty(css))
((XmlFragmentWriter)writer).Writer.WriteAttributeString("style", css);
}

public void StartLink(IFragmentWriter writer, ConfigurableDictionaryNode config, Guid destination)
Expand Down

0 comments on commit 9dd6df0

Please sign in to comment.