From af43bb3c9410b42ed310a2db1489656be5f0b969 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Thu, 8 Dec 2005 12:13:22 +0000 Subject: [PATCH] a first and really naive implementation of drag&drop support, no visuals yet... Axel, no worries I'm going to clean this up and remove stuff from EventDispatcher again... git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15417 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/interface/View.cpp | 57 +++++++++++++++++++++-------------- src/kits/interface/Window.cpp | 30 ++++++++++++++++-- 2 files changed, 61 insertions(+), 26 deletions(-) diff --git a/src/kits/interface/View.cpp b/src/kits/interface/View.cpp index bbe9f6fe5d..7c8822b1b4 100644 --- a/src/kits/interface/View.cpp +++ b/src/kits/interface/View.cpp @@ -47,9 +47,12 @@ #endif #include +#include #include +using std::nothrow; + //#define DEBUG_BVIEW #ifdef DEBUG_BVIEW # include @@ -1261,17 +1264,21 @@ BView::DragMessage(BMessage *message, BRect dragRect, BHandler *replyTo) #endif int32 bufferSize = message->FlattenedSize(); - char *buffer = new char[bufferSize]; - message->Flatten(buffer, bufferSize); - - fOwner->fLink->StartMessage(AS_LAYER_DRAG_RECT); - fOwner->fLink->Attach(dragRect); - fOwner->fLink->Attach(offset); - fOwner->fLink->Attach(bufferSize); - fOwner->fLink->Attach(buffer, bufferSize); - fOwner->fLink->Flush(); - - delete [] buffer; + char* buffer = new (nothrow) char[bufferSize]; + if (buffer) { + message->Flatten(buffer, bufferSize); + + fOwner->fLink->StartMessage(AS_LAYER_DRAG_RECT); + fOwner->fLink->Attach(dragRect); + fOwner->fLink->Attach(offset); + fOwner->fLink->Attach(bufferSize); + fOwner->fLink->Attach(buffer, bufferSize); + fOwner->fLink->Flush(); + + delete [] buffer; + } else { + fprintf(stderr, "BView::DragMessage() - no memory to flatten drag message\n"); + } } @@ -1318,17 +1325,21 @@ BView::DragMessage(BMessage *message, BBitmap *image, #endif int32 bufferSize = message->FlattenedSize(); - char *buffer = new char[bufferSize]; - message->Flatten(buffer, bufferSize); - - fOwner->fLink->StartMessage(AS_LAYER_DRAG_IMAGE); - fOwner->fLink->Attach(image->get_server_token()); - fOwner->fLink->Attach((int32)dragMode); - fOwner->fLink->Attach(offset); - fOwner->fLink->Attach(bufferSize); - fOwner->fLink->Attach(buffer, bufferSize); - - delete [] buffer; + char* buffer = new (nothrow) char[bufferSize]; + if (buffer) { + message->Flatten(buffer, bufferSize); + + fOwner->fLink->StartMessage(AS_LAYER_DRAG_IMAGE); + fOwner->fLink->Attach(image->get_server_token()); + fOwner->fLink->Attach((int32)dragMode); + fOwner->fLink->Attach(offset); + fOwner->fLink->Attach(bufferSize); + fOwner->fLink->Attach(buffer, bufferSize); + + delete [] buffer; + } else { + fprintf(stderr, "BView::DragMessage() - no memory to flatten drag message\n"); + } // TODO: in app_server the bitmap refCount must be incremented // WRITE this into specs!!!! @@ -4146,7 +4157,7 @@ BView::_Draw(BRect updateRect) child->_Draw(rect); } - if (Flags() & B_WILL_DRAW) { + if (Flags() & B_DRAW_ON_CHILDREN) { // TODO: Since we have hard clipping in the app_server, // a view can never draw "on top of it's child views" as // the BeBook describes. diff --git a/src/kits/interface/Window.cpp b/src/kits/interface/Window.cpp index 993bf19dcc..1119a54fc2 100644 --- a/src/kits/interface/Window.cpp +++ b/src/kits/interface/Window.cpp @@ -868,11 +868,21 @@ BWindow::DispatchMessage(BMessage *msg, BHandler *target) msg->FindPoint("be:view_where", &where); msg->FindInt32("buttons", (int32 *)&buttons); msg->FindInt32("be:transit", (int32 *)&transit); + BMessage* dragMessage = NULL; + if (msg->HasMessage("be:drag_message")) { + dragMessage = new BMessage(); + if (msg->FindMessage("be:drag_message", dragMessage) != B_OK) { + delete dragMessage; + dragMessage = NULL; + } + } if (BView *view = dynamic_cast(target)) - view->MouseMoved(where, transit, NULL); + view->MouseMoved(where, transit, dragMessage); else target->MessageReceived(msg); + + delete dragMessage; break; } @@ -976,6 +986,20 @@ BWindow::DispatchMessage(BMessage *msg, BHandler *target) msg->SendReply(B_MESSAGE_NOT_UNDERSTOOD); break; } + case _MESSAGE_DROPPED_: + { + if (fLastMouseMovedView) + target = fLastMouseMovedView; + + uint32 originalWhat; + if (msg->FindInt32("_original_what", (int32*)&originalWhat) == B_OK) { + msg->what = originalWhat; + msg->RemoveName("_original_what"); + } + + BLooper::DispatchMessage(msg, target); + break; + } default: BLooper::DispatchMessage(msg, target); @@ -2387,8 +2411,8 @@ BWindow::_AdoptResize() // saves us some server communication, as the server // does the same with our views on its side. - int32 deltaWidth = fFrame.Width() - fTopView->Bounds().Width(); - int32 deltaHeight = fFrame.Height() - fTopView->Bounds().Height(); + int32 deltaWidth = (int32)(fFrame.Width() - fTopView->Bounds().Width()); + int32 deltaHeight = (int32)(fFrame.Height() - fTopView->Bounds().Height()); if (deltaWidth == 0 && deltaHeight == 0) return;