Logic to create the Continuous Action Summary
Added a default windows font path (hard coded) when one cannot be derived.
This commit is contained in:
parent
8ad203006d
commit
6dd816dba8
334
PROMS/Volian.Print.Library/ContActionSum.cs
Normal file
334
PROMS/Volian.Print.Library/ContActionSum.cs
Normal file
@ -0,0 +1,334 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.Drawing;
|
||||||
|
using LBWordLibrary;
|
||||||
|
using VEPROMS.CSLA.Library;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
|
namespace Volian.Print.Library
|
||||||
|
{
|
||||||
|
public class ContinuousActionSummary : IDisposable
|
||||||
|
{
|
||||||
|
private LBApplicationClass _WordApp;
|
||||||
|
private LBDocumentClass _WordDoc;
|
||||||
|
private LBSelection _WordSel;
|
||||||
|
private LBTable _WordTbl;
|
||||||
|
private const string TheQuickBrownFox = "The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.";
|
||||||
|
private VE_Font _pkFont;
|
||||||
|
public ContinuousActionSummary()
|
||||||
|
{
|
||||||
|
_WordApp = new LBApplicationClass();
|
||||||
|
_WordDoc = _WordApp.Documents.Add();
|
||||||
|
_WordSel = _WordApp.Selection;
|
||||||
|
_pkFont = new VE_Font("Arial", 11, E_Style.None, 12); // copied from Calvert Placekeepers.
|
||||||
|
}
|
||||||
|
public void Visible()
|
||||||
|
{
|
||||||
|
_WordApp.Visible = true;
|
||||||
|
_WordApp.Activate();
|
||||||
|
}
|
||||||
|
private ItemInfo GetHLSii(ItemInfo ii)
|
||||||
|
{
|
||||||
|
while (!ii.IsHigh) ii = ii.MyParent;
|
||||||
|
return ii;
|
||||||
|
}
|
||||||
|
public ContinuousActionSummary(pkParagraphs myContActSteps, VE_Font pkFont)
|
||||||
|
{
|
||||||
|
ItemInfo prevHLSii = null;
|
||||||
|
string txtPageNum = ""; // this gets asigned the page number continuous action step text.
|
||||||
|
string txtDone = ""; // nothing is printed in the Done column
|
||||||
|
_WordApp = new LBApplicationClass();
|
||||||
|
_WordDoc = _WordApp.Documents.Add();
|
||||||
|
_WordSel = _WordApp.Selection;
|
||||||
|
//_WordApp.Visible = true;
|
||||||
|
_pkFont = pkFont;
|
||||||
|
AddTable();
|
||||||
|
AddHeader();
|
||||||
|
foreach (pkParagraph myContAct in myContActSteps)
|
||||||
|
{
|
||||||
|
if (myContAct.MyChildren.Count > 0)
|
||||||
|
if (myContAct.MyParagraph.MyItemInfo.ActiveFormat.PlantFormat.FormatData.SectData.AccSectionData.ContinuousActionSummaryData.IncludeSectionNumAndTitle) // only print the section title if it has Continuous Action Steps
|
||||||
|
AddSectionHeader(myContAct.MyParagraph.MyItemInfo.DisplayNumber, myContAct.MyParagraph.MyItemInfo.FormattedDisplayText);
|
||||||
|
foreach (pkParagraph pgh in myContAct.MyChildren) // within each section...
|
||||||
|
{
|
||||||
|
ItemInfo hlsii = GetHLSii(pgh.MyParagraph.MyItemInfo);
|
||||||
|
if (prevHLSii != hlsii)
|
||||||
|
{
|
||||||
|
if (_DoingSubsteps)
|
||||||
|
FinishSubstep(txtDone, txtPageNum);
|
||||||
|
// start Continuous Action text table cell
|
||||||
|
StartSubStep();
|
||||||
|
txtPageNum = "";
|
||||||
|
prevHLSii = hlsii;
|
||||||
|
}
|
||||||
|
foreach (pkParagraph pghC in pgh.MyCautionsAndNotes) // this is a high level step with cautions and/or notes
|
||||||
|
{
|
||||||
|
StepConfig sc = pghC.MyParagraph.MyItemInfo.MyConfig as StepConfig;
|
||||||
|
string doneStr = "";
|
||||||
|
string NoteCautionTab = pghC.MyParagraph.MyItemInfo.MyTab.CleanText.Trim();
|
||||||
|
NoteCautionTab += " ";
|
||||||
|
if (txtPageNum == "") txtPageNum = (pghC.MyParagraph.MyItemInfo.PageNumber + 1).ToString();
|
||||||
|
AddContinuousAction(NoteCautionTab, GetContActStepText(pghC.MyParagraph.MyItemInfo), doneStr, txtPageNum, 0, 0);
|
||||||
|
}
|
||||||
|
string stpTab = pgh.MyParagraph.MyItemInfo.MyTab.CleanText.Trim() + " "; // this is either the High Level step tab or the sub-step tab
|
||||||
|
float preTabLen = 0;
|
||||||
|
if (pgh.MyParagraph.MyItemInfo.IsNote || pgh.MyParagraph.MyItemInfo.IsCaution) // only the caution and/or note is on the CAS - high level step not selected
|
||||||
|
{
|
||||||
|
stpTab = string.Format("{0} ", hlsii.MyTab.Text.Trim()) + " " + stpTab;
|
||||||
|
}
|
||||||
|
else if (!pgh.MyParagraph.MyItemInfo.IsHigh) // if the high level step was not included, adjust the tab for a sub-step/RNO
|
||||||
|
{
|
||||||
|
string tabPre = (_FirstLine) ? hlsii.MyTab.Text.Trim() + " " : "";
|
||||||
|
if (!_FirstLine)
|
||||||
|
preTabLen = GetTextWidth(hlsii.MyTab.Text.Trim() + " ") / 72f;
|
||||||
|
if (pgh.MyParagraph.MyItemInfo.IsRNOPart)
|
||||||
|
{
|
||||||
|
stpTab = stpTab.TrimEnd() + "[R] ";
|
||||||
|
}
|
||||||
|
stpTab = tabPre + stpTab;
|
||||||
|
}
|
||||||
|
if (txtPageNum == "") txtPageNum = (pgh.MyParagraph.MyItemInfo.PageNumber + 1).ToString();
|
||||||
|
AddContinuousAction(stpTab, GetContActStepText(pgh.MyParagraph.MyItemInfo), "", txtPageNum, 0, preTabLen);
|
||||||
|
if (pgh.MyChildren.Count > 0) // process the sub-steps under this parent
|
||||||
|
{
|
||||||
|
AddChildren(pgh, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_DoingSubsteps)
|
||||||
|
FinishSubstep(txtDone, txtPageNum);
|
||||||
|
}
|
||||||
|
RepeatHeader();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AddChildren(pkParagraph pgh, int level)
|
||||||
|
{
|
||||||
|
if (pgh.MyChildren.Count > 0)
|
||||||
|
level++;
|
||||||
|
foreach (pkParagraph cpgh in pgh.MyChildren)
|
||||||
|
{
|
||||||
|
if (cpgh.MyCautionsAndNotes.Count > 0)
|
||||||
|
AddNotesOrCautions(cpgh,level);
|
||||||
|
string stpTab = cpgh.MyParagraph.MyItemInfo.MyTab.CleanText.Trim() + " ";
|
||||||
|
if (cpgh.MyParagraph.MyItemInfo.IsNote || cpgh.MyParagraph.MyItemInfo.IsCaution)
|
||||||
|
{
|
||||||
|
stpTab = string.Format("{0} ", cpgh.MyParagraph.MyParent.MyTab.Text.Trim()) + " " + stpTab;
|
||||||
|
}
|
||||||
|
AddContinuousAction(stpTab, GetContActStepText(cpgh.MyParagraph.MyItemInfo), "", (cpgh.MyParagraph.MyItemInfo.PageNumber + 1).ToString(),level,0);
|
||||||
|
AddChildren(cpgh, level);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private string GetContActStepText(ItemInfo myItemInfo)
|
||||||
|
{
|
||||||
|
//string conActSumText = "";
|
||||||
|
//StepConfig sc = myItemInfo.MyConfig as StepConfig;
|
||||||
|
//if (sc != null && sc.Step_AlternateContActSumText != null)
|
||||||
|
// conActSumText = sc.Step_AlternateContActSumText;
|
||||||
|
//if (conActSumText == "")
|
||||||
|
// conActSumText = myItemInfo.FormattedDisplayText;
|
||||||
|
//return conActSumText;
|
||||||
|
return myItemInfo.FormattedDisplayText;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AddNotesOrCautions(pkParagraph pgh, int level)
|
||||||
|
{
|
||||||
|
foreach (pkParagraph cpgh in pgh.MyCautionsAndNotes)
|
||||||
|
{
|
||||||
|
string doneStr = "";
|
||||||
|
string NoteCautionTab = string.Format("{0} NOTE: ", cpgh.MyParagraph.MyParent.MyTab.Text);
|
||||||
|
if (cpgh.MyParagraph.MyItemInfo.IsCaution) NoteCautionTab = string.Format("{0} CAUTION: ", cpgh.MyParagraph.MyParent.MyTab.Text);
|
||||||
|
AddContinuousAction(NoteCautionTab, GetContActStepText(cpgh.MyParagraph.MyItemInfo), doneStr, (cpgh.MyParagraph.MyItemInfo.PageNumber + 1).ToString(),level,0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void RepeatHeader()
|
||||||
|
{
|
||||||
|
_WordTbl.Rows.First.Select();
|
||||||
|
_WordSel.Rows.HeadingFormat = -1;
|
||||||
|
}
|
||||||
|
private bool _FirstSection = true;
|
||||||
|
private void AddTable()
|
||||||
|
{
|
||||||
|
_FirstSection = true;
|
||||||
|
_WordTbl = _WordDoc.Tables.Add(_WordSel.Range, 1, 4, 1, 0);
|
||||||
|
_WordTbl.TopPadding = 6F;
|
||||||
|
_WordTbl.BottomPadding = 6F;
|
||||||
|
LBColumn col = _WordTbl.Columns.First;
|
||||||
|
col.SetWidth(72 * .71F, LBWdRulerStyle.wdAdjustNone);
|
||||||
|
col = col.Next;
|
||||||
|
col.SetWidth(72 * 4.7F, LBWdRulerStyle.wdAdjustNone);
|
||||||
|
col = col.Next;
|
||||||
|
col.SetWidth(72 * .56F, LBWdRulerStyle.wdAdjustNone);
|
||||||
|
col = col.Next;
|
||||||
|
col.SetWidth(72 * .56F, LBWdRulerStyle.wdAdjustNone);
|
||||||
|
_WordTbl.Rows.AllowBreakAcrossPages = 0;
|
||||||
|
}
|
||||||
|
private void AddHeader()
|
||||||
|
{
|
||||||
|
WriteCell("START", true, true);
|
||||||
|
WriteCell("STEP CONTINUOUS ACTION", true, true);
|
||||||
|
WriteCell("DONE", true, true);
|
||||||
|
WriteCell("PAGE", true, false);
|
||||||
|
}
|
||||||
|
private void AddSectionHeader(string number, string title)
|
||||||
|
{
|
||||||
|
if (!_FirstSection)
|
||||||
|
{
|
||||||
|
Advance(5);
|
||||||
|
_WordSel.MoveLeft(LBWdUnits.wdCell, 1, false);
|
||||||
|
_WordSel.SelectRow();
|
||||||
|
_WordSel.Cells.Merge();
|
||||||
|
}
|
||||||
|
_FirstSection = false;
|
||||||
|
Advance(2);
|
||||||
|
SetIndent(0, 0);
|
||||||
|
WriteCell("SECTION " + number, true, false);
|
||||||
|
WriteCell(" " + title, false, true);
|
||||||
|
Advance();
|
||||||
|
}
|
||||||
|
private float GetTextWidth(string txt)
|
||||||
|
{
|
||||||
|
System.Drawing.Font font = new System.Drawing.Font(_pkFont.Family, (float)_pkFont.Size);
|
||||||
|
iTextSharp.text.Font iFont = Volian.Svg.Library.VolianPdf.GetFont(font);
|
||||||
|
float w = 0;
|
||||||
|
foreach (char c in txt)
|
||||||
|
{
|
||||||
|
w += iFont.BaseFont.GetWidthPointKerned(c.ToString(), (float)_pkFont.Size);
|
||||||
|
}
|
||||||
|
// indented text didn't always line up doing it this way
|
||||||
|
//float w = iFont.BaseFont.GetWidthPointKerned(txt, (float)_pkFont.Size);
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
private bool _FirstLine = false;
|
||||||
|
private bool _DoingSubsteps = false;
|
||||||
|
private void StartSubStep()
|
||||||
|
{
|
||||||
|
_FirstLine = true;
|
||||||
|
_DoingSubsteps = true;
|
||||||
|
Advance(2);
|
||||||
|
//SetIndent(.64F, -.31F);
|
||||||
|
}
|
||||||
|
private void FinishSubstep(string done, string page)
|
||||||
|
{
|
||||||
|
_DoingSubsteps = false;
|
||||||
|
Advance();
|
||||||
|
SetAlignment(LBWdParagraphAlignment.wdAlignParagraphCenter, LBWdCellVerticalAlignment.wdCellAlignVerticalBottom);
|
||||||
|
WriteCell(done, false, true);
|
||||||
|
SetAlignment(LBWdParagraphAlignment.wdAlignParagraphCenter, LBWdCellVerticalAlignment.wdCellAlignVerticalTop);
|
||||||
|
WriteCell(page, false, false);
|
||||||
|
}
|
||||||
|
float prevTabIndent = 0;
|
||||||
|
private void AddContinuousAction(string number, string text, string done, string page, int level, float preTabLen)
|
||||||
|
{
|
||||||
|
string celltxt = number;
|
||||||
|
if (!_DoingSubsteps)
|
||||||
|
Advance(2);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!_FirstLine)
|
||||||
|
{
|
||||||
|
_WordSel.TypeParagraph();
|
||||||
|
celltxt = "\n" + celltxt; // not the first piece of text in the table cell, add a new line
|
||||||
|
}
|
||||||
|
}
|
||||||
|
float tabIndent = GetTextWidth(number) / 72f;
|
||||||
|
if (!_DoingSubsteps || _FirstLine || level == 0)
|
||||||
|
prevTabIndent = preTabLen;
|
||||||
|
if (text.Contains("\x05")) // hanging indent character
|
||||||
|
{
|
||||||
|
string[] parts = text.Split("\x05".ToCharArray());
|
||||||
|
float ind = tabIndent + (GetTextWidth(parts[0]) / 72f);
|
||||||
|
SetIndent(ind, -ind);
|
||||||
|
celltxt += (parts[0] + parts[1]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetIndent(prevTabIndent + tabIndent, -tabIndent);
|
||||||
|
celltxt += text;
|
||||||
|
}
|
||||||
|
if (level == 0)
|
||||||
|
prevTabIndent = tabIndent;
|
||||||
|
WriteCell(celltxt, false, !_DoingSubsteps);
|
||||||
|
if (!_DoingSubsteps)
|
||||||
|
{
|
||||||
|
SetAlignment(LBWdParagraphAlignment.wdAlignParagraphCenter, LBWdCellVerticalAlignment.wdCellAlignVerticalBottom);
|
||||||
|
WriteCell(done, false, true);
|
||||||
|
SetAlignment(LBWdParagraphAlignment.wdAlignParagraphCenter, LBWdCellVerticalAlignment.wdCellAlignVerticalTop);
|
||||||
|
WriteCell(page, false, false);
|
||||||
|
}
|
||||||
|
_FirstLine = false;
|
||||||
|
}
|
||||||
|
static Regex rgx = new Regex(@"\\(b|ul|up[1-9]|dn0|up0|dn[1-9]|b0|ulnone)( |$|(?=\\))");
|
||||||
|
private void WriteRTF(string text)
|
||||||
|
{
|
||||||
|
Match m = rgx.Match(text);
|
||||||
|
while (m.Success)
|
||||||
|
{
|
||||||
|
if (m.Index > 0)
|
||||||
|
_WordSel.TypeText(text.Substring(0,m.Index));
|
||||||
|
switch (m.Groups[1].Value)
|
||||||
|
{
|
||||||
|
case "b": // bold on
|
||||||
|
_WordSel.Font.Bold = 1;
|
||||||
|
break;
|
||||||
|
case "b0": // bold off
|
||||||
|
_WordSel.Font.Bold = 0;
|
||||||
|
break;
|
||||||
|
case "ul": // underline on
|
||||||
|
_WordSel.Font.Underline = LBWdUnderline.wdUnderlineSingle;
|
||||||
|
break;
|
||||||
|
case "ulnone": // underline off
|
||||||
|
_WordSel.Font.Underline = LBWdUnderline.wdUnderlineNone;
|
||||||
|
break;
|
||||||
|
case "dn0": // superscript off
|
||||||
|
_WordSel.Font.Superscript = 0;
|
||||||
|
break;
|
||||||
|
case "up0": // subscript off
|
||||||
|
_WordSel.Font.Subscript = 0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (m.Groups[1].Value.StartsWith("dn"))// subscript on
|
||||||
|
_WordSel.Font.Subscript = 1;
|
||||||
|
else // superscript on
|
||||||
|
_WordSel.Font.Superscript = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
text = text.Substring(m.Index+m.Length);
|
||||||
|
m = rgx.Match(text);
|
||||||
|
}
|
||||||
|
_WordSel.TypeText(text);
|
||||||
|
}
|
||||||
|
private void WriteCell(string text, bool bold, bool advance)
|
||||||
|
{
|
||||||
|
_WordSel.Font.Name = _pkFont.Family;//"Arial";
|
||||||
|
_WordSel.Font.Bold = bold ? 1 : 0;
|
||||||
|
WriteRTF(text);
|
||||||
|
if (advance) Advance();
|
||||||
|
}
|
||||||
|
private void SetIndent(float left, float first)
|
||||||
|
{
|
||||||
|
_WordSel.ParagraphFormat.LeftIndent = left * 72;
|
||||||
|
_WordSel.ParagraphFormat.FirstLineIndent = first * 72;
|
||||||
|
}
|
||||||
|
private void SetAlignment(LBWdParagraphAlignment hAlign, LBWdCellVerticalAlignment vAlign)
|
||||||
|
{
|
||||||
|
_WordSel.ParagraphFormat.Alignment = hAlign;
|
||||||
|
_WordSel.Cells.VerticalAlignment = vAlign;
|
||||||
|
}
|
||||||
|
private void Advance(int count)
|
||||||
|
{
|
||||||
|
_WordSel.MoveRight(LBWdUnits.wdCell, count, false);
|
||||||
|
}
|
||||||
|
private void Advance()
|
||||||
|
{
|
||||||
|
Advance(1);
|
||||||
|
}
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
_WordApp.Quit(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -44,7 +44,10 @@ namespace Volian.Svg.Library
|
|||||||
if (_FontDir == null)
|
if (_FontDir == null)
|
||||||
{
|
{
|
||||||
RegistryKey regKey = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders");
|
RegistryKey regKey = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders");
|
||||||
_FontDir = regKey.GetValue("Fonts").ToString();
|
if (regKey != null)
|
||||||
|
_FontDir = regKey.GetValue("Fonts").ToString();
|
||||||
|
if (_FontDir == null) // Not allowed or cannot find the fonts folder value in the registry.
|
||||||
|
_FontDir = @"C:\Windows\Fonts"; // default to C:\Windows\Fonts
|
||||||
}
|
}
|
||||||
return _FontDir;
|
return _FontDir;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user