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
This commit is contained in:
+34
-23
@@ -47,9 +47,12 @@
|
||||
#endif
|
||||
|
||||
#include <math.h>
|
||||
#include <new>
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
using std::nothrow;
|
||||
|
||||
//#define DEBUG_BVIEW
|
||||
#ifdef DEBUG_BVIEW
|
||||
# include <stdio.h>
|
||||
@@ -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<BRect>(dragRect);
|
||||
fOwner->fLink->Attach<BPoint>(offset);
|
||||
fOwner->fLink->Attach<int32>(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<BRect>(dragRect);
|
||||
fOwner->fLink->Attach<BPoint>(offset);
|
||||
fOwner->fLink->Attach<int32>(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<int32>(image->get_server_token());
|
||||
fOwner->fLink->Attach<int32>((int32)dragMode);
|
||||
fOwner->fLink->Attach<BPoint>(offset);
|
||||
fOwner->fLink->Attach<int32>(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<int32>(image->get_server_token());
|
||||
fOwner->fLink->Attach<int32>((int32)dragMode);
|
||||
fOwner->fLink->Attach<BPoint>(offset);
|
||||
fOwner->fLink->Attach<int32>(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.
|
||||
|
||||
@@ -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<BView *>(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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user