split ItemList from CardList, this class can also be used to list keywords

git-svn-id: svn://svn.code.sf.net/p/magicseteditor/code/trunk@229 0fc631ac-6414-0410-93d0-97cfa31319b6
This commit is contained in:
twanvl
2007-03-22 20:23:12 +00:00
parent f5de36057c
commit e51af9677b
13 changed files with 673 additions and 567 deletions
+162
View File
@@ -0,0 +1,162 @@
//+----------------------------------------------------------------------------+
//| Description: Magic Set Editor - Program to make Magic (tm) cards |
//| Copyright: (C) 2001 - 2006 Twan van Laarhoven |
//| License: GNU General Public License 2 or later (see file COPYING) |
//+----------------------------------------------------------------------------+
// ----------------------------------------------------------------------------- : Includes
#include <gui/control/item_list.hpp>
#include <gui/util.hpp>
// ----------------------------------------------------------------------------- : ItemList
ItemList::ItemList(Window* parent, int id, long additional_style)
: wxListView(parent, id, wxDefaultPosition, wxDefaultSize, additional_style | wxLC_REPORT | wxLC_VIRTUAL | wxLC_SINGLE_SEL)
{
// create image list
wxImageList* il = new wxImageList(18,14);
il->Add(load_resource_image(_("sort_asc")), Color(255,0,255));
il->Add(load_resource_image(_("sort_desc")), Color(255,0,255));
AssignImageList(il, wxIMAGE_LIST_SMALL);
}
// ----------------------------------------------------------------------------- : ItemList : Selection
bool ItemList::canSelectPrevious() const {
return selected_item_pos - 1 >= 0;
}
bool ItemList::canSelectNext() const {
return selected_item_pos >= 0 && static_cast<size_t>(selected_item_pos + 1) < sorted_list.size();
}
void ItemList::selectPrevious() {
assert(selected_item_pos >= 1);
selectItemPos(selected_item_pos - 1, true);
}
void ItemList::selectNext() {
assert(selected_item_pos + 1 < (long)sorted_list.size());
selectItemPos(selected_item_pos + 1, true);
}
// ----------------------------------------------------------------------------- : ItemList : Selection (private)
void ItemList::selectItem(const VoidP& item, bool focus, bool event) {
selected_item = item;
if (event) sendEvent();
findSelectedItemPos();
if (focus) {
selectCurrentItem();
}
}
void ItemList::selectItemPos(long pos, bool focus) {
if (selected_item_pos == pos && !focus) return; // this item is already selected
if ((size_t)pos < sorted_list.size()) {
// only if there is something to select
selectItem(getItem(pos), false, true);
} else {
selectItem(VoidP(), false, true);
}
selected_item_pos = pos;
if (focus) selectCurrentItem();
}
void ItemList::findSelectedItemPos() {
// find the position of the selected item
long count = GetItemCount();
selected_item_pos = -1;
for (long pos = 0 ; pos < count ; ++pos) {
if (getItem(pos) == selected_item) {
selected_item_pos = pos;
break;
}
}
}
void ItemList::selectCurrentItem() {
if (GetItemCount() > 0) {
if (selected_item_pos == -1 || (size_t)selected_item_pos > sorted_list.size()) {
// deselect currently selected item, if any
long sel = GetFirstSelected();
Select(sel, false);
} else {
Select(selected_item_pos);
Focus (selected_item_pos);
}
}
}
// ----------------------------------------------------------------------------- : ItemList : Building the list
// Comparison object for comparing items
struct ItemList::ItemComparer {
ItemComparer(ItemList& list) : list(list) {}
ItemList& list; // 'this' pointer
// Compare two items using the current criterium and order
bool operator () (const VoidP& a, const VoidP& b) {
return list.compareItems(a.get(), b.get());
}
};
void ItemList::refreshList() {
// Get all items
sorted_list.clear();
getItems(sorted_list);
long item_count = (long)sorted_list.size();
SetItemCount(item_count);
// Sort the list
if (sort_by_column >= 0) {
sort(sorted_list.begin(), sorted_list.end(), ItemComparer(*this));
}
// refresh
RefreshItems(0, item_count - 1);
if (item_count == 0) Refresh();
// (re)select current item
findSelectedItemPos();
selectCurrentItem();
}
void ItemList::sortBy(long column, bool ascending) {
// Change image in column header
long count = GetColumnCount();
for (long i = 0 ; i < count ; ++i) {
if (i == column) {
SetColumnImage(i, sort_ascending ? 0 : 1); // arrow up/down
} else if (i == sort_by_column) {
ClearColumnImage(i);
}
++i;
}
// sort list
sort_by_column = column;
sort_ascending = ascending;
refreshList();
}
// ----------------------------------------------------------------------------- : ItemList : Window events
void ItemList::onColumnClick(wxListEvent& ev) {
long new_sort_by_column = ev.GetColumn();
if (sort_by_column == new_sort_by_column) {
if (sort_ascending) {
sort_ascending = false; // 2nd click on same column -> sort descending
} else if (mustSort()) {
sort_ascending = true; // 3rd click on same column -> sort ascending again
} else {
new_sort_by_column = -1; // 3rd click on same column -> don't sort
}
} else {
sort_ascending = true;
}
sortBy(new_sort_by_column, sort_ascending);
}
void ItemList::onItemFocus(wxListEvent& ev) {
selectItemPos(ev.GetIndex(), false);
}
// ----------------------------------------------------------------------------- : ItemList : Event table
BEGIN_EVENT_TABLE(ItemList, wxListView)
EVT_LIST_COL_CLICK (wxID_ANY, ItemList::onColumnClick)
EVT_LIST_ITEM_FOCUSED (wxID_ANY, ItemList::onItemFocus)
END_EVENT_TABLE ()