[blam: 3/4] ChannelList, ChannelCollection: communicate directly



commit 7b20ec94c90aa15f4a8cd390c6d7da87eee22749
Author: Carlos Martín Nieto <cmn dwim me>
Date:   Mon Jun 17 19:11:49 2013 +0200

    ChannelList, ChannelCollection:  communicate directly
    
    It's silly for changes in ChannelCollection to go through a myriad of
    events through Application to affect what the ChannelList shows. Pass
    the collection directly to the list and set up the notifications so
    they can talk directly.

 blam.csproj              |    1 +
 src/Application.cs       |   29 +-----------
 src/ChannelCollection.cs |   62 +++++++++++++++-----------
 src/ChannelList.cs       |  108 ++++++++++++++++++++++++++++++---------------
 src/Makefile.am          |    1 +
 5 files changed, 112 insertions(+), 89 deletions(-)
---
diff --git a/blam.csproj b/blam.csproj
index 41025e6..0e01d9f 100644
--- a/blam.csproj
+++ b/blam.csproj
@@ -77,6 +77,7 @@
       <Private>False</Private>
       <Package>gconf-sharp-2.0</Package>
     </Reference>
+    <Reference Include="Microsoft.CSharp" />
   </ItemGroup>
   <ItemGroup>
     <Compile Include="src\Application.cs" />
diff --git a/src/Application.cs b/src/Application.cs
index 1db2dd7..0423c38 100644
--- a/src/Application.cs
+++ b/src/Application.cs
@@ -157,10 +157,6 @@ namespace Imendio.Blam {
 
             mCollection = ChannelCollection.LoadFromFile (Defines.APP_HOMEDIR + "/collection.xml");
 
-            mCollection.ChannelUpdated         += ChannelUpdatedCb;
-            mCollection.ChannelAdded           += ChannelAddedCb;
-                       mCollection.ChannelGroupAdded      += ChannelGroupAddedCb;
-            mCollection.ChannelRemoved         += ChannelRemovedCb;
             mCollection.ChannelRefreshStarted  += ChannelRefreshStartedCb;
             mCollection.ChannelRefreshFinished += ChannelRefreshFinishedCb;
 
@@ -186,7 +182,7 @@ namespace Imendio.Blam {
                                                         "mainWindow", null);
             gladeXML.Autoconnect(this);
 
-            channelList = new ChannelList(mCollection.Channels, mCollection.Groups);
+            channelList = new ChannelList(mCollection);
             ((Container)channelListSw).Child = channelList;
 
             channelList.ChannelSelectedEvent   += ChannelSelected;
@@ -701,27 +697,6 @@ namespace Imendio.Blam {
             }
         }
 
