Author: husted
Date: Wed Dec  6 11:07:10 2006
New Revision: 483177

URL: http://svn.apache.org/viewvc?view=rev&rev=483177
Log:
Extend support for flipping to a page in the datagrid, based on a key field. 
Clients can override ExecuteList to specify the name of the key field. 

Added:
    struts/sandbox/trunk/overdrive/Nexus/Core/EntryDictionary.cs
Modified:
    struts/sandbox/trunk/overdrive/Nexus/Core/Core.csproj
    struts/sandbox/trunk/overdrive/Nexus/Core/Nexus.Core.xml
    struts/sandbox/trunk/overdrive/Nexus/Web/GridControl.ascx.cs

Modified: struts/sandbox/trunk/overdrive/Nexus/Core/Core.csproj
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/overdrive/Nexus/Core/Core.csproj?view=diff&rev=483177&r1=483176&r2=483177
==============================================================================
--- struts/sandbox/trunk/overdrive/Nexus/Core/Core.csproj (original)
+++ struts/sandbox/trunk/overdrive/Nexus/Core/Core.csproj Wed Dec  6 11:07:10 
2006
@@ -104,6 +104,11 @@
                     BuildAction = "Compile"
                 />
                 <File
+                    RelPath = "EntryDictionary.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
                     RelPath = "IEntryList.cs"
                     SubType = "Code"
                     BuildAction = "Compile"

Added: struts/sandbox/trunk/overdrive/Nexus/Core/EntryDictionary.cs
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/overdrive/Nexus/Core/EntryDictionary.cs?view=auto&rev=483177
==============================================================================
--- struts/sandbox/trunk/overdrive/Nexus/Core/EntryDictionary.cs (added)
+++ struts/sandbox/trunk/overdrive/Nexus/Core/EntryDictionary.cs Wed Dec  6 
11:07:10 2006
@@ -0,0 +1,121 @@
+using System;
+using System.Collections;
+using System.Text;
+
+namespace Nexus.Core
+{
+       /// <summary>
+       /// Expose field attributes as public properties.
+       /// </summary>
+       /// <remarks><p>
+       /// The EntryDictionary is used for integration with libraries that 
+       /// can use only public properties, such as DataGrid. 
+       /// It is also used to pass properties as Event argument, 
+       /// in which case it is used like a data transfer object.
+       /// </p><p>
+       /// The values are available both as an IDictionary and 
+       /// (optionally) as Properties. 
+       /// (The properties should use the IDictionary for storage.)
+       /// To define properties, extend EntryDictionary.
+       /// </p></remarks>
+       public class EntryDictionary
+       {
+               private IDictionary _Value = new Hashtable();
+
+               public EntryDictionary()
+               {
+                       // Default contstructor 
+               }
+
+               public EntryDictionary(IDictionary sources)
+               {
+                       AddAll(sources);
+               }
+
+               /// <summary>
+               /// Provide a string representation of the field values 
+               /// in the format "key=value\n".
+               /// </summary>
+               /// <returns>String representation</returns>
+               public override String ToString()
+               {
+                       StringBuilder builder = new StringBuilder(128);
+                       string tab = "=";
+                       string eol = "\n";
+                       ICollection keys = _Value.Keys;
+                       foreach (string key in keys)
+                       {
+                               builder.Append(key);
+                               builder.Append(tab);
+                               builder.Append(Get(key));
+                               builder.Append(eol);
+                       }
+                       return builder.ToString();
+               }
+
+               public void Add(string key, string value)
+               {
+                       _Value.Add(key, value);
+               }
+
+               public void AddAll(IDictionary sources)
+               {
+                       ICollection keys = sources.Keys;
+                       foreach (string key in keys)
+                       {
+                               object value = sources[key];
+                               if (value == null)
+                                       Add(key, value as string);
+                               else
+                                       Add(key, value.ToString());
+                       }
+               }
+
+               protected ICollection Keys
+               {
+                       get { return _Value.Keys; }
+               }
+
+               public string Get(string key)
+               {
+                       return _Value[key] as string;
+               }
+
+               public void Set(string key, string value)
+               {
+                       if (value == null)
+                               _Value[key] = null;
+                       else _Value[key] = value.Trim();
+               }
+
+               public Boolean Contains(Object key)
+               {
+                       return _Value.Contains(key);
+               }
+
+               public IDictionary Criteria
+               {
+                       get { return _Value; }
+               }
+
+               /// <summary>
+               /// Call calculated properties so that 
+               /// they are cached as entries in the table.
+               /// </summary>
+               /// <remarks>
+               /// <p>Override to provide functionality</p>
+               /// </remarks>
+               /// 
+               public virtual void CacheText()
+               {
+               }
+
+               /*
+               public string Property
+               {
+                       get { return return Get(App.PROPERTY); }
+                       set { Set(App.PROPERTY, value); }
+               }
+               */
+       }
+}
\ No newline at end of file

