29 #ifndef _GG_ListBox_h_
30 #define _GG_ListBox_h_
49 extern GG_API
const ListBoxStyle
LIST_NONE;
51 extern GG_API
const ListBoxStyle
LIST_TOP;
54 extern GG_API
const ListBoxStyle
LIST_LEFT;
111 template <
class Cont>
114 typedef typename Cont::iterator Iter;
117 bool operator()(Iter lhs, Iter rhs)
const;
118 static bool LessThan(Iter lhs, Iter rhs, Iter end);
154 struct DeferAdjustLayout
156 DeferAdjustLayout(
Row* row);
157 ~DeferAdjustLayout();
166 Row(
X w,
Y h,
const std::string& drag_drop_data_type, Alignment align =
ALIGN_VCENTER,
unsigned int margin = 2);
172 std::size_t size()
const;
175 Control* operator[](std::size_t n)
const;
176 Control* at(std::size_t n)
const;
178 Alignment RowAlignment()
const;
179 Alignment ColAlignment(std::size_t n)
const;
180 X ColWidth(std::size_t n)
const;
181 unsigned int Margin()
const;
183 Control* CreateControl(
const std::string& str,
const boost::shared_ptr<Font>& font,
Clr color)
const;
188 virtual void Render();
191 void push_back(
const std::string& str,
const boost::shared_ptr<Font>& font,
Clr color = CLR_BLACK);
192 void push_back(
const std::string& str,
const std::string& font_filename,
unsigned int pts,
Clr color = CLR_BLACK);
195 void resize(std::size_t n);
197 void SetCell(std::size_t n,
Control* c);
198 Control* RemoveCell(std::size_t n);
199 void SetRowAlignment(Alignment align);
200 void SetColAlignment(std::size_t n, Alignment align);
201 void SetColWidth(std::size_t n,
X width);
202 void SetColAlignments(
const std::vector<Alignment>& aligns);
203 void SetColWidths(
const std::vector<X>& widths);
204 void SetMargin(
unsigned int margin);
208 void AdjustLayout(
bool adjust_for_push_back =
false);
210 std::vector<Control*> m_cells;
211 Alignment m_row_alignment;
212 std::vector<Alignment> m_col_alignments;
213 std::vector<X> m_col_widths;
214 unsigned int m_margin;
216 bool m_ignore_adjust_layout;
218 friend class DeferAdjustLayout;
221 typedef std::list<Row*>::iterator iterator;
222 typedef std::list<Row*>::const_iterator const_iterator;
223 typedef std::list<Row*>::reverse_iterator reverse_iterator;
224 typedef std::list<Row*>::const_reverse_iterator const_reverse_iterator;
226 typedef std::set<iterator, RowPtrIteratorLess<std::list<Row*> > > SelectionSet;
257 virtual Pt MinUsableSize()
const;
258 virtual Pt ClientUpperLeft()
const;
259 virtual Pt ClientLowerRight()
const;
262 const_iterator begin()
const;
263 const_iterator end()
const;
264 const_reverse_iterator
266 const_reverse_iterator
268 const Row& GetRow(std::size_t n)
const;
269 iterator Caret()
const;
272 bool Selected(iterator it)
const;
273 Clr InteriorColor()
const;
274 Clr HiliteColor()
const;
279 const Row& ColHeaders()
const;
280 iterator FirstRowShown()
const;
281 std::size_t FirstColShown()
const;
283 iterator LastVisibleRow()
const;
284 std::size_t LastVisibleCol()
const;
286 std::size_t NumRows()
const;
287 std::size_t NumCols()
const;
290 bool KeepColWidths()
const;
295 std::size_t SortCol()
const;
297 X ColWidth(std::size_t n)
const;
298 Alignment ColAlignment(std::size_t n)
const;
299 Alignment RowAlignment(iterator it)
const;
304 const std::set<std::string>& AllowedDropTypes()
const;
308 bool AutoScrollDuringDragDrops()
const;
312 unsigned int AutoScrollMargin()
const;
316 unsigned int AutoScrollInterval()
const;
341 virtual void StartingChildDragDrop(
const Wnd* wnd,
const GG::Pt& offset);
342 virtual void AcceptDrops(
const std::vector<Wnd*>& wnds,
const Pt& pt);
343 virtual void ChildrenDraggedAway(
const std::vector<Wnd*>& wnds,
const Wnd* destination);
344 virtual void Render();
346 virtual void SizeMove(
const Pt& ul,
const Pt& lr);
348 virtual void Disable(
bool b =
true);
349 virtual void SetColor(
Clr c);
354 iterator Insert(
Row* row, iterator it);
359 iterator Insert(
Row* row);
361 Row* Erase(iterator it);
363 void SelectRow(iterator it);
364 void DeselectRow(iterator it);
373 Row& GetRow(std::size_t n);
375 void SetSelections(
const SelectionSet& s);
376 void SetCaret(iterator it);
377 void BringRowIntoView(iterator it);
378 void SetFirstRowShown(iterator it);
380 void SetInteriorColor(
Clr c);
381 void SetHiliteColor(
Clr c);
386 void SetColHeaders(
Row* r);
387 void RemoveColHeaders();
389 void SetColWidth(std::size_t n,
X w);
390 void SetNumCols(std::size_t n);
391 void SetSortCol(std::size_t n);
397 void SetSortCmp(
const boost::function<
bool (
const Row&,
const Row&, std::size_t)>& sort_cmp);
403 void LockColWidths();
407 void UnLockColWidths();
410 void SetColAlignment(std::size_t n, Alignment align);
413 void SetRowAlignment(iterator it, Alignment align);
417 void AllowDropType(
const std::string& str);
423 void DisallowDropType(
const std::string& str);
428 void AutoScrollDuringDragDrops(
bool auto_scroll);
433 void SetAutoScrollMargin(
unsigned int margin);
437 void SetAutoScrollInterval(
unsigned int interval);
445 template <
class RowType>
449 bool operator()(
const Row& lhs,
const Row& rhs, std::size_t column)
const;
470 X RightMargin()
const;
471 Y BottomMargin()
const;
472 unsigned int CellMargin()
const;
474 iterator RowUnderPt(
const Pt& pt)
const;
476 iterator OldSelRow()
const;
477 iterator OldRDownRow()
const;
478 iterator LClickRow()
const;
479 iterator RClickRow()
const;
481 bool AutoScrollingUp()
const;
482 bool AutoScrollingDown()
const;
483 bool AutoScrollingLeft()
const;
484 bool AutoScrollingRight()
const;
488 virtual void KeyPress(
Key key, boost::uint32_t key_code_point,
Flags<ModKey> mod_keys);
489 virtual void MouseWheel(
const Pt& pt,
int move,
Flags<ModKey> mod_keys);
490 virtual void DragDropEnter(
const Pt& pt,
const std::map<Wnd*, Pt>& drag_drop_wnds,
Flags<ModKey> mod_keys);
491 virtual void DragDropHere(
const Pt& pt,
const std::map<Wnd*, Pt>& drag_drop_wnds,
Flags<ModKey> mod_keys);
492 virtual void DragDropLeave();
493 virtual void TimerFiring(
unsigned int ticks,
Timer* timer);
495 virtual bool EventFilter(
Wnd* w,
const WndEvent& event);
497 iterator Insert(
Row* row, iterator it,
bool dropped);
498 Row* Erase(iterator it,
bool removing_duplicate,
bool signal);
499 void BringCaretIntoView();
500 void RecreateScrolls();
501 void ResetAutoScrollVars();
506 void ConnectSignals();
507 void ValidateStyle();
508 void AdjustScrolls(
bool adjust_for_resize);
509 void VScrolled(
int tab_low,
int tab_high,
int low,
int high);
510 void HScrolled(
int tab_low,
int tab_high,
int low,
int high);
512 void NormalizeRow(
Row* row);
513 iterator FirstRowShownWhenBottomIs(iterator bottom_row,
Y client_height);
514 std::size_t FirstColShownWhenRightIs(std::size_t right_col,
X client_width);
516 std::list<Row*> m_rows;
521 SelectionSet m_selections;
522 iterator m_old_sel_row;
523 bool m_old_sel_row_selected;
524 iterator m_old_rdown_row;
525 iterator m_lclick_row;
526 iterator m_rclick_row;
527 iterator m_last_row_browsed;
529 iterator m_first_row_shown;
530 std::size_t m_first_col_shown;
531 std::vector<X> m_col_widths;
532 std::vector<Alignment>
534 unsigned int m_cell_margin;
542 bool m_keep_col_widths;
544 std::size_t m_sort_col;
545 boost::function<bool (const Row&, const Row&, std::size_t)>
547 std::set<std::string>
548 m_allowed_drop_types;
550 bool m_auto_scroll_during_drag_drops;
551 unsigned int m_auto_scroll_margin;
552 bool m_auto_scrolling_up;
553 bool m_auto_scrolling_down;
554 bool m_auto_scrolling_left;
555 bool m_auto_scrolling_right;
556 Timer m_auto_scroll_timer;
558 iterator* m_iterator_being_erased;
567 template <
class Cont>
570 { assert(m_container); }
572 template <
class Cont>
575 { assert(m_container); }
577 template <
class Cont>
583 BOOST_MPL_ASSERT((boost::is_same<typename Iter::value_type, ::GG::ListBox::Row*>));
584 return LessThan(lhs, rhs, m_container->end());
587 template <
class Cont>
593 true : (*lhs)->UpperLeft().y < (*rhs)->UpperLeft().y);
596 template <
class RowType>
599 return static_cast<const RowType&
>(lhs).SortKey(column) <
static_cast<const RowType&
>(rhs).SortKey(column);