示例#1
0
		// Navigates to the indicated item and returns the new item
		private int NavigateItemVisually (ItemNavigation navigation)
		{			
			int page_size, columns, selected_index = -1;

			if (multicolumn) {
				columns = items_area.Width / ColumnWidthInternal; 
				page_size = columns * RowCount;
				if (page_size == 0) {
					page_size = RowCount;
				}
			} else {
				page_size = items_area.Height / ItemHeight;	
			}

			switch (navigation) {

			case ItemNavigation.PreviousColumn: {
				if (SelectedIndex - RowCount < 0) {
					return -1;
				}

				if (SelectedIndex - RowCount < top_index) {
					top_index = SelectedIndex - RowCount;
					UpdateTopItem ();
				}
					
				selected_index = SelectedIndex - RowCount;
				break;
			}
			
			case ItemNavigation.NextColumn: {
				if (SelectedIndex + RowCount >= Items.Count) {
					break;
				}

				if (SelectedIndex + RowCount > last_visible_index) {
					top_index = SelectedIndex;
					UpdateTopItem ();
				}
					
				selected_index = SelectedIndex + RowCount;
				break;
			}

			case ItemNavigation.First: {
				top_index = 0;
				selected_index  = 0;
				UpdateTopItem ();
				break;
			}

			case ItemNavigation.Last: {

				int rows = items_area.Height / ItemHeight;
				
				if (multicolumn) {
					selected_index = Items.Count - 1;
					break;
				}
				if (Items.Count < rows) {
					top_index = 0;
					selected_index  = Items.Count - 1;
					UpdateTopItem ();
				} else {
					top_index = Items.Count - rows;
					selected_index  = Items.Count - 1;
					UpdateTopItem ();
				}
				break;
			}

			case ItemNavigation.Next: {
				if (FocusedItem == Items.Count - 1)
					return -1;

				if (multicolumn) {
					selected_index = FocusedItem + 1;
					break;
				}
				
				int bottom = 0;
				ArrayList heights = new ArrayList ();
				if (draw_mode == DrawMode.OwnerDrawVariable) {
					for (int i = top_index; i <= FocusedItem + 1; i++) {
						int h = GetItemHeight (i);
						bottom += h;
						heights.Add (h);
					}
				} else {
					bottom = ((FocusedItem + 1) - top_index + 1) * ItemHeight;
				}

				if (bottom >= items_area.Height) {
					int overhang = bottom - items_area.Height;

					int offset = 0;
					if (draw_mode == DrawMode.OwnerDrawVariable)
						while (overhang > 0)
							overhang -= (int) heights [offset];
					else
						offset = (int) Math.Ceiling ((float)overhang / (float) ItemHeight);
					top_index += offset;
					UpdateTopItem ();
				}
				selected_index = FocusedItem + 1;
				break;
			}

			case ItemNavigation.Previous: {
				if (FocusedItem > 0) {
					if (FocusedItem - 1 < top_index) {
						top_index--;
						UpdateTopItem ();
					}
					selected_index = FocusedItem - 1;
				}
				break;
			}

			case ItemNavigation.NextPage: {
				if (Items.Count < page_size) {
					NavigateItemVisually (ItemNavigation.Last);
					break;
				}

				if (FocusedItem + page_size - 1 >= Items.Count) {
					top_index = Items.Count - page_size;
					UpdateTopItem ();
					selected_index = Items.Count - 1;
				}
				else {
					if (FocusedItem + page_size - 1  > last_visible_index) {
						top_index = FocusedItem;
						UpdateTopItem ();
					}
					
					selected_index = FocusedItem + page_size - 1;
				}
					
				break;
			}			

			case ItemNavigation.PreviousPage: {
					
				int rows = items_area.Height / ItemHeight;
				if (FocusedItem - (rows - 1) <= 0) {
					top_index = 0;
					UpdateTopItem ();
					selected_index = 0;
				}
				else { 
					if (SelectedIndex - (rows - 1)  < top_index) {
						top_index = FocusedItem - (rows - 1);
						UpdateTopItem ();
					}
					
					selected_index = FocusedItem - (rows - 1);
				}
					
				break;
			}		
			default:
				break;
			}
			
			return selected_index;
		}
