void CStatusBar::MouseDown( BPoint point) { D_HOOK(("CStatusBar::MouseDown()\n")); if ((m_scrollBar == NULL) || !Window()->IsActive()) return; int32 buttons; if (Window()->CurrentMessage()->FindInt32("buttons", &buttons) != B_OK) buttons = B_PRIMARY_MOUSE_BUTTON; if (buttons == B_PRIMARY_MOUSE_BUTTON) { // drag rect BRect dragRect(Bounds()); dragRect.left = dragRect.right - 10.0; if (dragRect.Contains(point)) { // resize m_dragging = true; SetMouseEventMask(B_POINTER_EVENTS, B_LOCK_WINDOW_FOCUS | B_NO_POINTER_HISTORY); } } }
bool ClipView::InitiateDrag(BPoint point, int32 index, bool wasSelected) { ClipItem* sItem = dynamic_cast<ClipItem *> (ItemAt(index)); if (sItem == NULL) return false; BString string(sItem->GetClip()); BMessage message(FAV_ADD); message.AddData("text/plain", B_MIME_TYPE, string, string.Length()); message.AddPointer("clip", sItem); BRect dragRect(0.0f, 0.0f, Bounds().Width(), sItem->Height()); BBitmap* dragBitmap = new BBitmap(dragRect, B_RGB32, true); if (dragBitmap->IsValid()) { BView* view = new BView(dragBitmap->Bounds(), "helper", B_FOLLOW_NONE, B_WILL_DRAW); dragBitmap->AddChild(view); dragBitmap->Lock(); sItem->DrawItem(view, dragRect); view->SetHighColor(0, 0, 0, 255); view->StrokeRect(view->Bounds()); view->Sync(); dragBitmap->Unlock(); } else { delete dragBitmap; dragBitmap = NULL; } if (dragBitmap != NULL) DragMessage(&message, dragBitmap, B_OP_ALPHA, BPoint(0.0, 0.0)); else DragMessage(&message, dragRect.OffsetToCopy(point), this); return true; }
// InitiateDrag bool DragSortableListView::InitiateDrag(BPoint point, int32 index, bool) { // supress drag&drop while an item is focused if (fFocusedIndex >= 0) return false; bool success = false; BListItem* item = ItemAt(CurrentSelection(0)); if (!item) { // workarround a timing problem Select(index); item = ItemAt(index); } if (item) { // create drag message BMessage msg(fDragCommand); MakeDragMessage(&msg); // figure out drag rect float width = Bounds().Width(); BRect dragRect(0.0, 0.0, width, -1.0); // figure out, how many items fit into our bitmap int32 numItems; bool fade = false; for (numItems = 0; BListItem* item = ItemAt(CurrentSelection(numItems)); numItems++) { dragRect.bottom += ceilf(item->Height()) + 1.0; if (dragRect.Height() > MAX_DRAG_HEIGHT) { fade = true; dragRect.bottom = MAX_DRAG_HEIGHT; numItems++; break; } } BBitmap* dragBitmap = new BBitmap(dragRect, B_RGB32, true); if (dragBitmap && dragBitmap->IsValid()) { if (BView *v = new BView(dragBitmap->Bounds(), "helper", B_FOLLOW_NONE, B_WILL_DRAW)) { dragBitmap->AddChild(v); dragBitmap->Lock(); BRect itemBounds(dragRect) ; itemBounds.bottom = 0.0; // let all selected items, that fit into our drag_bitmap, draw for (int32 i = 0; i < numItems; i++) { int32 index = CurrentSelection(i); BListItem* item = ItemAt(index); itemBounds.bottom = itemBounds.top + ceilf(item->Height()); if (itemBounds.bottom > dragRect.bottom) itemBounds.bottom = dragRect.bottom; DrawListItem(v, index, itemBounds); itemBounds.top = itemBounds.bottom + 1.0; } // make a black frame arround the edge v->SetHighColor(0, 0, 0, 255); v->StrokeRect(v->Bounds()); v->Sync(); uint8 *bits = (uint8 *)dragBitmap->Bits(); int32 height = (int32)dragBitmap->Bounds().Height() + 1; int32 width = (int32)dragBitmap->Bounds().Width() + 1; int32 bpr = dragBitmap->BytesPerRow(); if (fade) { for (int32 y = 0; y < height - ALPHA / 2; y++, bits += bpr) { uint8 *line = bits + 3; for (uint8 *end = line + 4 * width; line < end; line += 4) *line = ALPHA; } for (int32 y = height - ALPHA / 2; y < height; y++, bits += bpr) { uint8 *line = bits + 3; for (uint8 *end = line + 4 * width; line < end; line += 4) *line = (height - y) << 1; } } else { for (int32 y = 0; y < height; y++, bits += bpr) { uint8 *line = bits + 3; for (uint8 *end = line + 4 * width; line < end; line += 4) *line = ALPHA; } } dragBitmap->Unlock(); } } else { delete dragBitmap; dragBitmap = NULL; } if (dragBitmap) DragMessage(&msg, dragBitmap, B_OP_ALPHA, BPoint(0.0, 0.0)); else DragMessage(&msg, dragRect.OffsetToCopy(point), this); _SetDragMessage(&msg); success = true; } return success; }
bool AudioListView::InitiateDrag(BPoint point, int32 dragIndex, bool) { BListItem* item = ItemAt(CurrentSelection(0)); if (item == NULL) { // workaround for a timing problem (see Locale prefs) Select(dragIndex); item = ItemAt(dragIndex); } if (item == NULL) return false; // create drag message BMessage message(kDraggedItem); for (int32 i = 0;; i++) { int32 index = CurrentSelection(i); if (index < 0) break; message.AddPointer("trackitem", ItemAt(CurrentSelection(i))); } // figure out drag rect BRect dragRect(0.0, 0.0, Bounds().Width(), -1.0); // figure out, how many items fit into our bitmap bool fade = false; for (int32 i = 0; message.FindPointer("trackitem", i, reinterpret_cast<void**>(&item)) == B_OK; i++) { dragRect.bottom += ceilf(item->Height()) + 1.0; if (dragRect.Height() > MAX_DRAG_HEIGHT) { dragRect.bottom = MAX_DRAG_HEIGHT; fade = true; break; } } BBitmap* dragBitmap = new BBitmap(dragRect, B_RGB32, true); if (dragBitmap->IsValid()) { BView* view = new BView(dragBitmap->Bounds(), "helper", B_FOLLOW_NONE, B_WILL_DRAW); dragBitmap->AddChild(view); dragBitmap->Lock(); BRect itemBounds(dragRect) ; itemBounds.bottom = 0.0; // let all selected items, that fit into our drag_bitmap, draw for (int32 i = 0; message.FindPointer("trackitem", i, reinterpret_cast<void**>(&item)) == B_OK; i++) { AudioListItem* item; message.FindPointer("trackitem", i, reinterpret_cast<void**>(&item)); itemBounds.bottom = itemBounds.top + ceilf(item->Height()); if (itemBounds.bottom > dragRect.bottom) itemBounds.bottom = dragRect.bottom; item->DrawItem(view, itemBounds); itemBounds.top = itemBounds.bottom + 1.0; } // make a black frame around the edge view->SetHighColor(0, 0, 0, 255); view->StrokeRect(view->Bounds()); view->Sync(); uint8* bits = (uint8*)dragBitmap->Bits(); int32 height = (int32)dragBitmap->Bounds().Height() + 1; int32 width = (int32)dragBitmap->Bounds().Width() + 1; int32 bpr = dragBitmap->BytesPerRow(); if (fade) { for (int32 y = 0; y < height - ALPHA / 2; y++, bits += bpr) { uint8* line = bits + 3; for (uint8* end = line + 4 * width; line < end; line += 4) *line = ALPHA; } for (int32 y = height - ALPHA / 2; y < height; y++, bits += bpr) { uint8* line = bits + 3; for (uint8* end = line + 4 * width; line < end; line += 4) *line = (height - y) << 1; } } else { for (int32 y = 0; y < height; y++, bits += bpr) { uint8* line = bits + 3; for (uint8* end = line + 4 * width; line < end; line += 4) *line = ALPHA; } } dragBitmap->Unlock(); } else { delete dragBitmap; dragBitmap = NULL; } if (dragBitmap != NULL) DragMessage(&message, dragBitmap, B_OP_ALPHA, BPoint(0.0, 0.0)); else DragMessage(&message, dragRect.OffsetToCopy(point), this); return true; }
bool LanguageListView::InitiateDrag(BPoint point, int32 dragIndex, bool /*wasSelected*/) { if (fDragMessage == NULL) return false; BListItem* item = ItemAt(CurrentSelection(0)); if (item == NULL) { // workaround for a timing problem // TODO: this should support extending the selection item = ItemAt(dragIndex); Select(dragIndex); } if (item == NULL) return false; // create drag message BMessage message = *fDragMessage; message.AddPointer("listview", this); for (int32 i = 0;; i++) { int32 index = CurrentSelection(i); if (index < 0) break; message.AddInt32("index", index); } // figure out drag rect BRect dragRect(0.0, 0.0, Bounds().Width(), -1.0); int32 numItems = 0; bool fade = false; // figure out, how many items fit into our bitmap for (int32 i = 0, index; message.FindInt32("index", i, &index) == B_OK; i++) { BListItem* item = ItemAt(index); if (item == NULL) break; dragRect.bottom += ceilf(item->Height()) + 1.0; numItems++; if (dragRect.Height() > MAX_DRAG_HEIGHT) { dragRect.bottom = MAX_DRAG_HEIGHT; fade = true; break; } } BBitmap* dragBitmap = new BBitmap(dragRect, B_RGB32, true); if (dragBitmap->IsValid()) { BView* view = new BView(dragBitmap->Bounds(), "helper", B_FOLLOW_NONE, B_WILL_DRAW); dragBitmap->AddChild(view); dragBitmap->Lock(); BRect itemBounds(dragRect) ; itemBounds.bottom = 0.0; // let all selected items, that fit into our drag_bitmap, draw for (int32 i = 0; i < numItems; i++) { int32 index = message.FindInt32("index", i); LanguageListItem* item = static_cast<LanguageListItem*>(ItemAt(index)); itemBounds.bottom = itemBounds.top + ceilf(item->Height()); if (itemBounds.bottom > dragRect.bottom) itemBounds.bottom = dragRect.bottom; item->DrawItem(view, itemBounds); itemBounds.top = itemBounds.bottom + 1.0; } // make a black frame arround the edge view->SetHighColor(0, 0, 0, 255); view->StrokeRect(view->Bounds()); view->Sync(); uint8* bits = (uint8*)dragBitmap->Bits(); int32 height = (int32)dragBitmap->Bounds().Height() + 1; int32 width = (int32)dragBitmap->Bounds().Width() + 1; int32 bpr = dragBitmap->BytesPerRow(); if (fade) { for (int32 y = 0; y < height - ALPHA / 2; y++, bits += bpr) { uint8* line = bits + 3; for (uint8* end = line + 4 * width; line < end; line += 4) *line = ALPHA; } for (int32 y = height - ALPHA / 2; y < height; y++, bits += bpr) { uint8* line = bits + 3; for (uint8* end = line + 4 * width; line < end; line += 4) *line = (height - y) << 1; } } else { for (int32 y = 0; y < height; y++, bits += bpr) { uint8* line = bits + 3; for (uint8* end = line + 4 * width; line < end; line += 4) *line = ALPHA; } } dragBitmap->Unlock(); } else { delete dragBitmap; dragBitmap = NULL; } if (dragBitmap != NULL) DragMessage(&message, dragBitmap, B_OP_ALPHA, BPoint(0.0, 0.0)); else DragMessage(&message, dragRect.OffsetToCopy(point), this); return true; }