public Column(string headerText, string footerText, Cell cell, double width, string sortKey) { HeaderText = headerText; FooterText = footerText; HeaderCell = new CellTextHeader(); FooterCell = new CellTextFooter(); ListCell = cell; this.width = width; this.sortKey = sortKey; isSortable = !string.IsNullOrEmpty(sortKey); }
private void PaintRows(Rectangle clip) { sort_column_index = -1; for (int i = 0; i < column_cache.Length; i++) { if (!column_cache [i].Column.Visible) { continue; } Column column = column_cache [i].Column; if (sortModel == null) { continue; } CellTextHeader column_cell = column.HeaderCell as CellTextHeader; if (column_cell == null) { continue; } if (column.IsSortable && sortModel.SortColumn == column) { sort_column_index = i; } } if (sort_column_index != -1 && (!pressed_column_is_dragging || pressed_column_index != sort_column_index)) { CachedColumn col = column_cache [sort_column_index]; Theme.DrawRowRule(cairo_context, list_rendering_alloc.X + col.X1 - (int)hadjustment.Value, header_rendering_alloc.Bottom + Theme.BorderWidth, col.Width, list_rendering_alloc.Height + Theme.InnerBorderWidth * 2); } clip.Intersect(list_rendering_alloc); cairo_context.Rectangle(clip.X, clip.Y, clip.Width, clip.Height); cairo_context.Clip(); cell_context.Clip = clip; cell_context.TextAsForeground = false; int vadjustment_value = (int)vadjustment.Value; int first_row = vadjustment_value / RowHeight; int last_row; try { last_row = Math.Min(model.Count, first_row + RowsInView); } catch (DbConnectionLostException) { last_row = first_row + RowsInView; } int offset = list_rendering_alloc.Y - vadjustment_value % RowHeight; Rectangle selected_focus_alloc = Rectangle.Zero; Rectangle single_list_alloc = new Rectangle(); single_list_alloc.X = list_rendering_alloc.X - (int)(hadjustment.Value); single_list_alloc.Y = offset; single_list_alloc.Width = list_rendering_alloc.Width; single_list_alloc.Height = RowHeight; int selection_height = 0; int selection_y = 0; selected_rows.Clear(); for (int ri = first_row; ri < last_row; ri++) { if (Selection != null && Selection.Contains(ri)) { if (selection_height == 0) { selection_y = single_list_alloc.Y; } selection_height += single_list_alloc.Height; selected_rows.Add(ri); if (Selection.FocusedCell.Row == ri) { selected_focus_alloc = single_list_alloc; } } else { if (rules_hint && ri % 2 != 0) { Theme.DrawRowRule(cairo_context, list_rendering_alloc.X, single_list_alloc.Y, single_list_alloc.Width, single_list_alloc.Height); } if (ri == drag_reorder_row_index && Reorderable) { cairo_context.Save(); cairo_context.LineWidth = 1.0; cairo_context.Antialias = Cairo.Antialias.None; cairo_context.MoveTo(single_list_alloc.Left, single_list_alloc.Top); cairo_context.LineTo(single_list_alloc.Right, single_list_alloc.Top); cairo_context.Color = Theme.Colors.GetWidgetColor(GtkColorClass.Text, StateType.Normal); cairo_context.Stroke(); cairo_context.Restore(); } if (Selection != null && Selection.FocusedCell.Row == ri && !Selection.Contains(ri) && AllowSelect) { CairoCorners corners = CairoCorners.All; if (Selection.Contains(ri - 1)) { corners &= ~(CairoCorners.TopLeft | CairoCorners.TopRight); } if (Selection.Contains(ri + 1)) { corners &= ~(CairoCorners.BottomLeft | CairoCorners.BottomRight); } Theme.DrawRowSelection(cairo_context, single_list_alloc.X, single_list_alloc.Y, single_list_alloc.Width, single_list_alloc.Height, false, true, Theme.Colors.GetWidgetColor(GtkColorClass.Background, StateType.Selected), corners); } if (selection_height > 0) { Theme.DrawRowSelection(cairo_context, list_rendering_alloc.X, selection_y, list_rendering_alloc.Width, selection_height); selection_height = 0; } PaintRow(ri, single_list_alloc, StateType.Normal); } single_list_alloc.Y += single_list_alloc.Height; } if (selection_height > 0) { Theme.DrawRowSelection(cairo_context, list_rendering_alloc.X, selection_y, list_rendering_alloc.Width, selection_height); } if (Selection != null && Selection.Count > 1 && !selected_focus_alloc.Equals(Rectangle.Zero) && HasFocus) { Theme.DrawRowSelection(cairo_context, selected_focus_alloc.X, selected_focus_alloc.Y, selected_focus_alloc.Width, selected_focus_alloc.Height, false, true, Theme.Colors.GetWidgetColor(GtkColorClass.Dark, StateType.Selected)); } foreach (int ri in selected_rows) { single_list_alloc.Y = offset + ((ri - first_row) * single_list_alloc.Height); PaintRow(ri, single_list_alloc, StateType.Selected); } cairo_context.ResetClip(); }