328 lines
12 KiB
C#

/*********************************************************************************************
* Copyright 2021 - Volian Enterprises, Inc. All rights reserved.
* Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
* ------------------------------------------------------------------------------
* $Workfile: ROField.cs $ $Revision: 11 $
* $Author: Kathy $ $Date: 4/04/03 9:41a $
*
* $History: ROField.cs $
*
* ***************** Version 11 *****************
* User: Kathy Date: 4/04/03 Time: 9:41a
* Updated in $/LibSource/ROFields
* B2003-030: get correct field type for new image
*
* ***************** Version 10 *****************
* User: Kathy Date: 12/10/02 Time: 2:27p
* Updated in $/LibSource/ROFields
* fieldname special chars
*
* ***************** Version 9 *****************
* User: Kathy Date: 12/02/02 Time: 8:30a
* Updated in $/LibSource/ROFields
* fieldname replace chars
*
* ***************** Version 8 *****************
* User: Kathy Date: 11/11/02 Time: 7:14a
* Updated in $/LibSource/ROFields
* image field type should be 32 not 20
*
* ***************** Version 7 *****************
* User: Kathy Date: 10/15/02 Time: 2:17p
* Updated in $/LibSource/ROFields
* combo field number
*
* ***************** Version 6 *****************
* User: Kathy Date: 9/27/02 Time: 1:11p
* Updated in $/LibSource/ROFields
* fix digit as first char in fieldname
*
* ***************** Version 5 *****************
* User: Kathy Date: 9/25/02 Time: 2:31p
* Updated in $/LibSource/ROFields
* multitxt->variable
*
* ***************** Version 4 *****************
* User: Kathy Date: 9/03/02 Time: 2:53p
* Updated in $/LibSource/ROFields
* missing " on image field def.
*
* ***************** Version 3 *****************
* User: Kathy Date: 8/30/02 Time: 11:56a
* Updated in $/LibSource/ROFields
* image
*
* ***************** Version 2 *****************
* User: Kathy Date: 8/28/02 Time: 10:59a
* Updated in $/LibSource/ROFields
* development
*********************************************************************************************/
using System;
using System.Text;
namespace ROFields
{
// Field Types:
// SingleTxt - Single Line Text
// VariableTxt - Variable Length Text (multiple lines)
// FrmtSingleTxt - Single Line Formatted text - used for Accessory ID fields
// XYPlot - used to enter the plot language commands
// Table - Used to enter a table (16-bit VE-PROMS text based style using dashes and pipe characters to define cells)
// Image - Used for images (ex. TIF,JPG,BMP file references)
// MultiTxt - ??
// Combination - used for Setpoint return values - user can select type of return value (Single/Multi line text, Table, X/Y Plot)
// when entering the RO data
// MultiField - ??
public enum FieldTypes: uint
{
Nil=0, SingleTxt=1, VariableTxt=2, FrmtSingleTxt=4, XYPlot=8, Table=10, Image=32,
MultiTxt=40, Combination=128, MultiFld=100
}
/// <summary>
/// Summary description for ROField: This class contains RO Field information. Each ROField
/// contains:
/// string fieldname - the name of the field
/// string recid - its database record id (used to interface to the database - null if
/// not created yet.
/// string masterrecID - its record id in the master if appropriate.
/// uint fieldtype - the field type as defined in the enum FieldTypes (listed above)
/// </summary>
public class ROField
{
string fieldname;
string recID;
string masterrecID;
uint fldtype;
// constuctor
public ROField(string fname, string rID, string mrID, uint fieldtype)
{
fieldname = fname;
recID = rID;
masterrecID = mrID;
fldtype = fieldtype;
}
public string GetFieldname { get {return fieldname;}}
public string GetRecID { get {return recID;}}
public string GetMasterRecID { get {return masterrecID;}}
public uint GetFieldType{ get {return fldtype;}}
public void SetFieldname(string name) {fieldname = name;}
public void SetRecID(string recid) {recID = recid;}
public void SetMasterRecID(string mrecid) {masterrecID = mrecid;}
public void SetFieldType(uint ftype) {fldtype = ftype;}
// C2021-026 return true if we allow child values for the current field type
public bool FieldTypeCanDoApplicability()
{
bool rtnval = false;
switch (fldtype)
{
case (uint)FieldTypes.SingleTxt:
case (uint)FieldTypes.VariableTxt:
case (uint)FieldTypes.Combination:
rtnval = true;
break;
}
return rtnval;
}
// Given a schema string, determine which RO Field type it is.
public uint ParseFieldType(string info)
{
int indx;
// formatted single line text has 'pattern' in schema definition)
indx = info.IndexOf("xsd:pattern");
if (indx >= 0) return (uint) FieldTypes.FrmtSingleTxt;
// Combination field has 'choice' in schema definition
indx = info.IndexOf("xsd:choice");
if (indx >= 0) return (uint) FieldTypes.Combination;
// image - search for 'Image_Height', in case Image is in the string from some other mechanism
indx = info.IndexOf("Image_Height");
if (indx >=0) return (uint) FieldTypes.Image;
// single line text has 'normalizedString' (pattern does too, but
// it would be eliminated above.
indx = info.IndexOf("xsd:normalizedString");
if (indx >=0) return (uint) FieldTypes.SingleTxt;
// now look for all of the multi-line fields: multi text, table, & XY Plot
indx = info.IndexOf("xsd:string");
if (indx <0) indx = info.IndexOf("xsd:String");
if (indx >=0)
{
int indxspecific;
indxspecific = info.IndexOf("Variable");
if (indxspecific >= 0) return (uint) FieldTypes.VariableTxt;
indxspecific = info.IndexOf("Table");
if (indxspecific >= 0) return (uint) FieldTypes.Table;
indxspecific = info.IndexOf("XYPlot");
if (indxspecific >= 0) return (uint) FieldTypes.XYPlot;
}
// indx = info.IndexOf("Image");
// if (indx >=0) return (uint) FieldTypes.Image;
return 1000;
}
// Creates a string representing the schema for this field. note that the input
// fieldname will override that which is stored for this ROField (for editting
// purposes).
public string MakeFieldName(string fldname)
{
if (fldname.Length < 2)
return fldname;
// a digit cannot start an xml fieldname, prepend a "__" to it.
string tmp0;
if (char.IsDigit(fldname,0))
tmp0 = "__" + fldname;
else
tmp0 = fldname;
// an xml fieldname cannot have a space, change it to a "__"
string tmpstr = tmp0.Replace(" ","__");
int len = tmpstr.Length;
int cnt = 0;
// this is also our sequence that tells us the follow 3 digits is the ascii number (base 10)
// of the character we replaced.
string OKpunch = "-._";
string outstr = "";
int decval;
while (cnt < len)
{
char tmpchr = tmpstr[cnt];
if(!char.IsLetterOrDigit(tmpchr)&& (OKpunch.IndexOf(tmpchr) == -1) )
{
decval = tmpchr;
outstr += OKpunch + decval.ToString("D3");
}
else
{
outstr += tmpchr.ToString();
}
cnt++;
}
return outstr;
}
public string MakeSchemaString(string fieldname, string width, string pattern)
{
uint ftype = this.GetFieldType;
StringBuilder strbld = new StringBuilder();
strbld.Append("<xsd:element name=\"");
strbld.Append(MakeFieldName(fieldname));
strbld.Append("\" minOccurs=\"0\">\n");
if (ftype == (uint)FieldTypes.VariableTxt || ftype == (uint)FieldTypes.Table || ftype == (uint)FieldTypes.XYPlot)
{
strbld.Append("<xsd:annotation>\n<xsd:documentation xml:lang=\"en\">");
if (ftype == (uint)FieldTypes.VariableTxt)
strbld.Append("Variable");
else if (ftype == (uint)FieldTypes.Table)
strbld.Append("Table");
else
strbld.Append("XYPlot");
strbld.Append("</xsd:documentation>\n</xsd:annotation>");
}
strbld.Append("<xsd:simpleType>\n<xsd:restriction base=\"xsd:");
if (ftype == (uint)FieldTypes.FrmtSingleTxt || ftype == (uint)FieldTypes.SingleTxt)
strbld.Append("normalizedString\">\n<xsd:maxLength value=\"");
else
strbld.Append("String\">\n<xsd:maxLength value=\"");
strbld.Append(width);
strbld.Append("\" />\n");
if (ftype == (uint)FieldTypes.FrmtSingleTxt)
{
strbld.Append("<xsd:pattern value=\"");
strbld.Append(pattern);
strbld.Append("\" />\n");
}
strbld.Append("</xsd:restriction>\n</xsd:simpleType>\n</xsd:element>");
return (strbld.ToString());
}
public string MakeComboSchemaString(string fieldname, bool fixd, string fixdwid, bool multi, string multiwid,
bool table, string tablewid, bool xyplot, string xyplotwid)
{
StringBuilder strbld = new StringBuilder();
strbld.Append("<xsd:choice>\n");
if (fixd == true)
{
strbld.Append("<xsd:element name=\"");
strbld.Append(MakeFieldName(fieldname)+"a");
strbld.Append("\" type=\"Fixed\" minOccurs=\"0\">\n");
strbld.Append("<xsd:simpleType>\n<xsd:restriction base=\"xsd:normalizedString\">\n<xsd:maxLength value=\"");
strbld.Append(fixdwid);
strbld.Append("\" />\n</xsd:restriction>\n</xsd:simpleType>\n</xsd:element>\n");
}
if (multi == true)
{
strbld.Append("<xsd:element name=\"");
strbld.Append(MakeFieldName(fieldname)+"b");
strbld.Append("\" type=\"Variable\" minOccurs=\"0\">\n");
strbld.Append("<xsd:annotation>\n<xsd:documentation xml:lang=\"en\">\nVariable\n");
strbld.Append("</xsd:documentation>\n</xsd:annotation>\n<xsd:simpleType name=\"Variable\">\n");
strbld.Append("<xsd:restriction base=\"xsd:string\">\n<xsd:maxLength value=\"");
strbld.Append(multiwid);
strbld.Append("\" />\n</xsd:restriction>\n</xsd:simpleType>\n</xsd:element>\n");
}
if (table == true)
{
strbld.Append("<xsd:element name=\"");
strbld.Append(MakeFieldName(fieldname)+"c");
strbld.Append("\" type=\"Table\" minOccurs=\"0\">\n");
strbld.Append("<xsd:annotation>\n<xsd:documentation xml:lang=\"en\">\nTable\n");
strbld.Append("</xsd:documentation>\n</xsd:annotation>\n<xsd:simpleType name=\"Variable\">\n");
strbld.Append("<xsd:restriction base=\"xsd:string\">\n<xsd:maxLength value=\"");
strbld.Append(tablewid);
strbld.Append("\" />\n</xsd:restriction>\n</xsd:simpleType>\n</xsd:element>");
}
if (xyplot == true)
{
strbld.Append("<xsd:element name=\"");
strbld.Append(MakeFieldName(fieldname)+"d");
strbld.Append("\" type=\"XY_Plot\" minOccurs=\"0\">\n");
strbld.Append("<xsd:annotation>\n<xsd:documentation xml:lang=\"en\">\nXYPlot\n");
strbld.Append("</xsd:documentation>\n</xsd:annotation>\n<xsd:simpleType name=\"Variable\">\n");
strbld.Append("<xsd:restriction base=\"xsd:string\">\n<xsd:maxLength value=\"");
strbld.Append(xyplotwid);
strbld.Append("\" />\n</xsd:restriction>\n</xsd:simpleType>\n</xsd:element>");
}
strbld.Append("</xsd:choice>");
return (strbld.ToString());
}
public string MakeImageSchemaString(string fieldname)
{
StringBuilder strbld = new StringBuilder();
strbld.Append("<xsd:element name=\"");
strbld.Append(MakeFieldName(fieldname));
strbld.Append("\">\n<xsd:complexType>\n<xsd:sequence>");
strbld.Append("<xsd:element name=\"Image_Filename\" minOccurs=\"0\">\n");
strbld.Append("<xsd:simpleType>\n<xsd:annotation>\n");
strbld.Append("<xsd:documentation xml:lang=\"en\">VLN_FINDFILE</xsd:documentation>\n");
strbld.Append("</xsd:annotation>\n<xsd:restriction base=\"xsd:normalizedString\">\n");
strbld.Append("<xsd:maxLength value=\"70\" />\n</xsd:restriction>\n</xsd:simpleType>");
strbld.Append("</xsd:element>\n<xsd:element name=\"Image_Height\" minOccurs=\"0\">\n");
strbld.Append("<xsd:simpleType>\n<xsd:annotation>\n");
strbld.Append("<xsd:documentation xml:lang=\"en\">Lines (6 lines per inch)</xsd:documentation>\n");
strbld.Append("</xsd:annotation>\n<xsd:restriction base=\"xsd:normalizedString\">\n");
strbld.Append("<xsd:maxLength value=\"10\" />\n</xsd:restriction>\n</xsd:simpleType>\n");
strbld.Append("</xsd:element>\n<xsd:element name=\"Image_Width\" minOccurs=\"0\">\n");
strbld.Append("<xsd:simpleType>\n<xsd:annotation>\n");
strbld.Append("<xsd:documentation xml:lang=\"en\">Characters (12 chars. Per inch)</xsd:documentation>\n");
strbld.Append("</xsd:annotation>\n<xsd:restriction base=\"xsd:normalizedString\">\n");
strbld.Append("<xsd:maxLength value=\"10\" />\n</xsd:restriction>\n</xsd:simpleType>\n");
strbld.Append("</xsd:element>\n</xsd:sequence>\n</xsd:complexType>\n</xsd:element>");
return(strbld.ToString());
}
}
}