* GetPreferredSize() no longer crashes when given a NULL parameter (as the

other interface views already do).
* Minor cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25019 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2008-04-18 12:01:07 +00:00
parent 00d5cfaa7e
commit 28d5567e28
+86 -58
View File
@@ -66,22 +66,28 @@ using std::nothrow;
static property_info sViewPropInfo[] = { static property_info sViewPropInfo[] = {
{ "Frame", { B_GET_PROPERTY, 0 }, { "Frame", { B_GET_PROPERTY, 0 },
{ B_DIRECT_SPECIFIER, 0 }, "Returns the view's frame rectangle.", 0, { B_RECT_TYPE } { B_DIRECT_SPECIFIER, 0 }, "Returns the view's frame rectangle.", 0,
{ B_RECT_TYPE }
}, },
{ "Frame", { B_SET_PROPERTY, 0 }, { "Frame", { B_SET_PROPERTY, 0 },
{ B_DIRECT_SPECIFIER, 0 }, "Sets the view's frame rectangle.", 0, { B_RECT_TYPE } { B_DIRECT_SPECIFIER, 0 }, "Sets the view's frame rectangle.", 0,
{ B_RECT_TYPE }
}, },
{ "Hidden", { B_GET_PROPERTY, 0 }, { "Hidden", { B_GET_PROPERTY, 0 },
{ B_DIRECT_SPECIFIER, 0 }, "Returns true if the view is hidden; false otherwise.", 0, { B_BOOL_TYPE } { B_DIRECT_SPECIFIER, 0 }, "Returns wether or not the view is hidden.",
0, { B_BOOL_TYPE }
}, },
{ "Hidden", { B_SET_PROPERTY, 0 }, { "Hidden", { B_SET_PROPERTY, 0 },
{ B_DIRECT_SPECIFIER, 0 }, "Hides or shows the view.", 0, { B_BOOL_TYPE } { B_DIRECT_SPECIFIER, 0 }, "Hides or shows the view.", 0,
{ B_BOOL_TYPE }
}, },
{ "Shelf", { 0 }, { "Shelf", { 0 },
{ B_DIRECT_SPECIFIER, 0 }, "Directs the scripting message to the shelf.", 0 { B_DIRECT_SPECIFIER, 0 }, "Directs the scripting message to the "
"shelf.", 0
}, },
{ "View", { B_COUNT_PROPERTIES, 0 }, { "View", { B_COUNT_PROPERTIES, 0 },
{ B_DIRECT_SPECIFIER, 0 }, "Returns the number of of child views.", 0, { B_INT32_TYPE } { B_DIRECT_SPECIFIER, 0 }, "Returns the number of of child views.", 0,
{ B_INT32_TYPE }
}, },
{ "View", { 0 }, { "View", { 0 },
{ B_INDEX_SPECIFIER, B_REVERSE_INDEX_SPECIFIER, B_NAME_SPECIFIER, 0 }, { B_INDEX_SPECIFIER, B_REVERSE_INDEX_SPECIFIER, B_NAME_SPECIFIER, 0 },
@@ -1002,7 +1008,8 @@ BView::SetOrigin(float x, float y)
fState->valid_flags |= B_VIEW_ORIGIN_BIT; fState->valid_flags |= B_VIEW_ORIGIN_BIT;
} }
// our local coord system origin has changed, so when archiving we'll add this too // our local coord system origin has changed, so when archiving we'll add
// this too
fState->archiving_flags |= B_VIEW_ORIGIN_BIT; fState->archiving_flags |= B_VIEW_ORIGIN_BIT;
} }
@@ -1181,7 +1188,9 @@ BView::GetPreferredSize(float* _width, float* _height)
{ {
STRACE(("\tHOOK: BView(%s)::GetPreferredSize()\n", Name())); STRACE(("\tHOOK: BView(%s)::GetPreferredSize()\n", Name()));
if (_width != NULL)
*_width = fBounds.Width(); *_width = fBounds.Width();
if (_height != NULL)
*_height = fBounds.Height(); *_height = fBounds.Height();
} }
@@ -1377,7 +1386,8 @@ BView::DragMessage(BMessage *message, BBitmap *image,
BMessage *msg = fOwner->CurrentMessage(); BMessage *msg = fOwner->CurrentMessage();
uint32 buttons; uint32 buttons;
if (msg == NULL || msg->FindInt32("buttons", (int32 *)&buttons) != B_OK) { if (msg == NULL
|| msg->FindInt32("buttons", (int32 *)&buttons) != B_OK) {
BPoint point; BPoint point;
GetMouse(&point, &buttons, false); GetMouse(&point, &buttons, false);
} }
@@ -1410,7 +1420,8 @@ BView::DragMessage(BMessage *message, BBitmap *image,
delete [] buffer; delete [] buffer;
} else { } else {
fprintf(stderr, "BView::DragMessage() - no memory to flatten drag message\n"); fprintf(stderr, "BView::DragMessage() - no memory to flatten drag "
"message\n");
} }
delete image; delete image;
@@ -1589,7 +1600,7 @@ BView::SetEventMask(uint32 mask, uint32 options)
if (fEventMask == mask && fEventOptions == options) if (fEventMask == mask && fEventOptions == options)
return B_OK; return B_OK;
fEventMask = mask | (fEventMask & 0xFFFF0000); fEventMask = mask | (fEventMask & 0xffff0000);
fEventOptions = options; fEventOptions = options;
fState->archiving_flags |= B_VIEW_EVENT_MASK_BIT; fState->archiving_flags |= B_VIEW_EVENT_MASK_BIT;
@@ -1860,8 +1871,7 @@ BView::GetBlendingMode(source_alpha *_sourceAlpha,
fOwner->fLink->StartMessage(AS_VIEW_GET_BLENDING_MODE); fOwner->fLink->StartMessage(AS_VIEW_GET_BLENDING_MODE);
int32 code; int32 code;
if (fOwner->fLink->FlushWithReply(code) == B_OK if (fOwner->fLink->FlushWithReply(code) == B_OK && code == B_OK) {
&& code == B_OK) {
int8 alphaSourceMode, alphaFunctionMode; int8 alphaSourceMode, alphaFunctionMode;
fOwner->fLink->Read<int8>(&alphaSourceMode); fOwner->fLink->Read<int8>(&alphaSourceMode);
fOwner->fLink->Read<int8>(&alphaFunctionMode); fOwner->fLink->Read<int8>(&alphaFunctionMode);
@@ -2117,7 +2127,8 @@ BView::ViewColor() const
void void
BView::ForceFontAliasing(bool enable) BView::ForceFontAliasing(bool enable)
{ {
if (fState->IsValid(B_VIEW_FONT_ALIASING_BIT) && enable == fState->font_aliasing) if (fState->IsValid(B_VIEW_FONT_ALIASING_BIT)
&& enable == fState->font_aliasing)
return; return;
if (fOwner) { if (fOwner) {
@@ -2301,7 +2312,6 @@ BView::ConstrainClippingRegion(BRegion* region)
// #pragma mark - Drawing Functions // #pragma mark - Drawing Functions
//---------------------------------------------------------------------------
void void
@@ -2466,10 +2476,10 @@ BView::DrawString(const char *string, int32 length, BPoint location,
void void
BView::StrokeEllipse(BPoint center, float xRadius, float yRadius, BView::StrokeEllipse(BPoint center, float xRadius, float yRadius,
pattern p) ::pattern pattern)
{ {
StrokeEllipse(BRect(center.x - xRadius, center.y - yRadius, center.x + xRadius, StrokeEllipse(BRect(center.x - xRadius, center.y - yRadius,
center.y + yRadius), p); center.x + xRadius, center.y + yRadius), pattern);
} }
@@ -2515,11 +2525,11 @@ BView::FillEllipse(BRect rect, ::pattern pattern)
void void
BView::StrokeArc(BPoint center, float xRadius, float yRadius, BView::StrokeArc(BPoint center, float xRadius, float yRadius, float startAngle,
float startAngle, float arcAngle, pattern p) float arcAngle, ::pattern pattern)
{ {
StrokeArc(BRect(center.x - xRadius, center.y - yRadius, center.x + xRadius, StrokeArc(BRect(center.x - xRadius, center.y - yRadius, center.x + xRadius,
center.y + yRadius), startAngle, arcAngle, p); center.y + yRadius), startAngle, arcAngle, pattern);
} }
@@ -2543,8 +2553,8 @@ BView::StrokeArc(BRect rect, float startAngle, float arcAngle,
void void
BView::FillArc(BPoint center,float xRadius, float yRadius, BView::FillArc(BPoint center,float xRadius, float yRadius, float startAngle,
float startAngle, float arcAngle, ::pattern pattern) float arcAngle, ::pattern pattern)
{ {
FillArc(BRect(center.x - xRadius, center.y - yRadius, center.x + xRadius, FillArc(BRect(center.x - xRadius, center.y - yRadius, center.x + xRadius,
center.y + yRadius), startAngle, arcAngle, pattern); center.y + yRadius), startAngle, arcAngle, pattern);
@@ -2609,21 +2619,24 @@ BView::FillBezier(BPoint *controlPoints, ::pattern pattern)
void void
BView::StrokePolygon(const BPolygon *polygon, bool closed, pattern p) BView::StrokePolygon(const BPolygon *polygon, bool closed, ::pattern pattern)
{ {
if (!polygon) if (!polygon)
return; return;
StrokePolygon(polygon->fPoints, polygon->fCount, polygon->Frame(), closed, p); StrokePolygon(polygon->fPoints, polygon->fCount, polygon->Frame(), closed,
pattern);
} }
void void
BView::StrokePolygon(const BPoint *ptArray, int32 numPoints, bool closed, pattern p) BView::StrokePolygon(const BPoint* pointArray, int32 numPoints, bool closed,
::pattern pattern)
{ {
BPolygon polygon(ptArray, numPoints); BPolygon polygon(pointArray, numPoints);
StrokePolygon(polygon.fPoints, polygon.fCount, polygon.Frame(), closed, p); StrokePolygon(polygon.fPoints, polygon.fCount, polygon.Frame(), closed,
pattern);
} }
@@ -2643,8 +2656,8 @@ BView::StrokePolygon(const BPoint *ptArray, int32 numPoints, BRect bounds,
polygon.MapTo(polygon.Frame(), bounds); polygon.MapTo(polygon.Frame(), bounds);
if (fOwner->fLink->StartMessage(AS_STROKE_POLYGON, if (fOwner->fLink->StartMessage(AS_STROKE_POLYGON,
polygon.fCount * sizeof(BPoint) + sizeof(BRect) + sizeof(bool) + sizeof(int32)) polygon.fCount * sizeof(BPoint) + sizeof(BRect) + sizeof(bool)
== B_OK) { + sizeof(int32)) == B_OK) {
fOwner->fLink->Attach<BRect>(polygon.Frame()); fOwner->fLink->Attach<BRect>(polygon.Frame());
fOwner->fLink->Attach<bool>(closed); fOwner->fLink->Attach<bool>(closed);
fOwner->fLink->Attach<int32>(polygon.fCount); fOwner->fLink->Attach<int32>(polygon.fCount);
@@ -2670,10 +2683,12 @@ BView::FillPolygon(const BPolygon *polygon, ::pattern pattern)
_UpdatePattern(pattern); _UpdatePattern(pattern);
if (fOwner->fLink->StartMessage(AS_FILL_POLYGON, if (fOwner->fLink->StartMessage(AS_FILL_POLYGON,
polygon->fCount * sizeof(BPoint) + sizeof(BRect) + sizeof(int32)) == B_OK) { polygon->fCount * sizeof(BPoint) + sizeof(BRect) + sizeof(int32))
== B_OK) {
fOwner->fLink->Attach<BRect>(polygon->Frame()); fOwner->fLink->Attach<BRect>(polygon->Frame());
fOwner->fLink->Attach<int32>(polygon->fCount); fOwner->fLink->Attach<int32>(polygon->fCount);
fOwner->fLink->Attach(polygon->fPoints, polygon->fCount * sizeof(BPoint)); fOwner->fLink->Attach(polygon->fPoints,
polygon->fCount * sizeof(BPoint));
_FlushIfNotInTransaction(); _FlushIfNotInTransaction();
} else { } else {
@@ -2804,8 +2819,8 @@ BView::FillRegion(BRegion *region, ::pattern pattern)
void void
BView::StrokeTriangle(BPoint pt1, BPoint pt2, BPoint pt3, BView::StrokeTriangle(BPoint pt1, BPoint pt2, BPoint pt3, BRect bounds,
BRect bounds, ::pattern pattern) ::pattern pattern)
{ {
if (fOwner == NULL) if (fOwner == NULL)
return; return;
@@ -2962,7 +2977,8 @@ BView::StrokeShape(BShape *shape, ::pattern pattern)
_CheckLockAndSwitchCurrent(); _CheckLockAndSwitchCurrent();
_UpdatePattern(pattern); _UpdatePattern(pattern);
if ((sd->opCount * sizeof(uint32)) + (sd->ptCount * sizeof(BPoint)) < MAX_ATTACHMENT_SIZE) { if ((sd->opCount * sizeof(uint32)) + (sd->ptCount * sizeof(BPoint))
< MAX_ATTACHMENT_SIZE) {
fOwner->fLink->StartMessage(AS_STROKE_SHAPE); fOwner->fLink->StartMessage(AS_STROKE_SHAPE);
fOwner->fLink->Attach<BRect>(shape->Bounds()); fOwner->fLink->Attach<BRect>(shape->Bounds());
fOwner->fLink->Attach<int32>(sd->opCount); fOwner->fLink->Attach<int32>(sd->opCount);
@@ -2990,7 +3006,8 @@ BView::FillShape(BShape *shape, ::pattern pattern)
_CheckLockAndSwitchCurrent(); _CheckLockAndSwitchCurrent();
_UpdatePattern(pattern); _UpdatePattern(pattern);
if ((sd->opCount * sizeof(uint32)) + (sd->ptCount * sizeof(BPoint)) < MAX_ATTACHMENT_SIZE) { if ((sd->opCount * sizeof(uint32)) + (sd->ptCount * sizeof(BPoint))
< MAX_ATTACHMENT_SIZE) {
fOwner->fLink->StartMessage(AS_FILL_SHAPE); fOwner->fLink->StartMessage(AS_FILL_SHAPE);
fOwner->fLink->Attach<BRect>(shape->Bounds()); fOwner->fLink->Attach<BRect>(shape->Bounds());
fOwner->fLink->Attach<int32>(sd->opCount); fOwner->fLink->Attach<int32>(sd->opCount);
@@ -3708,7 +3725,8 @@ BView::ResolveSpecifier(BMessage *msg, int32 index, BMessage *specifier,
replyMsg.AddString("message", "This window doesn't have a shelf"); replyMsg.AddString("message", "This window doesn't have a shelf");
break; break;
case 6: { case 6:
{
if (!fFirstChild) { if (!fFirstChild) {
err = B_NAME_NOT_FOUND; err = B_NAME_NOT_FOUND;
replyMsg.AddString("message", "This window doesn't have children."); replyMsg.AddString("message", "This window doesn't have children.");
@@ -3716,21 +3734,24 @@ BView::ResolveSpecifier(BMessage *msg, int32 index, BMessage *specifier,
} }
BView *child = NULL; BView *child = NULL;
switch (what) { switch (what) {
case B_INDEX_SPECIFIER: { case B_INDEX_SPECIFIER:
{
int32 index; int32 index;
err = specifier->FindInt32("index", &index); err = specifier->FindInt32("index", &index);
if (err == B_OK) if (err == B_OK)
child = ChildAt(index); child = ChildAt(index);
break; break;
} }
case B_REVERSE_INDEX_SPECIFIER: { case B_REVERSE_INDEX_SPECIFIER:
{
int32 rindex; int32 rindex;
err = specifier->FindInt32("index", &rindex); err = specifier->FindInt32("index", &rindex);
if (err == B_OK) if (err == B_OK)
child = ChildAt(CountChildren() - rindex); child = ChildAt(CountChildren() - rindex);
break; break;
} }
case B_NAME_SPECIFIER: { case B_NAME_SPECIFIER:
{
const char *name; const char *name;
err = specifier->FindString("name", &name); err = specifier->FindString("name", &name);
if (err == B_OK) if (err == B_OK)
@@ -3746,11 +3767,15 @@ BView::ResolveSpecifier(BMessage *msg, int32 index, BMessage *specifier,
if (err == B_OK) if (err == B_OK)
err = B_BAD_INDEX; err = B_BAD_INDEX;
replyMsg.AddString("message", "Cannot find view at/with specified index/name.");
replyMsg.AddString("message",
"Cannot find view at/with specified index/name.");
break; break;
} }
default: default:
return BHandler::ResolveSpecifier(msg, index, specifier, what, property); return BHandler::ResolveSpecifier(msg, index, specifier, what,
property);
} }
if (err < B_OK) { if (err < B_OK) {
@@ -3769,7 +3794,7 @@ BView::ResolveSpecifier(BMessage *msg, int32 index, BMessage *specifier,
void void
BView::MessageReceived(BMessage *msg) BView::MessageReceived(BMessage* msg)
{ {
if (!msg->HasSpecifiers()) { if (!msg->HasSpecifiers()) {
switch (msg->what) { switch (msg->what) {
@@ -3850,7 +3875,8 @@ BView::MessageReceived(BMessage *msg)
case 0: case 0:
err = replyMsg.AddRect("result", Frame()); err = replyMsg.AddRect("result", Frame());
break; break;
case 1: { case 1:
{
BRect newFrame; BRect newFrame;
err = msg->FindRect("data", &newFrame); err = msg->FindRect("data", &newFrame);
if (err == B_OK) { if (err == B_OK) {
@@ -3862,7 +3888,8 @@ BView::MessageReceived(BMessage *msg)
case 2: case 2:
err = replyMsg.AddBool( "result", IsHidden()); err = replyMsg.AddBool( "result", IsHidden());
break; break;
case 3: { case 3:
{
bool newHiddenState; bool newHiddenState;
err = msg->FindBool("data", &newHiddenState); err = msg->FindBool("data", &newHiddenState);
if (err == B_OK) { if (err == B_OK) {
@@ -4190,7 +4217,8 @@ BView::_Layout(bool force, BLayoutContext* context)
void void
BView::_InitData(BRect frame, const char *name, uint32 resizingMode, uint32 flags) BView::_InitData(BRect frame, const char *name, uint32 resizingMode,
uint32 flags)
{ {
// Info: The name of the view is set by BHandler constructor // Info: The name of the view is set by BHandler constructor
@@ -4430,7 +4458,8 @@ BView::_CreateSelf()
// we create all its children, too // we create all its children, too
for (BView *child = fFirstChild; child != NULL; child = child->fNextSibling) { for (BView *child = fFirstChild; child != NULL;
child = child->fNextSibling) {
child->_CreateSelf(); child->_CreateSelf();
} }
@@ -4439,8 +4468,7 @@ BView::_CreateSelf()
} }
/*! /*! Sets the new view position.
Sets the new view position.
It doesn't contact the server, though - the only case where this It doesn't contact the server, though - the only case where this
is called outside of MoveTo() is as reaction of moving a view is called outside of MoveTo() is as reaction of moving a view
in the server (a.k.a. B_WINDOW_RESIZED). in the server (a.k.a. B_WINDOW_RESIZED).
@@ -4462,8 +4490,7 @@ BView::_MoveTo(int32 x, int32 y)
} }
/*! /*! Computes the actual new frame size and recalculates the size of
Computes the actual new frame size and recalculates the size of
the children as well. the children as well.
It doesn't contact the server, though - the only case where this It doesn't contact the server, though - the only case where this
is called outside of ResizeBy() is as reaction of resizing a view is called outside of ResizeBy() is as reaction of resizing a view
@@ -4502,9 +4529,7 @@ BView::_ResizeBy(int32 deltaWidth, int32 deltaHeight)
} }
/*! /*! Relayouts the view according to its resizing mode. */
Relayouts the view according to its resizing mode.
*/
void void
BView::_ParentResizedBy(int32 x, int32 y) BView::_ParentResizedBy(int32 x, int32 y)
{ {
@@ -4554,7 +4579,8 @@ BView::_Activate(bool active)
{ {
WindowActivated(active); WindowActivated(active);
for (BView *child = fFirstChild; child != NULL; child = child->fNextSibling) { for (BView *child = fFirstChild; child != NULL;
child = child->fNextSibling) {
child->_Activate(active); child->_Activate(active);
} }
} }
@@ -4580,7 +4606,8 @@ BView::_Attach()
Invalidate(); Invalidate();
} }
for (BView* child = fFirstChild; child != NULL; child = child->fNextSibling) { for (BView* child = fFirstChild; child != NULL;
child = child->fNextSibling) {
// we need to check for fAttached as new views could have been // we need to check for fAttached as new views could have been
// added in AttachedToWindow() - and those are already attached // added in AttachedToWindow() - and those are already attached
if (!child->fAttached) if (!child->fAttached)
@@ -4597,7 +4624,8 @@ BView::_Detach()
DetachedFromWindow(); DetachedFromWindow();
fAttached = false; fAttached = false;
for (BView* child = fFirstChild; child != NULL; child = child->fNextSibling) { for (BView* child = fFirstChild; child != NULL;
child = child->fNextSibling) {
child->_Detach(); child->_Detach();
} }
@@ -4772,8 +4800,8 @@ BView::_SetShelf(BShelf *shelf)
status_t status_t
BView::_SetViewBitmap(const BBitmap* bitmap, BRect srcRect, BView::_SetViewBitmap(const BBitmap* bitmap, BRect srcRect, BRect dstRect,
BRect dstRect, uint32 followFlags, uint32 options) uint32 followFlags, uint32 options)
{ {
if (!_CheckOwnerLockAndSwitchCurrent()) if (!_CheckOwnerLockAndSwitchCurrent())
return B_ERROR; return B_ERROR;