using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace JGClassGenerator
{
internal partial class FormListInput : FormBaseDialog
{
private Dictionary<int, JTypesData> m_DicDataTypes;
private int m_ParentRecordNumber = 0;
private JFieldsData m_WorkingFieldsData = null;
internal delegate void GetFieldNamesListEventHandler(object sender, ref List<string> listFieldNames);
internal event GetFieldNamesListEventHandler GetFieldNamesList;
private void OnGetFieldsList(object sender, ref List<string> listFieldNames)
{
GetFieldNamesListEventHandler handler = GetFieldNamesList;
if (handler != null)
handler(sender, ref listFieldNames);
}
private void RaiseGetFieldsListEvent(object sender, ref List<string> listFieldNames)
{
OnGetFieldsList(sender, ref listFieldNames);
}
internal delegate void FieldDataChangedEventHandler(object sender, JFieldsData fieldData, bool isNew);
internal event FieldDataChangedEventHandler FieldDataChanged;
private void OnFieldDataChanged(object sender, JFieldsData fieldData, bool isNew)
{
FieldDataChangedEventHandler handler = FieldDataChanged;
if (handler != null)
handler(sender, fieldData, isNew);
}
private void RaiseFieldDataChanged(object sender, JFieldsData fieldData, bool isNew)
{
OnFieldDataChanged(sender, fieldData, isNew);
}
internal FormListInput(int parentRecordNumber)
{
InitializeComponent();
this.ShowButtons = true;
this.m_ParentRecordNumber = parentRecordNumber;
}
private void FormListInput_Load(object sender, EventArgs e)
{
ControlInitialise();
}
private void ControlInitialise()
{
ButtonOK.Visible = false;
ButtonCancelText = "Finished";
FillDbTypeCombo();
ClearForm();
this.m_DicDataTypes = JTypesUpdater.GetDataTypesMatrix();
AddNewField(this.m_ParentRecordNumber);
}
internal void AddNewField(int parentRecordNumber)
{
ClearForm();
this.m_ParentRecordNumber = parentRecordNumber;
this.m_WorkingFieldsData = new JFieldsData();
txtFieldLength.Enabled = false;
ShowMessage("", false);
cboDbType.Focus();
}
public void AutoComplete(ComboBox cb, System.Windows.Forms.KeyPressEventArgs e)
{
int searchIndex = -1;
string searchString = "";
if (e.KeyChar == '\t')
{
if (cb.SelectionStart <= 1)
{
cb.Text = "";
return;
}
if (cb.SelectionLength == 0)
searchString = cb.Text.Substring(0, cb.Text.Length - 1);
else
searchString = cb.Text.Substring(0, cb.SelectionStart - 1);
}
else
{
if (cb.SelectionLength == 0)
searchString = cb.Text + e.KeyChar;
else
searchString = cb.Text.Substring(0, cb.SelectionStart) + e.KeyChar;
}
searchIndex = cb.FindString(searchString);
if (searchIndex != -1)
{
cb.SelectedText = "";
cb.SelectedIndex = searchIndex;
cb.SelectionStart = searchString.Length;
cb.SelectionLength = cb.Text.Length;
}
e.Handled = true;
}
private void cboDbType_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Escape)
{
cboDbType.SelectedIndex = -1;
}
}
private void cboDbType_KeyPress(object sender, KeyPressEventArgs e)
{
AutoComplete(cboDbType, e);
}
private void cboDbType_SelectedIndexChanged(object sender, EventArgs e)
{
if (cboDbType.SelectedIndex == -1)
return;
JTypesData.JTypesIndexData indexData = (JTypesData.JTypesIndexData)cboDbType.SelectedItem;
JTypesData dataType = m_DicDataTypes[indexData.TypeID];
lblTypeID.Text = indexData.TypeID.ToString();
if (dataType.LengthRequired)
{
lblFieldLength.Enabled = true;
txtFieldLength.Enabled = true;
}
else
{
lblFieldLength.Enabled = false;
txtFieldLength.Enabled = false;
}
}
private void ClearForm()
{
cboDbType.SelectedIndex = -1;
cboDbType.Text = "";
lblTypeID.Text = "0";
txtFieldName.Text = "";
txtFieldLength.Text = "";
}
private void FillDbTypeCombo()
{
cboDbType.Items.Clear();
if (!string.IsNullOrEmpty(JCommon.ProgramDatabasePath))
{
List<JTypesData.JTypesIndexData> listIndex = JTypesUpdater.AllIndexData();
cboDbType.Items.AddRange(listIndex.ToArray());
}
}
private void GetRecordFromForm(JFieldsData fieldsData)
{
fieldsData.ParentRecordNumber = this.m_ParentRecordNumber;
fieldsData.FieldName = Convert.ToString(txtFieldName.Text);
fieldsData.TypeID = TypeID;
try
{
fieldsData.FieldLength = Convert.ToInt32(txtFieldLength.Text);
}
catch
{
fieldsData.FieldLength = 0;
}
}
private bool IsDataComplete()
{
int fieldLength = 0;
if (TypeID < 1)
{
ShowMessage("Please Select Db Type", true);
return false;
}
if (string.IsNullOrEmpty(txtFieldName.Text) || string.IsNullOrEmpty(cboDbType.Text))
{
ShowMessage("Field Name and Type Required", true);
return false;
}
if (IsFieldNameDuplicated(txtFieldName.Text))
{
ShowMessage("Duplicate Variable Name : " + txtFieldName.Text, true);
return false;
}
JTypesData dataType = m_DicDataTypes[TypeID];
if (dataType.LengthRequired)
{
try
{
fieldLength = Convert.ToInt32(txtFieldLength.Text);
}
catch
{
fieldLength = 0;
}
if (fieldLength == 0)
{
ShowMessage("Field Length Required For " + cboDbType.Text, true);
return false;
}
}
return true;
}
private bool IsFieldNameDuplicated(string newName)
{
bool result = false;
List<string> listFieldNames = new List<string>();
RaiseGetFieldsListEvent(this, ref listFieldNames);
foreach (string current in listFieldNames)
{
if (current == newName)
{
result = true;
break;
}
}
return result;
}
private int TypeID
{
get
{
try
{
return Convert.ToInt32(lblTypeID.Text);
}
catch
{
return 0;
}
}
}
private void txtFieldName_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Return)
{
e.SuppressKeyPress = true;
if (SaveRecord())
AddNewField(this.m_ParentRecordNumber);
}
}
private void txtFieldLength_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Return)
{
e.SuppressKeyPress = true;
if (SaveRecord())
AddNewField(this.m_ParentRecordNumber);
}
}
private bool SaveRecord()
{
if (IsDataComplete())
{
GetRecordFromForm(this.m_WorkingFieldsData);
RaiseFieldDataChanged(this, this.m_WorkingFieldsData, true);
return true;
}
return false;
}
}
}