Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
11/23/14 05:32:41 (9 years ago)
Author:
swagner
Message:

#2205: Continued working on programmable network items

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/ProgrammableNetworkItem.cs

    r11563 r11564  
    3535  [Item("ProgrammableNetworkItem", "Abstract base class for programmable items of a network.")]
    3636  [StorableClass]
    37   public abstract class ProgrammableNetworkItem : NetworkItem, IProgrammableNetworkItem {
    38     #region Item Properties
     37  public abstract class ProgrammableNetworkItem : Item, IProgrammableNetworkItem {
    3938    public static new Image StaticItemImage {
    4039      get { return HeuristicLab.Common.Resources.VSImageLibrary.Script; }
    4140    }
     41
     42    #region Item Members
    4243    public override string ItemName {
    43       get { return CompiledNetworkItem != null ? CompiledNetworkItem.ItemName : base.ItemName; }
     44      get { return CompiledNetworkItem.ItemName; }
    4445    }
    4546    public override string ItemDescription {
    46       get { return CompiledNetworkItem != null ? CompiledNetworkItem.ItemDescription : base.ItemDescription; }
     47      get { return CompiledNetworkItem.ItemDescription; }
    4748    }
    4849    public override Image ItemImage {
    49       get { return CompiledNetworkItem != null ? CompiledNetworkItem.ItemImage : base.ItemImage; }
    50     }
    51     #endregion
    52 
    53     #region NamedItem Properties
    54     public override bool CanChangeName {
    55       get { return CompiledNetworkItem != null ? CompiledNetworkItem.CanChangeName : base.CanChangeName; }
    56     }
    57     public override bool CanChangeDescription {
    58       get { return CompiledNetworkItem != null ? CompiledNetworkItem.CanChangeDescription : base.CanChangeDescription; }
     50      get { return CompiledNetworkItem.ItemImage; }
     51    }
     52    #endregion
     53
     54    #region NamedItem Members
     55    [Storable]
     56    private string name;
     57    public string Name {
     58      get { return CompiledNetworkItem.Name; }
     59      set { CompiledNetworkItem.Name = value; }
     60    }
     61    public bool CanChangeName {
     62      get { return CompiledNetworkItem.CanChangeName; }
     63    }
     64    [Storable]
     65    private string description;
     66    public string Description {
     67      get { return CompiledNetworkItem.Description; }
     68      set { CompiledNetworkItem.Description = value; }
     69    }
     70    public virtual bool CanChangeDescription {
     71      get { return CompiledNetworkItem.CanChangeDescription; }
     72    }
     73    public event EventHandler<CancelEventArgs<string>> NameChanging;
     74    private void OnNameChanging(CancelEventArgs<string> e) {
     75      var handler = NameChanging;
     76      if (handler != null) handler(this, e);
     77    }
     78    public event EventHandler NameChanged;
     79    private void OnNameChanged() {
     80      var handler = NameChanged;
     81      if (handler != null) handler(this, EventArgs.Empty);
     82    }
     83    public event EventHandler DescriptionChanged;
     84    private void OnDescriptionChanged() {
     85      var handler = DescriptionChanged;
     86      if (handler != null) handler(this, EventArgs.Empty);
     87    }
     88    #endregion
     89
     90    #region NetworkItem Members
     91    public INetworkItem Parent {
     92      get { return CompiledNetworkItem.Parent; }
     93    }
     94    public IEnumerable<INetworkItem> Children {
     95      get { return CompiledNetworkItem.Children; }
    5996    }
    6097    #endregion
     
    79116    public CompilerErrorCollection CompileErrors {
    80117      get { return compileErrors; }
    81       private set {
     118      protected set {
    82119        compileErrors = value;
    83120        OnCompileErrorsChanged();
     
    85122    }
    86123
    87     private INetworkItem compiledNetworkItem;
    88     protected INetworkItem CompiledNetworkItem {
     124    private Type compiledNetworkItemType;
     125    private CompiledProgrammableNetworkItem compiledNetworkItem;
     126    protected CompiledProgrammableNetworkItem CompiledNetworkItem {
    89127      get {
    90         if (compiledNetworkItem == null) {
    91           Compile();
    92         }
     128        if (compiledNetworkItem == null)
     129          CompiledNetworkItem = (CompiledProgrammableNetworkItem)Activator.CreateInstance(compiledNetworkItemType, this);
    93130        return compiledNetworkItem;
    94131      }
    95       set {
     132      private set {
    96133        if (compiledNetworkItem != value) {
    97           if (compiledNetworkItem != null) DeregisterCompiledNetworkItemEvents();
     134          if (compiledNetworkItem != null) {
     135            DeregisterCompiledNetworkItemEvents();
     136            compiledNetworkItem.DeregisterEvents();
     137          }
    98138          compiledNetworkItem = value;
    99           if (compiledNetworkItem != null) RegisterCompiledNetworkItemEvents();
    100           OnCompiledNetworkItemChanged();
     139          if (compiledNetworkItem != null) {
     140            RegisterCompiledNetworkItemEvents();
     141            compiledNetworkItem.RegisterEvents();
     142          }
    101143          OnToStringChanged();
    102144          OnItemImageChanged();
     145          OnNameChanged();
     146          OnDescriptionChanged();
    103147        }
    104148      }
     
    109153    protected ProgrammableNetworkItem(ProgrammableNetworkItem original, Cloner cloner)
    110154      : base(original, cloner) {
     155      // name and description are cloned in CompiledProgrammableNetworkItem
    111156      code = original.code;
    112157      if (original.compileErrors != null)
     
    115160    }
    116161    protected ProgrammableNetworkItem()
    117       : base("ProgrammableNetworkItem") {
     162      : base() {
     163      name = "ProgrammableNetworkItem";
     164      description = string.Empty;
    118165      code = CodeTemplate;
     166      Compile();
    119167    }
    120168    protected ProgrammableNetworkItem(string name)
    121       : base(name) {
     169      : base() {
     170      this.name = string.IsNullOrEmpty(name) ? string.Empty : name;
     171      description = string.Empty;
    122172      code = CodeTemplate;
     173      Compile();
    123174    }
    124175    protected ProgrammableNetworkItem(string name, string description)
    125       : base(name, description) {
     176      : base() {
     177      this.name = string.IsNullOrEmpty(name) ? string.Empty : name;
     178      this.description = string.IsNullOrEmpty(description) ? string.Empty : description;
    126179      code = CodeTemplate;
     180      Compile();
     181    }
     182
     183    [StorableHook(HookType.AfterDeserialization)]
     184    private void AfterDeserialization() {
     185      Compile();
    127186    }
    128187
    129188    public override string ToString() {
    130       return CompiledNetworkItem != null ? CompiledNetworkItem.ToString() : base.ToString();
     189      return CompiledNetworkItem.ToString();
    131190    }
    132191
     
    159218          Name, Environment.NewLine, sb.ToString()));
    160219      }
    161       CompiledNetworkItem = (INetworkItem)Activator.CreateInstance(
    162         results.CompiledAssembly.GetTypes()
    163           .Single(x => typeof(CompiledProgrammableNetworkItem)
    164           .IsAssignableFrom(x)),
    165         this);
     220      compiledNetworkItemType = results.CompiledAssembly.GetTypes()
     221          .Single(x => typeof(CompiledProgrammableNetworkItem).IsAssignableFrom(x));
     222      CompiledNetworkItem = null;
    166223    }
    167224    public virtual IEnumerable<Assembly> GetAssemblies() {
     
    180237      if (handler != null) handler(this, EventArgs.Empty);
    181238    }
    182     public event EventHandler CompiledNetworkItemChanged;
    183     protected virtual void OnCompiledNetworkItemChanged() {
    184       var handler = CompiledNetworkItemChanged;
    185       if (handler != null) handler(this, EventArgs.Empty);
    186     }
    187239
    188240    #region CompiledNetworkItem Events
    189241    protected virtual void RegisterCompiledNetworkItemEvents() {
    190       if (compiledNetworkItem != null) {
    191         compiledNetworkItem.ToStringChanged += CompiledNetworkItem_ToStringChanged;
    192         compiledNetworkItem.ItemImageChanged += CompiledNetworkItem_ItemImageChanged;
    193       }
     242      CompiledNetworkItem.ToStringChanged += CompiledNetworkItem_ToStringChanged;
     243      CompiledNetworkItem.ItemImageChanged += CompiledNetworkItem_ItemImageChanged;
     244      CompiledNetworkItem.NameChanging += CompiledNetworkItem_NameChanging;
     245      CompiledNetworkItem.NameChanged += CompiledNetworkItem_NameChanged;
     246      CompiledNetworkItem.DescriptionChanged += CompiledNetworkItem_DescriptionChanged;
    194247    }
    195248    protected virtual void DeregisterCompiledNetworkItemEvents() {
    196       if (compiledNetworkItem != null) {
    197         compiledNetworkItem.ToStringChanged -= CompiledNetworkItem_ToStringChanged;
    198         compiledNetworkItem.ItemImageChanged -= CompiledNetworkItem_ItemImageChanged;
    199       }
     249      CompiledNetworkItem.ToStringChanged -= CompiledNetworkItem_ToStringChanged;
     250      CompiledNetworkItem.ItemImageChanged -= CompiledNetworkItem_ItemImageChanged;
     251      CompiledNetworkItem.NameChanging -= CompiledNetworkItem_NameChanging;
     252      CompiledNetworkItem.NameChanged -= CompiledNetworkItem_NameChanged;
     253      CompiledNetworkItem.DescriptionChanged -= CompiledNetworkItem_DescriptionChanged;
    200254    }
    201255    private void CompiledNetworkItem_ToStringChanged(object sender, EventArgs e) {
     
    204258    private void CompiledNetworkItem_ItemImageChanged(object sender, EventArgs e) {
    205259      OnItemImageChanged();
     260    }
     261    private void CompiledNetworkItem_NameChanging(object sender, CancelEventArgs<string> e) {
     262      OnNameChanging(e);
     263    }
     264    private void CompiledNetworkItem_NameChanged(object sender, EventArgs e) {
     265      OnNameChanged();
     266    }
     267    private void CompiledNetworkItem_DescriptionChanged(object sender, EventArgs e) {
     268      OnDescriptionChanged();
    206269    }
    207270    #endregion
     
    214277      }
    215278
    216       protected ProgrammableNetworkItem Context { get; private set; }
    217 
    218       protected CompiledProgrammableNetworkItem(CompiledProgrammableNetworkItem original, Cloner cloner)
    219         : base(original, cloner) {
    220         Context = cloner.Clone(original.Context);
    221         RegisterContextEvents();
    222       }
    223       protected CompiledProgrammableNetworkItem(ProgrammableNetworkItem context) {
    224         Context = context;
    225         RegisterContextEvents();
    226       }
    227 
    228       public override string ToString() {
    229         return Name;
    230       }
    231 
    232       #region INamedItem Members
     279      #region NamedItem Members
    233280      public string Name {
    234         get { return Context.Name; }
    235         set { Context.Name = value; }
     281        get { return Context.name; }
     282        set {
     283          if (!CanChangeName) throw new NotSupportedException("Name cannot be changed.");
     284          if (!(Context.name.Equals(value) || (value == null) && (Context.name == string.Empty))) {
     285            CancelEventArgs<string> e = value == null ? new CancelEventArgs<string>(string.Empty) : new CancelEventArgs<string>(value);
     286            OnNameChanging(e);
     287            if (!e.Cancel) {
     288              Context.name = value == null ? string.Empty : value;
     289              OnNameChanged();
     290            }
     291          }
     292        }
    236293      }
    237294      public virtual bool CanChangeName {
     
    239296      }
    240297      public string Description {
    241         get { return Context.Description; }
    242         set { Context.Description = value; }
     298        get { return Context.description; }
     299        set {
     300          if (!CanChangeDescription) throw new NotSupportedException("Description cannot be changed.");
     301          if (!(Context.description.Equals(value) || (value == null) && (Context.description == string.Empty))) {
     302            Context.description = value == null ? string.Empty : value;
     303            OnDescriptionChanged();
     304          }
     305        }
    243306      }
    244307      public virtual bool CanChangeDescription {
     
    264327      #endregion
    265328
    266       #region INetworkItem Members
     329      #region NetworkItem Members
     330      private INetworkItem parent;
    267331      public INetworkItem Parent {
    268         get { return Context.Parent; }
    269       }
    270       public IEnumerable<INetworkItem> Children {
    271         get { return Context.Children; }
     332        get { return parent; }
     333        protected set {
     334          if (value != parent) {
     335            parent = value;
     336          }
     337        }
     338      }
     339      public virtual IEnumerable<INetworkItem> Children {
     340        get { return Enumerable.Empty<INetworkItem>(); }
    272341      }
    273342      #endregion
    274343
    275       #region Context Events
    276       protected virtual void RegisterContextEvents() {
    277         Context.NameChanging += Context_NameChanging;
    278         Context.NameChanged += Context_NameChanged;
    279         Context.DescriptionChanged += Context_DescriptionChanged;
    280         Context.CompiledNetworkItemChanged += Context_CompiledNetworkItemChanged;
    281       }
    282       protected virtual void DeregisterContextEvents() {
    283         Context.NameChanging -= Context_NameChanging;
    284         Context.NameChanged -= Context_NameChanged;
    285         Context.DescriptionChanged -= Context_DescriptionChanged;
    286         Context.CompiledNetworkItemChanged -= Context_CompiledNetworkItemChanged;
    287       }
    288       private void Context_NameChanging(object sender, CancelEventArgs<string> e) {
    289         OnNameChanging(e);
    290       }
    291       private void Context_NameChanged(object sender, EventArgs e) {
    292         OnNameChanged();
    293       }
    294       private void Context_DescriptionChanged(object sender, EventArgs e) {
    295         OnDescriptionChanged();
    296       }
    297       private void Context_CompiledNetworkItemChanged(object sender, EventArgs e) {
    298         DeregisterContextEvents();
    299       }
     344      protected ProgrammableNetworkItem Context { get; private set; }
     345
     346      protected CompiledProgrammableNetworkItem(CompiledProgrammableNetworkItem original, Cloner cloner)
     347        : base(original, cloner) {
     348        Context = cloner.Clone(original.Context);
     349        Context.name = original.Context.name;
     350        Context.description = original.Context.description;
     351      }
     352      protected CompiledProgrammableNetworkItem(ProgrammableNetworkItem context)
     353        : base() {
     354        Context = context;
     355      }
     356
     357      public virtual void Initialize() { }
     358
     359      public override string ToString() {
     360        return Name;
     361      }
     362
     363      #region Events
     364      public virtual void RegisterEvents() { }
     365      public virtual void DeregisterEvents() { }
    300366      #endregion
    301367    }
     
    303369
    304370    #region Helpers
    305     protected string ReadCodeTemplate(string templateName) {
    306       using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(templateName))
     371    protected virtual string ReadCodeTemplate(string templateName) {
     372      using (var stream = Assembly.GetAssembly(this.GetType()).GetManifestResourceStream(templateName))
    307373      using (var reader = new StreamReader(stream)) {
    308374        return reader.ReadToEnd();
Note: See TracChangeset for help on using the changeset viewer.