using System; using System.Windows.Forms; using System.IO; using System.Text; using System.Text.RegularExpressions; using System.Collections; using System.Runtime.Serialization.Formatters.Binary; // read in struct using System.Xml.Xsl; using System.Xml; using System.Xml.Serialization; using System.ComponentModel; #region Structs // top of the page style list. [Serializable] public struct PageStyles { public string Name; public PageStyle [] PgStyles; } [Serializable] public struct PageStyle { public string Name; public short Index; public PSItem [] Items; } [Serializable] public struct PSItem { public float Row; public float Col; //public E_PageStructMod Justify; public string Justify; public VE_Font Style; public string Token; } //// top of the doc style list. [Serializable] public struct DocStyles { public string Name; public DocStyle [] DcStyles; } [Serializable] public struct DocStyle { //for VCSummer by jcb public float CenterLineX; public float CenterLineYTop; public float CenterLineYBottom; public bool LandscapePageList; public bool ShowSectionTitles; //end for VCSummer by jcb public string Name; public short Index; public short pagestyle; // Index into page style array public VE_Font dstyle; // 'Printer driver styles' for the entire document public float TopMargin; // First 'document text' row on printed page/ renamed to TopMargin public float FooterLen; // Number of lines required for footer public float LeftMargin; // Size of left margin public float PageLength; public float PageWidth; public short numberingsequence; // 0 - no page number // 1 - included with steps // 2 - within sections ie. document styles // 3 - within each accessory document public short IndexOtherThanFirstPage; // reference document style for remaining pages (not first), if // one exists. public bool IsStepSection; // using oldtonew, determine whether is step // section or word doc section (new to 32-bit) public bool UseCheckOffs; // This was originally in fmt. Load fmt to get public bool UseColSByLevel; // Didn't want a OldToNew Test in new proms, so set this if doc is an E2. public int oldtonew; // Bits for converting from old to new // document style public bool CancelSectTitle; // Was format flags CancelSecTitlesOnS1 & CancelSecTitlesOnS2 public bool SpecialStepsFoldout; // Was format flag SpecialStepsFoldout - but put on E2 (was in 16bit code) public bool UndSpecialStepsFoldout; // Was format flag UndSpecialStepsFoldout - but put here on E2 only. public bool ExtraLineHeader; // added for Callaway foldout Notes (needed line bewteen 'NOTE' and text) public bool AlignHLSTabWithSect; // added for FNP (was in WST) public short ContTopHLS; // Flag for including High Level step // as part of top continue message. public float CTMargin; // Margin for top message public float CBMargin; // Margin for bottom message public short CBLoc; // 0 - place continue string at end of text // 1 - between end of text & bottom of page // 2 - place at bottom of page // public VE_Font ContStyle; // Style of continue messages public short EndFlag; // Does end statement exist for this type public VE_Font EndStyle; // Style of end message at end of page public string ContTop; // Message at top of page public string ContBottom; // Message at bottom of page public string EndString; // String for end of document public string FinalMsg; // Message for the final page of th text public VE_DocStyle DocStructStyle; // Describe How / When structure is used } #endregion #region ENums [Flags] public enum E_PageStructMod : uint { PSCenter = 0, // Page style, center field PSLeft = 1, // Page style, left justify PSRight = 2, // Page style, right justify // *** PS modifiers: *** PSBottom = 4, // Page style, always use bottom half line PSTop = 8, // Page style, always use top half line PSTrue = 16, // page style, don't adjust per CPI* (not needed after 4.0) PSNotFirst = 32, // page style, don't put this token on the first page of section PSOnlyFirst = 64, // page style, only put this token on the first page of section PSRelRow = 128, // place in RelPageList PSNoHalfLine= 256, // DontDoHalflines for his paglist row item PSNotLast = 0x200, // 512 - use this token on all but the last page of this section PSRtfOnly = 0x400, // Only use this token when the driver is rtf PSRtfNot = 0x800, // Do NOT use token when driver is rtf PSGDIOnly = 0X1000, // Only use this token when the driver is GDI PSGDINot = 0x2000, // Do NOT use token when driver is GDI PSAdjBngRow = 0x4000 // If the pagelist item exceeds the row it's printed on, // then adjust the starting row for the procedure body }; // Possible settings for DocStructStyle (DSS_) // These styles describe How and When the defined Doc Style is used [Flags] public enum E_DocStructStyle:uint { UseOnAllPages = 0, // Default UseOnFirstPage = 1, // Use only on the first page UseOnAllButFirstPage = 2, // Use on all but the first page UseOnLastPage = 4, // NO LOGIC exists for this selection. Use only on the last page UseSectionFoldout = 8, // Attach section foldouts (only active if using SectionLevelFoldouts_ON DontCountFoldoutPgs = 16, // Used with the USESECTIONFOLDOUT flag. Keeps foldout pages from // being included in the section total page count. TableOfContents = 32, DontCountInTabOfCont = 64, Placekeeper = 128, Align1StLevSubWHLS = 0x00000100, // guess? DoubleBoxHLS = 0x00000200, UseAltCntrline = 0x00000400, DontNumberInTOC = 0x00000800, // Don't include page number for this section in the Table of Contents UseSpecialFigFrame = 0x00001000, // for use with stp55 and 55a in bge HLSUseLetters = 0x00002000, // docstyles with this bit set in the DocStructStyle will // default to using letters for HLSteps NoSectionInStepContinue = 0x00004000, // don't include the section number in the step continue BottomSectionContinue = 0x00008000, // print the continue message if the section continues AlwaysDotStep = 0x00010000, // put the period after step number in the continue message XBlankW1stLevSub = 0x00020000, // insert an extra blank line before a 1st level substep AffectedPages = 0x00040000, DSS_TreatAsTrueSectNum = 0x00080000, // in conjunction with tietabtolevel, takes section number // from the last space and appends a period SampleWatermark = 0x00100000, // Will force "SAMPLE" to be printed across the page // on all pages in this section DSS_PageBreakHLS = 0x00200000, // Page Breaks on all high level steps DSS_NoChkIfContTypeHigh = 0x00400000, // Will suppress the checkoff if type is HIGH and the // step is continued on the next page DSS_WidthOvrdStdHLS = 0x00800000, // Width Override for Standard HLStep in this section DSS_AddDotZeroStdHLS = 0x01000000, // Append .0 to the Standard HLStep for this section DSS_SectionCompress = 0x02000000, // Compress all the steps of this section (i.e. use 7 LPI) DSS_PrintSectOnFirst = 0x04000000, // Prints section title/number only on the first // page of an attachment section, assuming numberingsequence is not 1 DSS_UnNumLikeRoman = 0x08000000, // the substeps underneath unnumbered HLSteps will have same tabs as romans DSS_DontChangeRomanLevel = 0x10000000, // Dont alter the the substep level for roman-numeral-tabbed hlsteps DSS_SkipTwoStepLevels = 0x20000000, // Skip two step levels for this doc style DSS_SkipOneStepLevel = 0x40000000, // Skip one step level for this doc style DSS_SimpleTopSectionContinue = 0x80000000, // Use the Top continue message as the section continue */ }; public enum E_DocStyleUse:uint { UseOnAllPages=0,UseOnFirstPage=1,UseOnAllButFirstPage=2,UseOnLastPage=4 }; [Flags] public enum E_DocStyle:uint { None=0,UseSectionFoldout=8,DontCountFoldoutPgs=16,TableOfContents=32, DontCountInTabOfCont=64,Placekeeper=128,Align1StLevSubWHLS=0x00000100, DoubleBoxHLS=0x00000200,UseAltCntrline=0x00000400,DontNumberInTOC=0x00000800, UseSpecialFigFrame=0x00001000,HLSUseLetters=0x00002000,NoSectionInStepContinue=0x00004000, BottomSectionContinue=0x00008000,AlwaysDotStep=0x00010000,XBlankW1stLevSub=0x00020000, AffectedPages=0x00040000,DSS_TreatAsTrueSectNum=0x00080000,SampleWatermark=0x00100000, DSS_PageBreakHLS=0x00200000,DSS_NoChkIfContTypeHigh=0x00400000,DSS_WidthOvrdStdHLS=0x00800000, DSS_AddDotZeroStdHLS=0x01000000,DSS_SectionCompress=0x02000000,DSS_PrintSectOnFirst=0x04000000, DSS_UnNumLikeRoman=0x08000000,DSS_DontChangeRomanLevel=0x10000000, DSS_SkipTwoStepLevels=0x20000000,DSS_SkipOneStepLevel=0x40000000,DSS_SimpleTopSectionContinue=0x80000000 }; //[Flags] //public enum E_Style:uint //{ // ELITE=0,PICA=1,SANSERIF=2,EXPANDED=4,PICA12=5,COMPRESSEDHVLPT18=8,HVLPT25=9,SPECIALCHARS=10,PT14=11,SANSERIF14=12,SANSERIF17=13, // HVLPT12=14,NARRATOR=15,MEDUPUNIVERS=16,LGUPMED16=17,PROPT10=18,LG1275HP4SI=19, // HVLPT10=20,HVLPT8=21,HVLPT14=22,SANSERIF25=23,EYECHART=24,TIMES11=25,SANSCOND=26, // UNDERLINE=64,BOLD=128,LANDSCAPE=256,ITALICS=512,BOXED=1024,BOXELEMENT=0x00000800, // TBCENTERED=4096,RTCHECKOFF=8192,LTCHECKOFF=16384,BIGSCRIPT=32768,HLTEXTHL=65536, // RTCHECKOFFWITHASTERISK=131072,DB_UNDERLINE=262144,COLDOTS=524288, // MMBOLD=1048576,RIGHTJUSTIFY=2097152,SUBSCRIPT=4194304,SUPERSCRIPT=8388608, // PAGELISTITEM=16777216,PRINTONTOPOFLINE=33554432,HORZCENTER=67108864, // CIRCLESTRING2=0x08000000,ALIGNWITHUP1=0x10000000,ALIGNWSECNUM=0x20000000, // MATCHCOLUMNMODE=0x40000000,KEEPRNOSUBSTYLE=0x80000000 //}; public enum E_FontName:uint { Elite=0,Pica=1,LnPrn=2,Condense=3,SanSerif=4,Pica12=5,Proportional=6, Propt12=7,HvlPt18=8,HvlPt25=9,SpecialChars=10,Pt14=11,SanSerif14=12,SanSerif17=13, HvlPt12=14,Narrator=15,MedUpUnivers=16,LgUpMed16=17,Propt10=18,Lg1275Hp4Si=19, HvlPt10=20,HvlPt8=21,HvlPt14=22,SanSerif25=23,EyeChart=24,Times11=25,SansCond=26 }; //[Flags] //public enum E_FontStyle:uint //{ // NONE=0,UNDERLINE=64,BOLD=128,LANDSCAPE=256,ITALICS=512,BOXED=1024,BOXELEMENT=0x00000800, // TBCENTERED=4096,RTCHECKOFF=8192,LTCHECKOFF=16384,BIGSCRIPT=32768,HLTEXTHL=65536, // RTCHECKOFFWITHASTERISK=131072,DB_UNDERLINE=262144,COLDOTS=524288, // MMBOLD=1048576,RIGHTJUSTIFY=2097152,SUBSCRIPT=4194304,SUPERSCRIPT=8388608, // PAGELISTITEM=16777216,PRINTONTOPOFLINE=33554432,HORZCENTER=67108864, // CIRCLESTRING2=0x08000000,ALIGNWITHUP1=0x10000000,ALIGNWSECNUM=0x20000000, // MATCHCOLUMNMODE=0x40000000,KEEPRNOSUBSTYLE=0x80000000 //}; [Flags] public enum E_FontStyle:uint { None=0,Underline=64,Bold=128,Italics=512,BigScript=32768, DbUnderline=262144,MmBold=1048576,Subscript=4194304,Superscript=8388608 }; public enum E_Justify : uint { None=0, Center=1, Left=2, Right=3 }; public enum E_TabCheckOff : uint { None=0, Left=1, Right=2 }; [Flags] public enum E_Style:uint { None=0,Landscape=256,Boxed=1024,BoxElement=0x00000800,TbCentered=4096,RtCheckoff=8192, LtCheckOff=16384,HlTextHl=65536,RtCheckoffWithAsterisk=131072,ColDots=524288, RightJustify=2097152,PageListItem=16777216,PrintOnTopOfLine=33554432, HorzCenter=67108864,CircleString2=0x08000000,AlighWithUp1=0x10000000, AlignWSecNum=0x20000000,MatchColumnMode=0x40000000,KeepRNOSubStyle=0x80000000 }; public enum E_OldToNewSteps : uint { S0 = 1, S1 = 2, S2 = 4, E0 = 1048576, E1 = 2097152, E2 = 4194304, X0 = 33554432, X1 = 67108864, X2 = 134217728 }; #endregion #region TypeConverters [Serializable,TypeConverter(typeof(VE_DocStyleConverter))] public class VE_DocStyle { uint i; public VE_DocStyle(string s) { } public VE_DocStyle(uint i) { this.i=i; } public VE_DocStyle() { this.i=0; } public E_DocStyleUse DocStyleUse { get{return (E_DocStyleUse)(i & 0x7);} set{i = ((uint)value) | (i & 0xFFFFFFF8);} } public string DocStyle { get{return ((E_DocStyle)(i & 0xFFFFFFF8)).ToString();} set{i = ((uint)Enum.Parse(typeof (E_DocStyle),value)) | (i & 0x7);} } } internal class VE_DocStyleConverter:ExpandableObjectConverter { public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { if(sourceType == typeof(string)) { return false; } return base.CanConvertFrom(context,sourceType); } public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { return base.ConvertFrom (context, culture, value); } public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) { if(destinationType==typeof(string)) { VE_DocStyle v = (VE_DocStyle)value; return string.Format((v.DocStyle=="None"?"{0}":"{0}, {1}"),v.DocStyleUse,v.DocStyle); } return base.ConvertTo (context, culture, value, destinationType); } } [Serializable,TypeConverter(typeof(VE_FontConverter))] public class VE_Font { uint i; private bool _PartialInheritance = false; //public bool PartialInheritance //{ // get { return _PartialInheritance; } // set { _PartialInheritance = value; } //} public bool CanInherit() { return !_PartialInheritance; } public VE_Font(string s) { } public VE_Font(uint i) { this.i=i; } public VE_Font() { this.i=0; } public VE_Font(XmlNode fxml) { // The "Family", "Size", and "Style" are attributes to the "Font" node // We were trying to get this information by fxml.SelectSingleNode("Family") // but this would always return a NULL because this items are Attributes not Nodes. // thus the FontFamily, FontSize, and FontStyle was never set XmlAttributeCollection ac = fxml.Attributes; // get the attributes from the passed in Font node XmlNode tmp = ac.GetNamedItem("Family"); // get the Family attribute from the Font node if (tmp!=null)FontFamily = tmp.InnerText; tmp = ac.GetNamedItem("Size"); // get the Size attribute from the Font node if (tmp != null) FontSize = tmp.InnerText; tmp = ac.GetNamedItem("Style"); // get the Style attribute from the Font node if (tmp != null) FontStyle = tmp.InnerText; } private string _FontFamily = null; private bool _FontFamilySet = false; public string FontFamily { get { if ((!_FontFamilySet)&&(_FontFamily == null)) _FontFamily = CvtFont.CvtFont.ConvertToFamily(((E_FontName)(i & 0x3f)).ToString()); _FontFamilySet = true; return _FontFamily; } set { CheckPartial(_FontFamily,value); _FontFamily = value; } } private void CheckPartial(string member, string value) { if (member != null && value == null) _PartialInheritance = true; } private string _FontSize = null; private bool _FontSizeSet = false; public string FontSize { get { if ((!_FontSizeSet)&&(_FontSize == null)) _FontSize = CvtFont.CvtFont.ConvertToSize(((E_FontName)(i & 0x3f)).ToString()).ToString(); _FontSizeSet = true; return _FontSize; } set { CheckPartial(_FontSize, value); _FontSize = value; } //set { i = ((uint)value) | (i & 0xFFFFFFC0); } } //public E_FontName FontName //{ // get{return (E_FontName)(i & 0x3F);} // set{i = ((uint)value) | (i & 0xFFFFFFC0);} //} private string _FontStyle = null; private bool _FontStyleSet = false; public string FontStyle { get{ if ((!_FontStyleSet) && (_FontStyle == null)) _FontStyle = ((E_FontStyle)(i & 0xD482C0)).ToString(); //if ((!_FontStyleSet) && (_FontStyle == null)) _FontStyle = ((E_FontStyle)(i & 0xFFFFFFC0)).ToString(); _FontStyleSet = true; return _FontStyle; } // return (E_FontStyle)(i & 0xFFFFFFC0);} set { CheckPartial(_FontStyle, value); _FontStyle = value; } //set{i = ((uint)value) | (i & 0x3F);} } private string _CPI; private bool _CPISet = false; public string CPI { get { if (!_CPISet) { _CPI = CvtFont.CvtFont.GetCPIs(i).ToString(); } _CPISet = true; return _CPI; } set { CheckPartial(_CPI, value); _CPI = value; if (value != null) _CPISet = true; } } private string _FontCheckOff = null; private bool _FontCheckOffSet = false; public string FontCheckOff { get { // 16-bit code had check offs in font style integer flag. 32-bit is converting this to its own // xml attribute not part of the font. This code is used for the format -> xml conversion // the 32-bit code should NOT have this as part of the font. RTCHECKOFF in 16-bit code = 8192 // and LTCHECKOFF in 16-bit code = 16384 if ((!_FontCheckOffSet) && (_FontCheckOff == null)) { if ((i & 8192)>0) _FontCheckOff = E_TabCheckOff.Right.ToString(); else if ((i & 16384) > 0) _FontCheckOff = E_TabCheckOff.Left.ToString(); else _FontCheckOff = E_TabCheckOff.None.ToString(); } _FontCheckOffSet = true; return _FontCheckOff; } set { CheckPartial(_FontCheckOff, value); _FontCheckOff = value; } } private string _FontJustify = null; private bool _FontJustifySet = false; public string FontJustify { get { // 16-bit code had justify in font style integer flag. 32-bit is converting this to its own // xml attribute not part of the font. This code is used for the format -> xml conversion // the 32-bit code should NOT have this as part of the font. TBCENTERED in 16-bit code = 4096 // and RIGHTJUSTIFY in 16-bit code = 2097152. Note 16-bit did not have a left justify. if ((!_FontJustifySet) && (_FontJustify == null)) { if ((i & 4096) > 0) _FontJustify = E_Justify.Center.ToString(); else if ((i & 2097152) > 0) _FontJustify = E_Justify.Right.ToString(); else _FontJustify = E_Justify.None.ToString(); } _FontJustifySet = true; return _FontJustify; } set { CheckPartial(_FontJustify, value); _FontJustify = value; } } public bool IsBoxed { get { return ((i & (int)E_Style.Boxed) > 0); } } //CIRCLESTRING2=0x08000000 public bool HasCircleString2() { if ((i & 0x08000000)>0) return true; else return false; } public VE_Font Copy() { VE_Font c = new VE_Font(i); return c; } } internal class VE_FontConverter:ExpandableObjectConverter { public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { if(sourceType == typeof(string)) { return false; } return base.CanConvertFrom(context,sourceType); } public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { return base.ConvertFrom (context, culture, value); } public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) { if(destinationType==typeof(string)) { VE_Font v = (VE_Font)value; return string.Format((v.FontStyle == "None" ? "Family={0} Size={1}" : "{0}, {1}, {2}"), v.FontFamily, v.FontSize, v.FontStyle); } return base.ConvertTo (context, culture, value, destinationType); } } #endregion /////////////////////////// namespace fmtxml { public partial class FmtToXml { private BinaryReader brFmt; private string fmtName; private VE_Font DefBaseFont; private VE_Font DefPlantFont; private string MyPath; public FmtToXml(string nm, string path) { MyPath = path; fmtName = nm; //if (!fmtName.ToUpper().StartsWith("FNP") && fmtName.ToUpper() != "BASE") return; try { // get the default base & plant files to use when figuring out inheritance. if (GetPlantBaseDefaultFonts()) { // will have entire name, such as aep.x01 - use number to differentiate it. int indx = nm.IndexOf('.'); if (indx > 0) { LoadPageFile(nm); string tmpDocName = fmtName; tmpDocName = tmpDocName.Remove(indx + 1, 1); tmpDocName = tmpDocName.Insert(indx + 1, "y"); LoadDocFile(tmpDocName); } else { LoadPageFile(nm + ".pag"); LoadDocFile(nm + ".doc"); } } } catch (Exception ex) { MessageBox.Show("Format name = " + nm, ex.Message); } } private float RowToPoints(int i) { return (i * 12); // row_in_points = input * 72/6, row = input * 12 } private float ColToPoints(float f, uint style) { return 72 * (f / CvtFont.CvtFont.GetCPISBadPICA12(style)); } private string GetAsciiStringUntilNull(BinaryReader br) { StringBuilder inpstr = new StringBuilder(); byte input = 0; int cnt = 0; bool stillread = true; do { try { input = br.ReadByte(); if (input==0) stillread=false; inpstr.Append(Convert.ToChar(input)); } catch (System.IO.EndOfStreamException) { stillread=false; } cnt++; }while (stillread); string retstr = inpstr.ToString(); if (retstr.Substring(retstr.Length-1,1)=="\0") return retstr.Substring(0,retstr.Length-1); return retstr; } private string GetAsciiString(BinaryReader br, int len) { StringBuilder inpstr = new StringBuilder(); byte input = 0; int cnt = 0; do { try { input = br.ReadByte(); inpstr.Append(Convert.ToChar(input)); } catch (System.IO.EndOfStreamException) { input = 0; while (cnt < len) { inpstr.Append(Convert.ToChar(input)); cnt++; } } cnt++; }while (cnt < len); string retstr = inpstr.ToString(); if (retstr.Substring(retstr.Length-1,1)=="\0") return retstr.Substring(0,retstr.Length-1); return retstr; } private VE_Font LoadVE_Font() { VE_Font retval=new VE_Font(brFmt.ReadUInt32()); return retval; } private VE_DocStyle LoadVE_DocStyle() { VE_DocStyle retval=new VE_DocStyle(brFmt.ReadUInt32()); return retval; } private bool _PicaIgnoreFiveSixths; public bool PicaIgnoreFiveSixths { get { return _PicaIgnoreFiveSixths; } set { _PicaIgnoreFiveSixths = value; } } public void LoadPageFile(string fname) { string lfmtname = fmtName; int indx = fmtName.IndexOf('.'); if (indx > 0) lfmtname = fmtName.Substring(0, fmtName.Length - 4) + "_" + fmtName.Substring(fmtName.Length - 2, 2); GetFormatFlags(lfmtname); ArrayList stringoffsets = new ArrayList(); short strings = 0; PageStyles pgstyles = new PageStyles(); // read in title. string fnm = MyPath + @"\" + fname; brFmt = new BinaryReader(File.Open(fnm,System.IO.FileMode.Open,System.IO.FileAccess.ReadWrite,FileShare.ReadWrite)); pgstyles.Name = GetAsciiString(brFmt); // read in struct name/def name/page file name //for (int i=0;i<3;i++) //{ // len = brFmt.ReadInt16(); // str = GetAsciiString(brFmt,len); //} string structName = GetAsciiString(brFmt); string includeName = GetAsciiString(brFmt); string formatName = GetAsciiString(brFmt); // Get the number of page styles, and create the array for them. short numpgstyles = brFmt.ReadInt16(); // If any page styles need added for a plant, the new count will be here: short newnumpgstyles = GetPlantSpecificStyleCount(fname, numpgstyles); bool didNewPageStyle = newnumpgstyles != numpgstyles; PageStyle[] pgs = new PageStyle[newnumpgstyles]; pgstyles.PgStyles = pgs; short offptr = brFmt.ReadInt16(); short vnum = brFmt.ReadInt16(); if (vnum!=0) { strings = vnum; for(int i=0;i' with '}' pi.Token = pi.Token.Replace('<', '{'); pi.Token = pi.Token.Replace('>', '}'); pi.Token = pi.Token.Replace("REVDATE", "REV2"); cnt++; if (!isfirst) { Fpsitms = new PSItem[cnt]; psitms.CopyTo(Fpsitms, 0); Fpsitms[cnt - 1] = pi; psitms = Fpsitms; } else psitms[0] = pi; isfirst = false; } else { if (!didLineDraw) { didLineDraw = true; pi.Token = "{BOX9}"; cnt++; if (!isfirst) { Fpsitms = new PSItem[cnt]; psitms.CopyTo(Fpsitms, 0); Fpsitms[cnt - 1] = pi; psitms = Fpsitms; } else psitms[0] = pi; isfirst = false; } } brFmt.BaseStream.Position = fseek+vnum; } pg.Items = psitms; pgs[i] = pg; } if (didNewPageStyle) pgs[numpgstyles] = AddPageStyles(fname); brFmt.Close(); // Don't do the font inheritance for the pagelist // you can have multiple docsytles point/use the same pagelist, // with each docstyle having different default font information. // The DoPSFontInherit() was calucating the font inheritance based on the font // set to the overall format, but the PROMS print module checks the docstyle default font // In NSP's case, the overall format uses an Arial font, the pagelist item uses // an Arial font, but the docstyle default font is Prestige Elite Tall. // the results from DoPSFontInherit() kept only the font size and style for the pagelist item. // the print module then ended up using Prestige Elite Tall instead of Arial for that pagelist item // - jsj 02/11/13 //DoPSFontInherit(ref pgstyles); AddPlantSpecific(fname, ref pgstyles); // First serialize files based on the above - then use xsl to transform // into prefered xml. if (!Directory.Exists("fmt_xml")) Directory.CreateDirectory("fmt_xml"); if (!Directory.Exists("tmp_fmt_xml")) Directory.CreateDirectory("tmp_fmt_xml"); XmlSerializer serializer = new XmlSerializer(typeof(PageStyles)); // for subformats, make the name FMT_00 where FMT is format name & 00 is number // from original name. This will allow the data load to know it's a sub. string destfile = "tmp_fmt_xml\\" + lfmtname + "p.xml"; if (File.Exists(destfile)) File.Delete(destfile); TextWriter writer = new StreamWriter(destfile); try { serializer.Serialize(writer, pgstyles); writer.Close(); XslCompiledTransform xsl = FmtFileToXml.getTransform(Application.StartupPath + "\\TranslatePag.XSL"); string sResults = "fmt_xml\\" + lfmtname + "p.xml"; xsl.Transform(destfile, sResults); // Perform Transform if (lfmtname == "GEN") File.Copy(sResults, "fmt_xml\\BASEp.xml"); // Create BASE from GEN format } catch (Exception e) { Console.WriteLine(e.Message); writer.Close(); } } private short GetPlantSpecificStyleCount(string fname, short nmstyles) { switch (fname.ToUpper()) { case "RGESAM1.PAG": case "RGESAM1.DOC": return ++nmstyles; break; default: return nmstyles; break; } } private PageStyle AddPageStyles(string fname) { PageStyle pg = new PageStyle(); switch (fname.ToUpper()) { case "RGESAM1.PAG": /* * * * * */ pg.Index=3; pg.Name = "Cover Page"; PSItem [] psitms = new PSItem[4]; PSItem pi = new PSItem(); pi.Token = "{DRAFTPAGE}{REFERENCEPAGE}{MASTERPAGE}{SAMPLEPAGE}"; pi.Row = 12; pi.Col = -2; pi.Justify = "PSCenter"; psitms[0] = pi; PSItem pi0 = new PSItem(); pi0.Token = "{EOPNUM}"; pi0.Row = 320; pi0.Col = 262; pi0.Justify = "PSCenter"; pi0.Style = new VE_Font(); pi0.Style.FontFamily = "Arial"; pi0.Style.FontSize = "18"; pi0.Style.CPI = "9"; psitms[1] = pi0; PSItem pi1 = new PSItem(); pi1.Token = "{COVERTITLE1}"; pi1.Row=350; pi1.Col=282; pi1.Justify="PSTop"; pi1.Style = new VE_Font(); pi1.Style.FontFamily = "Arial"; pi1.Style.FontSize = "18"; pi1.Style.CPI = "9"; psitms[2] = pi1; PSItem pi2 = new PSItem(); pi2.Token = "{COVERTITLE2}"; pi2.Row=366; pi2.Col=282; pi2.Justify="PSCenter"; pi2.Style = new VE_Font(); pi2.Style.FontFamily = "Arial"; pi2.Style.FontSize = "18"; pi2.Style.CPI = "9"; psitms[3] = pi2; pg.Items = psitms; return pg; break; default: break; } return pg; } private void GetFormatFlags(string lfmtname) { string fmtFile = "tmp_fmt_xml\\" + lfmtname + "f.xml"; string fmtParent = null; if (Regex.IsMatch(lfmtname, "[^_]*_[0-9][0-9]")) fmtParent = "tmp_fmt_xml\\" + lfmtname.Substring(0, lfmtname.Length - 3) + "f.xml"; XmlDocument fmtDoc = GetXMLDoc(fmtFile); string picaIgnoreFiveSixths = GetXML(fmtDoc, "PicaIgnoreFiveSixths"); if (picaIgnoreFiveSixths != "True" && fmtParent != null) // Could not find it, look in parent { fmtDoc = GetXMLDoc(fmtParent); picaIgnoreFiveSixths = GetXML(fmtDoc, "PicaIgnoreFiveSixths"); } PicaIgnoreFiveSixths = (picaIgnoreFiveSixths == "True"); } private string GetXML(XmlDocument fDoc, string lookFor) { if (fDoc == null) return null; XmlNodeList xl = fDoc.DocumentElement.SelectNodes("//*/@" + lookFor); // Look for Attribute if (xl.Count == 0) xl = fDoc.DocumentElement.SelectNodes("//" + lookFor); // Look for Node string found = xl.Count == 1 ? xl[0].InnerText : null; if (found != null) Console.WriteLine("Found '" + lookFor + "'"); return found; } private XmlDocument GetXMLDoc(string fmtFile) { XmlDocument fDoc=null; if (File.Exists(fmtFile)) { fDoc = new XmlDocument(); fDoc.Load(fmtFile); } return fDoc; } private string RemoveInitialLineDraw(string tkn, ref int coladj) { // if first two characters are line draw and space, remove them and adjust column. if (tkn[0] == '\xB3' && tkn[1] == ' ') { coladj += 2; tkn = tkn.Substring(2, tkn.Length - 2); //trim any end line char too. tkn = tkn.Replace('\xB3',' '); tkn = tkn.TrimEnd(" ".ToCharArray()); } return tkn; } private string GetAsciiString(BinaryReader brFmt) { short len = brFmt.ReadInt16(); return GetAsciiString(brFmt, len); } public void LoadDocFile(string fname) { ArrayList stringoffsets = new ArrayList(); short strings = 0; DocStyles dcstyles = new DocStyles(); // read in title. string fnm = MyPath + @"\" + fname; // construct format file name from this path.\ string fmtFileName = fname; if (fname.Contains(".Y")) { // subformat - replace .Y with .X fmtFileName = MyPath + @"\" + fname.Replace(".Y", ".X"); } else { fmtFileName = MyPath + @"\" + fname.Substring(0, fname.IndexOf(".")) + ".FMT"; } //if (fname == "CPL.Y01") Console.WriteLine(fname); brFmt = new BinaryReader(File.Open(fnm,System.IO.FileMode.Open,System.IO.FileAccess.ReadWrite,FileShare.ReadWrite)); dcstyles.Name = GetAsciiString(brFmt); bool didNewDocStyle = false; short newnumdcstyles = 0; // read in struct name/def name/doc file name string structName = GetAsciiString(brFmt); string includeName = GetAsciiString(brFmt); string formatName = GetAsciiString(brFmt); DocStyle[] dcs = null; if (structName.ToUpper() != "DOCSTYL.STR") { Console.WriteLine("Other Structure {0}", structName); if (structName == "BKPGDOC.STR") { for(int i=0;i<4;i++) brFmt.ReadInt16(); // Skip 4 integers dcs = new DocStyle[4]; string baseName = GetAsciiString(brFmt); dcs[0].Index = 0; dcs[1].Index = 1; dcs[2].Index = 2; dcs[3].Index = 3; dcs[0].Name = baseName + "- portrait @ 6 lpi"; dcs[1].Name = baseName + "- portrait @ 4 lpi"; dcs[2].Name = baseName + "- landscape @ 6 lpi"; dcs[3].Name = baseName + "- landscape @ 4 lpi"; brFmt.ReadInt16(); dcs[0].dstyle = LoadVE_Font(); dcs[1].dstyle = dcs[0].dstyle.Copy(); dcs[2].dstyle = dcs[0].dstyle.Copy(); dcs[3].dstyle = dcs[0].dstyle.Copy(); dcs[0].TopMargin = dcs[1].TopMargin = dcs[2].TopMargin = dcs[3].TopMargin = brFmt.ReadInt16(); dcs[0].LeftMargin = dcs[1].LeftMargin = dcs[2].LeftMargin = dcs[3].LeftMargin = brFmt.ReadInt16(); dcs[0].PageLength = brFmt.ReadInt16(); dcs[1].PageLength = brFmt.ReadInt16(); dcs[2].PageLength = brFmt.ReadInt16(); dcs[3].PageLength = brFmt.ReadInt16(); } } else { // Get the number of page styles, and create the array for them. short numdcstyles = brFmt.ReadInt16(); // If any doc styles need added for a plant, the new count will be here: newnumdcstyles = GetPlantSpecificStyleCount(fname, numdcstyles); didNewDocStyle = newnumdcstyles != numdcstyles; dcs = new DocStyle[newnumdcstyles]; short offptr = brFmt.ReadInt16(); // not sure what these bytes contain? short vnum = brFmt.ReadInt16(); if (vnum != 0) { strings = vnum; for (int i = 0; i < strings; i++) { vnum = brFmt.ReadInt16(); stringoffsets.Add(vnum); } } for (short i = 0; i < numdcstyles; i++) { DocStyle dc = new DocStyle(); dc.Index = i; dc.Name = GetAsciiString(brFmt); vnum = brFmt.ReadInt16(); // not sure what this is! dc.pagestyle = brFmt.ReadInt16(); uint tmpstyle = brFmt.ReadUInt32(); dc.dstyle = new VE_Font(tmpstyle); dc.TopMargin = RowToPoints(brFmt.ReadInt16()); dc.FooterLen = RowToPoints(brFmt.ReadInt16()); dc.LeftMargin = ColToPoints(brFmt.ReadInt16(), tmpstyle); dc.PageLength = RowToPoints(brFmt.ReadInt16()); dc.PageWidth = ColToPoints(brFmt.ReadInt16(), tmpstyle); dc.numberingsequence = brFmt.ReadInt16(); dc.oldtonew = brFmt.ReadInt32(); SetupDocStyleFromFmtFlags(ref dc, fmtFileName); dc.IsStepSection = ConvertToSectType(dc.oldtonew); dc.ContTopHLS = brFmt.ReadInt16(); dc.CTMargin = brFmt.ReadInt16(); dc.CBMargin = brFmt.ReadInt16(); dc.CBLoc = brFmt.ReadInt16(); tmpstyle = brFmt.ReadUInt32(); dc.ContStyle = new VE_Font(tmpstyle); dc.CTMargin = ColToPoints(dc.CTMargin, tmpstyle); dc.CBMargin = ColToPoints(dc.CBMargin, tmpstyle); dc.EndFlag = brFmt.ReadInt16(); dc.EndStyle = LoadVE_Font(); dc.UseCheckOffs = UseCheckOffsIn(fname.Substring(0, fname.Length - 4), dc.oldtonew); dc.UseColSByLevel = dc.oldtonew == 5; // use the string offsets to read in the strings. int[] offst = new int[strings]; for (int j = 0; j < strings; j++) { offst[j] = brFmt.ReadInt32(); } dc.DocStructStyle = LoadVE_DocStyle(); if (offst[0] != 0) dc.ContTop = DoReplaceTokens(GetAsciiStringUntilNull(brFmt)); //else dc.ContTop = null; // in 16-bit a null setting would prevent the Top Continue Message from printing // we need to set this to a blank string, else it will be inherited from the BASE format(BASEall.xml) else dc.ContTop = ""; if (offst[1] != 0) dc.ContBottom = DoReplaceTokens(GetAsciiStringUntilNull(brFmt)); else dc.ContBottom = null; if (offst[2] != 0) dc.EndString = DoReplaceTokens(GetAsciiStringUntilNull(brFmt)); else dc.EndString = null; if (dc.EndString == "") { dc.EndString = null; dc.EndFlag = 0; } if (offst[3] != 0) dc.FinalMsg = DoReplaceTokens(GetAsciiStringUntilNull(brFmt)); else dc.FinalMsg = null; if (dc.ContTop == null && dc.ContBottom == null) dc.ContStyle = null; if (dc.EndString == null) dc.EndStyle = null; dcs[i] = dc; vnum = brFmt.ReadInt16(); } } if (didNewDocStyle) dcs[newnumdcstyles - 1] = AddDocStyles(fname); dcstyles.DcStyles = dcs; brFmt.Close(); // Inherit fonts. DoDSFontInherit(ref dcstyles); // Do UseOnFirstPage/UseOnAllbutFirstPage index additions. This was added for 32bit support // of the document style 'StructureStyle Where = "UseOnFirstPage" or "UseOnAllButFirstPage" DoUseOnPagesAttribute(ref dcstyles); // do Plant specific adjustments AddPlantSpecific(fname, ref dcstyles); // First serialize files based on the above - then use xsl to transform // into prefered xml. if (!Directory.Exists("fmt_xml")) Directory.CreateDirectory("fmt_xml"); if (!Directory.Exists("tmp_fmt_xml")) Directory.CreateDirectory("tmp_fmt_xml"); XmlSerializer serializer = new XmlSerializer(typeof(DocStyles)); string lfmtname = fmtName; int indx = fmtName.IndexOf('.'); // for subformats, make the name FMT_00 where FMT is format name & 00 is number // from original name. This will allow the data load to know it's a sub. if (indx > 0) lfmtname = fmtName.Substring(0, fmtName.Length - 4) + "_" + fmtName.Substring(fmtName.Length - 2, 2); string destfile = "tmp_fmt_xml\\" + lfmtname + "d.xml"; if (File.Exists(destfile)) File.Delete(destfile); TextWriter writer = new StreamWriter(destfile); try { serializer.Serialize(writer, dcstyles); writer.Close(); XslCompiledTransform xsl = FmtFileToXml.getTransform(Application.StartupPath + "\\TranslateDoc.XSL"); string sResults = "fmt_xml\\" + lfmtname + "d.xml"; xsl.Transform(destfile, sResults); // Perform Transform xsl = FmtFileToXml.getTransform(Application.StartupPath + "\\removeFmtUseCO.XSL"); //xsl.Load(Application.StartupPath + "\\removeempty.XSL"); string sFormatResults = "fmt_xml\\" + lfmtname + "f.xml"; string sResults2 = "fmt_xml\\" + lfmtname + "xf.xml"; xsl.Transform(sFormatResults, sResults2); File.Delete(sFormatResults); File.Move(sResults2, sFormatResults); if (lfmtname == "GEN") File.Copy(sResults, "fmt_xml\\BASEd.xml"); // Create BASE from GEN format } catch (Exception e) { Console.WriteLine(e.Message); writer.Close(); } } private void DoUseOnPagesAttribute(ref DocStyles docstyles) { int indxFirst = -1; int indxAllButFirst = -1; for (int i = 0; i < docstyles.DcStyles.Length; i++) { if ((docstyles.DcStyles[i].DocStructStyle.DocStyleUse & E_DocStyleUse.UseOnFirstPage) == E_DocStyleUse.UseOnFirstPage) indxFirst = docstyles.DcStyles[i].Index; if ((docstyles.DcStyles[i].DocStructStyle.DocStyleUse & E_DocStyleUse.UseOnAllButFirstPage) == E_DocStyleUse.UseOnAllButFirstPage) indxAllButFirst = docstyles.DcStyles[i].Index; } if (indxFirst != -1 && indxAllButFirst != -1) { docstyles.DcStyles[indxFirst].IndexOtherThanFirstPage = (short)indxAllButFirst; } } private DocStyle AddDocStyles(string fname) { DocStyle dc = new DocStyle(); switch (fname.ToUpper()) { case "RGESAM1.DOC": /* * */ dc.Index = 5; dc.Name = "Cover Page"; dc.numberingsequence = 0; dc.IsStepSection = false; dc.UseCheckOffs = false; dc.UseColSByLevel = false; dc.oldtonew = 544; dc.CancelSectTitle = false; dc.SpecialStepsFoldout=false; dc.UndSpecialStepsFoldout=false; dc.pagestyle = 3; dc.TopMargin = 54; dc.FooterLen = 0; dc.PageLength = 780; dc.PageWidth = 540; dc.LeftMargin = 72; dc.dstyle = new VE_Font(); dc.dstyle.FontFamily = "Courier New"; dc.dstyle.FontSize = "12"; dc.dstyle.CPI = "10"; dc.DocStructStyle = new VE_DocStyle(); dc.DocStructStyle.DocStyleUse = E_DocStyleUse.UseOnAllPages; break; default: break; } return dc; } private bool UseCheckOffsIn(string p, int p_2) { try { XmlDocument xdoc = new XmlDocument(); string path = "fmt_xml\\" + p + "f.xml"; if (!File.Exists(path)) return false; xdoc.Load("fmt_xml\\" + p + "f.xml"); XmlNode useCO = xdoc.SelectSingleNode("FormatData/ProcData/CheckOffData/@UseCheckOffsIn"); if (useCO == null) return false; int iDoc = System.Convert.ToInt32(useCO.Value); if ((p_2 & iDoc)>0) return true; } catch (Exception ex) { Console.WriteLine("here"); } return false; } private void SetupDocStyleFromFmtFlags(ref DocStyle dc, string fmtFileName) { int oldToNew = dc.oldtonew; BinaryReader brFmt = new BinaryReader(File.Open(fmtFileName, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite, FileShare.ReadWrite)); int[] tmpshort3 = new int[3]; ArrayList stringoffsets = new ArrayList(); byte tmpbyte; Int16 tmpshort; string tmpstr; try { tmpshort = brFmt.ReadInt16(); tmpstr = fmtxml.FmtFileToXml.GetStringUntilNull(brFmt); for (int i = 0; i < 3; i++) { tmpshort = brFmt.ReadInt16(); tmpstr = fmtxml.FmtFileToXml.GetStringUntilNull(brFmt); } short vnum = brFmt.ReadInt16(); // number of ints, etc. long posatints = brFmt.BaseStream.Position; long tstloc = vnum + posatints; tmpbyte = brFmt.ReadByte(); // FirstChar Int16[] xtraflag = new Int16[19]; for (int i = 0; i < 19; i++) { xtraflag[i] = brFmt.ReadInt16(); } dc.CancelSectTitle = CheckSectType(oldToNew, xtraflag); dc.SpecialStepsFoldout = GetSpecialStepsFoldout(oldToNew, xtraflag); dc.UndSpecialStepsFoldout = GetUndSpecialStepsFoldout(oldToNew, xtraflag); } catch (Exception exception) { Console.WriteLine("Didn't process docstyle"); } } private bool GetUndSpecialStepsFoldout(int oldToNew, Int16[] flg) { if (((oldToNew & (int)E_OldToNewSteps.E2) != 0) && ((flg[10] & fmtxml.FmtFileToXml.UNDSPECIALSTEPSFOLDOUT) > 0)) return true; return false; } private bool GetSpecialStepsFoldout(int oldToNew, Int16[] flg) { if (((oldToNew & (int)E_OldToNewSteps.E2) != 0) && ((flg[7] & fmtxml.FmtFileToXml.SPECIALSTEPSFOLDOUT) > 0)) return true; return false; } private bool CheckSectType(int oldToNew, Int16[] flg) { if (((oldToNew & (int)E_OldToNewSteps.S2) != 0) && ((flg[6] & fmtxml.FmtFileToXml.CANCELSECTITLESONS2) > 0)) return true; if (((oldToNew & (int)E_OldToNewSteps.S1) != 0) && ((flg[7] & fmtxml.FmtFileToXml.CANCELSECTITLESONS1) > 0)) return true; if (((oldToNew & (int)E_OldToNewSteps.E0) != 0) && ((flg[11] & fmtxml.FmtFileToXml.CANCELSECTITLESONE0) > 0)) return true; if (((oldToNew & (int)E_OldToNewSteps.E2) != 0) && ((flg[11] & fmtxml.FmtFileToXml.CANCELSECTITLESONE2) > 0)) return true; return false; } private bool ConvertToSectType(int p) { if (((p & (int)E_OldToNewSteps.S0) != 0) || ((p & (int)E_OldToNewSteps.S1) != 0) || ((p & (int)E_OldToNewSteps.S2) != 0) || ((p & (int)E_OldToNewSteps.E0) != 0) || ((p & (int)E_OldToNewSteps.E1) != 0) || ((p & (int)E_OldToNewSteps.E2) != 0) || ((p & (int)E_OldToNewSteps.X0) != 0) || ((p & (int)E_OldToNewSteps.X1) != 0) || ((p & (int)E_OldToNewSteps.X2) != 0)) return true; return false; } private string DoReplaceTokens(string p) { if (p == null || p == "") return p; string wkstr = p; // use regular expressions to do the following... // first see if entire string is line draw type chars, if so, just don't include it. if (AllDrawChars(wkstr)) return null; try { // replace newline with {par} wkstr = wkstr.Replace("\n", "{par}"); // special change bar token (various cpl formats) wkstr = wkstr.Replace("\x08\x08\x08\x08\x08\x05", "{CHG_BAR with Backspace Token}"); // special change bar token (various gpc formats) wkstr = wkstr.Replace("\x05", "{CHG_BAR Token}"); // backspage - just flag for positioning if needed. wkstr = wkstr.Replace("\x08", "{Backspace}"); //sub on/off wkstr = wkstr.Replace("\x19\x19", "\x19"); // replace double sub on with single wkstr = wkstr.Replace("~~", "\x19"); wkstr = Regex.Replace(wkstr, @"\x19([^\x19\x18 ]*?)(?:[\x19\x18]|(?= )|\Z)(.*?)", @"\dn2$1\up0$2"); //super on/off wkstr = Regex.Replace(wkstr, @"\x18([^\x19\x18 ]*?)(?:[\x19\x18]|(?= )|\Z)(.*?)", @"\up2$1\up0$2"); //bold on/off wkstr = Regex.Replace(wkstr, @"\x01([^\x01 ]*?)(?:[\x01]|(?= )|\Z)(.*?)", @"\b$1\b0$2"); wkstr = Regex.Replace(wkstr, @"\x13([^\x13\xd6 ]*?)(?:[\x13\xd6]|(?= )|\Z)(.*?)", @"\b$1\b0$2"); //underline on/off //wkstr = Regex.Replace(wkstr, @"\x16([^\x16 ]*?)(?:[\x16]|(?= )|\Z)(.*?)", @"\ul$1\ul0$2"); wkstr = Regex.Replace(wkstr, @"\x16([^\x16 ]*?)(?:[\x16]|(?= )|\Z)(.*?)", @"\ul $1\ulnone $2"); //narrator //wkstr = Regex.Replace(wkstr, @"\x86([^\x86 ]*?)(?:[\x86]|(?= )|\Z)(.*?)", @"\f{Narrator}$1\f0$2"); wkstr = Regex.Replace(wkstr, @"\x86([^\x86 ]*?)(?:[\x86]|(?= )|\Z)(.*?)", @"$1$2"); // remove hanging indent, vertical tab wkstr = Regex.Replace(wkstr, @"\x02", @"\NonSupported Hanging Indent (Hex x02)"); //wkstr = Regex.Replace(wkstr, @"\x0B", @"\NonSupported Vertical Tab (Hex x0b"); wkstr = Regex.Replace(wkstr, @"\x0B", @""); // remove some unknown chars for ano & fpl - these plants are not supported // as of conversion date. wkstr = Regex.Replace(wkstr, @"\x95", @"\NonSupported Unknown (Hex x95)"); //ano2vlv wkstr = Regex.Replace(wkstr, @"\x1bf1", @"\NonSupported Unknown (hex 1b f1)"); //fpl wkstr = Regex.Replace(wkstr, @"\x1bf0", @"\NonSupported Unknown (hex 1b f0)"); //fpl wkstr = Regex.Replace(wkstr, @"\x1bM1", @"\NonSupported Unknown (hex 1b M1)"); //fpl wkstr = Regex.Replace(wkstr, @"\x1bM0", @"\NonSupported Unknown (hex 1b M0)"); //fpl // ATA page?? wkstr = Regex.Replace(wkstr, @"\x1b", @"{NonSupported Hex 1b}"); // replace the \xff33 13 with {Section Number} wkstr = Regex.Replace(wkstr, @"\xFF33 13", @"{Section Number}"); // replace \xff with \xA0, i.e. hardspace wkstr = Regex.Replace(wkstr, @"\xFF", @"\xA0"); // replace x10 & x11 in various ano tabs - not this needs fixed if ANO comes // back into the program wkstr = wkstr.Replace("\x10", ""); wkstr = wkstr.Replace("\x11", ""); // replace x15 with {RO} for now. wkstr = wkstr.Replace("\x15", "{RO}"); } catch (Exception ex) { Console.WriteLine("error replacing token (regex) = {0}", ex.Message); } return wkstr; } private bool AllDrawChars(string wkstr) { foreach (char c in wkstr) { if (c < '\xB3' || c > '\xDF') return false; } return true; } private bool CompareFonts(VE_Font parFont, ref VE_Font subFont) { bool rtval = false; if (parFont != null && subFont != null) { if (parFont.FontFamily == subFont.FontFamily) { subFont.FontFamily = null; rtval = true; } if (rtval && parFont.FontSize == subFont.FontSize) { subFont.FontSize = null; } if (rtval && parFont.FontStyle == subFont.FontStyle) { subFont.FontStyle = null; } if (rtval && parFont.CPI == subFont.CPI) { subFont.CPI = null; } } return rtval; } //private void DoPSFontInherit(ref PageStyles pagstyles) //{ // for (int i=0; i 0) // we are working with a sub-format { parentOfSub = fmtName.Substring(0, fmtName.Length - 4); // name of sub format's parent lfmtName = fmtName.Substring(0, fmtName.Length - 4) + "_" + fmtName.Substring(fmtName.Length - 2, 2); getFontFromBase = false; // get the font from sub-format parent format } string parentName = "fmt_xml\\" + parentOfSub + "f.xml"; // if we have a valid parent format then use it to find the default font if (!getFontFromBase && File.Exists(parentName)) { xdoc.Load(parentName); xfont = xdoc.SelectSingleNode("FormatData/Font"); if (xfont != null) DefBaseFont = new VE_Font(xfont); else getFontFromBase = true; // font not found, use the font from base.xml } if (getFontFromBase) { xdoc.Load("fmt_xml\\basef.xml"); xfont = xdoc.SelectSingleNode("FormatData/Font"); DefBaseFont = new VE_Font(xfont); } // Get the font from the current plant format (or sub-format) string fName = "fmt_xml\\" + lfmtName + "f.xml"; if (!File.Exists(fName)) return false; xdoc.Load(fName); xfont = xdoc.SelectSingleNode("FormatData/Font"); if (xfont != null) DefPlantFont = new VE_Font(xfont); } catch (Exception ex) { Console.WriteLine(ex.Message); return false; } return true; } } }