#region License Information
/* HeuristicLab
* Copyright (C) Heuristic and Evolutionary Algorithms Laboratory (HEAL)
*
* This file is part of HeuristicLab.
*
* HeuristicLab is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* HeuristicLab is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with HeuristicLab. If not, see .
*/
#endregion
using System;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using HeuristicLab.Data;
using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Views {
public partial class VariableNodeEditDialog : Form {
private VariableTreeNode variableTreeNode;
public VariableTreeNode NewNode {
get { return variableTreeNode; }
set {
if (InvokeRequired) {
Invoke(new Action(x =>
{
variableTreeNode = (VariableTreeNode) x;
variableNameTextBox.Text = variableTreeNode.VariableName;
}), value);
} else {
variableTreeNode = value;
variableNameTextBox.Text = variableTreeNode.VariableName;
}
}
}
public string SelectedVariableName {
get { return variableNamesCombo.Visible ? variableNamesCombo.Text : variableNameTextBox.Text; }
}
public VariableNodeEditDialog(ISymbolicExpressionTreeNode node) {
InitializeComponent();
oldValueTextBox.TabStop = false; // cannot receive focus using tab key
NewNode = (VariableTreeNode)node; // will throw an invalid cast exception if node is not of the correct type
InitializeFields();
}
private void InitializeFields() {
if (NewNode == null)
throw new ArgumentException("Node is not a constant.");
else {
this.Text = "Edit variable";
newValueTextBox.Text = oldValueTextBox.Text = Math.Round(variableTreeNode.Weight, 4).ToString();
// add a dropbox containing all the available variable names
variableNameLabel.Visible = true;
variableNamesCombo.Visible = true;
if (variableTreeNode.Symbol.VariableNames.Any()) {
foreach (var name in variableTreeNode.Symbol.VariableNames)
variableNamesCombo.Items.Add(name);
variableNamesCombo.SelectedIndex = variableNamesCombo.Items.IndexOf(variableTreeNode.VariableName);
variableNamesCombo.Visible = true;
variableNameTextBox.Visible = false;
} else {
variableNamesCombo.Visible = false;
variableNameTextBox.Visible = true;
}
}
}
#region text box validation and events
private void newValueTextBox_Validating(object sender, CancelEventArgs e) {
string errorMessage;
if (!ValidateNewValue(newValueTextBox.Text, out errorMessage)) {
e.Cancel = true;
errorProvider.SetError(newValueTextBox, errorMessage);
newValueTextBox.SelectAll();
}
}
private void newValueTextBox_Validated(object sender, EventArgs e) {
errorProvider.SetError(newValueTextBox, string.Empty);
}
private static bool ValidateNewValue(string value, out string errorMessage) {
double val;
bool valid = double.TryParse(value, out val);
errorMessage = string.Empty;
if (!valid) {
var sb = new StringBuilder();
sb.Append("Invalid Value (Valid Value Format: \"");
sb.Append(FormatPatterns.GetDoubleFormatPattern());
sb.Append("\")");
errorMessage = sb.ToString();
}
return valid;
}
#endregion
#region combo box validation and events
private void variableNamesCombo_Validating(object sender, CancelEventArgs e) {
if (variableNamesCombo.Items.Count == 0) return;
if (variableNamesCombo.Items.Contains(variableNamesCombo.SelectedItem)) return;
e.Cancel = true;
errorProvider.SetError(variableNamesCombo, "Invalid variable name");
variableNamesCombo.SelectAll();
}
private void variableNamesCombo_Validated(object sender, EventArgs e) {
errorProvider.SetError(variableNamesCombo, String.Empty);
}
#endregion
// proxy handler passing key strokes to the parent control
private void childControl_KeyDown(object sender, KeyEventArgs e) {
ValueChangeDialog_KeyDown(sender, e);
}
private void ValueChangeDialog_KeyDown(object sender, KeyEventArgs e) {
if ((e.KeyCode == Keys.Enter) || (e.KeyCode == Keys.Return)) {
if (!ValidateChildren()) return;
OnDialogValidated(this, e); // emit validated effect
Close();
}
}
public event EventHandler DialogValidated;
private void OnDialogValidated(object sender, EventArgs e) {
double weight = double.Parse(newValueTextBox.Text);
// we impose an extra validation condition: that the weight/value be different than the original ones
var variableName = SelectedVariableName;
if (variableTreeNode.Weight.Equals(weight) && variableTreeNode.VariableName.Equals(variableName)) return;
variableTreeNode.Weight = weight;
variableTreeNode.VariableName = variableName;
DialogResult = DialogResult.OK;
var dialogValidated = DialogValidated;
if (dialogValidated != null)
dialogValidated(sender, e);
}
private void cancelButton_Click(object sender, EventArgs e) {
Close();
}
private void okButton_Click(object sender, EventArgs e) {
if (ValidateChildren()) {
OnDialogValidated(this, e);
Close();
}
}
}
}