示例#2
0
        static MenuItem GetNextItem(Menu menu, ItemNavigation navigation)
        {
            int      pos = 0;
            bool     selectable_items = false;
            MenuItem item;

            // Check if there is at least a selectable item
            for (int i = 0; i < menu.MenuItems.Count; i++)
            {
                item = menu.MenuItems [i];
                if (item.Separator == false && item.Visible == true)
                {
                    selectable_items = true;
                    break;
                }
            }

            if (selectable_items == false)
            {
                return(null);
            }

            switch (navigation)
            {
            case ItemNavigation.First:

                /* First item that is not separator and it is visible*/
                for (pos = 0; pos < menu.MenuItems.Count; pos++)
                {
                    item = menu.MenuItems [pos];
                    if (item.Separator == false && item.Visible == true)
                    {
                        break;
                    }
                }

                break;

            case ItemNavigation.Last:             // Not used
                break;

            case ItemNavigation.Next:

                pos = menu.SelectedItem == null ? -1 : menu.SelectedItem.Index;

                /* Next item that is not separator and it is visible*/
                for (pos++; pos < menu.MenuItems.Count; pos++)
                {
                    item = menu.MenuItems [pos];
                    if (item.Separator == false && item.Visible == true)
                    {
                        break;
                    }
                }

                if (pos >= menu.MenuItems.Count)                   /* Jump at the start of the menu */
                {
                    pos = 0;
                    /* Next item that is not separator and it is visible*/
                    for (; pos < menu.MenuItems.Count; pos++)
                    {
                        item = menu.MenuItems [pos];
                        if (item.Separator == false && item.Visible == true)
                        {
                            break;
                        }
                    }
                }
                break;

            case ItemNavigation.Previous:

                if (menu.SelectedItem != null)
                {
                    pos = menu.SelectedItem.Index;
                }

                /* Previous item that is not separator and it is visible*/
                for (pos--; pos >= 0; pos--)
                {
                    item = menu.MenuItems [pos];
                    if (item.Separator == false && item.Visible == true)
                    {
                        break;
                    }
                }

                if (pos < 0)                    /* Jump at the end of the menu*/
                {
                    pos = menu.MenuItems.Count - 1;
                    /* Previous item that is not separator and it is visible*/
                    for (; pos >= 0; pos--)
                    {
                        item = menu.MenuItems [pos];
                        if (item.Separator == false && item.Visible == true)
                        {
                            break;
                        }
                    }
                }

                break;

            default:
                break;
            }

            return(menu.MenuItems [pos]);
        }
示例#3
0
		static MenuItem GetNextItem (Menu menu, ItemNavigation navigation)
		{
			int pos = 0;
			bool selectable_items = false;
			MenuItem item;

			// Check if there is at least a selectable item
			for (int i = 0; i < menu.MenuItems.Count; i++) {
				item = menu.MenuItems [i];
				if (item.Separator == false && item.Visible == true) {
					selectable_items = true;
					break;
				}
			}

			if (selectable_items == false)
				return null;

			switch (navigation) {
			case ItemNavigation.First:

				/* First item that is not separator and it is visible*/
				for (pos = 0; pos < menu.MenuItems.Count; pos++) {
					item = menu.MenuItems [pos];
					if (item.Separator == false && item.Visible == true)
						break;
				}

				break;

			case ItemNavigation.Last: // Not used
				break;

			case ItemNavigation.Next:

				pos = menu.SelectedItem == null ? - 1 : menu.SelectedItem.Index;

				/* Next item that is not separator and it is visible*/
				for (pos++; pos < menu.MenuItems.Count; pos++) {
					item = menu.MenuItems [pos];
					if (item.Separator == false && item.Visible == true)
						break;
				}

				if (pos >= menu.MenuItems.Count) { /* Jump at the start of the menu */
					pos = 0;
					/* Next item that is not separator and it is visible*/
					for (; pos < menu.MenuItems.Count; pos++) {
						item = menu.MenuItems [pos];
						if (item.Separator == false && item.Visible == true)
							break;
					}
				}
				break;

			case ItemNavigation.Previous:

				if (menu.SelectedItem != null)
					pos = menu.SelectedItem.Index;

				/* Previous item that is not separator and it is visible*/
				for (pos--; pos >= 0; pos--) {
					item = menu.MenuItems [pos];
					if (item.Separator == false && item.Visible == true)
						break;
				}

				if (pos < 0 ) { /* Jump at the end of the menu*/
					pos = menu.MenuItems.Count - 1;
					/* Previous item that is not separator and it is visible*/
					for (; pos >= 0; pos--) {
						item = menu.MenuItems [pos];
						if (item.Separator == false && item.Visible == true)
							break;
					}
				}

				break;

			default:
				break;
			}

			return menu.MenuItems [pos];
		}