1564 lines
48 KiB
C#
1564 lines
48 KiB
C#
/*********************************************************************************************
|
|
* Copyright 2021- Volian Enterprises, Inc. All rights reserved.
|
|
* Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
|
|
* ------------------------------------------------------------------------------
|
|
* $Workfile: RODefFrm.cs $ $Revision: 18 $
|
|
* $Author: Kathy $ $Date: 9/06/05 11:26a $
|
|
*
|
|
* $History: RODefFrm.cs $
|
|
*
|
|
* ***************** Version 18 *****************
|
|
* User: Kathy Date: 9/06/05 Time: 11:26a
|
|
* Updated in $/EXE/RefObj/ROEditor
|
|
* B2005-035
|
|
*
|
|
* ***************** Version 17 *****************
|
|
* User: Jsj Date: 7/02/03 Time: 9:25a
|
|
* Updated in $/EXE/RefObj/ROEditor
|
|
* made messagebox calls modal by removing the parent window reference
|
|
*
|
|
* ***************** Version 16 *****************
|
|
* User: Kathy Date: 5/21/03 Time: 12:52p
|
|
* Updated in $/EXE/RefObj/ROEditor
|
|
* B2003-041: process if only one field for RO & not always saving ro
|
|
* field name edit
|
|
*
|
|
* ***************** Version 15 *****************
|
|
* User: Kathy Date: 5/07/03 Time: 1:58p
|
|
* Updated in $/EXE/RefObj/ROEditor
|
|
* B2003-033 fixed
|
|
*
|
|
* ***************** Version 14 *****************
|
|
* User: Jsj Date: 4/14/03 Time: 3:03p
|
|
* Updated in $/EXE/RefObj/ROEditor
|
|
* changes due to RO FST file creation speed up
|
|
*
|
|
* ***************** Version 13 *****************
|
|
* User: Kathy Date: 12/10/02 Time: 2:26p
|
|
* Updated in $/EXE/RefObj/ROEditor
|
|
* fieldname special chars & bug fixes
|
|
*
|
|
* ***************** Version 12 *****************
|
|
* User: Kathy Date: 12/02/02 Time: 9:25a
|
|
* Updated in $/EXE/RefObj/ROEditor
|
|
* after edit fieldname, update menu & retval correctly
|
|
*
|
|
* ***************** Version 11 *****************
|
|
* User: Kathy Date: 12/02/02 Time: 8:30a
|
|
* Updated in $/EXE/RefObj/ROEditor
|
|
* fieldname replace chars
|
|
*
|
|
* ***************** Version 10 *****************
|
|
* User: Kathy Date: 12/02/02 Time: 6:19a
|
|
* Updated in $/EXE/RefObj/ROEditor
|
|
* status on long ops & update text box for fieldname change
|
|
*
|
|
* ***************** Version 9 *****************
|
|
* User: Kathy Date: 11/19/02 Time: 11:30a
|
|
* Updated in $/EXE/RefObj/ROEditor
|
|
* validate retval (handle {})
|
|
*
|
|
* ***************** Version 8 *****************
|
|
* User: Kathy Date: 10/15/02 Time: 2:18p
|
|
* Updated in $/EXE/RefObj/ROEditor
|
|
* new group (table)
|
|
*
|
|
* ***************** Version 7 *****************
|
|
* User: Kathy Date: 10/10/02 Time: 10:02a
|
|
* Updated in $/EXE/RefObj/ROEditor
|
|
* try to m ake xml tree & tree control in sync
|
|
*
|
|
* ***************** Version 6 *****************
|
|
* User: Kathy Date: 9/25/02 Time: 2:31p
|
|
* Updated in $/EXE/RefObj/ROEditor
|
|
* multitxt->variable
|
|
*
|
|
* ***************** Version 5 *****************
|
|
* User: Kathy Date: 9/25/02 Time: 9:57a
|
|
* Updated in $/EXE/RefObj/ROEditor
|
|
* dev
|
|
*
|
|
* ***************** Version 4 *****************
|
|
* User: Kathy Date: 9/19/02 Time: 10:04a
|
|
* Updated in $/EXE/RefObj/ROEditor
|
|
* mods for subgroup apply below node. if mod menutitle template, update
|
|
* menu titles from node down.
|
|
*
|
|
* ***************** Version 3 *****************
|
|
* User: Kathy Date: 9/11/02 Time: 1:15p
|
|
* Updated in $/EXE/RefObj/ROEditor
|
|
* vlnxml
|
|
*
|
|
* ***************** Version 2 *****************
|
|
* User: Kathy Date: 8/28/02 Time: 10:57a
|
|
* Updated in $/EXE/RefObj/ROEditor
|
|
*********************************************************************************************/
|
|
|
|
using System;
|
|
using System.Drawing;
|
|
using System.Collections;
|
|
using System.ComponentModel;
|
|
using System.Windows.Forms;
|
|
using System.Xml;
|
|
using System.Xml.Schema;
|
|
using System.Text;
|
|
using ROFields;
|
|
using RODBInterface;
|
|
using VlnStatus;
|
|
using System.Collections.Generic;
|
|
|
|
|
|
namespace ROEditor
|
|
{
|
|
|
|
/// <summary>
|
|
/// Summary description for RODefinition.
|
|
/// </summary>
|
|
public class RODefFrm : System.Windows.Forms.Form
|
|
{
|
|
private System.Windows.Forms.Label lblGroup;
|
|
private System.Windows.Forms.Label lblRetVal;
|
|
private System.Windows.Forms.Label lblMenuVal;
|
|
private System.Windows.Forms.TextBox tbRetVal;
|
|
private System.Windows.Forms.TextBox tbMenuVal;
|
|
private System.Windows.Forms.Label lblGroupText;
|
|
private System.Windows.Forms.GroupBox gbFields;
|
|
private System.Windows.Forms.Label lblInUse;
|
|
private System.Windows.Forms.Label lblAvail;
|
|
private System.Windows.Forms.ListBox lboxInUse;
|
|
private System.Windows.Forms.CheckedListBox lboxInUseCB; // C2021-026 added a checked list box for Parent/Child capabilites
|
|
private System.Windows.Forms.ListBox lboxAvail;
|
|
private System.Windows.Forms.Button btnAdd;
|
|
private System.Windows.Forms.Button btnEdit;
|
|
private System.Windows.Forms.Button btnRemove;
|
|
private System.Windows.Forms.Button btnNew;
|
|
/// <summary>
|
|
/// Required designer variable.
|
|
/// </summary>
|
|
private System.ComponentModel.Container components = null;
|
|
private RODB myrodb;
|
|
ArrayList AvailList;
|
|
private System.Windows.Forms.Button btnOK;
|
|
private System.Windows.Forms.Button btnCancel;
|
|
ArrayList InUseList;
|
|
ArrayList InUseApplcList; // C2021-026 hold the list of fields that have child values
|
|
private VlnXmlElement elem;
|
|
private uint editlevel; // flag for group definition or ro definition
|
|
private string strFieldsInUse;
|
|
private string origFieldsInUse;
|
|
private string origApplicFields;
|
|
private string origRetVal;
|
|
private string origMenuItem;
|
|
StringBuilder parseerror;
|
|
private int hi, lo;
|
|
private Label lb_chkApplc;
|
|
private int dbtype;
|
|
// C2021-026 returns true is Parent/Child info was passed into the RO Editor
|
|
public bool PCApplicabilityEnabled
|
|
{
|
|
get { return ROEditor.Form1.ApplicabilityEnabled(); }
|
|
}
|
|
|
|
// pass in Group Element
|
|
public RODefFrm(VlnXmlElement pelem, RODB rodb, string fields, string grptxt, int idbtype)
|
|
{
|
|
myrodb = rodb;
|
|
strFieldsInUse = fields;
|
|
dbtype = idbtype;
|
|
if (fields == "FieldsInUse") // not a group level edit.
|
|
editlevel = (uint) RecordType.Schema;
|
|
else
|
|
editlevel = (uint) RecordType.GroupSchema;
|
|
elem = pelem;
|
|
//
|
|
// Required for Windows Form Designer support
|
|
//
|
|
InitializeComponent();
|
|
|
|
// C2021-024 toggle which check boxes are visable based on if Parent/Child is available
|
|
if (PCApplicabilityEnabled)
|
|
{
|
|
lboxInUseCB.Visible = true;
|
|
lboxInUse.Visible = false;
|
|
lb_chkApplc.Visible = true;
|
|
}
|
|
else
|
|
{
|
|
lboxInUseCB.Visible = false;
|
|
lboxInUse.Visible = true;
|
|
lb_chkApplc.Visible = false;
|
|
}
|
|
if (editlevel == (uint)RecordType.GroupSchema) this.Text = "Subgroup Definition";
|
|
FillInData(grptxt);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Clean up any resources being used.
|
|
/// </summary>
|
|
protected override void Dispose(bool disposing)
|
|
{
|
|
if (disposing)
|
|
{
|
|
if (components != null)
|
|
{
|
|
components.Dispose();
|
|
}
|
|
}
|
|
base.Dispose(disposing);
|
|
}
|
|
|
|
private void FillInAvailable()
|
|
{
|
|
ROField rof;
|
|
|
|
// put the items in the AvailList box.
|
|
for (int i = 0; i < AvailList.Count; i++)
|
|
{
|
|
rof = (ROField)AvailList[i];
|
|
if (rof.GetFieldname != null) // DO YET: Why null?
|
|
this.lboxAvail.Items.Add(rof.GetFieldname);
|
|
}
|
|
}
|
|
// C2021-024 see if the give RO field is checked to have child values
|
|
private bool ContainedInUseApplicList(ROField rof)
|
|
{
|
|
bool isInList = false;
|
|
foreach (ROField arof in InUseApplcList)
|
|
{
|
|
if (arof.GetRecID == rof.GetRecID)
|
|
{
|
|
isInList = true;
|
|
break;
|
|
}
|
|
}
|
|
return isInList;
|
|
}
|
|
private bool _initializing = false;
|
|
|
|
private void SetUpListBoxes()
|
|
{
|
|
_initializing = true;
|
|
ROField rof;
|
|
// Get list of available fields (all fields in this type, i.e. rectype = 'Schema'
|
|
// or 'GroupSchema') and get list of inuse from the schema definition.
|
|
ArrayList tmp = myrodb.RODB_GetFields(elem, editlevel);
|
|
// put the items in the AvailList box.
|
|
if (AvailList == null) AvailList = new ArrayList();
|
|
for (int i = 0; i < tmp.Count; i++) AvailList.Add(tmp[i]); // don't modify the list returned from RODB_GetFields since it is part of dictionary
|
|
InUseList = myrodb.RODB_GetFieldsInUse(elem, AvailList, strFieldsInUse, ref origFieldsInUse, true);
|
|
// C2021-024 get the list of fields that are have P/C values turned on (fields that are checked)
|
|
InUseApplcList = myrodb.RODB_GetApplicabilityEnabledFields(elem, InUseList, ref origApplicFields, PCApplicabilityEnabled);
|
|
FillInAvailable();
|
|
|
|
// set up the listbox for inuse items.
|
|
if (InUseList != null)
|
|
{
|
|
// add items to the InUseList box.
|
|
for (int i = 0; i < InUseList.Count; i++)
|
|
{
|
|
rof = (ROField)InUseList[i];
|
|
if (rof.GetFieldname != null) //DO YET: why null?
|
|
{
|
|
// C2021-026 populate the relative In Use list base on if Parent/Child is enabled
|
|
if (PCApplicabilityEnabled)
|
|
{
|
|
this.lboxInUseCB.Items.Add(rof.GetFieldname);
|
|
if (rof.FieldTypeCanDoApplicability())
|
|
{
|
|
if (ContainedInUseApplicList(rof))
|
|
this.lboxInUseCB.SetItemCheckState(lboxInUseCB.Items.IndexOf(rof.GetFieldname), CheckState.Checked);
|
|
}
|
|
}
|
|
else
|
|
this.lboxInUse.Items.Add(rof.GetFieldname);
|
|
}
|
|
}
|
|
}
|
|
_initializing = false;
|
|
}
|
|
|
|
|
|
private void DoValueTextBoxes()
|
|
{
|
|
string menuitm, retval;
|
|
if (editlevel == (uint) RecordType.GroupSchema)
|
|
{
|
|
menuitm = elem.GetAttribute("GroupMenuItem");
|
|
this.tbRetVal.Visible = false;
|
|
this.lblRetVal.Visible = false;
|
|
VlnXmlElement parent;
|
|
parent = (VlnXmlElement) elem.ParentNode;
|
|
while (parent != null && (menuitm == ""))
|
|
{
|
|
// walk up tree to get parent and check for data there
|
|
if (menuitm == "") menuitm = parent.GetAttribute("GroupMenuItem");
|
|
if (parent.Name != "RO_Root")
|
|
parent = (VlnXmlElement) parent.ParentNode;
|
|
else
|
|
parent = null;
|
|
}
|
|
if (menuitm != "")
|
|
this.tbMenuVal.Text = CvtFldToUserFld(menuitm);
|
|
else
|
|
this.tbMenuVal.Text = "";
|
|
}
|
|
else
|
|
{
|
|
menuitm = elem.GetAttribute("MenuItem");
|
|
retval = elem.GetAttribute("RetVal");
|
|
this.tbRetVal.Visible = true;
|
|
this.lblRetVal.Visible = true;
|
|
VlnXmlElement parent;
|
|
parent = (VlnXmlElement) elem.ParentNode;
|
|
while (parent != null && (menuitm == "" || retval == ""))
|
|
{
|
|
// walk up tree to get parent and check for data there
|
|
if (menuitm == "") menuitm = parent.GetAttribute("MenuItem");
|
|
if (retval == "") retval = parent.GetAttribute("RetVal");
|
|
if (parent.Name != "RO_Root")
|
|
parent = (VlnXmlElement)parent.ParentNode;
|
|
else
|
|
parent = null;
|
|
}
|
|
if (menuitm != "")
|
|
this.tbMenuVal.Text = CvtFldToUserFld(menuitm);
|
|
else
|
|
this.tbMenuVal.Text = "";
|
|
if (retval != "")
|
|
this.tbRetVal.Text = CvtFldToUserFld(retval);
|
|
else
|
|
this.tbRetVal.Text = "";
|
|
}
|
|
}
|
|
|
|
private void FillInData(string grptxt)
|
|
{
|
|
this.lblGroupText.Text = grptxt;
|
|
DoValueTextBoxes();
|
|
SetUpListBoxes();
|
|
|
|
if (PCApplicabilityEnabled) // C2021-026 Check Box list focus event
|
|
lboxInUseCB.GotFocus += new EventHandler(this.lboxInUseCB_GotFocus);
|
|
else
|
|
lboxInUse.GotFocus += new EventHandler(this.lboxInUse_GotFocus);
|
|
|
|
lboxAvail.GotFocus += new EventHandler(this.lboxAvail_GotFocus);
|
|
|
|
lboxInUse.MouseUp += new System.Windows.Forms.MouseEventHandler(this.lboxInUse_MouseUp);
|
|
lboxInUseCB.MouseUp += new System.Windows.Forms.MouseEventHandler(this.lboxInUseCB_MouseUp);
|
|
|
|
// save copies of local data, so if there is a change, we know we must save them.
|
|
origRetVal = this.tbRetVal.Text;
|
|
origMenuItem = this.tbMenuVal.Text;
|
|
|
|
// if this is a database level definition & it's a user defined database,
|
|
// the okay button is disabled until a field is used.
|
|
if (elem.ParentNode.Name == "RO_Root" && dbtype == 3)
|
|
{
|
|
string attr;
|
|
if (editlevel == (uint)RecordType.Schema)
|
|
attr = elem.GetAttribute("FieldsInUse");
|
|
else
|
|
attr = elem.GetAttribute("GroupFieldsInUse");
|
|
if (attr == null || attr == "") btnOK.Enabled = false;
|
|
}
|
|
}
|
|
|
|
protected void lboxInUse_GotFocus(object sender, EventArgs e)
|
|
{
|
|
lboxAvail.ClearSelected();
|
|
this.btnRemove.Enabled = true;
|
|
this.btnAdd.Enabled = false;
|
|
this.btnEdit.Enabled = true;
|
|
}
|
|
protected void lboxInUseCB_GotFocus(object sender, EventArgs e)
|
|
{
|
|
lboxAvail.ClearSelected();
|
|
this.btnRemove.Enabled = true;
|
|
this.btnAdd.Enabled = false;
|
|
this.btnEdit.Enabled = true;
|
|
}
|
|
protected void lboxAvail_GotFocus(object sender, EventArgs e)
|
|
{
|
|
if (PCApplicabilityEnabled)
|
|
lboxInUseCB.ClearSelected();
|
|
else
|
|
lboxInUse.ClearSelected();
|
|
this.btnAdd.Enabled = true;
|
|
this.btnRemove.Enabled = false;
|
|
this.btnEdit.Enabled = true;
|
|
}
|
|
|
|
//CSM C2024-024
|
|
//Simple Selection of Fields to add to Return Values and Menu Values.
|
|
//Part of 2024 PROMS Upgrades
|
|
//Add Context Menu for In Use Listbox
|
|
//Will allow user to right click Selected Items
|
|
//and add then to the Return Value / Menu Value Text Boxes
|
|
//without re-typing them
|
|
protected void lboxInUse_MouseUp(object sender, MouseEventArgs e)
|
|
{
|
|
if (e.Button == MouseButtons.Right && lboxInUse.SelectedItems.Count > 0)
|
|
{
|
|
ContextMenuStrip cn = new ContextMenuStrip();
|
|
if (tbRetVal.Visible)
|
|
{
|
|
var AddToReturnItem = new ToolStripMenuItem("Add to Return Value");
|
|
AddToReturnItem.Click += new EventHandler(lboxInUse_Click);
|
|
AddToReturnItem.Name = "Add to Return Value";
|
|
cn.Items.Add(AddToReturnItem);
|
|
}
|
|
var AddToMenuItem = new ToolStripMenuItem("Add to Menu Value");
|
|
AddToMenuItem.Click += new EventHandler(lboxInUse_Click);
|
|
AddToMenuItem.Name = "Add to Menu Value";
|
|
cn.Items.Add(AddToMenuItem);
|
|
this.lboxInUse.ContextMenuStrip = cn;
|
|
cn.Show(Control.MousePosition.X, Control.MousePosition.Y);
|
|
}
|
|
}
|
|
private void lboxInUse_Click(object sender, EventArgs e)
|
|
{
|
|
switch (((ToolStripMenuItem)sender).Name)
|
|
{
|
|
case "Add to Return Value":
|
|
if (tbRetVal.Text == "")
|
|
tbRetVal.Text += $"<{lboxInUse.SelectedItem}>";
|
|
else
|
|
tbRetVal.Text += $" - <{lboxInUse.SelectedItem}>";
|
|
break;
|
|
case "Add to Menu Value":
|
|
if (tbMenuVal.Text == "")
|
|
tbMenuVal.Text += $"<{lboxInUse.SelectedItem}>";
|
|
else
|
|
tbMenuVal.Text += $" - <{lboxInUse.SelectedItem}>";
|
|
break;
|
|
|
|
}
|
|
}
|
|
|
|
//CSM C2024-024
|
|
//Simple Selection of Fields to add to Return Values and Menu Values.
|
|
//Part of 2024 PROMS Upgrades
|
|
//Add Context Menu for In Use ComboBox
|
|
//(Replaces In Use Listbox when Applicability
|
|
//to allow for selection of items per Unit)
|
|
//Will allow user to right click Selected Items
|
|
//and add then to the Return Value / Menu Value Text Boxes
|
|
//without re-typing them
|
|
protected void lboxInUseCB_MouseUp(object sender, MouseEventArgs e)
|
|
{
|
|
if (e.Button == MouseButtons.Right && lboxInUseCB.SelectedItems.Count > 0)
|
|
{
|
|
ContextMenuStrip cn = new ContextMenuStrip();
|
|
if (tbRetVal.Visible)
|
|
{
|
|
var AddToReturnItem = new ToolStripMenuItem("Add to Return Value");
|
|
AddToReturnItem.Click += new EventHandler(lboxInUseCB_Click);
|
|
AddToReturnItem.Name = "Add to Return Value";
|
|
cn.Items.Add(AddToReturnItem);
|
|
}
|
|
var AddToMenuItem = new ToolStripMenuItem("Add to Menu Value");
|
|
AddToMenuItem.Click += new EventHandler(lboxInUseCB_Click);
|
|
AddToMenuItem.Name = "Add to Menu Value";
|
|
cn.Items.Add(AddToMenuItem);
|
|
this.lboxInUseCB.ContextMenuStrip = cn;
|
|
cn.Show(Control.MousePosition.X, Control.MousePosition.Y);
|
|
}
|
|
}
|
|
private void lboxInUseCB_Click(object sender, EventArgs e)
|
|
{
|
|
switch (((ToolStripMenuItem)sender).Name)
|
|
{
|
|
case "Add to Return Value":
|
|
if (tbRetVal.Text == "")
|
|
tbRetVal.Text += $"<{lboxInUseCB.SelectedItem}>";
|
|
else
|
|
tbRetVal.Text += $" - <{lboxInUseCB.SelectedItem}>";
|
|
break;
|
|
case "Add to Menu Value":
|
|
if (tbMenuVal.Text == "")
|
|
tbMenuVal.Text += $"<{lboxInUseCB.SelectedItem}>";
|
|
else
|
|
tbMenuVal.Text += $" - <{lboxInUseCB.SelectedItem}>";
|
|
break;
|
|
|
|
}
|
|
}
|
|
|
|
private void btnRemove_Click(object sender, System.EventArgs e)
|
|
{
|
|
//get item in lboxInUse (in use list) and remove it from there
|
|
// and add it to the lboxAvail list.
|
|
if (PCApplicabilityEnabled) // C2021-026 use the Check Box list
|
|
{
|
|
if (lboxInUseCB.SelectedIndex >= 0)
|
|
{
|
|
// get the selected item and its string. Remove it from the listbox,
|
|
// add it to the available array list & listbox & then remove it from
|
|
// the inuse array list.
|
|
int indx = lboxInUseCB.SelectedIndex;
|
|
lboxInUseCB.Items.RemoveAt(indx);
|
|
|
|
// copy if over to availlist
|
|
ROField rof = (ROField)InUseList[indx];
|
|
ROField copyrof = new ROField(rof.GetFieldname, rof.GetRecID, rof.GetMasterRecID, rof.GetFieldType);
|
|
AvailList.Add(copyrof);
|
|
|
|
lboxAvail.Items.Add(CvtFldToUserFld(copyrof.GetFieldname));
|
|
InUseList.RemoveAt(indx);
|
|
if (InUseApplcList.Contains(rof)) // C2021-026 remove from the field applicability list
|
|
InUseApplcList.Remove(rof);
|
|
lboxAvail.Refresh();
|
|
lboxInUseCB.Refresh();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (lboxInUse.SelectedIndex >= 0)
|
|
{
|
|
// get the selected item and its string. Remove it from the listbox,
|
|
// add it to the available array list & listbox & then remove it from
|
|
// the inuse array list.
|
|
int indx = lboxInUse.SelectedIndex;
|
|
lboxInUse.Items.RemoveAt(indx);
|
|
|
|
// copy if over to availlist
|
|
ROField rof = (ROField)InUseList[indx];
|
|
ROField copyrof = new ROField(rof.GetFieldname, rof.GetRecID, rof.GetMasterRecID, rof.GetFieldType);
|
|
AvailList.Add(copyrof);
|
|
|
|
lboxAvail.Items.Add(CvtFldToUserFld(copyrof.GetFieldname));
|
|
InUseList.RemoveAt(indx);
|
|
if (InUseApplcList.Contains(rof)) // C2021-026 remove from the field applicability list
|
|
InUseApplcList.Remove(rof);
|
|
lboxAvail.Refresh();
|
|
lboxInUse.Refresh();
|
|
}
|
|
}
|
|
}
|
|
private void btnAdd_Click(object sender, System.EventArgs e)
|
|
{
|
|
//get item in lboxInUse (in use list) and remove it from there
|
|
// and add it to the lboxAvail list.
|
|
if (PCApplicabilityEnabled) // C2021-026 using the Check Box List
|
|
{
|
|
if (lboxAvail.SelectedIndex >= 0)
|
|
{
|
|
// get the selected item and its string. Remove it from the listbox,
|
|
// add it to the inuse array list & listbox & then remove it from
|
|
// the avail(able) array list.
|
|
int indx = lboxAvail.SelectedIndex;
|
|
lboxAvail.Items.RemoveAt(indx);
|
|
|
|
// copy if over to availlist
|
|
ROField rof = (ROField)AvailList[indx];
|
|
ROField copyrof = new ROField(rof.GetFieldname, rof.GetRecID, rof.GetMasterRecID, rof.GetFieldType);
|
|
InUseList.Add(copyrof);
|
|
|
|
lboxInUseCB.Items.Add(CvtFldToUserFld(copyrof.GetFieldname));
|
|
AvailList.RemoveAt(indx);
|
|
lboxAvail.Refresh();
|
|
lboxInUseCB.Refresh();
|
|
btnOK.Enabled = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (lboxAvail.SelectedIndex >= 0)
|
|
{
|
|
// get the selected item and its string. Remove it from the listbox,
|
|
// add it to the inuse array list & listbox & then remove it from
|
|
// the avail(able) array list.
|
|
int indx = lboxAvail.SelectedIndex;
|
|
lboxAvail.Items.RemoveAt(indx);
|
|
|
|
// copy if over to availlist
|
|
ROField rof = (ROField)AvailList[indx];
|
|
ROField copyrof = new ROField(rof.GetFieldname, rof.GetRecID, rof.GetMasterRecID, rof.GetFieldType);
|
|
InUseList.Add(copyrof);
|
|
|
|
lboxInUse.Items.Add(CvtFldToUserFld(copyrof.GetFieldname));
|
|
AvailList.RemoveAt(indx);
|
|
lboxAvail.Refresh();
|
|
lboxInUse.Refresh();
|
|
btnOK.Enabled = true;
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
private void syntax(string prob,int start, int end)
|
|
{
|
|
lo=start;
|
|
hi=end;
|
|
parseerror.Append("Invalid Syntax - ");
|
|
parseerror.Append(prob);
|
|
}
|
|
|
|
private void missingDelimiter(char chr,int start,int end)
|
|
{
|
|
lo=start;
|
|
hi=end;
|
|
string delim = "{}{<><";
|
|
int delindx;
|
|
delindx = delim.IndexOf(chr,0);
|
|
parseerror.Append("Couldn't find matching ");
|
|
if (delindx >-1)
|
|
parseerror.Append(delim.Substring(delindx,1));
|
|
else
|
|
parseerror.Append("?");
|
|
}
|
|
private bool isWhiteSpace(char chr)
|
|
{
|
|
return(chr!=0 && " \t\n\r".IndexOf(chr)!=-1);
|
|
}
|
|
private int endsIn(char chr, string str, int start, int end)
|
|
{
|
|
while(start <= end && isWhiteSpace(str[end]))end--;
|
|
if(start <= end && str[end]==chr)return 1;
|
|
return 0;
|
|
}
|
|
|
|
private void processBrace(string str, int start, int end)
|
|
{
|
|
int where=str.IndexOfAny("<>{}=".ToCharArray(),start,end-start);
|
|
if(where!=0)
|
|
{
|
|
char chr=str[where];
|
|
switch(chr)
|
|
{
|
|
case '{':
|
|
// verify that this ends in a }
|
|
if(endsIn('}',str,where,end)==0)
|
|
{
|
|
syntax("should end with }",where,end);
|
|
}
|
|
break;
|
|
case '<':
|
|
syntax("< not permitted here",where,where);
|
|
break;
|
|
case '}':
|
|
syntax("} not permitted here",start,where);
|
|
break;
|
|
case '>':
|
|
syntax("> not permitted here",start,where);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
private int findMatchingBrace(string str, int start, int end)
|
|
{
|
|
int where=start+1;
|
|
int last=where;
|
|
int termlevel=1;
|
|
while(hi==0 && where <= end && termlevel!=0)
|
|
{
|
|
char chr=str[where];
|
|
switch (chr)
|
|
{
|
|
case '{':
|
|
where=findMatchingBrace(str,where,end);
|
|
where++;
|
|
break;
|
|
case '}':
|
|
termlevel=0;
|
|
break;
|
|
case '>':
|
|
missingDelimiter(chr,last,where);
|
|
break;
|
|
case '<':
|
|
int next;
|
|
next=str.IndexOfAny("{}<>".ToCharArray(),where+1,end-where);
|
|
if(next==0)
|
|
{
|
|
missingDelimiter(chr,last,end);
|
|
}
|
|
else if(str[next]!='>')
|
|
{
|
|
missingDelimiter(chr,last,next);
|
|
}
|
|
else
|
|
{
|
|
last=where=next+1;
|
|
}
|
|
break;
|
|
default:
|
|
where++;
|
|
break;
|
|
}
|
|
}
|
|
if(hi==0 && termlevel!=0)
|
|
{
|
|
missingDelimiter('{',start,end);
|
|
}
|
|
return where;
|
|
}
|
|
|
|
private bool ValidReturnFieldSpec(string str, int start, int end)
|
|
{
|
|
if (parseerror != null)
|
|
parseerror.Remove(0,parseerror.Length);
|
|
else
|
|
parseerror = new StringBuilder();
|
|
int where=start;
|
|
int last=start;
|
|
hi=lo=0;
|
|
while(hi==0 && where <= end)
|
|
{
|
|
char chr=str[where];
|
|
switch (chr)
|
|
{
|
|
case '{':
|
|
int next;
|
|
next=findMatchingBrace(str,where,end);
|
|
if(hi==0)
|
|
{
|
|
processBrace(str,where+1,next-1);
|
|
where=next+1;
|
|
last=where;
|
|
}
|
|
break;
|
|
case '}':
|
|
missingDelimiter(chr,last,where);
|
|
break;
|
|
case '>':
|
|
missingDelimiter(chr,last,where);
|
|
break;
|
|
case '<':
|
|
int strt=where+1;
|
|
where = str.IndexOfAny("<>{}".ToCharArray(),where+1,end-where);
|
|
if (where==0)
|
|
missingDelimiter('<',start,end);
|
|
else if (str[where]=='>')
|
|
{
|
|
string inusename = str.Substring(strt,where-strt);
|
|
// now check field name.
|
|
bool found = false;
|
|
string rofname;
|
|
for (int i=0; i<InUseList.Count; i++)
|
|
{
|
|
ROField rof = (ROField) InUseList[i];
|
|
rofname = rof.GetFieldname;
|
|
if (inusename == rofname || inusename == CvtFldToUserFld(rofname))
|
|
{
|
|
found = true;
|
|
break;
|
|
}
|
|
}
|
|
if (found == false)syntax(inusename+" invalid field name",strt,where);
|
|
// used to have procini def stuff here.
|
|
start=where+1;
|
|
where++;
|
|
}
|
|
else
|
|
missingDelimiter('<',start,where);
|
|
break;
|
|
default:
|
|
where++;
|
|
break;
|
|
}
|
|
}
|
|
if (parseerror.Length>0)
|
|
{
|
|
MessageBox.Show(parseerror.ToString(),"Error in validating return value");
|
|
return false;
|
|
}
|
|
else
|
|
return true;
|
|
}
|
|
|
|
private bool ValidFieldSpec(string field)
|
|
{
|
|
int left = field.IndexOf("<");
|
|
int right;
|
|
int stindx = 0;
|
|
while (left != -1)
|
|
{
|
|
// get right bracket and then check for valid field & if commas with
|
|
// this, check for integer values.
|
|
right = field.IndexOf(">",stindx);
|
|
if (right == -1)
|
|
{
|
|
MessageBox.Show("Missing > in Menu value.");
|
|
return false;
|
|
}
|
|
string substring = field.Substring(left+1,right-left-1);
|
|
// do comma parts now.
|
|
string inusename;
|
|
int comma1 = substring.IndexOf(",");
|
|
if (comma1 != -1)
|
|
{
|
|
// get any numbers for formatting & check for ints.
|
|
int comma2 = substring.IndexOf(",",comma1+1);
|
|
if (comma2 != -1) // two ints.
|
|
{
|
|
if (comma2-comma1 > 1) // first format field - not empty
|
|
{
|
|
string int1 = substring.Substring(comma1+1,comma2-comma1-1);
|
|
try
|
|
{
|
|
int l = System.Convert.ToInt32(int1);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
MessageBox.Show(e.Message,"invalid format number");
|
|
return false;
|
|
}
|
|
}
|
|
if (comma2<substring.Length) // second part - not empty
|
|
{
|
|
string int2 = substring.Substring(comma2+1,substring.Length-comma2-1);
|
|
try
|
|
{
|
|
int l = System.Convert.ToInt32(int2);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
MessageBox.Show(e.Message,"invalid format number");
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
else // just one format
|
|
{
|
|
string int1 = substring.Substring(comma1,comma2-comma1);
|
|
try
|
|
{
|
|
int l = System.Convert.ToInt32(int1);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
MessageBox.Show(e.Message,"invalid format number");
|
|
return false;
|
|
}
|
|
}
|
|
inusename = substring.Substring(0,comma1);
|
|
}
|
|
else // no commas, it's just a field name.
|
|
inusename = substring;
|
|
|
|
// now check field name.
|
|
bool found = false;
|
|
string rofname;
|
|
for (int i=0; i<InUseList.Count; i++)
|
|
{
|
|
ROField rof = (ROField) InUseList[i];
|
|
rofname = rof.GetFieldname;
|
|
if (inusename == rofname || inusename == CvtFldToUserFld(rofname))
|
|
{
|
|
found = true;
|
|
break;
|
|
}
|
|
}
|
|
if (found == false)
|
|
{
|
|
MessageBox.Show("Menu Value not in In Use field list");
|
|
return false;
|
|
}
|
|
if (left>field.Length)
|
|
left = -1;
|
|
else
|
|
{
|
|
stindx=right+1;
|
|
left = field.IndexOf("<",left+1);
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
private bool ProcessRROMenuChange(VlnXmlElement mnuele, string newtmpl)
|
|
{
|
|
bool success;
|
|
XmlNode chldnode = (XmlNode) mnuele.FirstChild;
|
|
VlnXmlElement echild;
|
|
while (chldnode != null)
|
|
{
|
|
if (chldnode is VlnXmlElement)
|
|
{
|
|
echild = (VlnXmlElement) chldnode;
|
|
if (echild.Name != "vlnGroup")
|
|
{
|
|
// If this is a group defintion subtree it will only have one
|
|
// child, which is the text definition for the subgroup. Don't
|
|
// include these in the tree.
|
|
int levelCnt = chldnode.ChildNodes.Count;
|
|
string TheMenuTitle = echild.GetAttribute("MenuTitle");
|
|
if ((levelCnt >= 1) && !TheMenuTitle.Equals(""))
|
|
{
|
|
string mnustring = echild.GetMenuString(newtmpl,false);
|
|
echild.SetAttribute("MenuTitle",mnustring);
|
|
success = myrodb.RODB_WriteRO(echild);
|
|
if (success==false) return false;
|
|
}
|
|
}
|
|
}
|
|
chldnode = chldnode.NextSibling;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private bool UpdateMenuTitles(VlnXmlElement mnuele, string newtmpl, string stredittype, VlnStatusMessage StatMsgWindow)
|
|
{
|
|
// For this group and below in the xml tree, update menu titles using the new
|
|
// template.
|
|
bool success;
|
|
string haskids;
|
|
string kidsloaded;
|
|
XmlNode node = (XmlNode) mnuele.FirstChild;
|
|
VlnXmlElement child;
|
|
|
|
while (node != null)
|
|
{
|
|
if (node is VlnXmlElement)
|
|
{
|
|
child = (VlnXmlElement) node;
|
|
|
|
// If this is a group menu edit, process group nodes, otherwise
|
|
// process rros. For both, when hitting a group node, check that
|
|
// it doesn't have a menu item string redefining the menu template.
|
|
|
|
if (child.Name == "vlnGroup" && child.HasAttribute(stredittype) == false)
|
|
{
|
|
haskids = child.GetAttribute("HasChild");
|
|
kidsloaded = child.GetAttribute("ChildLoaded");
|
|
if (haskids == "True" && kidsloaded == "False" )
|
|
{
|
|
myrodb.RODB_GetChildData(child,true);
|
|
child.SetAttribute("ChildLoaded","True");
|
|
}
|
|
StatMsgWindow.StatusMessage = child.GetAttribute("MenuTitle");
|
|
success = UpdateMenuTitles(child,newtmpl, stredittype, StatMsgWindow);
|
|
if (success == false) return false;
|
|
|
|
if (editlevel == (uint) RecordType.Schema)
|
|
{
|
|
success = ProcessRROMenuChange(mnuele, newtmpl);
|
|
if (success==false)return false;
|
|
}
|
|
else if (editlevel == (uint) RecordType.GroupSchema)
|
|
{
|
|
string mnustring = child.GetMenuString(newtmpl,true);
|
|
child.SetAttribute("MenuTitle",mnustring);
|
|
success = myrodb.RODB_WriteGroup(child,child);
|
|
if (success==false) return false;
|
|
}
|
|
}
|
|
}
|
|
node = node.NextSibling;
|
|
}
|
|
// if doing RO menu updates, do all at the current level, otherwise, skip it
|
|
// because it is a group menu item.
|
|
if (stredittype == "MenuItem")
|
|
{
|
|
success = ProcessRROMenuChange(mnuele, newtmpl);
|
|
if (success==false) return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private string CvtUserFldToFld(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;
|
|
}
|
|
|
|
private string CvtFldToUserFld(string fldname)
|
|
{
|
|
string tmpstr0;
|
|
if (fldname.Length < 2) return fldname;
|
|
// an xml element name cannot begin with a digit. we had prepended a "__"
|
|
if (fldname.Substring(0,2) == "__" && char.IsDigit(fldname,2))
|
|
tmpstr0 = fldname.Substring(2,fldname.Length-2);
|
|
else
|
|
tmpstr0 = fldname;
|
|
// an xml element name cannot have a space, we converted to a "__"
|
|
string tmpstr = tmpstr0.Replace("__"," ");
|
|
int len = tmpstr.Length;
|
|
int cur = 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, indx;
|
|
if (tmpstr.Length <6)
|
|
indx = -1;
|
|
else
|
|
indx=tmpstr.IndexOf(OKpunch,cur);
|
|
string asc_spchar;
|
|
while (indx>=0)
|
|
{
|
|
outstr += tmpstr.Substring(cur,indx-cur);
|
|
asc_spchar = tmpstr.Substring(indx+3,3);
|
|
decval = System.Convert.ToInt16(asc_spchar,10);
|
|
outstr += System.Convert.ToChar(decval).ToString();
|
|
cur = indx+6;
|
|
if (cur+6 > len)
|
|
indx = -1;
|
|
else
|
|
indx = tmpstr.IndexOf(OKpunch,cur);
|
|
}
|
|
if (cur<len) outstr += tmpstr.Substring(cur,len-cur);
|
|
|
|
return outstr;
|
|
}
|
|
|
|
|
|
private void btnOK_Click(object sender, System.EventArgs e)
|
|
{
|
|
// Check if data has changed and if so, write it out.
|
|
// Set all of the attributes/data in the passed in VlnXmlElement & then use
|
|
// the database methods to send it to the database.
|
|
|
|
// First check for validity of Return value and Menu value.
|
|
// return value: be sure it's a valid string representing a field
|
|
bool valid;
|
|
if (origRetVal != this.tbRetVal.Text)
|
|
{
|
|
valid = ValidReturnFieldSpec(this.tbRetVal.Text,0,this.tbRetVal.Text.Length-1);
|
|
if (valid == false) return;
|
|
}
|
|
if (origMenuItem != this.tbMenuVal.Text)
|
|
{
|
|
valid = ValidFieldSpec(this.tbMenuVal.Text);
|
|
if (valid == false) return;
|
|
}
|
|
|
|
// save the inuse recs in the inuse attribute.
|
|
string origfields = origFieldsInUse;
|
|
string inuserecs=null;
|
|
ROField rof;
|
|
for (int i=0; i< InUseList.Count; i++)
|
|
{
|
|
rof = (ROField) InUseList[i];
|
|
if (rof.GetFieldname != null) //DO YET: why null?
|
|
{
|
|
inuserecs = inuserecs + rof.GetRecID;
|
|
if (i+1 < InUseList.Count) inuserecs = inuserecs + " ";
|
|
}
|
|
}
|
|
// C2021-026 save the fields with applicability set
|
|
string applicfieldrecs = null;
|
|
for (int i = 0; i < InUseApplcList.Count; i++)
|
|
{
|
|
rof = (ROField)InUseApplcList[i];
|
|
if (rof.GetFieldname != null)
|
|
{
|
|
applicfieldrecs = applicfieldrecs + rof.GetRecID;
|
|
if (i + 1 < InUseApplcList.Count) applicfieldrecs = applicfieldrecs + " ";
|
|
}
|
|
}
|
|
|
|
// save the database record, saving modified data as appropriate -- if a mod
|
|
// occurred at this level, add it to the attribute list too.
|
|
|
|
// also, if the menu item template changed, we need to spin thru all of the menu title strings
|
|
// from here down (either RO's if editlevel is Schema, or Group's if editlevel is
|
|
// GroupSchema).
|
|
string dotemplatechange = null;
|
|
bool mod = false;
|
|
if (editlevel == (uint) RecordType.Schema)
|
|
{
|
|
if (this.tbRetVal.Text != origRetVal)
|
|
{
|
|
mod = true;
|
|
elem.SetAttribute("RetVal",CvtUserFldToFld(this.tbRetVal.Text));
|
|
}
|
|
if (this.tbMenuVal.Text != origMenuItem)
|
|
{
|
|
mod = true;
|
|
// there may be 'spaces' in the template - don't do replace.(" ","_");
|
|
elem.SetAttribute("MenuItem",this.tbMenuVal.Text);
|
|
dotemplatechange = "MenuItem";
|
|
}
|
|
if (inuserecs != origFieldsInUse)
|
|
{
|
|
elem.SetAttribute("FieldsInUse", inuserecs);
|
|
mod = true;
|
|
}
|
|
//C2021-026 save the list of field recids that use applicability
|
|
if (applicfieldrecs != origApplicFields)
|
|
{
|
|
elem.SetAttribute("ApplicabilityEnabled", applicfieldrecs);
|
|
mod = true;
|
|
}
|
|
}
|
|
|
|
if (editlevel == (uint) RecordType.GroupSchema)
|
|
{
|
|
if (this.tbMenuVal.Text != origMenuItem)
|
|
{
|
|
mod = true;
|
|
// there may be 'spaces' in the template - don't do replace.(" ","_");
|
|
elem.SetAttribute("GroupMenuItem",this.tbMenuVal.Text);
|
|
dotemplatechange = "GroupMenuItem";
|
|
}
|
|
if (inuserecs != origFieldsInUse)
|
|
{
|
|
elem.SetAttribute("GroupFieldsInUse", inuserecs);
|
|
mod = true;
|
|
}
|
|
}
|
|
|
|
if (mod == true)
|
|
{
|
|
bool success = myrodb.RODB_WriteRO(elem);
|
|
if (dotemplatechange!=null)
|
|
{
|
|
Cursor.Current = Cursors.WaitCursor;
|
|
VlnStatusMessage StatMsgWindow = new VlnStatusMessage("Status of Menu Title Change");
|
|
success = UpdateMenuTitles(elem, this.tbMenuVal.Text, dotemplatechange, StatMsgWindow);
|
|
StatMsgWindow.Dispose();
|
|
elem.SetAttribute("TreeNotData","True");
|
|
Cursor.Current = Cursors.Default;
|
|
}
|
|
|
|
|
|
// if an RO defintion, reload schema. Don't bother to reload Group schema
|
|
// since it's rarely used.
|
|
if (editlevel == (uint) RecordType.Schema)
|
|
{
|
|
XmlSchema myschema;
|
|
VlnXmlElement parent;
|
|
parent = (VlnXmlElement) elem;
|
|
while (parent != null)
|
|
{
|
|
if (parent.HasAttribute("Schema") == true) break;
|
|
if (parent.HasAttribute("FieldsInUse") == true) break;
|
|
parent = (VlnXmlElement) parent.ParentNode;
|
|
}
|
|
// if a schema has been read in, delete it and reread it.
|
|
if (parent.HasAttribute("Schema"))
|
|
{
|
|
// delete this attribute because we'll reread it in.
|
|
parent.RemoveAttribute("Schema");
|
|
myschema = myrodb.RODB_GetSchema(elem);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
private void btnEdit_Click(object sender, System.EventArgs e)
|
|
{
|
|
ROField rof;
|
|
bool isInSelList = true;
|
|
// Get the field which is active & it's type. Pass the field through to the field
|
|
// editor.
|
|
int indx;
|
|
// C2021-026 get the selected index base on wich InUse list is being used
|
|
indx = (PCApplicabilityEnabled)? lboxInUseCB.SelectedIndex : lboxInUse.SelectedIndex;
|
|
if (indx >= 0)
|
|
rof = (ROField) InUseList[indx];
|
|
else
|
|
{
|
|
isInSelList = false;
|
|
indx = lboxAvail.SelectedIndex;
|
|
if (indx >= 0)
|
|
rof = (ROField) AvailList[indx];
|
|
else
|
|
{
|
|
// message - bad one.
|
|
return;
|
|
}
|
|
}
|
|
|
|
string origname = CvtFldToUserFld(rof.GetFieldname);
|
|
uint ftype = rof.GetFieldType;
|
|
if (ftype == (uint)FieldTypes.FrmtSingleTxt || ftype == (uint)FieldTypes.VariableTxt ||
|
|
ftype == (uint)FieldTypes.SingleTxt || ftype == (uint)FieldTypes.Table ||
|
|
ftype == (uint)FieldTypes.XYPlot || ftype == (uint)FieldTypes.Image)
|
|
|
|
{
|
|
FieldTypeDefFrm nwtyp = new FieldTypeDefFrm(rof, myrodb, elem, editlevel, AvailList, InUseList);
|
|
nwtyp.ShowDialog();
|
|
}
|
|
else
|
|
{
|
|
FieldCombFrm nwcomb = new FieldCombFrm(rof, myrodb, elem, editlevel, rof.GetFieldname, AvailList, InUseList);
|
|
nwcomb.ShowDialog();
|
|
}
|
|
|
|
//need to refresh pull from table for fields in use.
|
|
_ = myrodb.RODB_GetFields(elem, 0, true);
|
|
string newname = CvtFldToUserFld(rof.GetFieldname);
|
|
|
|
// Update Lists & Text boxes to represent any modified text.
|
|
if (isInSelList)
|
|
{
|
|
if (PCApplicabilityEnabled)
|
|
lboxInUseCB.Items.Clear();
|
|
else
|
|
lboxInUse.Items.Clear();
|
|
// add items to the InUseList box.
|
|
for (int i=0; i< InUseList.Count; i++)
|
|
{
|
|
rof = (ROField) InUseList[i];
|
|
if (rof.GetFieldname != null)
|
|
{
|
|
string fieldname = CvtFldToUserFld(rof.GetFieldname);
|
|
|
|
// C2021-026 if doing Parent/Child enabled RO Editor, put the In Use fields in the Check Box List instead of the normal list
|
|
if (PCApplicabilityEnabled)
|
|
{
|
|
this.lboxInUseCB.Items.Add(fieldname);
|
|
if (rof.FieldTypeCanDoApplicability())
|
|
{
|
|
if (ContainedInUseApplicList(rof))
|
|
this.lboxInUseCB.SetItemCheckState(lboxInUseCB.Items.IndexOf(fieldname), CheckState.Checked);
|
|
}
|
|
}
|
|
else
|
|
this.lboxInUse.Items.Add(fieldname);
|
|
}
|
|
}
|
|
|
|
if (origname != newname)
|
|
{
|
|
tbMenuVal.Text = tbMenuVal.Text.Replace($"<{origname}>", $"<{newname}>");
|
|
tbRetVal.Text = tbRetVal.Text.Replace($"<{origname}>", $"<{newname}>");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
lboxAvail.Items.Clear();
|
|
// add items to the AvailList box.
|
|
for (int i=0; i< AvailList.Count; i++)
|
|
{
|
|
rof = (ROField) AvailList[i];
|
|
if (rof.GetFieldname != null)
|
|
this.lboxAvail.Items.Add(CvtFldToUserFld(rof.GetFieldname));
|
|
}
|
|
}
|
|
}
|
|
|
|
private void btnNew_Click(object sender, System.EventArgs e)
|
|
{
|
|
ROField rof = new ROField(null,null,null,0);
|
|
FieldTypeDefFrm nwtyp = new FieldTypeDefFrm(rof, myrodb, elem, editlevel, AvailList, InUseList);
|
|
nwtyp.ShowDialog();
|
|
|
|
if (rof.GetFieldname != null)
|
|
{
|
|
AvailList.Add(rof);
|
|
lboxAvail.Items.Add(CvtFldToUserFld(rof.GetFieldname));
|
|
}
|
|
|
|
//need to refresh pull from table for fields in use.
|
|
_ = myrodb.RODB_GetFields(elem, 0, true);
|
|
}
|
|
// C2021-026 Check/un-check field for Parent/Child values
|
|
private void lboxInUseCB_ItemCheck(object sender, ItemCheckEventArgs e)
|
|
{
|
|
if (_initializing) return;
|
|
ROField rof = (ROField)InUseList[e.Index];
|
|
bool isInAplicList = ContainedInUseApplicList(rof);
|
|
if (!rof.FieldTypeCanDoApplicability())
|
|
{
|
|
MessageBox.Show("Cannot Enable Applicability on this RO Field type.", "Enable Applicabilty", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
e.NewValue = CheckState.Unchecked;
|
|
}
|
|
else if (e.NewValue == CheckState.Checked) //we are going to check it - add tothe applic list
|
|
{
|
|
if (!isInAplicList) // make sure it's not already in the list (this should never happen)
|
|
InUseApplcList.Add(rof);
|
|
}
|
|
else if (isInAplicList) // we are un-checking it. Remove it from the applic list
|
|
{
|
|
for (int i = 0; i < InUseApplcList.Count; i++)
|
|
if ((InUseApplcList[i] as ROField).GetRecID == rof.GetRecID)
|
|
{
|
|
InUseApplcList.RemoveAt(i);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
#region Windows Form Designer generated code
|
|
/// <summary>
|
|
/// Required method for Designer support - do not modify
|
|
/// the contents of this method with the code editor.
|
|
/// </summary>
|
|
private void InitializeComponent()
|
|
{
|
|
this.lblGroup = new System.Windows.Forms.Label();
|
|
this.lblRetVal = new System.Windows.Forms.Label();
|
|
this.lblMenuVal = new System.Windows.Forms.Label();
|
|
this.tbRetVal = new System.Windows.Forms.TextBox();
|
|
this.tbMenuVal = new System.Windows.Forms.TextBox();
|
|
this.lblGroupText = new System.Windows.Forms.Label();
|
|
this.gbFields = new System.Windows.Forms.GroupBox();
|
|
this.lb_chkApplc = new System.Windows.Forms.Label();
|
|
this.btnNew = new System.Windows.Forms.Button();
|
|
this.btnRemove = new System.Windows.Forms.Button();
|
|
this.btnEdit = new System.Windows.Forms.Button();
|
|
this.btnAdd = new System.Windows.Forms.Button();
|
|
this.lboxAvail = new System.Windows.Forms.ListBox();
|
|
this.lboxInUse = new System.Windows.Forms.ListBox();
|
|
this.lboxInUseCB = new System.Windows.Forms.CheckedListBox(); // C2021-026 list with check boxes to enable P/C on field
|
|
this.lblAvail = new System.Windows.Forms.Label();
|
|
this.lblInUse = new System.Windows.Forms.Label();
|
|
this.btnOK = new System.Windows.Forms.Button();
|
|
this.btnCancel = new System.Windows.Forms.Button();
|
|
this.gbFields.SuspendLayout();
|
|
this.SuspendLayout();
|
|
//
|
|
// lblGroup
|
|
//
|
|
this.lblGroup.Location = new System.Drawing.Point(24, 0);
|
|
this.lblGroup.Name = "lblGroup";
|
|
this.lblGroup.Size = new System.Drawing.Size(88, 16);
|
|
this.lblGroup.TabIndex = 0;
|
|
this.lblGroup.Text = "Group:";
|
|
this.lblGroup.TextAlign = System.Drawing.ContentAlignment.TopRight;
|
|
//
|
|
// lblRetVal
|
|
//
|
|
this.lblRetVal.Location = new System.Drawing.Point(16, 32);
|
|
this.lblRetVal.Name = "lblRetVal";
|
|
this.lblRetVal.Size = new System.Drawing.Size(96, 16);
|
|
this.lblRetVal.TabIndex = 1;
|
|
this.lblRetVal.Text = "Return Value:";
|
|
this.lblRetVal.TextAlign = System.Drawing.ContentAlignment.TopRight;
|
|
//
|
|
// lblMenuVal
|
|
//
|
|
this.lblMenuVal.Location = new System.Drawing.Point(16, 64);
|
|
this.lblMenuVal.Name = "lblMenuVal";
|
|
this.lblMenuVal.Size = new System.Drawing.Size(96, 16);
|
|
this.lblMenuVal.TabIndex = 2;
|
|
this.lblMenuVal.Text = "Menu Value:";
|
|
this.lblMenuVal.TextAlign = System.Drawing.ContentAlignment.TopRight;
|
|
//
|
|
// tbRetVal
|
|
//
|
|
this.tbRetVal.Location = new System.Drawing.Point(120, 32);
|
|
this.tbRetVal.Name = "tbRetVal";
|
|
this.tbRetVal.Size = new System.Drawing.Size(464, 22);
|
|
this.tbRetVal.TabIndex = 4;
|
|
this.tbRetVal.Text = "textBox1";
|
|
//
|
|
// tbMenuVal
|
|
//
|
|
this.tbMenuVal.Location = new System.Drawing.Point(120, 64);
|
|
this.tbMenuVal.Name = "tbMenuVal";
|
|
this.tbMenuVal.Size = new System.Drawing.Size(464, 22);
|
|
this.tbMenuVal.TabIndex = 5;
|
|
this.tbMenuVal.Text = "textBox1";
|
|
//
|
|
// lblGroupText
|
|
//
|
|
this.lblGroupText.Location = new System.Drawing.Point(120, 0);
|
|
this.lblGroupText.Name = "lblGroupText";
|
|
this.lblGroupText.Size = new System.Drawing.Size(464, 16);
|
|
this.lblGroupText.TabIndex = 7;
|
|
this.lblGroupText.Text = "label1";
|
|
//
|
|
// gbFields
|
|
//
|
|
this.gbFields.Controls.Add(this.lb_chkApplc);
|
|
this.gbFields.Controls.Add(this.btnNew);
|
|
this.gbFields.Controls.Add(this.btnRemove);
|
|
this.gbFields.Controls.Add(this.btnEdit);
|
|
this.gbFields.Controls.Add(this.btnAdd);
|
|
this.gbFields.Controls.Add(this.lboxAvail);
|
|
this.gbFields.Controls.Add(this.lboxInUse);
|
|
this.gbFields.Controls.Add(this.lboxInUseCB);
|
|
this.gbFields.Controls.Add(this.lblAvail);
|
|
this.gbFields.Controls.Add(this.lblInUse);
|
|
this.gbFields.Location = new System.Drawing.Point(8, 112);
|
|
this.gbFields.Name = "gbFields";
|
|
this.gbFields.Size = new System.Drawing.Size(704, 247);
|
|
this.gbFields.TabIndex = 8;
|
|
this.gbFields.TabStop = false;
|
|
this.gbFields.Text = "Fields";
|
|
//
|
|
// lb_chkApplc
|
|
//
|
|
this.lb_chkApplc.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
|
this.lb_chkApplc.Location = new System.Drawing.Point(69, 24);
|
|
this.lb_chkApplc.Name = "lb_chkApplc";
|
|
this.lb_chkApplc.Size = new System.Drawing.Size(227, 16);
|
|
this.lb_chkApplc.TabIndex = 8;
|
|
this.lb_chkApplc.Text = "(Check Parent/Child Applicability Fields)";
|
|
//
|
|
// btnNew
|
|
//
|
|
this.btnNew.Location = new System.Drawing.Point(608, 48);
|
|
this.btnNew.Name = "btnNew";
|
|
this.btnNew.Size = new System.Drawing.Size(80, 24);
|
|
this.btnNew.TabIndex = 7;
|
|
this.btnNew.Text = "New...";
|
|
this.btnNew.Click += new System.EventHandler(this.btnNew_Click);
|
|
//
|
|
// btnRemove
|
|
//
|
|
this.btnRemove.Enabled = false;
|
|
this.btnRemove.Location = new System.Drawing.Point(272, 144);
|
|
this.btnRemove.Name = "btnRemove";
|
|
this.btnRemove.Size = new System.Drawing.Size(80, 24);
|
|
this.btnRemove.TabIndex = 6;
|
|
this.btnRemove.Text = "Remove>>";
|
|
this.btnRemove.Click += new System.EventHandler(this.btnRemove_Click);
|
|
//
|
|
// btnEdit
|
|
//
|
|
this.btnEdit.Enabled = false;
|
|
this.btnEdit.Location = new System.Drawing.Point(272, 96);
|
|
this.btnEdit.Name = "btnEdit";
|
|
this.btnEdit.Size = new System.Drawing.Size(80, 24);
|
|
this.btnEdit.TabIndex = 5;
|
|
this.btnEdit.Text = "Edit...";
|
|
this.btnEdit.Click += new System.EventHandler(this.btnEdit_Click);
|
|
//
|
|
// btnAdd
|
|
//
|
|
this.btnAdd.Enabled = false;
|
|
this.btnAdd.Location = new System.Drawing.Point(272, 48);
|
|
this.btnAdd.Name = "btnAdd";
|
|
this.btnAdd.Size = new System.Drawing.Size(80, 24);
|
|
this.btnAdd.TabIndex = 4;
|
|
this.btnAdd.Text = "<< Add";
|
|
this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click);
|
|
//
|
|
// lboxAvail
|
|
//
|
|
this.lboxAvail.ItemHeight = 14;
|
|
this.lboxAvail.Location = new System.Drawing.Point(376, 48);
|
|
this.lboxAvail.Name = "lboxAvail";
|
|
this.lboxAvail.Size = new System.Drawing.Size(216, 172);
|
|
this.lboxAvail.TabIndex = 3;
|
|
//
|
|
// lboxInUse
|
|
//
|
|
this.lboxInUse.ItemHeight = 14;
|
|
this.lboxInUse.Location = new System.Drawing.Point(27, 48);
|
|
this.lboxInUse.Name = "lboxInUse";
|
|
this.lboxInUse.Size = new System.Drawing.Size(216, 172);
|
|
this.lboxInUse.TabIndex = 2;
|
|
//
|
|
// lboxInUseCB
|
|
//
|
|
this.lboxInUseCB.Location = new System.Drawing.Point(27, 48);
|
|
this.lboxInUseCB.Name = "lboxInUseCB";
|
|
this.lboxInUseCB.Size = new System.Drawing.Size(216, 174);
|
|
this.lboxInUseCB.TabIndex = 2;
|
|
this.lboxInUseCB.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.lboxInUseCB_ItemCheck);
|
|
//
|
|
// lblAvail
|
|
//
|
|
this.lblAvail.Location = new System.Drawing.Point(384, 24);
|
|
this.lblAvail.Name = "lblAvail";
|
|
this.lblAvail.Size = new System.Drawing.Size(80, 16);
|
|
this.lblAvail.TabIndex = 1;
|
|
this.lblAvail.Text = "Available:";
|
|
//
|
|
// lblInUse
|
|
//
|
|
this.lblInUse.Location = new System.Drawing.Point(24, 24);
|
|
this.lblInUse.Name = "lblInUse";
|
|
this.lblInUse.Size = new System.Drawing.Size(64, 16);
|
|
this.lblInUse.TabIndex = 0;
|
|
this.lblInUse.Text = "In Use:";
|
|
//
|
|
// btnOK
|
|
//
|
|
this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
|
|
this.btnOK.Location = new System.Drawing.Point(512, 376);
|
|
this.btnOK.Name = "btnOK";
|
|
this.btnOK.Size = new System.Drawing.Size(88, 24);
|
|
this.btnOK.TabIndex = 9;
|
|
this.btnOK.Text = "OK";
|
|
this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
|
|
//
|
|
// btnCancel
|
|
//
|
|
this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
|
this.btnCancel.Location = new System.Drawing.Point(616, 376);
|
|
this.btnCancel.Name = "btnCancel";
|
|
this.btnCancel.Size = new System.Drawing.Size(80, 24);
|
|
this.btnCancel.TabIndex = 10;
|
|
this.btnCancel.Text = "Cancel";
|
|
|
|
//
|
|
// RODefFrm
|
|
//
|
|
this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
|
|
this.ClientSize = new System.Drawing.Size(792, 437);
|
|
this.Controls.Add(this.btnCancel);
|
|
this.Controls.Add(this.btnOK);
|
|
this.Controls.Add(this.gbFields);
|
|
this.Controls.Add(this.lblGroupText);
|
|
this.Controls.Add(this.tbMenuVal);
|
|
this.Controls.Add(this.tbRetVal);
|
|
this.Controls.Add(this.lblMenuVal);
|
|
this.Controls.Add(this.lblRetVal);
|
|
this.Controls.Add(this.lblGroup);
|
|
this.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
|
this.Name = "RODefFrm";
|
|
this.Text = "Referenced Object Definition";
|
|
this.gbFields.ResumeLayout(false);
|
|
this.ResumeLayout(false);
|
|
this.PerformLayout();
|
|
|
|
}
|
|
|
|
//if User clicked save (DialogResult.OK) close the form
|
|
//if use did not click save, ask if they are sure they want to close the form
|
|
//only close if they say "Yes, they want to"
|
|
protected override void OnFormClosing(FormClosingEventArgs e)
|
|
{
|
|
if (this.DialogResult != System.Windows.Forms.DialogResult.OK && !CloseCancel())
|
|
{
|
|
e.Cancel = true;
|
|
}
|
|
}
|
|
|
|
public static bool CloseCancel()
|
|
{
|
|
const string message = "Are you sure that you would like to cancel? Information may not be saved.";
|
|
const string caption = "Cancel";
|
|
var result = MessageBox.Show(message, caption,
|
|
MessageBoxButtons.YesNo,
|
|
MessageBoxIcon.Question);
|
|
|
|
return result == DialogResult.Yes;
|
|
}
|
|
#endregion
|
|
}
|
|
}
|