// ======================================================================== // 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.IO; using System.Text; using Volian.CSLA.Library; namespace DataLoader { public partial class frmLoader : Form { private Section AddSection(string Number, string Title, DateTime Dts, string Userid, ConfigInfo ci, string stpseq, string fmt, int libdocid, string pth) { UpdateLabels(0, 1, 0); try { string Format = null; // do the format field, an xpath for the format & last part is column // mode if a step section. try { if (fmt != null && fmt != "") { if (fmt.IndexOf(' ') > -1) // will have spaces if it's a user format { string part1 = "/" + fmt.Substring(0, fmt.IndexOf(' ')) + "/"; string part2 = "USER=" + fmt.Substring(fmt.LastIndexOf(' ') + 1, 2); Format = part1 + part2; } else Format = "/" + fmt; } } catch (Exception ex) { log.ErrorFormat("Error getting format {0}", ex.Message); } // tack on the column mode: if (stpseq != null && stpseq.Substring(1, 1) == "0" && stpseq.Substring(5, 1) != " ") Format = Format + "/COL=" + stpseq.Substring(5, 1); // find rtf file (or use the library document temp file) & read it into the field // acccontent int Contentid=0; byte ContentType=0; if (libdocid != 0 || stpseq.Substring(1, 1) != "0") { string fname = null; if (libdocid != 0) { Contentid = libdocid; ContentType = 2; } else { int num = Convert.ToInt32(stpseq[0]) - 64; string thenum = num.ToString("d2"); fname = string.Format("{0}\\rtffiles\\{1}.A{2}", pth, ProcFileName, thenum); Application.DoEvents(); SaveSectionDocument(fname, stpseq, ref ContentType, ref Contentid); } } Section sec = Section.MakeSection(Number, Title,ContentType, Contentid, Format, ci.ToString(), Dts, Userid); dicOldStepSequence[sec] = stpseq; return sec; } catch (Exception ex) { 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 string SectTitle(OleDbConnection cn, DataRowView dr) { string tbuff = null; string menustr = null; bool UseMultiLineSectionTitle = false; // TODO KBR: format flag 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] like '" + 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()); if (tbuff != null || tbuff[0] != '\0') titleInMemo = true; } else // no long section title existed for this accessory page tbuff = TextConvert.ConvertText(dr["Text"].ToString().PadRight(130, ' ').Substring(0, 75).TrimEnd()); } catch (Exception ex) { log.ErrorFormat("Error getting long section title {0}", ex.Message); } } // For step sections, the long section title is stored on the section record // (see above comment for accessory pages to see the difference) else { tbuff = TextConvert.ConvertText(dr["TextM"].ToString().Trim()); } //// 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 { // format does not include long section title menustr = TextConvert.ConvertText(dr["Text"].ToString().PadRight(80, ' ').Substring(0, 75).TrimEnd()); } return menustr; } private Int32 MigrateSection(Procedure prc, OleDbConnection cn, DataRowView dr, DataTable dt, Byte FromType, Int32 FromID, bool isSubSection, string pth) { Int32 thesectid = 0; bool islibdoc = false; //bool hasxml = false; string s = dr["text"].ToString().PadRight(130, ' '); string num = s.Substring(85, 20).TrimEnd(); string fmt = s.Substring(75, 10).TrimEnd(); string title = SectTitle(cn, dr); 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); // 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) if (step.Substring(1, 1) == "0") { // if this section has the original edit section flag (sequence[2]) save the id. // set pagination, continuous, separate. If blank, don't create attribute - uses format default. if (sequence.Substring(4, 1) == "T") { ci.AddItem("Section", "Pagination", "C"); //hasxml = SetXml(xmldoc, topElement, "Section", "Pagination", "C"); } else if (sequence.Substring(4, 1) == "S") { ci.AddItem("Section", "Pagination", "S"); //hasxml = SetXml(xmldoc, topElement, "Section", "Pagination", "S"); } // Step: linked to enhanced (!exist = N) if (sequence.Substring(7, 1) == "1") { ci.AddItem("Step", "LnkEnh", "Y"); //hasxml = SetXml(xmldoc, topElement, "Step", "LnkEnh", "Y"); } char cbittst = sequence.PadRight(10)[8]; if (cbittst == ' ') cbittst = '\0'; // determine if TOC element (!exist = N) if ((cbittst & TOC) > 1) { ci.AddItem("Section", "TOC", "Y"); //hasxml = SetXml(xmldoc, topElement, "Section", "TOC", "Y"); } // determine if autogenerated section (!exist = N) if ((cbittst & AUTOGEN) > 1) { ci.AddItem("Section", "AutoGen", "Y"); //hasxml = SetXml(xmldoc, topElement, "Section", "AutoGen", "Y"); } // Here are subsection flags, i.e. the following are only set if this // is a subsection. bool didsub = false; if (isSubSection) { // Subsection: editable (!exist = Y) if ((cbittst & EDDATA) > 0) { ci.AddItem("SubSection", "Edit", "N"); //SetXml(xmldoc, topElement, "SubSection", "Edit", "N"); } // Subsection: print section headers (!exist = Y) if ((cbittst & PH) > 0) { didsub = true; ci.AddItem("SubSection", "PH", "N"); //SetXml(xmldoc, topElement, "SubSection", "PH", "N"); } // Subsection: autoindent (!exist = Y) if ((cbittst & AUTOIND) > 0) { ci.AddItem("SubSection", "AutoIndent", "N"); //SetXml(xmldoc, topElement, "SubSection", "AutoIndent", "N"); } } if (!didsub && sequence.Substring(4, 1) == "N") { ci.AddItem("SubSection", "PH", "N"); //SetXml(xmldoc, topElement, "SubSection", "PH", "N"); } } 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)); //hasxml = SetXml(xmldoc, topElement, "Section", "NumPages", sequence.Substring(3, 1)); // see if it's a libdoc too.0 string thekey = prc.Number.PadRight(20) + 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]; islibdoc = true; } } Section sec = AddSection(num, title, dts, init, ci, step + sequence, fmt, libDocid, pth); thesectid = sec.SectID; // if this section has the original edit section flag (sequence[2]) save the id. if (!islibdoc && 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) // 0 = next of same type // 1 = procedure, // 2 = section, // 3 = caution // 4 = note // 5 = RNO // 6 = substep // 7 = table Structure str = AddStructure(FromType, FromID, 2, thesectid, step + sequence, dts, init); // 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); Byte FrType = 6; Int32 FrID = 0; pbStep.Maximum = dt.Rows.Count; pbStep.Value = 0; foreach (DataRowView drv in dv) { FrID = MigrateStep(cn, dt, drv, FrType, FrID); if (sec.ContentID == 0) { sec.ContentID = FrID; sec.ContentType = 1; sec.Save(true); } FrType = 0; } return str.StructureID; } 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(tbSource.Text + "\\" + 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(tbSource.Text + "\\" + 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 log.ErrorFormat("File - {0}.DBF\r\n\r\n{1}\r\n\r\n{2}", FileName, ex.Message, ex.InnerException); break; } } } } }