-        private void ChannelAddedCb (IChannel channel)
-        {
-            channelList.Add (channel);
-        }
-
-               private void ChannelGroupAddedCb(IChannel group, IChannel chan)
-               {
-                       channelList.AddToGroup(group, chan);
-               }
-
-        private void ChannelUpdatedCb (IChannel channel)
-        {
-            UpdateTotalNumberOfUnread ();
-        }
-
-        private void ChannelRemovedCb (IChannel channel)
-        {
-            channelList.Remove (channel);
-            UpdateTotalNumberOfUnread ();
-        }
-
         private void ChannelRefreshStartedCb (IChannel channel)
         {
             uint contextId = statusbar.GetContextId("update-status");
@@ -853,7 +828,7 @@ namespace Imendio.Blam {
             Conf.Sync ();
         }
 
-        private void UpdateTotalNumberOfUnread ()
+        public void UpdateTotalNumberOfUnread()
         {
             int nrOfUnread, nrOfNew;
 
diff --git a/src/ChannelCollection.cs b/src/ChannelCollection.cs
index a78a6b3..88c6db2 100644
--- a/src/ChannelCollection.cs
+++ b/src/ChannelCollection.cs
@@ -7,6 +7,7 @@
 
 using System;
 using System.Collections;
+using System.Collections.Specialized;
 using System.Linq;
 using System.IO;
 using System.Reflection;
@@ -18,12 +19,10 @@ using System.ComponentModel;
 
 namespace Imendio.Blam {
 
-    public class ChannelCollection {
+       public class ChannelCollection : INotifyCollectionChanged {
 
-       public event ChannelEventHandler ChannelAdded;
-       public event ChannelGroupEventHandler ChannelGroupAdded;
-       public event ChannelEventHandler ChannelUpdated;
-       public event ChannelEventHandler ChannelRemoved;
+               public event NotifyCollectionChangedEventHandler CollectionChanged;
+               public event PropertyChangedEventHandler PropertyChanged;
        
        public event ChannelEventHandler ChannelRefreshStarted;
        public event ChannelEventHandler ChannelRefreshFinished;
@@ -82,6 +81,32 @@ namespace Imendio.Blam {
             }
         }
 
+               void NotifyAdd(IChannel channel)
+               {
+                       NotifyCollectionChanged(NotifyCollectionChangedAction.Add, channel);
+               }
+
+               void NotifyAdd(object obj)
+               {
+                       NotifyCollectionChanged(NotifyCollectionChangedAction.Add, obj);
+               }
+
+               void NotifyRemove(IChannel channel)
+               {
+                       NotifyCollectionChanged(NotifyCollectionChangedAction.Remove, channel);
+               }
+
+               void NotifyChange(IChannel channel)
+               {
+                       NotifyCollectionChanged(NotifyCollectionChangedAction.Replace, channel);
+               }
+
+               void NotifyCollectionChanged(NotifyCollectionChangedAction action, object obj)
+               {
+                       if (CollectionChanged != null)
+                               CollectionChanged(this, new NotifyCollectionChangedEventArgs(action, obj));
+               }
+
        public ChannelCollection ()
        {
        }
@@ -179,8 +204,8 @@ namespace Imendio.Blam {
                        bool res = await channel.RefreshAsync();
                        if (res)
                                MarkAsDirty();
-                       if (ChannelAdded != null)
-                               ChannelAdded (channel);
+
+                       NotifyAdd(channel);
                }
 
         public async void Add(ChannelGroup group, IChannel channel)
@@ -189,9 +214,7 @@ namespace Imendio.Blam {
                        bool updated = await channel.RefreshAsync();
                        channel.PropertyChanged += ChannelChanged;
 
-                       if(ChannelGroupAdded != null){
-                               ChannelGroupAdded(group, channel);
-                       }
+                       NotifyAdd(new { Group = group, Channel = channel });
 
                        MarkAsDirty();
                }
@@ -201,20 +224,10 @@ namespace Imendio.Blam {
                        IChannel channel = (IChannel)sender;
                        MarkAsDirty();
 
-                       if (ChannelUpdated != null) {
-                               ChannelUpdated (channel);
-                       }
+                       if (PropertyChanged != null)
+                               PropertyChanged(this, args);
                }
 
-               public void Updated (IChannel channel)
-       {
-           MarkAsDirty();
-
-           if (ChannelUpdated != null) {
-               ChannelUpdated (channel);
-           }
-       }
-
        public void Remove (IChannel channel)
        {
         /* Try to find out from which list we need to remove. */
@@ -232,10 +245,7 @@ namespace Imendio.Blam {
             }
         }
 
-           if (ChannelRemoved != null) {
-               ChannelRemoved (channel);
-           }
-
+        NotifyRemove(channel);
         MarkAsDirty();
        }
 
diff --git a/src/ChannelList.cs b/src/ChannelList.cs
index a7de14a..13d1ff7 100644
--- a/src/ChannelList.cs
+++ b/src/ChannelList.cs
@@ -10,6 +10,7 @@ using Gtk;
 using GtkSharp;
 using System;
 using System.Collections;
+using System.Collections.Specialized;
 using System.Runtime.InteropServices;
 using System.ComponentModel;
 using Mono.Unix;
@@ -37,62 +38,97 @@ namespace Imendio.Blam {
             new TargetEntry("channel", TargetFlags.Widget, (uint)TargetType.Channel)
        };
 
-        public ChannelList(IList channels, IList groups)
-        { 
-            TreeViewColumn col;
-            CellRenderer   cell;
+               ChannelCollection Collection;
 
-            /* Channel name column */
-            nameColumn = new TreeViewColumn();
-            cell = new CellRendererText();
+               public ChannelList(ChannelCollection collection)
+               {
+                       Collection = collection;
+                       Collection.CollectionChanged += CollectionChanged;
+                       Collection.PropertyChanged += CollectionPropertyChanged;
+
+                       TreeViewColumn col;
+                       CellRenderer   cell;
+
+                       /* Channel name column */
+                       nameColumn = new TreeViewColumn();
+                       cell = new CellRendererText();
 
-            nameColumn.PackStart(cell, true);
-            nameColumn.Sizing = TreeViewColumnSizing.GrowOnly;
-            nameColumn.Expand = true;
-            nameColumn.SetCellDataFunc(cell, new TreeCellDataFunc(NamesCellDataFunc));
+                       nameColumn.PackStart(cell, true);
+                       nameColumn.Sizing = TreeViewColumnSizing.GrowOnly;
+                       nameColumn.Expand = true;
+                       nameColumn.SetCellDataFunc(cell, new TreeCellDataFunc(NamesCellDataFunc));
 
-            AppendColumn(nameColumn);
+                       AppendColumn(nameColumn);
 
-            /* Items column */
-            col = new TreeViewColumn();
-            cell = new CellRendererText();
+                       /* Items column */
+                       col = new TreeViewColumn();
+                       cell = new CellRendererText();
 
-            col.PackStart(cell, true);
-            col.SetCellDataFunc(cell,
-                                new TreeCellDataFunc(ItemsCellDataFunc));
+                       col.PackStart(cell, true);
+                       col.SetCellDataFunc(cell,
+                                           new TreeCellDataFunc(ItemsCellDataFunc));
 
-            AppendColumn(col);
+                       AppendColumn(col);
 
-            this.RulesHint = true;
+                       this.RulesHint = true;
 
-            selectionChangedHandler = new EventHandler(SelectionChanged);
-            this.Selection.Changed += selectionChangedHandler;
+                       selectionChangedHandler = new EventHandler(SelectionChanged);
+                       this.Selection.Changed += selectionChangedHandler;
 
-            this.Model = new TreeStore (typeof(Channel));
-            this.HeadersVisible = false;
+                       this.Model = new TreeStore (typeof(Channel));
+                       this.HeadersVisible = false;
 
-            // Sort the list
-            (Model as TreeStore).DefaultSortFunc = ChannelSort;
-            (this.Model as TreeStore).SetSortColumnId (-1, SortType.Ascending);
+                       // Sort the list
+                       (Model as TreeStore).DefaultSortFunc = ChannelSort;
+                       (this.Model as TreeStore).SetSortColumnId (-1, SortType.Ascending);
 
-            // Right click popup
-            this.popupMenu = new ChannelMenu();
-            this.popupMenu.EditSelected       += EditChannelCb;
-            this.popupMenu.MarkAsReadSelected += MarkAsReadCb;
-            this.popupMenu.RemoveSelected     += RemoveChannelCb;
-            this.popupMenu.RefreshSelected    += RefreshChannelCb;
+                       // Right click popup
+                       this.popupMenu = new ChannelMenu();
+                       this.popupMenu.EditSelected       += EditChannelCb;
+                       this.popupMenu.MarkAsReadSelected += MarkAsReadCb;
+                       this.popupMenu.RemoveSelected     += RemoveChannelCb;
+                       this.popupMenu.RefreshSelected    += RefreshChannelCb;
 
                        EnableModelDragSource(ModifierType.Button1Mask, DragEntries, DragAction.Copy);
                        DragDataGet += DragDataGetHandler;
                        EnableModelDragDest(DragEntries, DragAction.Copy);
                        DragDataReceived += DragDataReceivedHandler;
 
-                       foreach (IChannel channel in channels)
+                       // Add the groups and chanels to the view
+                       foreach (IChannel channel in Collection.Channels)
                                Add (channel);
 
-                       foreach (IChannel group in groups)
+                       foreach (IChannel group in Collection.Groups)
                                AddGroup(group);
-        }
+               }
+
+               void CollectionPropertyChanged(object sender, PropertyChangedEventArgs args)
+               {
+                       Application.TheApp.UpdateTotalNumberOfUnread();
+               }
+
+               void CollectionChanged(object sender, NotifyCollectionChangedEventArgs args)
+               {
+                       switch (args.Action) {
+                               case NotifyCollectionChangedAction.Add:
+                                       foreach (var channel in args.NewItems) {
+                                               if (channel is Channel) {
+                                                       Add((IChannel)channel);
+                                               } else if (channel is ChannelGroup) {
+                                                       AddGroup((IChannel)channel);
+                                               } else {
+                                                       dynamic obj = channel;
+                                                       AddToGroup(obj.Group, obj.Channel);
+                                               }
+                                       }
+                                       break;
+                               case NotifyCollectionChangedAction.Remove:
+                                       foreach (IChannel channel in args.OldItems) {
+                                               Remove(channel);
+                                       }
+                                       break;
+                       }
+               }
 
         private void ForceResort()
         {
diff --git a/src/Makefile.am b/src/Makefile.am
index 50a8910..3780f0c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -11,6 +11,7 @@ RESOURCES = \
 ASSEMBLIES = \
             -r:System.Web   \
             -r:Mono.Posix   \
+            -r:Microsoft.CSharp \
             -r:System.ServiceModel
 
 BLAM_CSFILES = Application.cs \


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]