Modified: struts/sandbox/trunk/overdrive/Nexus/Core/Nexus.Core.xml
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/overdrive/Nexus/Core/Nexus.Core.xml?view=diff&rev=483177&r1=483176&r2=483177
==============================================================================
--- struts/sandbox/trunk/overdrive/Nexus/Core/Nexus.Core.xml (original)
+++ struts/sandbox/trunk/overdrive/Nexus/Core/Nexus.Core.xml Wed Dec  6 
11:07:10 2006
@@ -1741,5 +1741,38 @@
             Token for Entry Item command name.
             </summary>
         </member>
+        <member name="T:Nexus.Core.EntryDictionary">
+            <summary>
+            Expose field attributes as public properties.
+            </summary>
+            <remarks><p>
+            The EntryDictionary is used for integration with libraries that 
+            can use only public properties, such as DataGrid. 
+            It is also used to pass properties as Event argument, 
+            in which case it is used like a data transfer object.
+            </p><p>
+            The values are available both as an IDictionary and 
+            (optionally) as Properties. 
+            (The properties should use the IDictionary for storage.)
+            To define properties, extend EntryDictionary.
+            </p></remarks>
+        </member>
+        <member name="M:Nexus.Core.EntryDictionary.ToString">
+            <summary>
+            Provide a string representation of the field values 
+            in the format "key=value\n".
+            </summary>
+            <returns>String representation</returns>
+        </member>
+        <member name="M:Nexus.Core.EntryDictionary.CacheText">
+            <summary>
+            Call calculated properties so that 
+            they are cached as entries in the table.
+            </summary>
+            <remarks>
+            <p>Override to provide functionality</p>
+            </remarks>
+            
+        </member>
     </members>
 </doc>

Modified: struts/sandbox/trunk/overdrive/Nexus/Web/GridControl.ascx.cs
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/overdrive/Nexus/Web/GridControl.ascx.cs?view=diff&rev=483177&r1=483176&r2=483177
==============================================================================
--- struts/sandbox/trunk/overdrive/Nexus/Web/GridControl.ascx.cs (original)
+++ struts/sandbox/trunk/overdrive/Nexus/Web/GridControl.ascx.cs Wed Dec  6 
11:07:10 2006
@@ -550,12 +550,84 @@
                /// <param name="helper">The helper to examine</param>
                /// <returns>Total count of items for all pages</returns>
                ///     
-               private int GetItemCount(IViewHelper helper)
+               protected int GetItemCount(IViewHelper helper)
                {
                        return Convert.ToInt32(helper.Criteria[ITEM_COUNT]);
                }
 
                /// <summary>
+               /// Obtain the item page from Helper, or zero if no page set.
+               /// </summary>
+               /// <param name="helper">The helper to examine</param>
+               /// <returns>Current page number within data set</returns>
+               ///     
+               protected int GetItemPage(IViewHelper helper)
+               {
+                       object page = helper.Criteria[ITEM_PAGE];
+                       if (page==null) return 0;                       
+                       return Convert.ToInt32(page);
+               }
+
+               /// <summary>
+               /// Update the item page from Helper.
+               /// </summary>
+               /// <param name="helper">The helper to examine</param>
+               /// <returns>Current page number for current item</returns>
+               ///     
+               protected void SetItemPage(IViewHelper helper, int page)
+               {
+                       helper.Criteria[ITEM_PAGE] = Convert.ToString(page);
+               }
+
+               
+               /// <summary>
+               /// Update the item offset from Helper.
+               /// </summary>
+               /// <param name="helper">The helper to examine</param>
+               /// <returns>Current page number for current item</returns>
+               ///     
+               protected void SetItemOffset(IViewHelper helper, int ofs)
+               {
+                       helper.Criteria[ITEM_OFFSET] = Convert.ToString(ofs);
+               }
+
+
+               /// <summary>
+               /// Store the item key field name.
+               /// </summary>
+               /// <param name="context">The context to examine</param>
+               /// <param name="key">The name of the item key field</param>
+               ///     
+               protected void SetItemKey(IDictionary context, string key)
+               {
+                       context[ITEM_KEY] = key;
+               }
+               
+               /// <summary>
+               /// Obtain the item key field name.
+               /// </summary>
+               /// <param name="context">The context to examine</param>
+               /// <returns>Name of key field</returns>
+               ///     
+               protected object GetItemKey(IDictionary context)
+               {
+                       return context[ITEM_KEY];
+               }
+               
+               /// <summary>
+               /// Obtain the item page from Helper, or zero if no page set.
+               /// </summary>
+               /// <param name="context">The context to examine</param>
+               /// <returns>Current page number within data set</returns>
+               ///     
+               protected object GetItemKeyValue(IDictionary context)
+               {
+                       object key = context[ITEM_KEY];
+                       if (key==null) return null;
+                       return context[key];
+               }
+               
+               /// <summary>
                /// Configure the DataGrid for initial display.
                /// </summary>
                /// <param name="helper">The Helper with an outcome to bind as 
