summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatthias Melcher <fltk@matthiasm.com>2008-12-26 21:20:38 +0000
committerMatthias Melcher <fltk@matthiasm.com>2008-12-26 21:20:38 +0000
commitfad309329b0ad830f3e423eaa5844e61d75e9210 (patch)
tree4e77f876791f203cfe93f262e41994e1ae192e51 /src
parent459cd78a947693d7fb99bf6ed0f497f2ae5cc1a5 (diff)
STR #2113: added sorting and a few other functions to Fl_Browser_.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@6600 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src')
-rw-r--r--src/Fl_Browser.cxx6
-rw-r--r--src/Fl_Browser_.cxx37
2 files changed, 43 insertions, 0 deletions
diff --git a/src/Fl_Browser.cxx b/src/Fl_Browser.cxx
index 25561c633..d84cc9c7b 100644
--- a/src/Fl_Browser.cxx
+++ b/src/Fl_Browser.cxx
@@ -59,6 +59,8 @@ void* Fl_Browser::item_next(void* l) const {return ((FL_BLINE*)l)->next;}
void* Fl_Browser::item_prev(void* l) const {return ((FL_BLINE*)l)->prev;}
+void* Fl_Browser::item_last() const {return last;}
+
int Fl_Browser::item_selected(void* l) const {
return ((FL_BLINE*)l)->flags&SELECTED;}
@@ -67,6 +69,10 @@ void Fl_Browser::item_select(void* l, int v) {
else ((FL_BLINE*)l)->flags &= ~SELECTED;
}
+const char *Fl_Browser::item_text(void *item) const {
+ return ((FL_BLINE*)item)->txt;
+}
+
/**
Return entry for line number \a line.
*/
diff --git a/src/Fl_Browser_.cxx b/src/Fl_Browser_.cxx
index 32f2431d4..a9c17debd 100644
--- a/src/Fl_Browser_.cxx
+++ b/src/Fl_Browser_.cxx
@@ -902,6 +902,43 @@ Fl_Browser_::Fl_Browser_(int X, int Y, int W, int H, const char* l)
end();
}
+/*
+ * Simple bubble sort - pure lazyness on my side.
+ */
+void Fl_Browser_::sort(int flags) {
+ int i, j, n = -1, desc = ((flags&FL_SORT_DESC)==FL_SORT_DESC);
+ void *a =item_first(), *b, *c;
+ if (!a) return;
+ while (a) {
+ a = item_next(a);
+ n++;
+ }
+ for (i=n-1; i>0; i--) {
+ char swapped = 0;
+ a = item_first();
+ b = item_next(a);
+ for (j=0; j<i; j++) {
+ const char *ta = item_text(a);
+ const char *tb = item_text(b);
+ c = item_next(b);
+ if (desc) {
+ if (strcmp(ta, tb)<0) {
+ item_swap(a, b);
+ swapped = 1;
+ }
+ } else {
+ if (strcmp(ta, tb)>0) {
+ item_swap(a, b);
+ swapped = 1;
+ }
+ }
+ b = c; a = item_prev(b);
+ }
+ if (!swapped)
+ break;
+ }
+}
+
// Default versions of some of the virtual functions:
/**