2008-11-18 Marek Habersack <mhabersack@novell.com>
authorMarek Habersack <grendel@twistedcode.net>
Tue, 18 Nov 2008 21:40:18 +0000 (21:40 -0000)
committerMarek Habersack <grendel@twistedcode.net>
Tue, 18 Nov 2008 21:40:18 +0000 (21:40 -0000)
* ListViewContainer.cs: added

* ListView.cs:
Align group with empty items if there are no more data items.
Each group is contained within ListViewContainer.
Calculate the number of groups correctly.

2008-11-18  Marek Habersack  <mhabersack@novell.com>

* System.Web.Extensions.dll.sources: added
./System.Web.UI.WebControls/ListViewTableCell.cs
Added ./System.Web.Query.Dynamic/DynamicClass.cs and
./System.Web.Query.Dynamic/ParseException.cs
Added ./System.Web.UI.WebControls/ListViewContainer.cs

svn path=/trunk/mcs/; revision=119223

mcs/class/System.Web.Extensions/ChangeLog
mcs/class/System.Web.Extensions/System.Web.Extensions.dll.sources
mcs/class/System.Web.Extensions/System.Web.UI.WebControls/ChangeLog
mcs/class/System.Web.Extensions/System.Web.UI.WebControls/ListView.cs
mcs/class/System.Web.Extensions/System.Web.UI.WebControls/ListViewContainer.cs [new file with mode: 0644]

index b727f3d927d407964e2e50f34444ea05e566f36e..45174c78ce2ac25252c9f03c768230e67707b4ef 100644 (file)
@@ -4,6 +4,7 @@
        ./System.Web.UI.WebControls/ListViewTableCell.cs
        Added ./System.Web.Query.Dynamic/DynamicClass.cs and
        ./System.Web.Query.Dynamic/ParseException.cs    
+       Added ./System.Web.UI.WebControls/ListViewContainer.cs
 
 2008-11-15  Marek Habersack  <mhabersack@novell.com>
 
index 8d0173f92b0758ef28595b3853b061380582d9f2..15b8b1b39797cd0eab521f12efb3013ebc3a4d5d 100644 (file)
@@ -90,6 +90,7 @@
 ./System.Web.UI.WebControls/ListViewCancelMode.cs
 ./System.Web.UI.WebControls/ListViewCommandEventArgs.cs
 ./System.Web.UI.WebControls/ListView.cs
+./System.Web.UI.WebControls/ListViewContainer.cs
 ./System.Web.UI.WebControls/ListViewDataItem.cs
 ./System.Web.UI.WebControls/ListViewDeletedEventArgs.cs
 ./System.Web.UI.WebControls/ListViewDeleteEventArgs.cs
index f0c40b64759c7bf1e40e38b2900a53830356a33c..e335f9e99778eae2b54fd7cfe14a52e61f4fe52e 100644 (file)
@@ -1,11 +1,15 @@
 2008-11-18  Marek Habersack  <mhabersack@novell.com>
 
+       * ListViewContainer.cs: added
+
        * ListView.cs: implemented grouping support. With this ListView is
        feature complete.
        Refactored grouped/non-grouped rendering common code into separate
        methods.
        FindPlaceholder now looks for the placeholder recursively.
        Implemented forgotten UpdateItem method.
+       Align group with empty items if there are no more data items.
+       Each group is contained within ListViewContainer.
 
        * ListViewTableCell.cs: added
 
index c6aeede7b3c740ef1a7426177a76a8c862f28f8c..4cbb0673b7c8439e9d536a68a044aed0029ef168 100644 (file)
@@ -59,6 +59,8 @@ namespace System.Web.UI.WebControls
                const int CSTATE_SORTDIRECTION = 7;
                const int CSTATE_SORTEXPRESSION = 8;
                const int CSTATE_COUNT = 9;
+
+               delegate void GroupStart ();
                
                ITemplate _emptyDataTemplate;
                ITemplate _emptyItemTemplate;