a DataSource</param>
@@ -752,19 +824,61 @@
                        if (okay) BindGrid(helper); // DoBindGrid = helper;
                        return helper;
                }
-
+               
                /// <summary>
-               /// Invoke a ListCommand that uses a criteria.
+               /// Look for a IssueEventKey, and scroll to it, if found.
                /// </summary>
-               /// <returns>Executed helper</returns>
+               /// <param name="criteria">Input/outpout values</param>
+               /// <returns>Helper after obtaining list</returns>
                public virtual IViewHelper ExecuteList(IDictionary criteria)
                {
+                       
                        IViewHelper helper = ReadExecute(ListCommand, criteria);
+
+                       object issue_event_key = GetItemKeyValue(criteria);
+                       int count = GetItemCount(helper);
                        bool okay = helper.IsNominal;
-                       if (okay) BindGrid(helper); // DoBindGrid = helper;
+                       bool skip_to_item = (issue_event_key == null) || 
(count==0) || !okay;
+                       if (skip_to_item)
+                       {
+                               if (okay) BindGrid(helper); // DoBindGrid = 
helper;
+                               return helper;
+                       }
+                       
+                       bool found = false; 
+                       int page = -1;
+                       int item = -1;
+                       object key = GetItemKey(criteria);
+                       while ((!found) && (count>item) && helper.IsNominal)
+                       {
+                               page++;
+                               if (helper.IsNominal)
+                               {
+                                       IList outcome = helper.Outcome;
+                                       foreach (EntryDictionary e in outcome)
+                                       {
+                                               found = found || 
(issue_event_key.Equals(e.Criteria[key]));
+                                       }
+                                       if (!found)
+                                       {
+                                               item = item + outcome.Count;
+                                               SetItemOffset(helper,item+1);
+                                               helper.Execute();
+                                       }
+                               }
+                       }
+                       
+                       if (helper.IsNominal)
+                       {
+                               if (found) SetItemPage(helper,page);            
                                        
+                               BindGrid(helper); // DoBindGrid = helper;
+                       } 
                        return helper;
                }
-
+               
+               
+               
+               
                /// <summary>
                /// Setup the DataGrid when the page is first initialized.
                /// </summary>
@@ -780,15 +894,18 @@
                                HasCriteria = true;
                        }
 
-                       if (HasCriteria)
+                       if (HasCriteria) 
+                       {
                                helper = ExecuteList(criteria);
+                       }
                        else
                                helper = ExecuteList();
                        
                        if (Grid.AllowCustomPaging)
                        {
+                               int page = GetItemPage(helper);
                                int count = GetItemCount(helper);
-                               ListPageIndexChanged_Raise(this, 0, 
Grid.PageSize, count);                                                          
    
+                               ListPageIndexChanged_Raise(this, page, 
Grid.PageSize, count);                                                          
 
                        }
                        
                        return helper;
@@ -1046,6 +1163,16 @@
                /// </summary>
                public const string ITEM_COUNT = "item_count";
 
+               /// <summary>
+               /// Provide key to store item page in criteria.
+               /// </summary>
+               public const string ITEM_PAGE = "item_page";
+
+               /// <summary>
+               /// Provide key to store item key in criteria.
+               /// </summary>
+               public const string ITEM_KEY = "item_key";
+               
                #endregion
 
                #region ListPageIndexChanged 
@@ -1137,6 +1264,7 @@
                                a.ItemFrom = from;
                                a.ItemThru = thru;
                                a.ItemCount = count;
+                               Grid.CurrentPageIndex = page;
                                ListPageIndexChanged(sender, a);
                        }
                }
@@ -1574,17 +1702,17 @@
                        /// <param name="insertNullKey">Whether to prepend a 
-v- item to the list</param>
                        public DropDownListTemplate(string id, IKeyValueList 
list, bool insertNullKey)
                        {
-                                       if (insertNullKey) 
+                               if (insertNullKey) 
+                               {
+                                       lock(list)
                                        {
-                                               lock(list)
-                                               {
-                                                       IKeyValue e = list[0] 
as KeyValue;
-                                                       if 
(!NULL_TOKEN.Equals(e.Text))
-                                                       {                       
                                        
-                                                               list.Insert(0, 
new KeyValue(String.Empty, NULL_TOKEN));                                        
 
-                                                       }
+                                               IKeyValue e = list[0] as 
KeyValue;
+                                               if (!NULL_TOKEN.Equals(e.Text))
+                                               {                               
                                
+                                                       list.Insert(0, new 
KeyValue(String.Empty, NULL_TOKEN));                                         
                                                }
-                                       }                                       
+                                       }
+                               }                                       
 
                                _DataField = id;
                                _Control = new DropDownList();


Reply via email to