164d80db6SStephan Aßmus /*
264d80db6SStephan Aßmus * Copyright 2006, Haiku.
364d80db6SStephan Aßmus * Distributed under the terms of the MIT License.
464d80db6SStephan Aßmus *
564d80db6SStephan Aßmus * Authors:
664d80db6SStephan Aßmus * Stephan Aßmus <superstippi@gmx.de>
764d80db6SStephan Aßmus */
864d80db6SStephan Aßmus
9e2a31283SStephan Aßmus #include "IconValueView.h"
10e2a31283SStephan Aßmus
1164d80db6SStephan Aßmus #include <stdio.h>
1264d80db6SStephan Aßmus #include <string.h>
1364d80db6SStephan Aßmus
1464d80db6SStephan Aßmus #include <Bitmap.h>
1564d80db6SStephan Aßmus #include <Region.h>
1664d80db6SStephan Aßmus
1764d80db6SStephan Aßmus #include "PropertyItemView.h"
1864d80db6SStephan Aßmus
1964d80db6SStephan Aßmus // constructor
IconValueView(IconProperty * property)2064d80db6SStephan Aßmus IconValueView::IconValueView(IconProperty* property)
21e2a31283SStephan Aßmus : PropertyEditorView(),
2264d80db6SStephan Aßmus fProperty(property),
2364d80db6SStephan Aßmus fIcon(NULL)
2464d80db6SStephan Aßmus {
2564d80db6SStephan Aßmus SetFlags(Flags() | B_NAVIGABLE_JUMP);
2664d80db6SStephan Aßmus }
2764d80db6SStephan Aßmus
2864d80db6SStephan Aßmus // destructor
~IconValueView()2964d80db6SStephan Aßmus IconValueView::~IconValueView()
3064d80db6SStephan Aßmus {
3164d80db6SStephan Aßmus delete fIcon;
3264d80db6SStephan Aßmus }
3364d80db6SStephan Aßmus
3464d80db6SStephan Aßmus // Draw
3564d80db6SStephan Aßmus void
Draw(BRect updateRect)3664d80db6SStephan Aßmus IconValueView::Draw(BRect updateRect)
3764d80db6SStephan Aßmus {
3864d80db6SStephan Aßmus BRect r;
3964d80db6SStephan Aßmus BRegion originalClippingRegion;
4064d80db6SStephan Aßmus GetClippingRegion(&originalClippingRegion);
4164d80db6SStephan Aßmus if (fIcon) {
4264d80db6SStephan Aßmus BRect b(Bounds());
4364d80db6SStephan Aßmus // layout icon in the center
4464d80db6SStephan Aßmus r = fIcon->Bounds();
4564d80db6SStephan Aßmus r.OffsetTo(floorf(b.left + b.Width() / 2.0 - r.Width() / 2.0),
4664d80db6SStephan Aßmus floorf(b.top + b.Height() / 2.0 - r.Height() / 2.0));
4764d80db6SStephan Aßmus if (fIcon->ColorSpace() == B_RGBA32 || fIcon->ColorSpace() == B_RGBA32_BIG) {
4864d80db6SStephan Aßmus // set up transparent drawing and let
4964d80db6SStephan Aßmus // the base class draw the entire background
5064d80db6SStephan Aßmus SetHighColor(255, 255, 255, 255);
5164d80db6SStephan Aßmus SetDrawingMode(B_OP_ALPHA);
5264d80db6SStephan Aßmus SetBlendingMode(B_PIXEL_ALPHA, B_ALPHA_OVERLAY);
5364d80db6SStephan Aßmus } else {
5464d80db6SStephan Aßmus // constrain clipping region to exclude bitmap
5564d80db6SStephan Aßmus BRegion region = originalClippingRegion;
5664d80db6SStephan Aßmus region.Exclude(r);
5764d80db6SStephan Aßmus ConstrainClippingRegion(®ion);
5864d80db6SStephan Aßmus }
5964d80db6SStephan Aßmus }
6064d80db6SStephan Aßmus // draw surrouing area (and possibly background for bitmap)
6164d80db6SStephan Aßmus PropertyEditorView::Draw(updateRect);
6264d80db6SStephan Aßmus
6364d80db6SStephan Aßmus ConstrainClippingRegion(&originalClippingRegion);
6464d80db6SStephan Aßmus if (fIcon) {
6564d80db6SStephan Aßmus DrawBitmap(fIcon, r.LeftTop());
6664d80db6SStephan Aßmus }
6764d80db6SStephan Aßmus }
6864d80db6SStephan Aßmus
6964d80db6SStephan Aßmus // SetEnabled
7064d80db6SStephan Aßmus void
SetEnabled(bool enabled)7164d80db6SStephan Aßmus IconValueView::SetEnabled(bool enabled)
7264d80db6SStephan Aßmus {
7364d80db6SStephan Aßmus // TODO: gray out icon...
7464d80db6SStephan Aßmus }
7564d80db6SStephan Aßmus
7664d80db6SStephan Aßmus // AdoptProperty
7764d80db6SStephan Aßmus bool
AdoptProperty(Property * property)7864d80db6SStephan Aßmus IconValueView::AdoptProperty(Property* property)
7964d80db6SStephan Aßmus {
8064d80db6SStephan Aßmus IconProperty* p = dynamic_cast<IconProperty*>(property);
8164d80db6SStephan Aßmus if (p) {
8264d80db6SStephan Aßmus SetIcon(p->Icon(), p->Width(), p->Height(), p->Format());
8364d80db6SStephan Aßmus Invalidate();
8464d80db6SStephan Aßmus
8564d80db6SStephan Aßmus fProperty = p;
8664d80db6SStephan Aßmus return true;
8764d80db6SStephan Aßmus }
8864d80db6SStephan Aßmus return false;
8964d80db6SStephan Aßmus }
9064d80db6SStephan Aßmus
91*61b0e9e3SStephan Aßmus // GetProperty
92*61b0e9e3SStephan Aßmus Property*
GetProperty() const93*61b0e9e3SStephan Aßmus IconValueView::GetProperty() const
94*61b0e9e3SStephan Aßmus {
95*61b0e9e3SStephan Aßmus return fProperty;
96*61b0e9e3SStephan Aßmus }
97*61b0e9e3SStephan Aßmus
9864d80db6SStephan Aßmus // #pragma mark -
9964d80db6SStephan Aßmus
10064d80db6SStephan Aßmus // SetIcon
10164d80db6SStephan Aßmus status_t
SetIcon(const unsigned char * bitsFromQuickRes,uint32 width,uint32 height,color_space format)10264d80db6SStephan Aßmus IconValueView::SetIcon(const unsigned char* bitsFromQuickRes,
10364d80db6SStephan Aßmus uint32 width, uint32 height, color_space format)
10464d80db6SStephan Aßmus {
10564d80db6SStephan Aßmus status_t status = B_BAD_VALUE;
10664d80db6SStephan Aßmus if (bitsFromQuickRes && width > 0 && height > 0) {
10764d80db6SStephan Aßmus delete fIcon;
10864d80db6SStephan Aßmus fIcon = new BBitmap(BRect(0.0, 0.0, width - 1.0, height - 1.0), format);
10964d80db6SStephan Aßmus status = fIcon ? fIcon->InitCheck() : B_ERROR;
11064d80db6SStephan Aßmus if (status >= B_OK) {
11164d80db6SStephan Aßmus // It doesn't look right to copy BitsLength() bytes, but bitmaps
11264d80db6SStephan Aßmus // exported from QuickRes or WonderBrush still contain their padding,
11364d80db6SStephan Aßmus // so it is alright.
11464d80db6SStephan Aßmus memcpy(fIcon->Bits(), bitsFromQuickRes, fIcon->BitsLength());
11564d80db6SStephan Aßmus } else {
11664d80db6SStephan Aßmus delete fIcon;
11764d80db6SStephan Aßmus fIcon = NULL;
11864d80db6SStephan Aßmus printf("IconValueView::SetIcon() - error allocating bitmap: %s\n", strerror(status));
11964d80db6SStephan Aßmus }
12064d80db6SStephan Aßmus }
12164d80db6SStephan Aßmus return status;
12264d80db6SStephan Aßmus }
12364d80db6SStephan Aßmus
12464d80db6SStephan Aßmus
125