From 931aebe962b3fa36dfde39a276f5f5d87cbde282 Mon Sep 17 00:00:00 2001 From: Stefano Ceccherini Date: Fri, 7 Jul 2006 19:16:50 +0000 Subject: [PATCH] Deleting replicants now works git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@18066 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/interface/ViewPrivate.h | 2 +- src/kits/interface/Dragger.cpp | 16 +++----- src/kits/interface/Shelf.cpp | 50 ++++++++++++++----------- 3 files changed, 35 insertions(+), 33 deletions(-) diff --git a/headers/private/interface/ViewPrivate.h b/headers/private/interface/ViewPrivate.h index fbdc8a3c99..e213acc258 100644 --- a/headers/private/interface/ViewPrivate.h +++ b/headers/private/interface/ViewPrivate.h @@ -18,7 +18,7 @@ #include #include -const static uint32 kDeleteDragger = 'JAHA'; +const static uint32 kDeleteReplicant = 'JAHA'; struct shape_data { uint32* opList; diff --git a/src/kits/interface/Dragger.cpp b/src/kits/interface/Dragger.cpp index 9f1a1090bb..351c1cc727 100644 --- a/src/kits/interface/Dragger.cpp +++ b/src/kits/interface/Dragger.cpp @@ -264,7 +264,7 @@ BDragger::MessageReceived(BMessage *msg) { if (msg->what == B_TRASH_TARGET) { if (fShelf) - Window()->PostMessage(kDeleteDragger, fTarget, NULL); + Window()->PostMessage(kDeleteReplicant, fTarget, NULL); else (new BAlert("??", "Can't delete this replicant from its original application. Life goes on.", @@ -385,12 +385,12 @@ BDragger::AllDetached() status_t -BDragger::SetPopUp(BPopUpMenu *context_menu) +BDragger::SetPopUp(BPopUpMenu *menu) { - if (fPopUp && fPopUp != context_menu) + if (fPopUp != NULL && fPopUp != menu) delete fPopUp; - fPopUp = context_menu; + fPopUp = menu; return B_OK; } @@ -547,12 +547,8 @@ BDragger::BuildDefaultPopUp() snprintf(about, B_OS_NAME_LENGTH, "About %s", name); fPopUp->AddItem(new BMenuItem(about, msg)); - - // Separator - fPopUp->AddItem(new BSeparatorItem()); - - // Delete - fPopUp->AddItem(new BMenuItem("Delete", new BMessage(kDeleteDragger))); + fPopUp->AddSeparatorItem(); + fPopUp->AddItem(new BMenuItem("Delete", new BMessage(kDeleteReplicant))); } diff --git a/src/kits/interface/Shelf.cpp b/src/kits/interface/Shelf.cpp index 565b21507e..c1a7539a7e 100644 --- a/src/kits/interface/Shelf.cpp +++ b/src/kits/interface/Shelf.cpp @@ -25,6 +25,7 @@ #include #include +#include #include #include @@ -295,10 +296,10 @@ _rep_data_::index_of(BList const *list, unsigned long id) _TContainerViewFilter_::_TContainerViewFilter_(BShelf *shelf, BView *view) - : BMessageFilter(B_ANY_DELIVERY, B_ANY_SOURCE) + : BMessageFilter(B_ANY_DELIVERY, B_ANY_SOURCE), + fShelf(shelf), + fView(view) { - fShelf = shelf; - fView = view; } @@ -323,12 +324,9 @@ _TContainerViewFilter_::Filter(BMessage *msg, BHandler **handler) filter_result _TContainerViewFilter_::ObjectDropFilter(BMessage *msg, BHandler **_handler) { - BView *mouseView; - + BView *mouseView = NULL; if (*_handler) mouseView = dynamic_cast(*_handler); - else - mouseView = NULL; if (msg->WasDropped()) { if (!fShelf->fAllowDragging) { @@ -343,20 +341,16 @@ _TContainerViewFilter_::ObjectDropFilter(BMessage *msg, BHandler **_handler) if (msg->WasDropped()) { point = msg->DropPoint(&offset); - point = mouseView->ConvertFromScreen(point - offset); } - BLooper *looper; + BLooper *looper = NULL; BHandler *handler = msg->ReturnAddress().Target(&looper); - BDragger *dragger; - if (Looper() == looper) { + BDragger *dragger = NULL; if (handler) dragger = dynamic_cast(handler); - else - dragger = NULL; BRect rect; if (dragger->fRelation == BDragger::TARGET_IS_CHILD) @@ -389,22 +383,27 @@ _TContainerViewFilter_::ObjectDropFilter(BMessage *msg, BHandler **_handler) class _TReplicantViewFilter_ : public BMessageFilter { public: _TReplicantViewFilter_(BShelf *shelf, BView *view) - : BMessageFilter(B_ANY_DELIVERY, B_ANY_SOURCE) - { - fShelf = shelf; - fView = view; + : BMessageFilter(B_ANY_DELIVERY, B_ANY_SOURCE), + fShelf(shelf), + fView(view) + { } virtual ~_TReplicantViewFilter_() { } - filter_result Filter(BMessage *, BHandler **) + filter_result Filter(BMessage *message, BHandler **handler) { + if (message->what == kDeleteReplicant) { + if (handler != NULL) + *handler = fShelf; + message->AddPointer("_target", fView); + } return B_DISPATCH_MESSAGE; } - protected: + private: BShelf *fShelf; BView *fView; }; @@ -470,6 +469,14 @@ BShelf::Instantiate(BMessage *data) void BShelf::MessageReceived(BMessage *msg) { + if (msg->what == kDeleteReplicant) { + BView *replicant = NULL; + if (msg->FindPointer("_target", (void **)&replicant) == B_OK && replicant != NULL) + DeleteReplicant(replicant); + + return; + } + BMessage replyMsg(B_REPLY); status_t err = B_BAD_SCRIPT_SYNTAX; @@ -1192,7 +1199,7 @@ BShelf::_AddReplicant(BMessage *data, BPoint *location, uint32 uniqueID) if (relation == BDragger::TARGET_IS_SIBLING || relation == BDragger::TARGET_IS_CHILD) fContainerView->AddChild(dragger); - AddFilter(new _TReplicantViewFilter_(this, replicant)); + replicant->AddFilter(new _TReplicantViewFilter_(this, replicant)); } else if (fDisplayZombies && fAllowZombies) { // TODO: the zombies must be adjusted and moved as well! @@ -1217,8 +1224,7 @@ BShelf::_AddReplicant(BMessage *data, BPoint *location, uint32 uniqueID) zombie->AddChild(dragger); zombie->SetArchive(data); - - AddFilter(new _TReplicantViewFilter_(this, zombie)); + zombie->AddFilter(new _TReplicantViewFilter_(this, zombie)); fContainerView->AddChild(zombie); }