@@ -894,7 +896,7 @@ namespace System.Web.UI.WebControls
        
                protected virtual ListViewItem CreateEmptyItem ()
                {
-                       if (_emptyDataTemplate != null) {
+                       if (_emptyItemTemplate != null) {
                                ListViewItem item = CreateItem (ListViewItemType.EmptyItem);
                                InstantiateEmptyItemTemplate (item);
                                OnItemCreated (new ListViewItemEventArgs (item));
@@ -1010,9 +1012,22 @@ namespace System.Web.UI.WebControls
                        int displayIndex = 0;
                        ListViewDataItem lvdi;
                        int startIndex = dataSource.StartRowIndex;
-                       int numberOfGroups = (dataSource.Count / groupItemCount) - 1;
+                       int dataCount = dataSource.Count;
+                       int numberOfGroups = (dataCount / groupItemCount) + (dataCount % groupItemCount) - 1;
+                       // This is disabled for now, until a bug in gmcs/JIT is fixed
+//                     GroupStart groupStart = () => {
+//                             if (groupItemCounter <= 0) {
+//                                     groupItemCounter = groupItemCount;
+//                                     currentGroup = StartNewGroup (numberOfGroups >= 1, ref gpos, ref firstItemIndexInGroup);
+//                                     numberOfGroups--;
+//                                     itemPosInGroup = firstItemIndexInGroup;
+//                                     _groupedItemsContainerItemCount++;
+//                                     needSeparator = false;
+//                             }
+//                     };
                        
                        foreach (object item in dataSource) {
+                               // groupStart ();
                                if (groupItemCounter <= 0) {
                                        groupItemCounter = groupItemCount;
                                        currentGroup = StartNewGroup (numberOfGroups >= 1, ref gpos, ref firstItemIndexInGroup);
@@ -1021,7 +1036,6 @@ namespace System.Web.UI.WebControls
                                        _groupedItemsContainerItemCount++;
                                        needSeparator = false;
                                }
-
                                if (needSeparator && haveSeparatorTemplate)
                                        InsertSeparatorItem (currentGroup, itemPosInGroup++);
 
@@ -1032,6 +1046,7 @@ namespace System.Web.UI.WebControls
                                        needSeparator = true;
                        }
 
+                       //groupStart ();
                        if (groupItemCounter <= 0) {
                                groupItemCounter = groupItemCount;
                                currentGroup = StartNewGroup (numberOfGroups >= 1, ref gpos, ref firstItemIndexInGroup);
@@ -1040,35 +1055,44 @@ namespace System.Web.UI.WebControls
                                _groupedItemsContainerItemCount++;
                                needSeparator = false;
                        }
-
+                       
                        if (insertPosition == InsertItemPosition.LastItem) {
-                               if (needSeparator && haveSeparatorTemplate) {
-                                       container = new ListViewItem ();
-                                       InstantiateItemSeparatorTemplate (container);
-                                       AddControlToContainer (container, currentGroup, itemPosInGroup++);
-                                       groupItemCounter--;
-                               }
-
+                               if (needSeparator && haveSeparatorTemplate)
+                                       InsertSeparatorItem (currentGroup, itemPosInGroup++);
+                               
+                               //groupStart ();
                                if (groupItemCounter <= 0) {
                                        groupItemCounter = groupItemCount;
                                        currentGroup = StartNewGroup (numberOfGroups >= 1, ref gpos, ref firstItemIndexInGroup);
                                        numberOfGroups--;
                                        itemPosInGroup = firstItemIndexInGroup;
                                        _groupedItemsContainerItemCount++;
+                                       needSeparator = false;
                                }
-                               
+
                                lvi = CreateInsertItem ();
                                InstantiateInsertItemTemplate (lvi);
                                AddControlToContainer (lvi, currentGroup, itemPosInGroup++);
                                groupItemCounter--;
                        }
+
+                       if (groupItemCounter > 0 && _emptyItemTemplate != null) {
+                               while (groupItemCounter > 0) {
+                                       if (haveSeparatorTemplate)
+                                               InsertSeparatorItem (currentGroup, itemPosInGroup++);
+                                       
+                                       lvi = CreateEmptyItem ();
+                                       AddControlToContainer (lvi, currentGroup, itemPosInGroup++);
+                                       groupItemCounter--;
+                               }
+                       }
                        
                        return ret;
                }
 
                Control StartNewGroup (bool needSeparator, ref int position, ref int firstItemIndexInGroup)
                {
-                       Control control = new Control ();
+                       Control control = new ListViewContainer ();
                        InstantiateGroupTemplate (control);
                        Control placeholder = FindPlaceholder (ItemPlaceholderID, control);
                        if (placeholder == null)
diff --git a/mcs/class/System.Web.Extensions/System.Web.UI.WebControls/ListViewContainer.cs b/mcs/class/System.Web.Extensions/System.Web.UI.WebControls/ListViewContainer.cs
new file mode 100644 (file)
index 0000000..bbd8c7f
--- /dev/null
@@ -0,0 +1,57 @@
+//
+// System.Web.UI.WebControls.ListViewContainer
+//
+// Authors:
+//   Marek Habersack (mhabersack@novell.com)
+//
+// (C) 2007-2008 Novell, Inc
+//
+
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+#if NET_3_5
+using System;
+using System.Web;
+using System.Web.UI;
+
+namespace System.Web.UI.WebControls
+{
+       // This class is necessary because each instance of the group template must define unique
+       // IDs for its children. The presence of this class can be seen when looking at the trace of
+       // any ASP.NET page with ListView control using item grouping.
+       internal class ListViewContainer : Control, INamingContainer
+       {
+               // Since the group template may contain command-triggering controls and we're
+               // wrapping it, we need to pass the command event up the chain, or it will get lost
+               // otherwise.
+               protected override bool OnBubbleEvent (object source, EventArgs e)
+               {
+                       CommandEventArgs args = e as CommandEventArgs;
+
+                       if (args == null)
+                               return false;
+
+                       RaiseBubbleEvent (this, args);
+                       return true;
+               }
+       }
+}
+#endif