// ======================================================================== // Copyright 2006 - Volian Enterprises, Inc. All rights reserved. // Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE // ------------------------------------------------------------------------ // $Workfile: $ $Revision: $ // $Author: $ $Date: $ // // $History: $ // ======================================================================== using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Data.OleDb; using System.Collections.Specialized; using System.Collections.Generic; using System.Xml; using System.Xml.XPath; using System.IO; using System.Text; using VEPROMS.CSLA.Library; namespace DataLoader { public partial class Loader { const int E2 = 4194304; private Dictionary dicOldToNew; private Item AddSection(Item procitem, string Number, string Title, string SecType, DateTime Dts, string Userid, ConfigInfo ci, string stpseq, string fmt, int libdocid, string pth, Item FromItem, FormatInfo activeFormat) { string missingFileName = ""; bool missingDocFile = false; //Console.WriteLine("before UpdateLabels"); frmMain.UpdateLabels(0, 1, 0); //Console.WriteLine("after UpdateLabels"); try { //Console.WriteLine("before activeFormat"); FormatInfo format = activeFormat; //Console.WriteLine("after activeFormat"); // Tie the section to format used, this will add the format xml if it doesn't exist in // the database yet. Note that if there is no format at this level then none should // be set so that the inheritance works correctly. if (fmt != null && fmt != "") format = GetFormat(fmt); // Find the docstyle based on the section type (step[1]) & the 'type' from the dbf // record sectype[0]) string dstyleindx = ((stpseq == null || stpseq == "") ? " " : stpseq.Substring(1, 1)) + ((SecType==null||SecType == "") ? " " : SecType.Substring(0, 1)); int tmpE2 = LookupOldToNew(dstyleindx); //int docstyleindx = GetDocStyleIndx(dstyleindx, format, procitem, docver,Number,Title); int docstyleindx = GetDocStyleIndx(dstyleindx, format, procitem, Number, Title); DocStyle myDocStyle = format.PlantFormat.DocStyles.DocStyleList[docstyleindx]; // Originally there was no determination as to whether to set landscape mode. Code was added on // 6/11/13 to compare the PageWidth & PageLength. This code was incorrectly setting some of the // word documents to landscape (FNP cover pages). Adding in the topmargin fixed this. bool isLandscape = myDocStyle.Layout.PageWidth > (myDocStyle.Layout.TopMargin + myDocStyle.Layout.PageLength); // Adjust the section number. The 16bit vfw code was sometimes printing section numbers // differently than what was stored as data. For example VEWCNOFN: OFN MA-001, the section // number was '1.' and 16bit printed it as '1.0'. The flag that caused this was (surprisingly), // !LineAboveUnderSection, search for LineAboveUnderSection in PROMSNT\exe\print\prntStep.c // to find the beginning point of tracing this 16bit logic, the call to PlaceSectionTitle. // The change in section number is: // 1 -> 1. B -> B. // 1. -> 1.0 B. -> B.0 // 1.0 stays same B.0 stays the same // It was decided to make the string change in the dataloader rather than have this 'strange' // code/support in the print program for the 32bit veproms. (8/30/11). This seems to work // for Wcnemg, WcnOFn, HLP, FPL. As other plants are migrated, this may need changed. /* The 16bit code if statement is (see below for what parts of this if statement where supported * for data migration so far (as of 8/31/11). Note that 'Smartsubsection' only had values of * 0 in fmtfiles. * if (!CancelCurSecTitle() && !(SpecialStepsFoldout && (CurDoc->oldtonew == E2)) && !(SmartSubSection && (CurDoc->oldtonew & SmartSubSection) && Section[CurrentSectIndex].Level == 0) && Section[CurrentSectIndex].Sequence[9] != 'N') { */ FormatData fmtData = format.PlantFormat.FormatData; // don't want to add the '0' after . for section numbers for Catawba or McGuire bool isCatawbaOrMcGuire = false; if (fmtData.Name.ToUpper().Contains("CAT") || fmtData.Name.ToUpper().Contains("MCG")) isCatawbaOrMcGuire = true; if (!isCatawbaOrMcGuire && fmtData.SectData.StepSectionData.StepSectionLayoutData.ShowSectionTitles && !format.PlantFormat.DocStyles.DocStyleList[docstyleindx].CancelSectTitle && !(format.PlantFormat.DocStyles.DocStyleList[docstyleindx].SpecialStepsFoldout && tmpE2 == E2)) { if (!fmtData.SectData.StepSectionData.StepSectionLayoutData.LineAboveUnderSection && (Number != null && Number != "") && (stpseq != null && stpseq.Substring(1, 1) == "0" && stpseq.Substring(5, 1) != " ")) { if (Number.EndsWith(".")) Number = Number + "0"; else if (Number.Length>1 && Number[Number.Length-2] != '.') Number = Number + "."; } } // tack on the column mode - add to config xml for node. if (stpseq != null && stpseq.Substring(1, 1) == "0" && stpseq.Substring(5, 1) != " ") { if (ci == null) ci = new ConfigInfo(null); char cmchar = stpseq.Substring(5, 1)[0]; if (cmchar > '2' || cmchar < '1') ci.AddItem("Section", "ColumnMode", "1"); else ci.AddItem("Section", "ColumnMode", stpseq.Substring(5, 1)); } // find rtf file (or use the library document temp file) & read it into the field // acccontent int Documentid=0; bool needEntry = false; if ((format.PlantFormat.DocStyles.DocStyleList[docstyleindx].StructureStyle.Style & E_DocStructStyle.TableOfContents) == E_DocStructStyle.TableOfContents && (format.PlantFormat.FormatData.PurchaseOptions & E_PurchaseOptions.AutoTableOfContents) == E_PurchaseOptions.AutoTableOfContents) needEntry = false; else if (libdocid != 0 || stpseq.Substring(1, 1) != "0") { needEntry = true; string fname = null; if (libdocid != 0) { Documentid = libdocid; if (Title.Trim().ToUpper() == "") { using (DocumentInfo di = DocumentInfo.Get(libdocid)) Title = di.LibTitle; } } else { int num = Convert.ToInt32(stpseq[0]) - 64; char prefix = 'A'; prefix += (char)(num / 100); int numpart = num % 100; //string thenum = num.ToString("d2"); fname = string.Format("{0}\\rtffiles\\{1}.{2}{3:D02}", pth, ProcFileName, prefix, numpart); Application.DoEvents(); string procnum = ""; using (ItemInfo ii = ItemInfo.Get(procitem.ItemID)) procnum = ii.DisplayNumber; SaveSectionDocument(fname, stpseq, SecType, ref Documentid, procnum + ":" + (Number == string.Empty ? Title : Number), isLandscape); if (Documentid == 0) { if (MissingDocument == null) { //if (ci == null) ci = new ConfigInfo(null); //ci.AddItem("Printing", "Length", string.Format("{0:0.0000}", 0.001)); Byte[] tstbyte = System.Text.Encoding.Default.GetBytes(""); MissingDocument = Document.MakeDocument("MISSING FILE IN CONVERSION", tstbyte, null, null,".doc"); } Documentid = MissingDocument.DocID; missingDocFile = true; missingFileName = string.Format("{0}.{1}{2:D02}",ProcFileName, prefix, numpart); } } } if (Userid == null || Userid == "") Userid = "Migration"; // test for performance Content cont; Format fmt2 = format == null ? null : format.GetJustFormat(); cont = Content.New(Number, Title, 10000+docstyleindx, fmt2, ci==null?null:ci.ToString(), Dts, Userid); if (needEntry) { Entry entry = cont.MyEntry; entry.MyDocument = Document.Get(Documentid); entry.DTS = Dts; entry.UserID = Userid; } cont.MyZContent.OldStepSequence = ProcNumber + "|" + stpseq.TrimEnd(" ".ToCharArray()); Item itm = null; // the stpseq for section records may include a space & some other data. This // was not part of what is stored in the transition records, so just look at // the sequence before the space for section records. Then use the first character // with a '0'. This is what's stored in the transition record, for example, if the // section was BI, the transition record would have B0 (the reasoning is that // for steps, this is what could be stored if there were enough steps. int trindxsp = stpseq.IndexOf(' '); string trstpseq = trindxsp < 0 ? stpseq : stpseq.Substring(0, 1)+ "0"; if (dicTrans_ItemIds.ContainsKey(ProcNumber + "|" + trstpseq)) { itm = dicTrans_ItemIds[ProcNumber + "|" + trstpseq]; itm.MyContent = cont; itm.MyPrevious = FromItem; itm.DTS = Dts; itm.UserID = Userid; if (!itm.IsSavable) ErrorRpt.ErrorReport(itm); itm.Save(); dicTrans_ItemIds.Remove(ProcNumber + "|" + trstpseq); dicTrans_MigrationErrors.Remove(ProcNumber + "|" + trstpseq); } else itm = Item.MakeItem(FromItem, cont, Dts, Userid); // Check this section type versus the docstyleindex, i.e. that the docstyle was not of // the same type of section as the data. For example, rgesmped.in has only 1 doc style // and it WAS both step & doc when the section was added as a word doc, but the current // rgesmped.in only supports step sections. The result was that there is Word content but // a step docstyle. // // Identify this problem by putting out an error message & adding an annotation. The data // will have to be fixed manually, i.e. go into sql server & change the format and Type to // use a word section type. if (needEntry && format.PlantFormat.DocStyles.DocStyleList[docstyleindx].IsStepSection) { frmMain.AddError("Conflicting section type (Word Section: {0}) & Document Style (Step Section type: {1})", ProcNumber + ":" + Number + ":" + Title, format.PlantFormat.DocStyles.DocStyleList[docstyleindx].Name); ItemAnnotation ia = itm.ItemAnnotations.Add(MigrationErrorType); ia.SearchText = "Conflicting Section Type and Document Style"; ia.UserID = "Migration"; itm.Save(); } if (missingDocFile) { ItemAnnotation ia = itm.ItemAnnotations.Add(MigrationErrorType); ia.SearchText = string.Format("Missing File: {0} In Conversion",missingFileName); ia.UserID = "Migration"; itm.Save(); } dicTrans_ItemDone[ProcNumber+"|"+trstpseq] = itm; dicOldStepSequence[itm] = stpseq; return itm; } catch (Exception ex) { frmMain.AddError(ex, "Save Section"); log.Error("Save Section"); log.ErrorFormat("oldstepsequence = {0}", stpseq); log.ErrorFormat("{0}\r\n\r\n{1}", ex.Message, ex.InnerException); log.ErrorFormat(ex.StackTrace); } return null; } private int LookupOldToNew(string lkup) { if (dicOldToNew == null) { dicOldToNew = new Dictionary(); //dicOldToNew.Add("", 1); dicOldToNew.Add("0", 1); dicOldToNew.Add("0 ", 1); dicOldToNew.Add("00", 1); dicOldToNew.Add("01", 2); dicOldToNew.Add("02", 4); dicOldToNew.Add("03", 8); dicOldToNew.Add("04", 16); dicOldToNew.Add("I", 32); dicOldToNew.Add("I ", 32); dicOldToNew.Add("I0", 32); dicOldToNew.Add("I1", 64); dicOldToNew.Add("I2", 128); dicOldToNew.Add("I3", 256); dicOldToNew.Add("I4", 512); dicOldToNew.Add("A", 1024); dicOldToNew.Add("A ", 1024); dicOldToNew.Add("A0", 1024); dicOldToNew.Add("A1", 2048); dicOldToNew.Add("A2", 4096); dicOldToNew.Add("A3", 8192); dicOldToNew.Add("A4", 16384); dicOldToNew.Add("F", 32768); dicOldToNew.Add("F ", 32768); dicOldToNew.Add("F0", 32768); dicOldToNew.Add("F1", 65536); dicOldToNew.Add("F2", 131072); dicOldToNew.Add("F3", 262144); dicOldToNew.Add("F4", 524288); dicOldToNew.Add("05", 1048576); dicOldToNew.Add("06", 2097152); dicOldToNew.Add("07", 4194304); dicOldToNew.Add("08", 8388608); dicOldToNew.Add("09", 16777216); dicOldToNew.Add("0:", 33554432); dicOldToNew.Add("0;", 67108864); dicOldToNew.Add("0<", 134217728); dicOldToNew.Add("0=", 268435456); dicOldToNew.Add("0>", 536870912); } int retval = -1; try { retval = dicOldToNew[lkup]; } catch (Exception ex) { frmMain.AddError(ex, "OldToNew {0}", lkup); Console.WriteLine(string.Format("Error in oldtonew {0}", lkup)); Console.WriteLine(string.Format("Error = {0}", ex.Message)); } return retval; } private int GetDocStyleIndx(string dstyleindx, FormatInfo format, Item procitem, /* DocVersion docver,*/ string Number, string Title) { int docstyle = LookupOldToNew(dstyleindx); DocStyle ds0 = null; foreach (DocStyle ds in format.PlantFormat.DocStyles.DocStyleList) { if (ds.Index == 0) ds0 = ds; if ((ds.OldToNew & docstyle) > 0) { //frmMain.AddError("--->>>\"Good\"\t\"{0}\"\t\"{1}\"\t\"{2}\"\t\"{3}\"\t\"{4}\"\t\"{5}\"", // procitem.DisplayNumber, (Number ?? "") == "" ? Title : Number, dstyleindx, format, docstyle, ds.Name); return (int)ds.Index; } } frmMain.AddError("Bad OldToNew Document Style {0}:{1} dStyleIndex = '{2}'\r\n{3} - Missing OldToNew {4}", procitem.DisplayNumber, (Number ?? "") == "" ? Title : Number, dstyleindx, format, docstyle); //frmMain.AddError("--->>>\"Bad\"\t\"{0}\"\t\"{1}\"\t\"{2}\"\t\"{3}\"\t\"{4}\"\t\"{5}\"", // procitem.DisplayNumber, (Number ?? "") == "" ? Title : Number, dstyleindx, format, docstyle, ds0.Name); return 0; // Default is Zero } //private FormatInfo GetFormat(Item procitem, DocVersion docver) //{ // return procitem.MyItemInfo.ActiveFormat; // //while (procitem.MyItemInfo.a .MyContent.MyFormat == null) // //{ // // // find the first sibling // // while (procitem.PreviousID != null) // // procitem = procitem.MyPrevious; // // if (procitem.ItemPartCount == 0) return docver.MyDocVersionInfo.ActiveFormat; // // // find the parent node // // procitem = procitem.ItemParts[0].MyContent.ContentItems[0].MyItem; // //} // //return procitem.MyContent.MyFormat; //} //private FormatInfo GetFormat(DocVersion docver) //{ // if (docver.MyDocVersionInfo.MyFormat != null) return docver.MyDocVersionInfo.MyFormat; // return GetFormat(docver.MyDocVersionInfo.MyFolder); //} //private FormatInfo GetFormat(FolderInfo folder) //{ // if (folder.MyFormat != null) return folder.MyFolderInfo.MyFormat; // return GetFormat(folder.MyParent); //} private string SectTitle(OleDbConnection cn, DataRowView dr, bool UseMultiLineSectionTitle, bool ConvertCaret) { string tbuff = null; string menustr = null; if (UseMultiLineSectionTitle) { bool titleInMemo = false; // for accessory pages... if (dr["Step"].ToString().Substring(1, 1) != "0") { // The long section title is stored on a record with the "~" character. // This was done since originally the actual accessory page data was stored in the memo // field, so the long title could not be stored there, another record had to be used. OleDbDataAdapter da = new OleDbDataAdapter("select * from " + ProcFileName + " where [Step] = '" + dr["Step"].ToString().Substring(0, 1) + "~';", cn); DataSet ds = new DataSet(); try { da.Fill(ds); if (ds.Tables[0].Rows.Count == 1) { DataRow row = ds.Tables[0].Rows[0]; tbuff = TextConvert.ConvertText(row["Textm"].ToString(),ConvertCaret); if (tbuff != null && tbuff != "") titleInMemo = true; } else // no long section title existed for this accessory page tbuff = TextConvert.ConvertText(dr["Text"].ToString().PadRight(130, ' ').Substring(0, 75).TrimEnd(), ConvertCaret); } catch (Exception ex) { frmMain.AddError(ex, string.Format("Error getting long section title, procedure: {0}",ProcFileName)); log.ErrorFormat("Error getting long section title, procedure: {0}, error: {1}", ProcFileName,ex.Message); } da.Dispose(); } // For step sections, the long section title is stored on the section record // (see above comment for accessory pages to see the difference) else { string t = dr["Text"].ToString().PadRight(80, ' ').Substring(0, 75).TrimEnd(); string tm = dr["TextM"].ToString().Trim(); string secttitle = tm == null || tm == "" ? t : tm; tbuff = TextConvert.ConvertText(secttitle, ConvertCaret); } //// TESTS were run & it looked like that whitespace was removed before saving, //// so, put up a message box if find out otherwise.... //int nl = tbuff.IndexOf("\n"); //if (nl > -1) // MessageBox.Show("multiline text for section title, fix this!!"); //// remove newlines & any other escape/whitespace chars. int nl = tbuff.IndexOf("\n"); if (nl > -1 || titleInMemo) { string tmpstr = tbuff.Replace("\r", ""); tmpstr = tmpstr.Replace("\t", ""); tmpstr = tmpstr.Replace("\n", " "); // get rid of multiple spaces while (tmpstr.IndexOf(" ") > -1) tmpstr = tmpstr.Replace(" ", " "); tbuff = tmpstr; if (tbuff.Substring(tbuff.Length - 1, 1) == " ") tbuff = tbuff.Substring(0, tbuff.Length - 1); menustr = tbuff; } else { if (tbuff==null||tbuff=="") menustr = TextConvert.ConvertText(dr["Text"].ToString().PadRight(80, ' ').Substring(0, 75).TrimEnd(), ConvertCaret); else menustr = tbuff; } } else { // format does not include long section title menustr = TextConvert.ConvertText(dr["Text"].ToString().PadRight(80, ' ').Substring(0, 75).TrimEnd(), ConvertCaret); } return menustr; } private static Color _OverrideColor = Color.Red; public static Color OverrideColor { get { return Loader._OverrideColor; } set { Loader._OverrideColor = value; } } private bool hasFloatingFoldouts = false; private Dictionary FoldoutStpSeq = null; private List FloatingFoldoutHLS = null; private Item MigrateSection(Item procitem, string procnum, OleDbConnection cn, DataRowView dr, DataTable dt, Item FromItem, bool hasSubSection, string pth, DocVersion docver, FormatInfo activeFormat,Content cont) { Int32 thesectid = 0; bool isautogen = false; string stype = dr["type"].ToString(); string s = dr["text"].ToString().PadRight(130, ' '); string rid = dr["recid"].ToString(); // RECID string num = s.Substring(85, 20).TrimEnd(); string fmt = s.Substring(75, 8).TrimEnd(); // base format name string ufmt = s.Substring(83, 2).TrimEnd(); // user format number (see TSectEditDlg::SetupWindow() PROMSNT\EXE\WINED\SECTEDIT.CPP) // Build the format name if one was specified for this section. if (fmt == "") fmt = null; else if (ufmt.Length == 2 && char.IsDigit(ufmt[0]) && char.IsDigit(ufmt[1])) // user format reference must be two digits fmt = fmt.PadRight(8,' ') + ufmt; // append the user format reference bool ismulti = false; bool conv_caret = true; // sectFormat is a local that represents the format to be used by this section. // Note that if the format is set for this section, check it against what the inherited // value would be (for example, what the format is for the set), if they are the same // clear the format at the section level. FormatInfo sectFormat = null; FormatInfo docverFormat = activeFormat;//docver.MyDocVersionInfo.ActiveFormat; if (fmt != null&& fmt !="") // Is there a long section title (from format flag) sectFormat = GetFormat(fmt); else // either from this format, or the plant. sectFormat = docverFormat; if (sectFormat != null) { ismulti = sectFormat.PlantFormat.FormatData.SectData.StepSectionData.UseMultiLineSectionTitle; conv_caret = sectFormat.PlantFormat.FormatData.SectData.ConvertCaretToDelta; hasFloatingFoldouts = sectFormat.PlantFormat.FormatData.PrintData.AlternateFloatingFoldout; } if (fmt != null && fmt != "") if (fmt == docverFormat.Name) fmt = null; string title = SectTitle(cn, dr, ismulti, conv_caret); string init = dr["initials"].ToString().Trim(); string sequence = dr["CSequence"].ToString().PadRight(10); string step = dr["CStep"].ToString(); int libDocid = 0; DateTime dts = GetDTS(dr["Date"].ToString(), dr["Time"].ToString()); ConfigInfo ci = new ConfigInfo(null); ci.AddItem("History", "RecID", rid); ci.AddItem("History", "ProcName", ProcFileName.ToUpper()); if (MultiUnitCount > 0) { string apple = AddApplicability(rid); if(apple != null) ci.AddItem("MasterSlave", "Applicability", apple); } ci.AddItem("Section", "OldType", stype); // for steps sections... // Step Section Header Format: // A0 1X2S51 &Y // ^^^^^^^^^^^^ // ||||||||||||| // ||||||||||||`- 'Y','N', or blank signals to print section header - lib/section/addsec.c // |||||||||||`-- (bits) Auto Indent, Editable Data, Checkoff Header Type - lib/section/addsec.c // ||||||||||`--- blank // ||||||||`----- Link With Enhanced Document ' '-Default(not determined) 0-NO 1-YES // |||||||`------ MetaSection - number of subsections is given // ||||||`------- S-Separate(PageBreak); T-Continuous; ' '-Default // |||||`-------- Column mode (1,2,3,' '-default) // ||||`--------- X -only proc section; x -orig. proc; ' ' -other // |||`---------- Position within the procedure // ||`----------- ALWAYS leave blank // |`------------ Step Section Header marker // `------------- Internal section number (starts at A) char cbittst = sequence.PadRight(10)[8]; if (cbittst == ' ') cbittst = '\0'; if (step.Substring(1, 1) == "0") { // set pagination, continuous, separate. If blank, don't create attribute - uses format default. if (sequence.Substring(2, 1) != " ") { ci.AddItem("Section", "OriginalSteps", "Y"); } if (sequence.Substring(4, 1) == "T") // continuous { ci.AddItem("Section", "Pagination", "1"); } else if (sequence.Substring(4, 1) == "S") // separate { ci.AddItem("Section", "Pagination", "2"); } // Step: linked to enhanced (!exist = N) if (sequence.Substring(7, 1) == "1") { ci.AddItem("Step", "LnkEnh", "Y"); } // determine if autogenerated section (!exist = N) // Placekeeper (Calvert) if ((cbittst & PLACEKEEPER) > 1) { isautogen = true; //ci.AddItem("Section", "AutoGen", "Y"); ci.AddItem("Section", "Placekeeper", "Y"); } // Phonelist (Clavert) if ((cbittst & PHONELIST) > 1) ci.AddItem("Section", "Phonelist", "Y"); // Here are subsection flags, i.e. the following are only set if this // is a subsection. bool didsub = false; if (hasSubSection) { // Subsection: editable (!exist = N, i.e. default is 'not editable') if ((cbittst & EDDATA) > 0) { ci.AddItem("SubSection", "Edit", "Y"); } // Subsection: autoindent (!exist = Y, i.e. default is 'autoindented') if ((cbittst & AUTOIND) > 0) { ci.AddItem("SubSection", "AutoIndent", "N"); } } // Section: print section headers (!exist = Y, i.e. default is 'print section header') // Note that this can be on a section or subsection. 16bit code has this for both // levels and it was stored either as a bit set on seq[8] (for subsections, i.e. // this subsection does not have subsections under it) or was a character in seq[9] (Y or N), // i.e. this section has subsections. Make this just one flag now. if (hasSubSection && ((cbittst & PH) == 0)) { didsub = true; ci.AddItem("Section", "PrintHdr", "N"); } if (!hasSubSection && sequence.Substring(9, 1) == "N") { ci.AddItem("Section", "PrintHdr", "N"); } // Save section level Checkoff information int chkOffType = (rid[0] & 0x007F) - '0'; if (rid[0] == '\u2591') //for SUM,CAT,MCG with only 2 checkoff options and default checkoff is enabled chkOffType = 1; //this diables checkoffs for this section if (chkOffType > 0) ci.AddItem("Section", "CheckoffSelection", chkOffType.ToString()); if (stype.Length > 1) { int chkOffHeading = (stype[1] & 0x007F) - '0'; if (chkOffHeading > 0) ci.AddItem("Section", "CheckoffHeading", chkOffHeading.ToString()); } } else { // Accessory Section Format: // AI 1 2 // ^^ ^ ^ // || | | // || | `- # of pages (ASCII value minus 48) // || `--- Position within the procedure // |`----- Acc. page type (A,I, or F) // `------ Internal section number (starts at A) ci.AddItem("Section", "NumPages", sequence.Substring(3, 1)); // see if it's a libdoc too string mystep = null; try { mystep = dr["Step"].ToString(); } catch (Exception ex) { Console.WriteLine("testing - error = {0}", ex.Message); } string thekey = procnum.PadRight(20) + ((mystep!=null)?mystep.Substring(0,1).PadRight(10):step.Substring(0, 1).PadRight(10)); if (dicLibDocRef.ContainsKey(thekey)) { // if it is a library document, see if the section record has already been // saved. If it has, just use this section id, otherwise, create the // section record with info from the library document file. libDocid = dicLibDocRef[thekey]; } } // Both step & word doc sections can be in toc // determine if TOC element (!exist = N) if ((cbittst & TOC) > 1) { ci.AddItem("Section", "TOC", "Y"); } //Console.WriteLine("Before AddSection"); Item secitem = AddSection(procitem, num, title, stype, dts, init, ci, step + sequence, fmt, libDocid, pth, FromItem, sectFormat); //Console.WriteLine("After AddSection"); if (secitem == null) throw (new Exception("Null parameter in AddSection")); if (hasFloatingFoldouts) { if (FoldoutStpSeq == null) FoldoutStpSeq = new Dictionary(); if (step[1] == 'F') FoldoutStpSeq.Add(step, secitem.ItemID); } if (cont != null) { // ContentsParts.Add can use 'fromtype', item - fromtype here = 2, section AddPartRecursive(cont, 2, secitem); //if (cont.ContentParts.Contains(2)) //{ // foreach (ContentPart part in cont.ContentParts) // { // if (part.FromType == 2) // { // Item ii = Item.Get(part.ItemID); // ii.MyContent.ContentParts.Add(2, secitem); // ii.Save(); // break; // } // } //} //else // cont.ContentParts.Add(2, secitem); if (cont.MyZContent.OldStepSequence == null || cont.MyZContent.OldStepSequence == "") cont.MyZContent.OldStepSequence = ProcNumber; if (!cont.IsSavable) ErrorRpt.ErrorReport(cont); cont.Save(); } thesectid = secitem.ItemID; using (ItemInfo seciteminfo = ItemInfo.Get(thesectid)) { if (seciteminfo.MyContent.ContentEntryCount != 0) { using (DocumentInfo di = seciteminfo.MyContent.MyEntry.MyDocument) { bool success = MSWordToPDF.UpdateDocPdf(di, OverrideColor, seciteminfo); if (!success) { frmMain.AddError("Error in ", "UpdateDocPdf"); log.Error(string.Format("UpdateDocPdf - Error creating Pdf for Word Doc: {0},{1}", procnum, secitem.MyContent.Number + secitem.MyContent.Text)); } } } } // if the editsectid hasn't been set yet, set it to this section id, i.e. the first // one processed. Then if this section has the original edit section flag (sequence[2]) // save the id. The first step is necessary in case there is no original edit section // flag set, so that the first section is the default one to get opened in edit. if (EditSectId==0)EditSectId = thesectid; if (libDocid<1 && step[1] == '0' && (sequence[2] == 'x' || sequence[2] == 'X')) EditSectId = thesectid; // ContentType (2 in the following call) are: // 0 = structure, // 1 = procedure, // 2 = section, // 3 = step // 4 = branch // fromtype values are (see steps.cs too) // 1 = procedure, // 2 = section, // 3 = caution // 4 = note // 5 = RNO // 6 = step // 7 = table isautogen = false; //needed for bge if (!isautogen) { // Process the Data Table - First look for High Level Steps string sQry = string.Format("Step like '[{0}]%' and Sequence='S'", dr["Step"].ToString().Substring(0, 1)); DataView dv = new DataView(dt, sQry, "StepNo", DataViewRowState.CurrentRows); Item FrItem = null; frmMain.pbStepMaximum = dt.Rows.Count-frmMain.pbSectMaximum; int type = 6; bool sectionShowed = false; int firstCharSection = (int)(dr["Step"].ToString()[0]); foreach (DataRowView drv in dv) { int firstCharStep = (int)(drv[0].ToString()[0]); if (firstCharSection != firstCharStep) { if(!sectionShowed) Console.WriteLine("'Section','{0}','{1}','{2}',{3}", procnum,num,dr["Step"].ToString(), (int)(dr["Step"].ToString()[0])); sectionShowed = true; Console.WriteLine("'Skipping Step','{0}','{1}','{2}',{3}", procnum,num,drv["Step"].ToString(), (int)(drv["Step"].ToString()[0])); } else { FrItem = MigrateStep(cn, dt, drv, FrItem, conv_caret, pth, docver, sectFormat, secitem, type); if (hasFloatingFoldouts && (sequence[2] == 'x' || sequence[2] == 'X')) { if (FloatingFoldoutHLS == null) FloatingFoldoutHLS = new List(); FloatingFoldoutHLS.Add(FrItem.ItemID); } type = 0; // Only add ContentPart for first child //if (secitem.MyContent.ContentParts.Count == 0) //{ // // type 6 is step // secitem.MyContent.ContentParts.Add(6, FrItem); // if (!secitem.MyContent.IsSavable) ErrorRpt.ErrorReport(secitem.MyContent); // secitem.MyContent.Save(); //} } } dv.Dispose(); } return secitem; } private void AddPartRecursive(Content cont, int fromType, Item secitem) { if (cont.ContentParts.Contains(fromType)) { foreach (ContentPart part in cont.ContentParts) { if (part.FromType == fromType) { Item ii = Item.Get(part.ItemID); AddPartRecursive(ii.MyContent, fromType, secitem); ii.Save(); break; } } } else cont.ContentParts.Add(fromType, secitem); } private static Dictionary ApplesToOranges; private static void ResetApplesToOranges() { ApplesToOranges = new Dictionary(); } private string AddApplicability(string recnum) { if (!MyProcAPL.ContainsKey(recnum)) return null; string apple = MyProcAPL[recnum]; return LookupOrange(apple); } private string LookupOrange(string apple) { if (!ApplesToOranges.ContainsKey(apple)) { ApplesToOranges.Add(apple, AddApplicability1(apple)); Console.WriteLine("Apple: '{0}' - Orange: '{1}'", apple, ApplesToOranges[apple]); } return ApplesToOranges[apple]; } private string AddApplicability1(string apple) { if (apple == "40000000") return "0"; UInt32 mask = 0; foreach (int i in Old2NewApple.Keys) mask |= (uint)(1 << (i - 1)); UInt32 val = UInt32.Parse(apple, System.Globalization.NumberStyles.HexNumber); //UInt32 val = UInt32.Parse(apple); if (val == 0) return null; val &= mask; if (val == 0) return "0"; if (val == mask) return null; int j = 1; StringBuilder sb = new StringBuilder(); string sep = string.Empty; while (val != 0) { if ((val & 1u) == 1u) { sb.Append(sep + Old2NewApple[j].ToString()); sep = ","; } j++; val = val >> 1; } return sb.ToString(); } private void LoadSection(DataSet ds, OleDbDataAdapter da, string FileName) { try { da.Fill(ds, "Sections"); DataTable dt = ds.Tables["Sections"]; dt.CaseSensitive = true; dt.Columns.Add("CStep", System.Type.GetType("System.String")); dt.Columns.Add("CSequence", System.Type.GetType("System.String")); // set the cstep & csequence - couldn't do it in the add because it needed a sql function foreach (DataRow drw in ds.Tables["Sections"].Rows) { drw["CStep"] = TextConvert.ConvertSeq(drw["Step"].ToString()); drw["CSequence"] = TextConvert.ConvertSeq(drw["Sequence"].ToString()); } dt.Columns.Add("StepNo", System.Type.GetType("System.Int32"), "Convert(Convert(Substring(CStep,2,1),'System.Char'),'System.Int32')-48"); dt.Columns.Add("Level", System.Type.GetType("System.Int32"), "Len(CSequence)"); dt.Columns.Add("SubStepNo", System.Type.GetType("System.Int32"), "Convert(Convert(Substring(CSequence,Len(CSequence),1),'System.Char'),'System.Int32')-48"); dt.Columns.Add("locb", System.Type.GetType("System.Int32"), "Convert(Convert(Substring(CSequence,2,1),'System.Char'),'System.Int32')-48"); } catch (Exception ex) { FileInfo fi; switch (ex.Message) { case "Index file not found.":// then delete inf file fi = new FileInfo(frmMain.ProcedureSetPath + "\\" + FileName + ".inf"); fi.Delete(); LoadSection(ds, da, FileName);// Try Again break; case "External table is not in the expected format.": // then pad dbt file with 128 zeros. fi = new FileInfo(frmMain.ProcedureSetPath + "\\" + FileName + ".dbt"); FileStream fs = fi.OpenWrite(); fs.Position = fs.Length; byte[] buf = new byte[128]; for (int i = 0; i < 128; i++) buf[i] = 0; fs.Write(buf, 0, 128); fs.Close(); LoadSection(ds, da, FileName);// Try Again break; default: // Unrecognized error frmMain.AddError(ex, "Unrecognized error in LoadSection {0}", FileName); Console.WriteLine("Unrecognized error: error = {0}", ex.Message); log.ErrorFormat("File - {0}.DBF\r\n\r\n{1}\r\n\r\n{2}", FileName, ex.Message, ex.InnerException); break; } } } } }