2006-12-27 Carlos Alberto Cortez <calberto.cortez@gmail.com>
authorCarlos Alberto Cortez <calberto.cortez@gmail.com>
Wed, 27 Dec 2006 20:09:21 +0000 (20:09 -0000)
committerCarlos Alberto Cortez <calberto.cortez@gmail.com>
Wed, 27 Dec 2006 20:09:21 +0000 (20:09 -0000)
* ListView.cs:
* ListViewItem.cs:
* ThemeWin32Classic.cs:
* Theme.cs: Initial support for Tile view in ListView,
as well as the implementation of the required bits for it (Item
and Subitem).

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

mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog
mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListView.cs
mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListViewItem.cs
mcs/class/Managed.Windows.Forms/System.Windows.Forms/Theme.cs
mcs/class/Managed.Windows.Forms/System.Windows.Forms/ThemeWin32Classic.cs

index da962de13175a3261d08f08616193b1821cd30e5..4569e7398dc25751bb982c21dd4e05ed06dd4cc5 100644 (file)
@@ -1,3 +1,12 @@
+2006-12-27  Carlos Alberto Cortez <calberto.cortez@gmail.com>
+
+       * ListView.cs:
+       * ListViewItem.cs:
+       * ThemeWin32Classic.cs:
+       * Theme.cs: Initial support for Tile view in ListView,
+       as well as the implementation of the required bits for it (Item
+       and Subitem).
+
 2006-12-27  Gert Driesen  <drieseng@users.sourceforge.net>
 
        * MonthCalendar.cs: On 2.0, throw ArgumentOutOfRangeException instead
index b2266f6de26b68aceb7bf4f3ed53b7f41d564653..b8f21ae0065eb510991fa673c2a37945399f9a76 100644 (file)
@@ -94,6 +94,9 @@ namespace System.Windows.Forms
                private string keysearch_text;
                static private readonly int keysearch_keydelay = 1000;
                private int[] reordered_column_indices;
+#if NET_2_0
+               private Size tile_size;
+#endif
 
                // internal variables
                internal ImageList large_image_list;
@@ -616,6 +619,21 @@ namespace System.Windows.Forms
                        }
                }
 
+#if NET_2_0
+               public Size TileSize {
+                       get {
+                               return tile_size;
+                       }
+                       set {
+                               if (value.Width <= 0 || value.Height <= 0)
+                                       throw new ArgumentOutOfRangeException ("value");
+
+                               tile_size = value;
+                               Redraw (true);
+                       }
+               }
+#endif
+
                [Browsable (false)]
                [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
                public ListViewItem TopItem {
@@ -1023,11 +1041,31 @@ namespace System.Windows.Forms
                        }
                }
 
+#if NET_2_0
+               Size TileItemSize {
+                       get {
+                               // Calculate tile size if needed
+                               // It appears that using Font.Size instead of a SizeF value can give us
+                               // a slightly better approach to the proportions defined in .Net
+                               if (tile_size == Size.Empty) {
+                                       int image_w = LargeImageList == null ? 0 : LargeImageList.ImageSize.Width;
+                                       int image_h = LargeImageList == null ? 0 : LargeImageList.ImageSize.Height;
+                                       int w = (int)Font.Size * ThemeEngine.Current.ListViewTileWidthFactor + image_w + 4;
+                                       int h = Math.Max ((int)Font.Size * ThemeEngine.Current.ListViewTileHeightFactor, image_h);
+
+                                       tile_size = new Size (w, h);
+                               }
+
+                               return tile_size;
+                       }
+               }
+#endif
+
                int rows;
                int cols;
                ListViewItem[,] item_matrix;
 
