4 using System
.Collections
;
9 public abstract class Category
: Container
{
14 protected Gtk
.HBox header
;
15 Gtk
.Label headerLabel
, position
;
16 Gtk
.Button prev
, next
;
17 int fewRows
, manyRows
, columns
;
21 public Category (string name
, int rows
, int columns
)
23 WidgetFlags
|= WidgetFlags
.NoWindow
;
25 header
= new Gtk
.HBox (false, 0);
27 headerLabel
= new Gtk
.Label ();
28 headerLabel
.Markup
= "<big><b>" + GLib
.Markup
.EscapeText (name
) + "</b></big>";
29 headerLabel
.SetAlignment (0.0f
, 0.5f
);
31 header
.PackStart (headerLabel
, true, true, 0);
33 position
= new Gtk
.Label ();
34 position
.ModifyFg (Gtk
.StateType
.Normal
, position
.Style
.Base (Gtk
.StateType
.Selected
));
35 header
.PackStart (position
, false, false, 0);
38 prev
= MakeButton (header
, Gtk
.Stock
.GoBack
, OnPrev
);
39 next
= MakeButton (header
, Gtk
.Stock
.GoForward
, OnNext
);
43 header
.SizeRequested
+= HeaderSizeRequested
;
45 tiles
= new SortedTileList (SortType
.Relevance
);
55 private Gtk
.Button
MakeButton (Gtk
.HBox header
, string icon
, EventHandler handler
)
57 Gtk
.Button button
= new Gtk
.Button ();
58 Gtk
.Image img
= new Gtk
.Image (icon
, Gtk
.IconSize
.Button
);
60 button
.Relief
= Gtk
.ReliefStyle
.None
;
61 button
.Clicked
+= handler
;
63 header
.PackStart (button
, false, false, 0);
69 protected int Columns
{
77 // Adjust page so that the first visible tile
80 page
= FirstVisible
/ (manyRows
* value);
82 page
= ((FirstVisible
- few
) / (manyRows
* value)) + 1;
86 few
= fewRows
* columns
;
87 many
= manyRows
* columns
;
95 void HeaderSizeRequested (object obj
, Gtk
.SizeRequestedArgs args
)
97 Gtk
.Requisition req
= args
.Requisition
;
98 Gtk
.Requisition labelReq
= headerLabel
.ChildRequisition
;
100 req
.Height
= (int)(labelReq
.Height
* 1.5);
102 args
.Requisition
= req
;
105 void UpdateButtons ()
107 if (tiles
.Count
<= FirstVisible
&& page
> 0) {
108 // The page we were viewing disappeared
112 prev
.Sensitive
= (page
!= 0);
113 next
.Sensitive
= (tiles
.Count
> LastVisible
+ 1);
116 position
.LabelProp
= String
.Format (Catalog
.GetString ("{0}-{1} of {2}"), FirstVisible
+ 1, LastVisible
+ 1, tiles
.Count
);
118 position
.LabelProp
= "";
121 protected override void OnAdded (Gtk
.Widget widget
)
123 widget
.ChildVisible
= false;
125 tiles
.Add ((Tiles
.Tile
)widget
);
126 widget
.Parent
= this;
132 protected override void OnRemoved (Gtk
.Widget widget
)
134 tiles
.Remove ((Tiles
.Tile
)widget
);
143 foreach (Widget tile
in VisibleTiles
)
144 tile
.ChildVisible
= false;
150 foreach (Widget tile
in VisibleTiles
)
151 tile
.ChildVisible
= true;
155 private bool showingMany
{
157 // Show extra tiles on every page after the first, unless
158 // there are only two pages and the second one only has
159 // enough tiles to fit the "fewer" size.
160 return (page
> 0 && tiles
.Count
> 2 * few
) || expanded
;
164 void OnPrev (object obj
, EventArgs args
)
172 void OnNext (object obj
, EventArgs args
)
180 protected int PageSize
{
182 return Math
.Min (showingMany
? many
: few
, tiles
.Count
);
186 protected int FirstVisible
{
193 return few
+ (page
- 1) * many
;
197 protected int LastVisible
{
199 return Math
.Min (FirstVisible
+ PageSize
, tiles
.Count
) - 1;
203 protected IList VisibleTiles
{
205 return tiles
.GetRange (FirstVisible
, LastVisible
- FirstVisible
+ 1);
209 public IEnumerable AllTiles
{
215 protected override void ForAll (bool include_internals
, Callback callback
)
217 foreach (Widget w
in (SortedTileList
)tiles
.Clone ())
219 if (include_internals
)
223 protected override bool OnExposeEvent (Gdk
.EventExpose evt
)
225 Rectangle headerRect
, bgRect
;
226 int headerHeight
= header
.Allocation
.Height
;
227 Gdk
.Color white
, bg
, mid
;
229 headerRect
= bgRect
= Allocation
;
230 headerRect
.Height
= headerHeight
;
231 bgRect
.Y
+= headerHeight
;
232 bgRect
.Height
-= headerHeight
;
234 GdkWindow
.DrawRectangle (Style
.BaseGC (State
), true, bgRect
);
236 white
= Style
.Base (State
);
237 bg
= Style
.Background (State
);
239 mid
= new Gdk
.Color ();
240 mid
.Red
= (ushort)((white
.Red
+ bg
.Red
) / 2);
241 mid
.Green
= (ushort)((white
.Green
+ bg
.Green
) / 2);
242 mid
.Blue
= (ushort)((white
.Blue
+ bg
.Blue
) / 2);
243 Style
.BaseGC (State
).RgbFgColor
= mid
;
244 GdkWindow
.DrawRectangle (Style
.BaseGC (State
), true, headerRect
);
245 Style
.BaseGC (State
).Foreground
= white
;
247 return base.OnExposeEvent (evt
);
252 while (tiles
.Count
> 0)
253 Remove (tiles
[tiles
.Count
- 1]);
258 return tiles
.Count
== 0;
268 public Search
.SortType Sort
{
276 public void Select (bool focus
, bool expanded
)
279 ((Gtk
.Widget
)VisibleTiles
[0]).GrabFocus ();
280 this.expanded
= expanded
;