#region License Information
/* HeuristicLab
* Copyright (C) 2002-2010 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 HeuristicLab.Common;
using HeuristicLab.Core;
using HeuristicLab.Data;
using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
using System.Drawing;
namespace HeuristicLab.Problems.ArtificialAnt {
///
/// Represents a trail of an artificial ant which can be visualized in the GUI.
///
[Item("AntTrail", "Represents a trail of an artificial ant which can be visualized in the GUI.")]
[StorableClass]
public sealed class AntTrail : Item {
public override Image ItemImage {
get { return HeuristicLab.Common.Resources.VS2008ImageLibrary.Image; }
}
[Storable]
private SymbolicExpressionTree expression;
public SymbolicExpressionTree SymbolicExpressionTree {
get { return expression; }
set {
if (expression != value) {
//if (expression != null) DeregisterSymbolicExpressionTreeEvents();
expression = value;
//if (expression != null) RegisterSymbolicExpressionTreeEvents();
OnSymbolicExpressionTreeChanged();
}
}
}
[Storable]
private BoolMatrix world;
public BoolMatrix World {
get { return world; }
set {
if (world != value) {
if (world != null) DeregisterWorldEvents();
world = value;
if (world != null) RegisterWorldEvents();
OnWorldChanged();
}
}
}
[Storable]
private IntValue maxTimeSteps;
public IntValue MaxTimeSteps {
get { return maxTimeSteps; }
set {
if (maxTimeSteps != value) {
if (maxTimeSteps != value) {
if (maxTimeSteps != null) DeregisterMaxTimeStepsEvents();
maxTimeSteps = value;
if (maxTimeSteps != null) RegisterMaxTimeStepsEvents();
OnWorldChanged();
}
}
}
}
public AntTrail() : base() { }
public AntTrail(BoolMatrix world, SymbolicExpressionTree expression, IntValue maxTimeSteps)
: this() {
this.world = world;
this.expression = expression;
this.maxTimeSteps = maxTimeSteps;
Initialize();
}
[StorableConstructor]
private AntTrail(bool deserializing) : base(deserializing) { }
[StorableHook(HookType.AfterDeserialization)]
private void Initialize() {
//if (expression != null) RegisterSymbolicExpressionTreeEvents();
if (world != null) RegisterWorldEvents();
if (maxTimeSteps != null) RegisterMaxTimeStepsEvents();
}
public override IDeepCloneable Clone(Cloner cloner) {
AntTrail clone = new AntTrail();
cloner.RegisterClonedObject(this, clone);
clone.expression = (SymbolicExpressionTree)cloner.Clone(expression);
clone.world = (BoolMatrix)cloner.Clone(world);
clone.maxTimeSteps = (IntValue)cloner.Clone(maxTimeSteps);
clone.Initialize();
return clone;
}
#region Events
public event EventHandler SymbolicExpressionTreeChanged;
private void OnSymbolicExpressionTreeChanged() {
var changed = SymbolicExpressionTreeChanged;
if (changed != null)
changed(this, EventArgs.Empty);
}
public event EventHandler WorldChanged;
private void OnWorldChanged() {
var changed = WorldChanged;
if (changed != null)
changed(this, EventArgs.Empty);
}
public event EventHandler MaxTimeStepsChanged;
private void OnMaxTimeStepsChanged() {
var changed = MaxTimeStepsChanged;
if (changed != null)
changed(this, EventArgs.Empty);
}
//private void RegisterSymbolicExpressionTreeEvents() {
// SymbolicExpressionTree.ItemChanged += new EventHandler>(SymbolicExpressionTree_ItemChanged);
// SymbolicExpressionTree.Reset += new EventHandler(SymbolicExpressionTree_Reset);
//}
//private void DeregisterSymbolicExpressionTreeEvents() {
// SymbolicExpressionTree.ItemChanged -= new EventHandler>(SymbolicExpressionTree_ItemChanged);
// SymbolicExpressionTree.Reset -= new EventHandler(SymbolicExpressionTree_Reset);
//}
private void RegisterWorldEvents() {
World.ItemChanged += new EventHandler>(World_ItemChanged);
World.Reset += new EventHandler(World_Reset);
}
private void DeregisterWorldEvents() {
World.ItemChanged -= new EventHandler>(World_ItemChanged);
World.Reset -= new EventHandler(World_Reset);
}
private void RegisterMaxTimeStepsEvents() {
MaxTimeSteps.ValueChanged += new EventHandler(MaxTimeSteps_ValueChanged);
}
private void DeregisterMaxTimeStepsEvents() {
MaxTimeSteps.ValueChanged -= new EventHandler(MaxTimeSteps_ValueChanged);
}
void MaxTimeSteps_ValueChanged(object sender, EventArgs e) {
OnMaxTimeStepsChanged();
}
private void World_ItemChanged(object sender, EventArgs e) {
OnWorldChanged();
}
private void World_Reset(object sender, EventArgs e) {
OnWorldChanged();
}
#endregion
}
}