-               void LayoutIcons (bool large_icons, bool left_aligned, int x_spacing, int y_spacing)
+               void LayoutIcons (Size item_size, bool left_aligned, int x_spacing, int y_spacing)
                {
                        header_control.Visible = false;
                        header_control.Size = Size.Empty;
@@ -1037,8 +1075,7 @@ namespace System.Windows.Forms
                        if (items.Count == 0)
                                return;
 
-                       Size sz = large_icons ? LargeIconItemSize : SmallIconItemSize;
-
+                       Size sz = item_size;
                        Rectangle area = ClientRectangle;
 
                        if (left_aligned) {
@@ -1146,18 +1183,25 @@ namespace System.Windows.Forms
                                break;
 
                        case View.SmallIcon:
-                               LayoutIcons (false, alignment == ListViewAlignment.Left, 4, 2);
+                               LayoutIcons (SmallIconItemSize, alignment == ListViewAlignment.Left, 4, 2);
                                break;
 
                        case View.LargeIcon:
-                               LayoutIcons (true, alignment == ListViewAlignment.Left,
+                               LayoutIcons (LargeIconItemSize, alignment == ListViewAlignment.Left,
                                             ThemeEngine.Current.ListViewHorizontalSpacing,
                                             ThemeEngine.Current.ListViewVerticalSpacing);
                                break;
 
                        case View.List:
-                               LayoutIcons (false, true, 4, 2);
+                               LayoutIcons (SmallIconItemSize, true, 4, 2);
                                break;
+#if NET_2_0
+                       case View.Tile:
+                               LayoutIcons (TileItemSize, alignment == ListViewAlignment.Left, 
+                                               ThemeEngine.Current.ListViewHorizontalSpacing,
+                                               ThemeEngine.Current.ListViewVerticalSpacing);
+                               break;
+#endif
                        }
 
                         CalculateScrollBars ();
index a9d5419588a25e2479e65a53a4bb752ef3bee260..9b6bdfde0195adc192276ed436e38454f5cabb0c 100644 (file)
@@ -766,6 +766,63 @@ namespace System.Windows.Forms
                                total = Rectangle.Union (item_rect, checkbox_rect);
                                bounds.Size = total.Size;
                                break;
+#if NET_2_0
+                       case View.Tile:
+                               label_rect = icon_rect = Rectangle.Empty;
+
+                               if (owner.LargeImageList != null) {
+                                       icon_rect.Width = owner.LargeImageList.ImageSize.Width;
+                                       icon_rect.Height = owner.LargeImageList.ImageSize.Height;
+                               }
+
+                               int separation = 2;
+                               SizeF tsize = owner.DeviceContext.MeasureString (Text, Font);
+
+                               // Set initial values for subitem's layout
+                               int total_height = (int)Math.Ceiling (tsize.Height);
+                               int max_subitem_width = (int)Math.Ceiling (tsize.Width);
+                               SubItems [0].bounds.Height = total_height;
+                       
+                               int count = Math.Min (owner.Columns.Count, SubItems.Count);
+                               for (int i = 1; i < count; i++) { // Ignore first column and first subitem
+                                       ListViewSubItem sub_item = SubItems [i];
+                                       if (sub_item.Text == null || sub_item.Text.Length == 0)
+                                               continue;
+
+                                       tsize = owner.DeviceContext.MeasureString (sub_item.Text, sub_item.Font);
+                               
+                                       int width = (int)Math.Ceiling (tsize.Width);
+                               
+                                       if (width > max_subitem_width)
+                                               max_subitem_width = width;
+                               
+                                       int height = (int)Math.Ceiling (tsize.Height);
+                                       total_height += height + separation;
+                               
+                                       sub_item.bounds.Height = height;
+                       
+                               }
+
+                               label_rect.X = icon_rect.Right + 4;
+                               label_rect.Y = owner.TileSize.Height / 2 - total_height / 2;
+                               label_rect.Width = max_subitem_width;
+                               label_rect.Height = total_height;
+                       
+                               // Second pass for assigning bounds. This time take first subitem into account.
+                               int current_y = label_rect.Y;
+                               for (int j = 0; j < count; j++) {
+                                       ListViewSubItem sub_item = SubItems [j];
+                                       if (sub_item.Text == null || sub_item.Text.Length == 0)
+                                               continue;
+
+                                       sub_item.SetBounds (label_rect.X, current_y, max_subitem_width, sub_item.bounds.Height);
+                                       current_y += sub_item.Bounds.Height + separation;
+                               }
+                               
+                               item_rect = Rectangle.Union (icon_rect, label_rect);
+                               bounds.Size = item_rect.Size;
+                               break;
+#endif
                        }
                        
                }
@@ -788,6 +845,7 @@ namespace System.Windows.Forms
 #if NET_2_0
                        private string name = String.Empty;
                        private object tag;
+                       internal Rectangle bounds;
 #endif
                        
                        #region Public Constructors
@@ -821,6 +879,20 @@ namespace System.Windows.Forms
                                    }
                        }
 
+#if NET_2_0
+                       public Rectangle Bounds {
+                               get {
+                                       Rectangle retval = bounds;
+                                       if (owner != null) {
+                                               retval.X += owner.Bounds.X;
+                                               retval.Y += owner.Bounds.Y;
+                                       }
+
+                                       return retval;
+                               }
+                       }
+#endif
+
                        [Localizable (true)]
                        public Font Font {
                                get {
@@ -907,6 +979,13 @@ namespace System.Windows.Forms
 
                                owner.owner.Invalidate ();
                        }
+
+#if NET_2_0
+                       internal void SetBounds (int x, int y, int width, int height)
+                       {
+                               bounds = new Rectangle (x, y, width, height);
+                       }
+#endif
                        #endregion // Private Methods
                }
 
