BListView: complete scripting support
Change-Id: Iff4b5cb775d1c0b0e588459429d6df7fb93a760e Reviewed-on: https://review.haiku-os.org/c/haiku/+/2945 Reviewed-by: Adrien Destugues <pulkomandy@gmail.com>
This commit is contained in:
parent
8fbce87334
commit
079e9eef15
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user