[Mono-winforms-list] [PATCH] ListBox etc....
Kazuki Oikawa
kazuki at panicode.com
Thu Sep 15 11:12:18 EDT 2005
Hi.
I made a patch to fix bugs.
Please review it.
Best regards.
Kazuki Oikawa
StatusBar.cs
- SizingGrip area should not be allocated when it is not displayed.
- Now it reflects MinWidth of the containing panel and fixed a crash that happens when its width becomes so small.
ListBox.cs
- Items should be fully shown.
- When resizing and vertical scrollbar disappeared, the item of index 0 should be on the top of the list.
- GetItemRectangle should consider the size of vertical scrollbar.
ThemeWin32Classic.cs
- Fixed a bug that ListBox items were wrapped at the right end.
ComboBox.cs
- When DropDownStyle is Simple, it does not show scrollbar to the last item of the list.
- When DropDownStyle is Simple, it crashed when the list was scrolled down with the down cursor key.
- Fixed a bug that when DropDownStyle is DropDownList, the selected item was not shown.
- The position of the selected item was not preserved when the next dropdown happened.
CheckedListBox.cs
- (Fixed #1 of CheckedListBoxTest.CheckedListBoxPropertyTest.)
Tooltip.cs
- Fixed #Mtd2 of ToolTipTest.RemoveToolTipTest.)
-------------- next part --------------
Index: CheckedListBox.cs
===================================================================
--- CheckedListBox.cs (ãªãã¸ã§ã³ 50025)
+++ CheckedListBox.cs (ä½æ¥ã³ãã¼)
@@ -387,6 +387,7 @@
listbox_items.Add (box_item);
if (check == CheckState.Checked)
owner.OnItemCheck (new ItemCheckEventArgs (cnt, check, CheckState.Unchecked));
+ owner.UpdateItemInfo (UpdateOperation.AddItems, cnt, cnt);
return cnt;
}
}
Index: ComboBox.cs
===================================================================
--- ComboBox.cs (ãªãã¸ã§ã³ 50025)
+++ ComboBox.cs (ä½æ¥ã³ãã¼)
@@ -1024,7 +1024,7 @@
selected_index, state, ForeColor, BackColor));
}
- if (clip.IntersectsWith (combobox_info.listbox_area) == true) {
+ if (DropDownStyle == ComboBoxStyle.Simple && clip.IntersectsWith (combobox_info.listbox_area) == true) {
dc.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (Parent.BackColor),
combobox_info.listbox_area);
}
@@ -1535,7 +1535,7 @@
vscrollbar_ctrl.Location = new Point (width - vscrollbar_ctrl.Width - ThemeEngine.Current.DrawComboListBoxDecorationRight (owner.DropDownStyle),
ThemeEngine.Current.DrawComboListBoxDecorationTop (owner.DropDownStyle));
- vscrollbar_ctrl.Maximum = owner.Items.Count - owner.MaxDropDownItems;
+ vscrollbar_ctrl.Maximum = owner.Items.Count - (owner.DropDownStyle == ComboBoxStyle.Simple ? page_size : owner.maxdrop_items);
show_scrollbar = vscrollbar_ctrl.Visible = true;
}
@@ -1793,9 +1793,10 @@
public void SetTopItem (int item)
{
- top_item = item;
- UpdateLastVisibleItem ();
- Refresh ();
+ if (vscrollbar_ctrl.Maximum < item)
+ vscrollbar_ctrl.Value = vscrollbar_ctrl.Maximum;
+ else
+ vscrollbar_ctrl.Value = item;
}
private void OnMouseDownPUW (object sender, MouseEventArgs e)
@@ -1906,8 +1907,14 @@
if (owner.DropDownStyle != ComboBoxStyle.Simple && owner.Items.Count == 0)
return false;
- SetTopItem (0);
- SetHighLightedItem (owner.SelectedItem);
+ if (owner.SelectedIndex >= 0) {
+ if (owner.SelectedIndex <= owner.Items.Count - owner.MaxDropDownItems) {
+ SetTopItem (owner.SelectedIndex);
+ } else {
+ SetTopItem (owner.Items.Count - owner.MaxDropDownItems);
+ }
+ SetHighLightedItem (owner.SelectedItem);
+ }
CalcListBoxArea ();
Show ();
Index: ListBox.cs
===================================================================
--- ListBox.cs (ãªãã¸ã§ã³ 50025)
+++ ListBox.cs (ä½æ¥ã³ãã¼)
@@ -132,6 +132,7 @@
private bool ctrl_pressed;
private bool shift_pressed;
private bool has_focus;
+ private bool use_item_height;
internal int focused_item;
internal ListBoxInfo listbox_info;
@@ -158,6 +159,7 @@
ctrl_pressed = false;
shift_pressed = false;
has_focus = false;
+ use_item_height = false;
items = new ObjectCollection (this);
selected_indices = new SelectedIndexCollection (this);
@@ -379,6 +381,7 @@
return;
listbox_info.item_height = value;
+ use_item_height = true;
CalcClientArea ();
}
}
@@ -747,18 +750,24 @@
if (DrawMode == DrawMode.OwnerDrawVariable) {
rect.Y = 0;
- for (int i = 0; i < index; i++) {
- rect.Y += GetItemHeight (i);
- }
+ if (index >= listbox_info.top_item) {
+ for (int i = listbox_info.top_item; i < index; i++) {
+ rect.Y += GetItemHeight (i);
+ }
+ } else {
+ for (int i = index; i < listbox_info.top_item; i++) {
+ rect.Y -= GetItemHeight (i);
+ }
+ }
} else {
- rect.Y = ItemHeight * index;
+ rect.Y = ItemHeight * (index - listbox_info.top_item);
}
}
else {
int which_page;
which_page = index / listbox_info.page_size;
- rect.Y = (index % listbox_info.page_size) * ItemHeight;
+ rect.Y = ((index - listbox_info.top_item) % listbox_info.page_size) * ItemHeight;
rect.X = which_page * ColumnWidthInternal;
rect.Height = ItemHeight;
rect.Width = ColumnWidthInternal;
@@ -834,11 +843,14 @@
protected override void OnFontChanged (EventArgs e)
{
base.OnFontChanged (e);
- listbox_info.item_height = FontHeight;
-
- RellocateScrollBars ();
- CalcClientArea ();
- UpdateItemInfo (UpdateOperation.AllItems, 0, 0);
+ if (!use_item_height) {
+ listbox_info.item_height = FontHeight;
+ RellocateScrollBars ();
+ CalcClientArea ();
+ UpdateItemInfo (UpdateOperation.AllItems, 0, 0);
+ } else {
+ base.Refresh ();
+ }
}
protected override void OnHandleCreated (EventArgs e)
@@ -1000,8 +1012,8 @@
listbox_info.textdrawing_rect.Y += ThemeEngine.Current.DrawListBoxDecorationTop (BorderStyle);
listbox_info.textdrawing_rect.X += ThemeEngine.Current.DrawListBoxDecorationLeft (BorderStyle);
//BUG: Top and Left decorations
- listbox_info.textdrawing_rect.Height -= ThemeEngine.Current.DrawListBoxDecorationBottom (BorderStyle);
- listbox_info.textdrawing_rect.Width -= ThemeEngine.Current.DrawListBoxDecorationRight (BorderStyle);
+ listbox_info.textdrawing_rect.Height -= ThemeEngine.Current.DrawListBoxDecorationBottom (BorderStyle) + ThemeEngine.Current.DrawListBoxDecorationTop (BorderStyle);
+ listbox_info.textdrawing_rect.Width -= ThemeEngine.Current.DrawListBoxDecorationRight (BorderStyle) + ThemeEngine.Current.DrawListBoxDecorationLeft (BorderStyle);
if (listbox_info.show_verticalsb)
listbox_info.textdrawing_rect.Width -= vscrollbar_ctrl.Width;
@@ -1022,7 +1034,7 @@
}
} else {
- listbox_info.page_size = listbox_info.textdrawing_rect.Height / listbox_info.item_height;
+ listbox_info.page_size = listbox_info.textdrawing_rect.Height / ItemHeight;
}
if (listbox_info.page_size == 0) {
@@ -1037,7 +1049,7 @@
// items can still be partially shown if scroll bars are displayed.
int remaining = (listbox_info.client_rect.Height -
- ThemeEngine.Current.DrawListBoxDecorationBottom (BorderStyle) -
+ ThemeEngine.Current.DrawListBoxDecorationTop (BorderStyle) -
ThemeEngine.Current.DrawListBoxDecorationBottom (BorderStyle)) %
listbox_info.item_height;
@@ -1109,7 +1121,7 @@
item_rect.Y += ThemeEngine.Current.DrawListBoxDecorationTop (BorderStyle);
item_rect.X += ThemeEngine.Current.DrawListBoxDecorationLeft (BorderStyle);
- item_rect.Width -= ThemeEngine.Current.DrawListBoxDecorationRight (BorderStyle);
+ item_rect.Width -= ThemeEngine.Current.DrawListBoxDecorationRight (BorderStyle);// + ThemeEngine.Current.DrawListBoxDecorationLeft (BorderStyle);
return item_rect;
}
@@ -1165,7 +1177,7 @@
}
else {
if (item_rect.Y + item_rect.Height > top_y)
- return i - 1;
+ return i;
}
}
}
@@ -1254,10 +1266,20 @@
case ItemNavigation.Next: {
if (focused_item + 1 < Items.Count) {
- if (focused_item + 1 > LBoxInfo.last_item) {
- LBoxInfo.top_item++;
- UpdatedTopItem ();
+ int actualHeight = 0;
+ if (draw_mode == DrawMode.OwnerDrawVariable) {
+ for (int i = LBoxInfo.top_item; i <= focused_item + 1; i++)
+ actualHeight += GetItemHeight (i);
+ } else {
+ actualHeight = ((focused_item + 1) - LBoxInfo.top_item + 1) * ItemHeight;
}
+ if (actualHeight >= LBoxInfo.textdrawing_rect.Height) {
+ int bal = IntegralHeight ? 0 : (listbox_info.textdrawing_rect.Height == actualHeight ? 0 : 1);
+ if (focused_item + bal >= LBoxInfo.last_item) {
+ LBoxInfo.top_item++;
+ UpdatedTopItem ();
+ }
+ }
selected_index = focused_item + 1;
}
break;
@@ -1798,6 +1820,8 @@
vscrollbar_ctrl.Maximum = Items.Count - listbox_info.page_size;
RellocateScrollBars ();
+ } else if (vscrollbar_ctrl.Maximum > 0) {
+ vscrollbar_ctrl.Maximum = 0;
}
CalcClientArea ();
Index: StatusBar.cs
===================================================================
--- StatusBar.cs (ãªãã¸ã§ã³ 50025)
+++ StatusBar.cs (ä½æ¥ã³ãã¼)
@@ -324,7 +324,7 @@
}
if (p.AutoSize == StatusBarPanelAutoSize.Contents) {
int len = (int) (DeviceContext.MeasureString (p.Text, Font).Width + 0.5F);
- p.Width = (int) (len * 1.5F);
+ p.Width = (int) (len + 8);
taken += p.Width;
taken += gap;
continue;
@@ -342,10 +342,11 @@
return;
int spring_total = springs.Count;
- int total_width = Width - taken - ThemeEngine.Current.StatusBarSizeGripWidth;
+ int total_width = Width - taken - (SizingGrip ? ThemeEngine.Current.StatusBarSizeGripWidth : 0);
for (int i = 0; i < spring_total; i++) {
StatusBarPanel p = (StatusBarPanel) springs [i];
- p.Width = total_width / spring_total;
+ int width = total_width / spring_total;
+ p.Width = (width >= p.MinWidth ? width : p.MinWidth);
}
}
Index: ThemeWin32Classic.cs
===================================================================
--- ThemeWin32Classic.cs (ãªãã¸ã§ã³ 50025)
+++ ThemeWin32Classic.cs (ä½æ¥ã³ãã¼)
@@ -1437,7 +1437,7 @@
e.Graphics.DrawString (ctrl.GetItemText (ctrl.Items[e.Index]), e.Font,
ThemeEngine.Current.ResPool.GetSolidBrush (fore_color),
- e.Bounds, string_format);
+ e.Bounds.X, e.Bounds.Y, string_format);
if ((e.State & DrawItemState.Focus) == DrawItemState.Focus) {
ThemeEngine.Current.CPDrawFocusRectangle (e.Graphics, e.Bounds,
Index: ToolTip.cs
===================================================================
--- ToolTip.cs (ãªãã¸ã§ã³ 50025)
+++ ToolTip.cs (ä½æ¥ã³ãã¼)
@@ -270,7 +270,10 @@
[Localizable (true)]
[DefaultValue ("")]
public string GetToolTip(Control control) {
- return (string)tooltip_strings[control];
+ string tooltip = (string)tooltip_strings[control];
+ if (tooltip == null)
+ return "";
+ return tooltip;
}
public void RemoveAll() {
More information about the Mono-winforms-list
mailing list