Rich 5af2c31559 Removed Debug Print
Moved code to add sections to Procedure parts
Moved code to add steps to Section parts
Moved code to add steps to Step parts
Changed Debug Print
Fixed a Format Flag conversion DontBreakOptEquipmentList
Changed GetItemFont so that parent items would not be left in the cache
Changed AddIncludedStepNumber to allow for ranges to sub levels.
Added a array reference to StepDataList by index.
2010-06-17 18:42:06 +00:00

577 lines
22 KiB
C#

// ========================================================================
// 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
{
private Dictionary<string, int> 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)
{
frmMain.UpdateLabels(0, 1, 0);
try
{
FormatInfo format = 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 docstyleindx = GetDocStyleIndx(dstyleindx, format, procitem, docver,Number,Title);
int docstyleindx = GetDocStyleIndx(dstyleindx, format, procitem, Number, Title);
// 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);
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 (libdocid != 0 || stpseq.Substring(1, 1) != "0")
{
needEntry = true;
string fname = null;
if (libdocid != 0)
{
Documentid = libdocid;
}
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, SecType, ref Documentid, procitem.DisplayNumber + ":" + (Number == string.Empty ? Title : Number));
if (Documentid == 0)
{
if (MissingDocument==null) MissingDocument = Document.MakeDocument("MISSING FILE IN CONVERSION", null, null, null);
Documentid = MissingDocument.DocID;
}
}
}
if (Userid == null || Userid == "") Userid = "Migration";
// test for performance
Content cont;
using(Format fmt2 = format == null ? null : format.Get())
cont = Content.New(Number, Title, 10000+docstyleindx, fmt2, ci==null?null:ci.ToString(), Dts, Userid);
Entry entry = cont.MyEntry;
if (needEntry)
{
entry.MyDocument = Document.Get(Documentid);
entry.DTS = Dts;
entry.UserID = Userid;
//entry = Entry.MakeEntry(cont.ContentID, Document.Get(Documentid), Dts, Userid);
}
cont.MyZContent.OldStepSequence = ProcNumber + "|" + stpseq;
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);
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<string, int>();
//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)
{
// get the format, if format is set, use it, otherwise walk
//if (format == null)
//{
//format = GetFormat(procitem, docver);
//}
int docstyle = LookupOldToNew(dstyleindx);
foreach (DocStyle ds in format.PlantFormat.DocStyles.DocStyleList)
{
if ((ds.OldToNew & docstyle)>0) 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);
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] 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(),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, "Error getting long section title");
log.ErrorFormat("Error getting long section title {0}", 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
{
tbuff = TextConvert.ConvertText(dr["TextM"].ToString().Trim(), 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
{
menustr = TextConvert.ConvertText(dr["Text"].ToString().PadRight(80, ' ').Substring(0, 75).TrimEnd(), ConvertCaret);
}
}
else
{ // format does not include long section title
menustr = TextConvert.ConvertText(dr["Text"].ToString().PadRight(80, ' ').Substring(0, 75).TrimEnd(), ConvertCaret);
}
return menustr;
}
private Item MigrateSection(Item procitem, string procnum, OleDbConnection cn, DataRowView dr, DataTable dt, Item FromItem, bool isSubSection, 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, 10).TrimEnd();
if (fmt == "") fmt = null;
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;
}
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("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)
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(2, 1) != " ")
{
ci.AddItem("Section", "OriginalSteps", "Y");
}
if (sequence.Substring(4, 1) == "T")
{
ci.AddItem("Section", "Pagination", "C");
}
else if (sequence.Substring(4, 1) == "S")
{
ci.AddItem("Section", "Pagination", "S");
}
// Step: linked to enhanced (!exist = N)
if (sequence.Substring(7, 1) == "1")
{
ci.AddItem("Step", "LnkEnh", "Y");
}
char cbittst = sequence.PadRight(10)[8];
if (cbittst == ' ')
cbittst = '\0';
else
{
// determine if TOC element (!exist = N)
if ((cbittst & TOC) > 1)
{
ci.AddItem("Section", "TOC", "Y");
}
// determine if autogenerated section (!exist = N)
if ((cbittst & AUTOGEN) > 1)
{
isautogen = true;
ci.AddItem("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");
}
// Subsection: print section headers (!exist = Y)
if ((cbittst & PH) > 0)
{
didsub = true;
ci.AddItem("SubSection", "PH", "N");
}
// Subsection: autoindent (!exist = Y)
if ((cbittst & AUTOIND) > 0)
{
ci.AddItem("SubSection", "AutoIndent", "N");
}
}
if (!didsub && sequence.Substring(4, 1) == "N")
{
ci.AddItem("SubSection", "PH", "N");
}
// Save section level Checkoff information
int chkOffType = (rid[0] & 0x007F) - '0';
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 thekey = procnum.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];
}
}
Item secitem = AddSection(procitem, num, title, stype, dts, init, ci, step + sequence, fmt, libDocid, pth, FromItem, sectFormat);
if (secitem == null)
throw (new Exception("Null parameter in AddSection"));
if (cont != null)
{
// ContentsParts.Add can use 'fromtype', item - fromtype here = 2, section
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;
// 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
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.pbStepValue = 0;
int type = 6;
foreach (DataRowView drv in dv)
{
FrItem = MigrateStep(cn, dt, drv, FrItem, conv_caret, pth, docver, sectFormat, secitem, type);
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();
//}
}
}
return secitem;
}
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.tbSourceText + "\\" + 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.tbSourceText + "\\" + 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;
}
}
}
}
}