Browse Source

Fixed crash if you shift+click on a multibrowser below the last item

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.0@1472 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
branch-1.0
Michael R Sweet 24 years ago
parent
commit
3f5ad43d64
  1. 43
      src/Fl_Browser_.cxx

43
src/Fl_Browser_.cxx

@ -1,5 +1,5 @@
// //
// "$Id: Fl_Browser_.cxx,v 1.10.2.15 2001/01/22 15:13:39 easysw Exp $" // "$Id: Fl_Browser_.cxx,v 1.10.2.16 2001/07/05 00:20:41 uid28863 Exp $"
// //
// Base Browser widget class for the Fast Light Tool Kit (FLTK). // Base Browser widget class for the Fast Light Tool Kit (FLTK).
// //
@ -563,35 +563,36 @@ int Fl_Browser_::handle(int event) {
void* l = find_item(my); void* l = find_item(my);
whichway = 1; whichway = 1;
if (Fl::event_state(FL_CTRL)) { // toggle selection: if (Fl::event_state(FL_CTRL)) { // toggle selection:
TOGGLE:
if (l) { if (l) {
whichway = !item_selected(l); whichway = !item_selected(l);
change = select(l, whichway, when() & FL_WHEN_CHANGED); change = select(l, whichway, when() & FL_WHEN_CHANGED);
} }
} else if (Fl::event_state(FL_SHIFT)) { // extend selection: } else if (Fl::event_state(FL_SHIFT)) { // extend selection:
change = 0; if (l == selection_) goto TOGGLE;
if (selection_ && l != selection_) { // state of previous selection determines new value:
void *m = l; whichway = l ? !item_selected(l) : 1;
int down = 0; // see which of the new item or previous selection is earlier,
whichway = item_selected(selection_); // by searching from the previous forward for this one:
for (m = selection_; m; m = item_next(m)) { int down;
if (m == l) down = 1; if (!l) down = 1;
} else {for (void* m = selection_; ; m = item_next(m)) {
void *n; if (m == l) {down = 1; break;}
if (!m) {down = 0; break;}
}}
if (down) { if (down) {
m = selection_; for (void* m = selection_; m != l; m = item_next(m))
n = l; select(m, whichway, when() & FL_WHEN_CHANGED);
} else { } else {
m = l; void* e = selection_;
n = selection_; for (void* m = item_next(l); m; m = item_next(m)) {
}
while (m != n) {
select(m, whichway, when() & FL_WHEN_CHANGED); select(m, whichway, when() & FL_WHEN_CHANGED);
m = item_next(m); if (m == e) break;
} }
select(n, whichway, when() & FL_WHEN_CHANGED);
select(l, whichway, when() & FL_WHEN_CHANGED);
change = 1;
} }
// do the clicked item last so the select box is around it:
if (l) select(l, whichway, when() & FL_WHEN_CHANGED);
change = 1;
} else { // select only this item } else { // select only this item
change = select_only(l, when() & FL_WHEN_CHANGED); change = select_only(l, when() & FL_WHEN_CHANGED);
} }
@ -706,5 +707,5 @@ void Fl_Browser_::item_select(void*, int) {}
int Fl_Browser_::item_selected(void* l) const {return l==selection_;} int Fl_Browser_::item_selected(void* l) const {return l==selection_;}
// //
// End of "$Id: Fl_Browser_.cxx,v 1.10.2.15 2001/01/22 15:13:39 easysw Exp $". // End of "$Id: Fl_Browser_.cxx,v 1.10.2.16 2001/07/05 00:20:41 uid28863 Exp $".
// //

Loading…
Cancel
Save