diff options
| author | Matthias Melcher <fltk@matthiasm.com> | 2008-12-26 21:20:38 +0000 |
|---|---|---|
| committer | Matthias Melcher <fltk@matthiasm.com> | 2008-12-26 21:20:38 +0000 |
| commit | fad309329b0ad830f3e423eaa5844e61d75e9210 (patch) | |
| tree | 4e77f876791f203cfe93f262e41994e1ae192e51 /src | |
| parent | 459cd78a947693d7fb99bf6ed0f497f2ae5cc1a5 (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.cxx | 6 | ||||
| -rw-r--r-- | src/Fl_Browser_.cxx | 37 |
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: /** |
