void PersonView::MessageReceived(BMessage* msg) { switch (msg->what) { case M_SAVE: Save(); break; case M_REVERT: if (fPictureView) fPictureView->Revert(); if (fAddrView) fAddrView->Reload(); for (int32 i = fControls.CountItems() - 1; i >= 0; i--) fControls.ItemAt(i)->Reload(); break; case M_SELECT: for (int32 i = fControls.CountItems() - 1; i >= 0; i--) { BTextView* text = fControls.ItemAt(i)->TextView(); if (text->IsFocus()) { text->Select(0, text->TextLength()); break; } } break; case M_GROUP_MENU: { /*const char* name = NULL; if (msg->FindString("group", &name) == B_OK) SetAttribute(fCategoryAttribute, name, false);*/ break; } } }
filter_result SpinnerMsgFilter::Filter(BMessage *msg, BHandler **target) { int32 c; msg->FindInt32("raw_char",&c); switch (c) { case B_ENTER: { BTextView *text = dynamic_cast<BTextView*>(*target); if (text && text->IsFocus()) { BView *view = text->Parent(); while (view) { Spinner *spin = dynamic_cast<Spinner*>(view); if (spin) { BString string(text->Text()); int32 newvalue = 0; sscanf(string.String(),"%ld",&newvalue); if (newvalue != spin->Value()) { spin->SetValue(newvalue); spin->Invoke(); } return B_SKIP_MESSAGE; } view = view->Parent(); } } return B_DISPATCH_MESSAGE; } case B_TAB: { // Cause Tab characters to perform keybaord navigation BHandler *h = *target; BView *v = NULL; h = h->NextHandler(); while (h) { v = dynamic_cast<BView*>(h); if (v) { *target = v->Window(); return B_DISPATCH_MESSAGE; } h = h->NextHandler(); } return B_SKIP_MESSAGE; } case B_UP_ARROW: case B_DOWN_ARROW: { BTextView *text = dynamic_cast<BTextView*>(*target); if (text && text->IsFocus()) { // We have a text view. See if it currently has the focus and belongs // to a Spinner control. If so, change the value of the spinner // TextViews are complicated beasts which are actually multiple views. // Travel up the hierarchy to see if any of the target's ancestors are // a Spinner. BView *view = text->Parent(); while (view) { Spinner *spin = dynamic_cast<Spinner*>(view); if (spin) { int32 step = spin->GetSteps(); if (c == B_DOWN_ARROW) step = 0 - step; spin->SetValue(spin->Value() + step); spin->Invoke(); return B_SKIP_MESSAGE; } view = view->Parent(); } } return B_DISPATCH_MESSAGE; } default: return B_DISPATCH_MESSAGE; } // shut the stupid compiler up return B_SKIP_MESSAGE; }
void PersonView::MessageReceived(BMessage* msg) { msg->PrintToStream(); switch (msg->what) { case M_SAVE: Save(); break; case M_REVERT: if (fPictureView) fPictureView->Revert(); if (fAddressWindow) fAddressWindow->Reload(); for (int32 i = fControls.CountItems() - 1; i >= 0; i--) fControls.ItemAt(i)->Reload(); break; case M_SELECT: for (int32 i = fControls.CountItems() - 1; i >= 0; i--) { BTextView* text = fControls.ItemAt(i)->TextView(); if (text->IsFocus()) { text->Select(0, text->TextLength()); break; } } break; case M_GROUP_MENU: { /*const char* name = NULL; if (msg->FindString("group", &name) == B_OK) SetAttribute(fCategoryAttribute, name, false);*/ break; } case M_SHOW_LOCATIONS: { if (fAddressWindow == NULL) { fAddressWindow = new AddressWindow(fContact); } fAddressWindow->Show(); fAddressWindow->Activate(true); break; } case M_ADD_FIELD: { field_type type; if (msg->FindInt32("field_type", (int32*)&type) == B_OK) { BContactField* contactField = BContactField::InstantiateChildClass(type); fContact->AddField(contactField); AddNewField(contactField); fSaved = false; } break; } case M_REMOVE_FIELD: { ContactFieldTextControl* control; if (msg->FindPointer("fieldtextcontrol", (void**)&control) == B_OK) { _RemoveField(control); fSaved = false; } break; } } }