index 8a210888f63f94071bf4d1d1658bdc527abaf20d..8169f2e2d0fa6b1ea9d395995a565d73300805e2 100644 (file)
@@ -785,6 +785,8 @@ namespace System.Windows.Forms
                public abstract int ListViewHorizontalSpacing { get; }
                public abstract Size ListViewDefaultSize { get; }
                public abstract int ListViewGroupHeight { get; }
+               public abstract int ListViewTileWidthFactor { get; }
+               public abstract int ListViewTileHeightFactor { get; }
                #endregion      // ListView
                
                #region Menus
index 640628f6a8b25fdde760e0d2f694bd44695f275f..dd2aa92bf163469e5f288a264de61997707c0044 100644 (file)
@@ -1722,7 +1722,7 @@ namespace System.Windows.Forms
                        }                       
                        
                        // Draw corner between the two scrollbars
-                       if (control.h_scroll.Visible == true && control.h_scroll.Visible == true) {
+                       if (control.h_scroll.Visible == true && control.v_scroll.Visible == true) {
                                Rectangle rect = new Rectangle ();
                                rect.X = control.h_scroll.Location.X + control.h_scroll.Width;
                                rect.Width = control.v_scroll.Width;
@@ -1811,7 +1811,12 @@ namespace System.Windows.Forms
                        Rectangle text_rect = item.GetBounds (ItemBoundsPortion.Label);                 
                        text_rect.X += col_offset;
 
+#if NET_2_0
+                       // Tile view doesn't support CheckBoxes
+                       if (control.CheckBoxes && control.View != View.Tile) {
+#else
                        if (control.CheckBoxes) {
+#endif
                                if (control.StateImageList == null) {
                                        // Make sure we've got at least a line width of 1
                                        int check_wd = Math.Max (3, rect_checkrect.Width / 6);
@@ -1857,8 +1862,11 @@ namespace System.Windows.Forms
                                }
                        }
 
-                       ImageList image_list = control.View == View.LargeIcon ? control.LargeImageList : 
-                               control.SmallImageList;
+                       ImageList image_list = control.View == View.LargeIcon 
+#if NET_2_0
+                               || control.View == View.Tile
+#endif
+                               ? control.LargeImageList : control.SmallImageList;
                        if (image_list != null) {
                                int idx;
 
@@ -1908,6 +1916,25 @@ namespace System.Windows.Forms
                                (item.Selected && control.Focused) ? SystemBrushes.HighlightText :
                                this.ResPool.GetSolidBrush (item.ForeColor);
 
+#if NET_2_0
+                       // Tile view renders its Text in a different fashion
+                       if (control.View == View.Tile) {
+                               // Item.Text is drawn using its first subitem's bounds
+                               dc.DrawString (item.Text, item.Font, textBrush, item.SubItems [0].Bounds, format);
+
+                               int count = Math.Min (control.Columns.Count, item.SubItems.Count);
+                               for (int i = 1; i < count; i++) {
+                                       ListViewItem.ListViewSubItem sub_item = item.SubItems [i];
+                                       if (sub_item.Text == null || sub_item.Text.Length == 0)
+                                               continue;
+
+                                       Brush itemBrush = item.Selected && control.Focused ? 
+                                               SystemBrushes.HighlightText : GetControlForeBrush (sub_item.ForeColor);
+                                       dc.DrawString (sub_item.Text, sub_item.Font, itemBrush, sub_item.Bounds, format);
+                               }
+                       } else
+#endif
+                       
                        if (item.Text != null && item.Text.Length > 0) {
                                if (item.Selected && control.Focused)
                                        dc.DrawString (item.Text, item.Font, textBrush, highlight_rect, format);
@@ -1992,7 +2019,7 @@ namespace System.Windows.Forms
                                        }
                                }
                        }
-                       
+
                        if (item.Focused && control.Focused) {                          
                                Rectangle focus_rect = highlight_rect;
                                if (control.FullRowSelect && control.View == View.Details) {
@@ -2042,6 +2069,14 @@ namespace System.Windows.Forms
                public override int ListViewGroupHeight { 
                        get { return 20; }
                }
+
+               public override int ListViewTileWidthFactor {
+                       get { return 22; }
+               }
+
+               public override int ListViewTileHeightFactor {
+                       get { return 3; }
+               }
                #endregion      // ListView
                
                #region Menus