diff --git a/src/kits/interface/ListView.cpp b/src/kits/interface/ListView.cpp index bd65e7e120..d97564c339 100644 --- a/src/kits/interface/ListView.cpp +++ b/src/kits/interface/ListView.cpp @@ -296,48 +296,72 @@ BListView::WindowActivated(bool active) void BListView::MessageReceived(BMessage* message) { - switch (message->what) { - case B_MOUSE_WHEEL_CHANGED: - if (!fTrack->is_dragging) - BView::MessageReceived(message); - break; + if (message->HasSpecifiers()) { + BMessage reply(B_REPLY); + status_t err = B_BAD_SCRIPT_SYNTAX; + int32 index; + BMessage specifier; + int32 what; + const char* property; - case B_COUNT_PROPERTIES: - case B_EXECUTE_PROPERTY: - case B_GET_PROPERTY: - case B_SET_PROPERTY: - { - BPropertyInfo propInfo(sProperties); - BMessage specifier; - const char* property; + if (message->GetCurrentSpecifier(&index, &specifier, &what, &property) + != B_OK) { + return BView::MessageReceived(message); + } - if (message->GetCurrentSpecifier(NULL, &specifier) != B_OK - || specifier.FindString("property", &property) != B_OK) { - BView::MessageReceived(message); - return; - } + BPropertyInfo propInfo(sProperties); + switch (propInfo.FindMatch(message, index, &specifier, what, + property)) { + case 0: // Item: Count + err = reply.AddInt32("result", CountItems()); + break; - switch (propInfo.FindMatch(message, 0, &specifier, message->what, - property)) { - case B_ERROR: - BView::MessageReceived(message); - break; - - case 0: - { - BMessage reply(B_REPLY); - reply.AddInt32("result", CountItems()); - reply.AddInt32("error", B_OK); - - message->SendReply(&reply); - break; + case 1: { // Item: EXECUTE + switch (what) { + case B_INDEX_SPECIFIER: + case B_REVERSE_INDEX_SPECIFIER: { + int32 index; + err = specifier.FindInt32("index", &index); + if (err >= B_OK) { + if (what == B_REVERSE_INDEX_SPECIFIER) + index = CountItems() - index; + if (index < 0 || index >= CountItems()) + err = B_BAD_INDEX; + } + if (err >= B_OK) { + Select(index, false); + Invoke(); + } + break; + } + case B_RANGE_SPECIFIER: { + case B_REVERSE_RANGE_SPECIFIER: + int32 beg, end, range; + err = specifier.FindInt32("index", &beg); + if (err >= B_OK) + err = specifier.FindInt32("range", &range); + if (err >= B_OK) { + if (what == B_REVERSE_RANGE_SPECIFIER) + beg = CountItems() - beg; + end = beg + range; + if (!(beg >= 0 && beg <= end && end < CountItems())) + err = B_BAD_INDEX; + if (err >= B_OK) { + if (fListType != B_MULTIPLE_SELECTION_LIST + && end - beg > 1) + err = B_BAD_VALUE; + if (err >= B_OK) { + Select(beg, end - 1, false); + Invoke(); + } + } + } + break; + } } - - case 1: - break; - - case 2: - { + break; + } + case 2: { // Selection: COUNT int32 count = 0; for (int32 i = 0; i < CountItems(); i++) { @@ -345,54 +369,108 @@ BListView::MessageReceived(BMessage* message) count++; } - BMessage reply(B_REPLY); - reply.AddInt32("result", count); - reply.AddInt32("error", B_OK); + err = reply.AddInt32("result", count); + break; + } + case 3: // Selection: EXECUTE + err = Invoke(); + break; - message->SendReply(&reply); - break; + case 4: // Selection: GET + err = B_OK; + for (int32 i = 0; err >= B_OK && i < CountItems(); i++) { + if (ItemAt(i)->IsSelected()) + err = reply.AddInt32("result", i); } + break; - case 3: - break; - - case 4: - { - BMessage reply (B_REPLY); - - for (int32 i = 0; i < CountItems(); i++) { - if (ItemAt(i)->IsSelected()) - reply.AddInt32("result", i); + case 5: { // Selection: SET + bool doSelect; + err = message->FindBool("data", &doSelect); + if (err >= B_OK) { + switch (what) { + case B_INDEX_SPECIFIER: + case B_REVERSE_INDEX_SPECIFIER: { + int32 index; + err = specifier.FindInt32("index", &index); + if (err >= B_OK) { + if (what == B_REVERSE_INDEX_SPECIFIER) + index = CountItems() - index; + if (index < 0 || index >= CountItems()) + err = B_BAD_INDEX; + } + if (err >= B_OK) { + if (doSelect) + Select(index, + fListType == B_MULTIPLE_SELECTION_LIST); + else + Deselect(index); + } + break; + } + case B_RANGE_SPECIFIER: { + case B_REVERSE_RANGE_SPECIFIER: + int32 beg, end, range; + err = specifier.FindInt32("index", &beg); + if (err >= B_OK) + err = specifier.FindInt32("range", &range); + if (err >= B_OK) { + if (what == B_REVERSE_RANGE_SPECIFIER) + beg = CountItems() - beg; + end = beg + range; + if (!(beg >= 0 && beg <= end + && end < CountItems())) + err = B_BAD_INDEX; + if (err >= B_OK) { + if (fListType != B_MULTIPLE_SELECTION_LIST + && end - beg > 1) + err = B_BAD_VALUE; + if (doSelect) + Select(beg, end - 1, fListType + == B_MULTIPLE_SELECTION_LIST); + else { + for (int32 i = beg; i < end; i++) + Deselect(i); + } + } + } + break; + } } - - reply.AddInt32("error", B_OK); - - message->SendReply(&reply); - break; } - - case 5: - break; - - case 6: - { - BMessage reply(B_REPLY); - - bool select; - if (message->FindBool("data", &select) == B_OK && select) - Select(0, CountItems() - 1, false); + break; + } + case 6: // Selection: SET (select/deselect all) + bool doSelect; + err = message->FindBool("data", &doSelect); + if (err >= B_OK) { + if (doSelect) + Select(0, CountItems() - 1, true); else DeselectAll(); - - reply.AddInt32("error", B_OK); - - message->SendReply(&reply); - break; } - } - break; + break; + + default: + return BView::MessageReceived(message); } + if (err != B_OK) { + reply.what = B_MESSAGE_NOT_UNDERSTOOD; + reply.AddString("message", strerror(err)); + } + + reply.AddInt32("error", err); + message->SendReply(&reply); + return; + } + + switch (message->what) { + case B_MOUSE_WHEEL_CHANGED: + if (!fTrack->is_dragging) + BView::MessageReceived(message); + break; + case B_SELECT_ALL: if (fListType == B_MULTIPLE_SELECTION_LIST) Select(0, CountItems() - 1, false);