[Mono-winforms-list] [PATCH] ListBox etc....
Kazuki Oikawa
kazuki at panicode.com
Tue Sep 20 00:41:54 EDT 2005
Oh..Sorry.
I attach the patch which is improvement from previous patch.
This patch is include previous fixes and
- When DropDownStyle is Simple, it doesn't show scrollbar.
- it doesn't highlight when mouse over a last item.
review it please.
--
Kazuki Oikawa
-------------- next part --------------
Index: ComboBox.cs
===================================================================
--- ComboBox.cs (revision 50212)
+++ ComboBox.cs (working copy)
@@ -1473,6 +1473,7 @@
int width, height;
int item_height = owner.ItemHeight;
bool show_scrollbar = false;
+ bool need_scrollbar = false;
if (owner.DropDownStyle == ComboBoxStyle.Simple) {
width = owner.CBoxInfo.listbox_area.Width;
@@ -1488,6 +1489,17 @@
height -= remaining;
}
}
+
+ int height2 = 0;
+ if (owner.DrawMode == DrawMode.OwnerDrawVariable) {
+ for (int i = 0; i < owner.Items.Count; i++) {
+ height2 += owner.GetItemHeight (i);
+ if (height2 > height) break;
+ }
+ } else {
+ height2 = (item_height - 2) * owner.Items.Count;
+ }
+ need_scrollbar = height < height2;
}
else { // DropDown or DropDownList
@@ -1507,9 +1519,10 @@
height += ThemeEngine.Current.DrawComboListBoxDecorationBottom (owner.DropDownStyle);
height += ThemeEngine.Current.DrawComboListBoxDecorationTop (owner.DropDownStyle);
+ need_scrollbar = owner.Items.Count > owner.MaxDropDownItems;
}
- if (owner.Items.Count <= owner.MaxDropDownItems) {
+ if (!need_scrollbar) {
/* Does not need vertical scrollbar*/
if (vscrollbar_ctrl != null) {
@@ -1534,8 +1547,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;
+
show_scrollbar = vscrollbar_ctrl.Visible = true;
}
@@ -1557,7 +1569,11 @@
textarea_drawable.Width -= vscrollbar_ctrl.Width;
last_item = LastVisibleItem ();
- page_size = textarea_drawable.Height / (item_height - 2);
+ page_size = textarea_drawable.Height / (item_height - 2);
+
+ if (need_scrollbar && show_scrollbar) {
+ vscrollbar_ctrl.Maximum = owner.Items.Count - (owner.DropDownStyle == ComboBoxStyle.Simple ? page_size : owner.maxdrop_items);
+ }
}
private void Draw (Rectangle clip, Graphics dc)
@@ -1776,7 +1792,7 @@
/* Previous item */
if (GetHighLightedIndex () != -1) {
invalidate = GetItemDisplayRectangle (GetHighLightedIndex (), top_item);
- if (ClientRectangle.Contains (invalidate))
+ if (ClientRectangle.IntersectsWith (invalidate))
Invalidate (invalidate);
}
@@ -1785,7 +1801,7 @@
if (highlighted_item != null) {
/* Current item */
invalidate = GetItemDisplayRectangle (GetHighLightedIndex (), top_item);
- if (ClientRectangle.Contains (invalidate))
+ if (ClientRectangle.IntersectsWith (invalidate))
Invalidate (invalidate);
}
@@ -1793,9 +1809,16 @@
public void SetTopItem (int item)
{
- top_item = item;
- UpdateLastVisibleItem ();
- Refresh ();
+ if (vscrollbar_ctrl != null) {
+ if (vscrollbar_ctrl.Maximum < item)
+ vscrollbar_ctrl.Value = vscrollbar_ctrl.Maximum;
+ else
+ vscrollbar_ctrl.Value = item;
+ } else {
+ top_item = item;
+ UpdateLastVisibleItem ();
+ Refresh ();
+ }
}
private void OnMouseDownPUW (object sender, MouseEventArgs e)
@@ -1848,9 +1871,6 @@
return;
}
- if (owner.DropDownStyle == ComboBoxStyle.Simple)
- return;
-
/* Reroute event to scrollbar */
if (vscrollbar_ctrl != null && vscrollbar_ctrl.Visible == true) {
Rectangle scrollbar_screenrect;
@@ -1906,8 +1926,16 @@
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 if (owner.Items.Count > owner.MaxDropDownItems) {
+ SetTopItem (owner.Items.Count - owner.MaxDropDownItems);
+ } else {
+ SetTopItem (0);
+ }
+ SetHighLightedItem (owner.SelectedItem);
+ }
CalcListBoxArea ();
Show ();
More information about the Mono-winforms-list
mailing list