[haiku-commits] r38775 - in haiku/trunk: headers/libs/alm src/libs/alm

  • From: clemens.zeidler@xxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Wed, 22 Sep 2010 06:51:09 +0200 (CEST)

Author: czeidler
Date: 2010-09-22 06:51:09 +0200 (Wed, 22 Sep 2010)
New Revision: 38775
Changeset: http://dev.haiku-os.org/changeset/38775

Modified:
   haiku/trunk/headers/libs/alm/ALMLayout.h
   haiku/trunk/headers/libs/alm/Area.h
   haiku/trunk/src/libs/alm/ALMLayout.cpp
   haiku/trunk/src/libs/alm/Area.cpp
Log:
Use the AlignInFrame BLayoutItem function to do the item alignment. The child 
area is not needed any more.
Don't leak the fConstraints list.



Modified: haiku/trunk/headers/libs/alm/ALMLayout.h
===================================================================
--- haiku/trunk/headers/libs/alm/ALMLayout.h    2010-09-21 23:51:41 UTC (rev 
38774)
+++ haiku/trunk/headers/libs/alm/ALMLayout.h    2010-09-22 04:51:09 UTC (rev 
38775)
@@ -60,10 +60,10 @@
                        LayoutStyleType         LayoutStyle() const;
                        void                            
SetLayoutStyle(LayoutStyleType style);
 
-                       BSize                           BaseMinSize();
-                       BSize                           BaseMaxSize();
-                       BSize                           BasePreferredSize();
-                       BAlignment                      BaseAlignment();
+       virtual BSize                           BaseMinSize();
+       virtual BSize                           BaseMaxSize();
+       virtual BSize                           BasePreferredSize();
+       virtual BAlignment                      BaseAlignment();
 
        virtual void                            InvalidateLayout(bool children 
= false);
 

Modified: haiku/trunk/headers/libs/alm/Area.h
===================================================================
--- haiku/trunk/headers/libs/alm/Area.h 2010-09-21 23:51:41 UTC (rev 38774)
+++ haiku/trunk/headers/libs/alm/Area.h 2010-09-22 04:51:09 UTC (rev 38775)
@@ -56,12 +56,6 @@
                        double                          ContentAspectRatio() 
const;
                        void                            
SetContentAspectRatio(double ratio);
 
-                       void                            
SetExplicitAlignment(BAlignment alignment);
-
-                       void                            
SetHorizontalAlignment(alignment horizontal);
-                       void                            SetVerticalAlignment(
-                                                                       
vertical_alignment vertical);
-
                        BSize                           ShrinkPenalties() const;
                        void                            
SetShrinkPenalties(BSize shrink);
                        BSize                           GrowPenalties() const;
@@ -90,7 +84,7 @@
                        void                            
InvalidateSizeConstraints();
 
 protected:
-                                                               
Area(BALMLayout* layout, BLayoutItem* item);
+                                                               
Area(BLayoutItem* item);
 
                        void                            Init(LinearSpec* ls, 
XTab* left, YTab* top,
                                                                        XTab* 
right, YTab* bottom, BView* content,
@@ -101,53 +95,51 @@
                        void                            DoLayout();
 
 private:
-                       void                            _InitChildArea();
-                       void                            _UpdateHorizontal();
-                       void                            _UpdateVertical();
-
                        void                            
_UpdateMinSizeConstraint(BSize min);
                        void                            
_UpdateMaxSizeConstraint(BSize max);
                        void                            
_UpdatePreferredConstraint(BSize preferred);
 
 protected:
-                       BList*                          fConstraints;
+                       BList                           fConstraints;
 
 private:
-                       // TODO remove the layout pointer when making Area a 
LayoutItem
-                       BALMLayout*                     fALMLayout;
                        BLayoutItem*            fLayoutItem;
 
                        LinearSpec*                     fLS;
+
                        XTab*                           fLeft;
                        XTab*                           fRight;
                        YTab*                           fTop;
                        YTab*                           fBottom;
-                       Row*                            fRow;
-                       Column*                         fColumn;
+                       Constraint*                     fLeftConstraint;
+                       Constraint*                     fTopConstraint;
+                       Constraint*                     fRightConstraint;
+                       Constraint*                     fBottomConstraint;
+
                        Constraint*                     fMinContentWidth;
                        Constraint*                     fMaxContentWidth;
                        Constraint*                     fMinContentHeight;
                        Constraint*                     fMaxContentHeight;
-                       BSize                           fShrinkPenalties;
-                       BSize                           fGrowPenalties;
-                       double                          fContentAspectRatio;
-                       Constraint*                     fContentAspectRatioC;
                        bool                            
fAutoPreferredContentSize;
                        Constraint*                     fPreferredContentWidth;
                        Constraint*                     fPreferredContentHeight;
-                       Area*                           fChildArea;
-                       BAlignment                      fAlignment;
+
+                       double                          fContentAspectRatio;
+                       Constraint*                     fContentAspectRatioC;
+
+                       Row*                            fRow;
+                       Column*                         fColumn;
+                       
+                       BSize                           fShrinkPenalties;
+                       BSize                           fGrowPenalties;
+
                        int32                           fLeftInset;
                        int32                           fTopInset;
                        int32                           fRightInset;
                        int32                           fBottomInset;
-                       Constraint*                     fLeftConstraint;
-                       Constraint*                     fTopConstraint;
-                       Constraint*                     fRightConstraint;
-                       Constraint*                     fBottomConstraint;
 
 public:
-       //friend class          BALMLayout;
+       friend class            BALMLayout;
 
 };
 

Modified: haiku/trunk/src/libs/alm/ALMLayout.cpp
===================================================================
--- haiku/trunk/src/libs/alm/ALMLayout.cpp      2010-09-21 23:51:41 UTC (rev 
38774)
+++ haiku/trunk/src/libs/alm/ALMLayout.cpp      2010-09-22 04:51:09 UTC (rev 
38775)
@@ -431,7 +431,7 @@
 bool
 BALMLayout::ItemAdded(BLayoutItem* item, int32 atIndex)
 {
-       item->SetLayoutData(new(std::nothrow) Area(this, item));
+       item->SetLayoutData(new(std::nothrow) Area(item));
        return item->LayoutData() != NULL;
 }
 

Modified: haiku/trunk/src/libs/alm/Area.cpp
===================================================================
--- haiku/trunk/src/libs/alm/Area.cpp   2010-09-21 23:51:41 UTC (rev 38774)
+++ haiku/trunk/src/libs/alm/Area.cpp   2010-09-22 04:51:09 UTC (rev 38775)
@@ -4,6 +4,8 @@
  * Distributed under the terms of the MIT License.
  */
 
+#include "Area.h"
+
 #include <algorithm>   // for max
 
 #include <Button.h>
@@ -13,14 +15,7 @@
 #include <StatusBar.h>
 #include <StringView.h>
 
-#include "Area.h"
 #include "ALMLayout.h"
-#include "Column.h"
-#include "Constraint.h"
-#include "OperatorType.h"
-#include "Row.h"
-#include "XTab.h"
-#include "YTab.h"
 
 
 using namespace std;
@@ -81,14 +76,12 @@
 
        fColumn = NULL;
 
-       if (fChildArea == NULL) {
-               fMinContentWidth->SetLeftSide(-1.0, fLeft, 1.0, fRight);
+       fMinContentWidth->SetLeftSide(-1.0, fLeft, 1.0, fRight);
 
-               if (fMaxContentWidth != NULL)
-                       fMaxContentWidth->SetLeftSide(-1.0, fLeft, 1.0, fRight);
-       } else
-               _UpdateHorizontal();
-       fALMLayout->InvalidateLayout();
+       if (fMaxContentWidth != NULL)
+               fMaxContentWidth->SetLeftSide(-1.0, fLeft, 1.0, fRight);
+
+       fLayoutItem->Layout()->InvalidateLayout();
 }
 
 
@@ -116,14 +109,12 @@
 
        fColumn = NULL;
 
-       if (fChildArea == NULL) {
-               fMinContentWidth->SetLeftSide(-1.0, fLeft, 1.0, fRight);
+       fMinContentWidth->SetLeftSide(-1.0, fLeft, 1.0, fRight);
 
-               if (fMaxContentWidth != NULL)
-                       fMaxContentWidth->SetLeftSide(-1.0, fLeft, 1.0, fRight);
-       } else
-               _UpdateHorizontal();
-       fALMLayout->InvalidateLayout();
+       if (fMaxContentWidth != NULL)
+               fMaxContentWidth->SetLeftSide(-1.0, fLeft, 1.0, fRight);
+
+       fLayoutItem->Layout()->InvalidateLayout();
 }
 
 
@@ -147,14 +138,12 @@
 
        fRow = NULL;
 
-       if (fChildArea == NULL) {
-               fMinContentHeight->SetLeftSide(-1.0, fTop, 1.0, fBottom);
+       fMinContentHeight->SetLeftSide(-1.0, fTop, 1.0, fBottom);
 
-               if (fMaxContentHeight != NULL)
-                       fMaxContentHeight->SetLeftSide(-1.0, fTop, 1.0, 
fBottom);
-       } else
-               _UpdateVertical();
-       fALMLayout->InvalidateLayout();
+       if (fMaxContentHeight != NULL)
+               fMaxContentHeight->SetLeftSide(-1.0, fTop, 1.0, fBottom);
+
+       fLayoutItem->Layout()->InvalidateLayout();
 }
 
 
@@ -178,14 +167,12 @@
 
        fRow = NULL;
 
-       if (fChildArea == NULL) {
-               fMinContentHeight->SetLeftSide(-1.0, fTop, 1.0, fBottom);
+       fMinContentHeight->SetLeftSide(-1.0, fTop, 1.0, fBottom);
 
-               if (fMaxContentHeight != NULL)
-                       fMaxContentHeight->SetLeftSide(-1.0, fTop, 1.0, 
fBottom);
-       } else
-               _UpdateVertical();
-       fALMLayout->InvalidateLayout();
+       if (fMaxContentHeight != NULL)
+               fMaxContentHeight->SetLeftSide(-1.0, fTop, 1.0, fBottom);
+
+       fLayoutItem->Layout()->InvalidateLayout();
 }
 
 
@@ -209,7 +196,7 @@
        SetTop(row->Top());
        SetBottom(row->Bottom());
        fRow = row;
-       fALMLayout->InvalidateLayout();
+       fLayoutItem->Layout()->InvalidateLayout();
 }
 
 
@@ -233,7 +220,7 @@
        SetLeft(column->Left());
        SetRight(column->Right());
        fColumn = column;
-       fALMLayout->InvalidateLayout();
+       fLayoutItem->Layout()->InvalidateLayout();
 }
 
 
@@ -243,7 +230,7 @@
 XTab*
 Area::ContentLeft() const
 {
-       return (fChildArea == NULL) ? fLeft : fChildArea->fLeft;
+       return fLeft;
 }
 
 
@@ -253,7 +240,7 @@
 YTab*
 Area::ContentTop() const
 {
-       return (fChildArea == NULL) ? fTop : fChildArea->fTop;
+       return fTop;
 }
 
 
@@ -263,7 +250,7 @@
 XTab*
 Area::ContentRight() const
 {
-       return (fChildArea == NULL) ? fRight : fChildArea->fRight;
+       return fRight;
 }
 
 
@@ -273,7 +260,7 @@
 YTab*
 Area::ContentBottom() const
 {
-       return (fChildArea == NULL) ? fBottom : fChildArea->fBottom;
+       return fBottom;
 }
 
 
@@ -284,20 +271,17 @@
 BSize
 Area::ShrinkPenalties() const
 {
-       return (fChildArea == NULL) ? fShrinkPenalties : 
fChildArea->fShrinkPenalties;
+       return fShrinkPenalties;
 }
 
 
 void Area::SetShrinkPenalties(BSize shrink) {
-       if (fChildArea == NULL) {
-               fShrinkPenalties = shrink;
-               if (fPreferredContentWidth != NULL) {
-                       fPreferredContentWidth->SetPenaltyNeg(shrink.Width());
-                       fPreferredContentHeight->SetPenaltyNeg(shrink.Height());
-               }
-       } else
-               fChildArea->SetShrinkPenalties(shrink);
-       fALMLayout->InvalidateLayout();
+       fShrinkPenalties = shrink;
+       if (fPreferredContentWidth != NULL) {
+               fPreferredContentWidth->SetPenaltyNeg(shrink.Width());
+               fPreferredContentHeight->SetPenaltyNeg(shrink.Height());
+       }
+       fLayoutItem->Layout()->InvalidateLayout();
 }
 
 
@@ -308,22 +292,19 @@
 BSize
 Area::GrowPenalties() const
 {
-       return (fChildArea == NULL) ? fGrowPenalties : 
fChildArea->fGrowPenalties;
+       return fGrowPenalties;
 }
 
 
 void
 Area::SetGrowPenalties(BSize grow)
 {
-       if (fChildArea == NULL) {
-               fGrowPenalties = grow;
-               if (fPreferredContentWidth != NULL) {
-                       fPreferredContentWidth->SetPenaltyPos(grow.Width());
-                       fPreferredContentHeight->SetPenaltyPos(grow.Height());
-               }
-       } else
-               fChildArea->SetGrowPenalties(grow);
-       fALMLayout->InvalidateLayout();
+       fGrowPenalties = grow;
+       if (fPreferredContentWidth != NULL) {
+               fPreferredContentWidth->SetPenaltyPos(grow.Width());
+               fPreferredContentHeight->SetPenaltyPos(grow.Height());
+       }
+       fLayoutItem->Layout()->InvalidateLayout();
 }
 
 
@@ -333,8 +314,7 @@
 double
 Area::ContentAspectRatio() const
 {
-       return (fChildArea == NULL) ? fContentAspectRatio
-               : fChildArea->fContentAspectRatio;
+       return fContentAspectRatio;
 }
 
 
@@ -345,60 +325,20 @@
 void
 Area::SetContentAspectRatio(double ratio)
 {
-       if (fChildArea == NULL) {
-               fContentAspectRatio = ratio;
-               if (fContentAspectRatioC == NULL) {
-                       fContentAspectRatioC = fLS->AddConstraint(
-                               -1.0, fLeft, 1.0, fRight, ratio, fTop, -ratio, 
fBottom,
-                               OperatorType(EQ), 0.0);
-                       fConstraints->AddItem(fContentAspectRatioC);
-               } else {
-                       fContentAspectRatioC->SetLeftSide(
-                               -1.0, fLeft, 1.0, fRight, ratio, fTop, -ratio, 
fBottom);
-               }
-       } else
-               fChildArea->SetContentAspectRatio(ratio);
-       fALMLayout->InvalidateLayout();
+       fContentAspectRatio = ratio;
+       if (fContentAspectRatioC == NULL) {
+               fContentAspectRatioC = fLS->AddConstraint(-1.0, fLeft, 1.0, 
fRight,
+                       ratio, fTop, -ratio, fBottom, OperatorType(EQ), 0.0);
+               fConstraints.AddItem(fContentAspectRatioC);
+       } else {
+               fContentAspectRatioC->SetLeftSide(-1.0, fLeft, 1.0, fRight, 
ratio,
+                       fTop, -ratio, fBottom);
+       }
+       fLayoutItem->Layout()->InvalidateLayout();
 }
 
 
 /**
- * Sets alignment of the content in its area.
- */
-void
-Area::SetExplicitAlignment(BAlignment alignment)
-{
-       fAlignment = alignment;
-       _UpdateHorizontal();
-       _UpdateVertical();
-
-       fALMLayout->InvalidateLayout();
-}
-
-
-/**
- * Sets horizontal alignment of the content in its area.
- */
-void Area::SetHorizontalAlignment(alignment horizontal) {
-       fAlignment.SetHorizontal(horizontal);
-       _UpdateHorizontal();
-       fALMLayout->InvalidateLayout();
-}
-
-
-/**
- * Sets vertical alignment of the content in its area.
- */
-void
-Area::SetVerticalAlignment(vertical_alignment vertical)
-{
-       fAlignment.SetVertical(vertical);
-       _UpdateVertical();
-       fALMLayout->InvalidateLayout();
-}
-
-
-/**
  * Gets left inset between area and its content.
  */
 int32
@@ -415,8 +355,7 @@
 Area::SetLeftInset(int32 left)
 {
        fLeftInset = left;
-       _UpdateHorizontal();
-       fALMLayout->InvalidateLayout();
+       fLayoutItem->Layout()->InvalidateLayout();
 }
 
 
@@ -437,8 +376,7 @@
 Area::SetTopInset(int32 top)
 {
        fTopInset = top;
-       _UpdateVertical();
-       fALMLayout->InvalidateLayout();
+       fLayoutItem->Layout()->InvalidateLayout();
 }
 
 
@@ -459,7 +397,6 @@
 Area::SetRightInset(int32 right)
 {
        fRightInset = right;
-       _UpdateHorizontal();
 }
 
 
@@ -480,7 +417,6 @@
 Area::SetBottomInset(int32 bottom)
 {
        fBottomInset = bottom;
-       _UpdateVertical();
 }
 
 
@@ -600,9 +536,8 @@
  */
 Area::~Area()
 {
-       delete fChildArea;
-       for (int32 i = 0; i < fConstraints->CountItems(); i++)
-               delete (Constraint*)fConstraints->ItemAt(i);
+       for (int32 i = 0; i < fConstraints.CountItems(); i++)
+               delete (Constraint*)fConstraints.ItemAt(i);
 }
 
 
@@ -610,9 +545,8 @@
  * Constructor.
  * Uses XTabs and YTabs.
  */
-Area::Area(BALMLayout* layout, BLayoutItem* item)
+Area::Area(BLayoutItem* item)
        :
-       fALMLayout(layout),
        fLayoutItem(item)
 {
 
@@ -626,8 +560,6 @@
 Area::Init(LinearSpec* ls, XTab* left, YTab* top,
        XTab* right, YTab* bottom, BView* content, BSize minContentSize)
 {
-       fConstraints = new BList(2);
-
        fMaxContentWidth = NULL;
        fMaxContentHeight = NULL;
 
@@ -641,9 +573,6 @@
        fPreferredContentWidth = NULL;
        fPreferredContentHeight = NULL;
 
-       fChildArea = NULL;
-
-       fAlignment = BAlignment(B_ALIGN_USE_FULL_WIDTH, 
B_ALIGN_USE_FULL_HEIGHT);
        fLeftInset = 0;
        fTopInset = 0;
        fRightInset = 0;
@@ -664,17 +593,17 @@
        // really to the left of the right x-tab, and the top y-tab really 
above the bottom y-tab
        fMinContentWidth = ls->AddConstraint(-1.0, left, 1.0, right, 
OperatorType(GE),
                        minContentSize.Width());
-       fConstraints->AddItem(fMinContentWidth);
+       fConstraints.AddItem(fMinContentWidth);
 
        fMinContentHeight = ls->AddConstraint(-1.0, top, 1.0, bottom, 
OperatorType(GE),
                        minContentSize.Height());
-       fConstraints->AddItem(fMinContentHeight);
+       fConstraints.AddItem(fMinContentHeight);
 }
 
 
 void
-Area::Init(LinearSpec* ls, Row* row, Column* column,
-       BView* content, BSize minContentSize)
+Area::Init(LinearSpec* ls, Row* row, Column* column, BView* content,
+       BSize minContentSize)
 {
        Init(ls, column->Left(), row->Top(), column->Right(), row->Bottom(),
                        content, minContentSize);
@@ -688,224 +617,59 @@
  */
 void Area::DoLayout()
 {
-       if (View() == NULL)
-               return; // empty areas need no layout
+       BRect areaFrame(round(Left()->Value()), round(Top()->Value()),
+               round(Right()->Value()), round(Bottom()->Value()));
+       areaFrame.left += fLeftInset;
+       areaFrame.right -= fRightInset;
+       areaFrame.top += fTopInset;
+       areaFrame.bottom -= fBottomInset;
 
-       // if there is a childArea, then it is the childArea that actually 
contains the content
-       Area* area = (fChildArea != NULL) ? fChildArea : this;
-
-       // set content location and size
-       area->View()->MoveTo(floor(area->Left()->Value() + 0.5),
-                       floor(area->Top()->Value() + 0.5));
-       int32 width = (int32)floor(area->Right()->Value() - 
area->Left()->Value() + 0.5);
-       int32 height = (int32)floor(area->Bottom()->Value() - 
area->Top()->Value() + 0.5);
-       area->View()->ResizeTo(width, height);
+       fLayoutItem->AlignInFrame(areaFrame);
 }
 
 
-/**
- * Adds a childArea to this area, together with constraints that specify the 
relative location
- * of the childArea within this area. It is called when such a childArea 
becomes necessary,
- * i.e. when the user requests insets or special alignment.
- */
 void
-Area::_InitChildArea()
+Area::_UpdateMinSizeConstraint(BSize min)
 {
-       // add a child area with new tabs,
-       // and add constraints that set its tabs to be equal to the
-       // coresponding tabs of this area (for a start)
-       fChildArea = new Area(fALMLayout, fLayoutItem);
-       fChildArea->Init(fLS, new XTab(fLS), new YTab(fLS), new XTab(fLS),
-               new YTab(fLS), View(), BSize(0, 0));
-
-       fLeftConstraint = fLeft->IsEqual(fChildArea->Left());
-       fConstraints->AddItem(fLeftConstraint);
-       fTopConstraint = fTop->IsEqual(fChildArea->Top());
-       fConstraints->AddItem(fTopConstraint);
-       fRightConstraint = fRight->IsEqual(fChildArea->Right());
-       fConstraints->AddItem(fRightConstraint);
-       fBottomConstraint = fBottom->IsEqual(fChildArea->Bottom());
-       fConstraints->AddItem(fBottomConstraint);
-
-       // remove the minimum content size constraints from this area
-       // and copy the minimum content size setting to the childArea
-       fConstraints->RemoveItem(fMinContentWidth);
-       delete fMinContentWidth;
-       fMinContentWidth = fChildArea->fMinContentWidth;
-       fConstraints->RemoveItem(fMinContentHeight);
-       delete fMinContentHeight;
-       fMinContentHeight = fChildArea->fMinContentHeight;
-
-       // if there are maximum content size constraints on this area,
-       // change them so that they refer to the tabs of the childArea
-       // and copy the minimum content size settings to the childArea
-       if (fMaxContentWidth != NULL) {
-               fChildArea->fMaxContentWidth = fMaxContentWidth;
-               fMaxContentWidth->SetLeftSide(
-                       -1.0, fChildArea->Left(), 1.0, fChildArea->Right());
-
-               fChildArea->fMaxContentHeight = fMaxContentHeight;
-               fMaxContentHeight->SetLeftSide(
-                       -1.0, fChildArea->Top(), 1.0, fChildArea->Bottom());
-       }
-
-       // if there are preferred content size constraints on this area,
-       // change them so that they refer to the tabs of the childArea
-       // and copy the preferred content size settings to the childArea
-       if (fPreferredContentHeight != NULL) {
-               fChildArea->fShrinkPenalties = fShrinkPenalties;
-               fChildArea->fGrowPenalties = fGrowPenalties;
-
-               fChildArea->fPreferredContentWidth = fPreferredContentWidth;
-               fPreferredContentWidth->SetLeftSide(
-                       -1.0, fChildArea->Left(), 1.0, fChildArea->Right());
-
-               fChildArea->fPreferredContentHeight = fPreferredContentHeight;
-               fPreferredContentHeight->SetLeftSide(
-                       -1.0, fChildArea->Top(), 1.0, fChildArea->Bottom());
-       }
+       fMinContentWidth->SetRightSide(min.Width() + fLeftInset + fRightInset);
+       fMinContentHeight->SetRightSide(min.Height() + fTopInset + 
fBottomInset);
 }
 
 
-/**
- * Update the constraints for horizontal insets and alignment.
- */
 void
-Area::_UpdateHorizontal()
+Area::_UpdateMaxSizeConstraint(BSize max)
 {
-       // if the area does not have a childAdrea yet, this is the time to add 
it
-       if (fChildArea == NULL)
-               _InitChildArea();
+       max.width += fLeftInset + fRightInset;
+       max.height += fTopInset + fBottomInset;
 
-       // change the constraints leftConstraint and rightConstraint so that 
the horizontal
-       // alignment and insets of the childArea within this area are as 
specified by the user
-       if (fAlignment.Horizontal() == B_ALIGN_LEFT) {
-               fLeftConstraint->SetLeftSide(-1.0, fLeft, 1.0, 
fChildArea->Left());
-               fLeftConstraint->SetOp(OperatorType(EQ));
-               fLeftConstraint->SetRightSide(fLeftInset);
-
-               fRightConstraint->SetLeftSide(-1.0, fChildArea->Right(), 1.0, 
fRight);
-               fRightConstraint->SetOp(OperatorType(GE));
-               fRightConstraint->SetRightSide(fRightInset);
-       } else if (fAlignment.Horizontal() == B_ALIGN_RIGHT) {
-               fLeftConstraint->SetLeftSide(-1.0, fLeft, 1.0, 
fChildArea->Left());
-               fLeftConstraint->SetOp(OperatorType(GE));
-               fLeftConstraint->SetRightSide(fLeftInset);
-
-               fRightConstraint->SetLeftSide(-1.0, fChildArea->Right(), 1.0, 
fRight);
-               fRightConstraint->SetOp(OperatorType(EQ));
-               fRightConstraint->SetRightSide(fRightInset);
-       } else if (fAlignment.Horizontal() == B_ALIGN_HORIZONTAL_CENTER) {
-               fLeftConstraint->SetLeftSide(-1.0, fLeft, 1.0, 
fChildArea->Left());
-               fLeftConstraint->SetOp(OperatorType(GE));
-               fLeftConstraint->SetRightSide(max(fLeftInset, fRightInset));
-
-               fRightConstraint->SetLeftSide(-1.0, fLeft, 1.0, 
fChildArea->Left(), 1.0, fChildArea->Right(), -1.0, fRight);
-               fRightConstraint->SetOp(OperatorType(EQ));
-               fRightConstraint->SetRightSide(0);
-       } else if (fAlignment.Horizontal() == B_ALIGN_USE_FULL_WIDTH) {
-               fLeftConstraint->SetLeftSide(-1.0, fLeft, 1.0, 
fChildArea->Left());
-               fLeftConstraint->SetOp(OperatorType(EQ));
-               fLeftConstraint->SetRightSide(fLeftInset);
-
-               fRightConstraint->SetLeftSide(-1.0, fChildArea->Right(), 1.0, 
fRight);
-               fRightConstraint->SetOp(OperatorType(EQ));
-               fRightConstraint->SetRightSide(fRightInset);
-       } else if (fAlignment.Horizontal() == B_ALIGN_HORIZONTAL_UNSET) {
-               fLeftConstraint->SetLeftSide(-1.0, fLeft, 1.0, 
fChildArea->Left());
-               fLeftConstraint->SetOp(OperatorType(GE));
-               fLeftConstraint->SetRightSide(fLeftInset);
-
-               fRightConstraint->SetLeftSide(-1.0, fChildArea->Right(), 1.0, 
fRight);
-               fRightConstraint->SetOp(OperatorType(GE));
-               fRightConstraint->SetRightSide(fRightInset);
+       BAlignment alignment = fLayoutItem->Alignment();
+       if (alignment.Vertical() == B_ALIGN_USE_FULL_HEIGHT) {
+               if (fMaxContentHeight == NULL) {
+                       fMaxContentHeight = fLS->AddConstraint(-1.0, fTop, 1.0, 
fBottom,
+                               OperatorType(LE), max.Height());
+                       fConstraints.AddItem(fMaxContentHeight);
+               } else
+                       fMaxContentHeight->SetRightSide(max.Height());
        }
-}
-
-
-/**
- * Update the constraints for vertical insets and alignment.
- */
-void Area::_UpdateVertical() {
-       // if the area does not have a childAdrea yet, this is the time to add 
it
-       if (fChildArea == NULL)
-               _InitChildArea();
-
-       // change the constraints topConstraint and bottomConstraint so that 
the vertical
-       // alignment and insets of the childArea within this area are as 
specified by the user
-       if (fAlignment.Vertical() == B_ALIGN_TOP) {
-               fTopConstraint->SetLeftSide(-1.0, fTop, 1.0, fChildArea->Top());
-               fTopConstraint->SetOp(OperatorType(EQ));
-               fTopConstraint->SetRightSide(fTopInset);
-
-               fBottomConstraint->SetLeftSide(-1.0, fChildArea->Bottom(), 1.0, 
fBottom);
-               fBottomConstraint->SetOp(OperatorType(GE));
-               fBottomConstraint->SetRightSide(fBottomInset);
-       } else if (fAlignment.Vertical() == B_ALIGN_BOTTOM) {
-               fTopConstraint->SetLeftSide(-1.0, fTop, 1.0, fChildArea->Top());
-               fTopConstraint->SetOp(OperatorType(GE));
-               fTopConstraint->SetRightSide(fTopInset);
-
-               fBottomConstraint->SetLeftSide(-1.0, fChildArea->Bottom(), 1.0, 
fBottom);
-               fBottomConstraint->SetOp(OperatorType(EQ));
-               fBottomConstraint->SetRightSide(fBottomInset);
-       } else if (fAlignment.Vertical() == B_ALIGN_VERTICAL_CENTER) {
-               fTopConstraint->SetLeftSide(-1.0, fTop, 1.0, fChildArea->Top());
-               fTopConstraint->SetOp(OperatorType(GE));
-               fTopConstraint->SetRightSide(max(fTopInset, fBottomInset));
-
-               fBottomConstraint->SetLeftSide(-1.0, fTop, 1.0, 
fChildArea->Top(), 1.0, fChildArea->Bottom(), -1.0, fBottom);
-               fBottomConstraint->SetOp(OperatorType(EQ));
-               fBottomConstraint->SetRightSide(0);
-       } else if (fAlignment.Vertical() == B_ALIGN_USE_FULL_HEIGHT) {
-               fTopConstraint->SetLeftSide(-1.0, fTop, 1.0, fChildArea->Top());
-               fTopConstraint->SetOp(OperatorType(EQ));
-               fTopConstraint->SetRightSide(fTopInset);
-
-               fBottomConstraint->SetLeftSide(-1.0, fChildArea->Bottom(), 1.0, 
fBottom);
-               fBottomConstraint->SetOp(OperatorType(EQ));
-               fBottomConstraint->SetRightSide(fBottomInset);
-       } else if (fAlignment.Vertical() == B_ALIGN_VERTICAL_UNSET) {
-               fTopConstraint->SetLeftSide(-1.0, fTop, 1.0, fChildArea->Top());
-               fTopConstraint->SetOp(OperatorType(GE));
-               fTopConstraint->SetRightSide(fTopInset);
-
-               fBottomConstraint->SetLeftSide(-1.0, fChildArea->Bottom(), 1.0, 
fBottom);
-               fBottomConstraint->SetOp(OperatorType(GE));
-               fBottomConstraint->SetRightSide(fBottomInset);
+       else {
+               fConstraints.RemoveItem(fMaxContentHeight);
+               delete fMaxContentHeight;
+               fMaxContentHeight = NULL;
        }
-}
 
-
-void
-Area::_UpdateMinSizeConstraint(BSize min)
-{
-       if (fChildArea == NULL) {
-               fMinContentWidth->SetRightSide(min.Width());
-               fMinContentHeight->SetRightSide(min.Height());
-       } else
-               fChildArea->_UpdateMinSizeConstraint(min);
-}
-
-
-void
-Area::_UpdateMaxSizeConstraint(BSize max)
-{
-       if (fChildArea == NULL) {
+       if (alignment.Vertical() == B_ALIGN_USE_FULL_WIDTH) {
                if (fMaxContentWidth == NULL) {
                        fMaxContentWidth = fLS->AddConstraint(-1.0, fLeft, 1.0, 
fRight,
                                OperatorType(LE), max.Width());
-                       fConstraints->AddItem(fMaxContentWidth);
-
-                       fMaxContentHeight = fLS->AddConstraint(-1.0, fTop, 1.0, 
fBottom,
-                               OperatorType(LE), max.Height());
-                       fConstraints->AddItem(fMaxContentHeight);
-               } else {
+                       fConstraints.AddItem(fMaxContentWidth);
+               } else
                        fMaxContentWidth->SetRightSide(max.Width());
-                       fMaxContentHeight->SetRightSide(max.Height());
-               }
-       } else
-               fChildArea->_UpdateMaxSizeConstraint(max);
+       }
+       else {
+               fConstraints.RemoveItem(fMaxContentWidth);
+               delete fMaxContentWidth;
+               fMaxContentWidth = NULL;
+       }
 }
 
 
@@ -918,23 +682,20 @@
 void
 Area::_UpdatePreferredConstraint(BSize preferred)
 {
-       if (fChildArea == NULL) {
-               if (fPreferredContentWidth == NULL) {
-                       fPreferredContentWidth = fLS->AddConstraint(
-                               -1.0, fLeft, 1.0, fRight, OperatorType(EQ),
-                               preferred.Width(), fShrinkPenalties.Width(),
-                               fGrowPenalties.Width());
-                       fConstraints->AddItem(fPreferredContentWidth);
+       preferred.width += fLeftInset + fRightInset;
+       preferred.height += fTopInset + fBottomInset;
+       if (fPreferredContentWidth == NULL) {
+               fPreferredContentWidth = fLS->AddConstraint(-1.0, fLeft, 1.0,
+                       fRight, OperatorType(EQ), preferred.Width(),
+                       fShrinkPenalties.Width(), fGrowPenalties.Width());
+               fConstraints.AddItem(fPreferredContentWidth);
 
-                       fPreferredContentHeight = fLS->AddConstraint(
-                               -1.0, fTop, 1.0, fBottom, OperatorType(EQ),
-                               preferred.Height(), fShrinkPenalties.Height(),
-                               fGrowPenalties.Height());
-                       fConstraints->AddItem(fPreferredContentHeight);
-               } else {
-                       fPreferredContentWidth->SetRightSide(preferred.Width());
-                       
fPreferredContentHeight->SetRightSide(preferred.Height());
-               }
-       } else
-               fChildArea->_UpdatePreferredConstraint(preferred);
+               fPreferredContentHeight = fLS->AddConstraint(-1.0, fTop, 1.0,
+                       fBottom, OperatorType(EQ), preferred.Height(),
+                       fShrinkPenalties.Height(), fGrowPenalties.Height());
+               fConstraints.AddItem(fPreferredContentHeight);
+       } else {
+               fPreferredContentWidth->SetRightSide(preferred.Width());
+               fPreferredContentHeight->SetRightSide(preferred.Height());
+       }
 }


Other related posts:

  • » [haiku-commits] r38775 - in haiku/trunk: headers/libs/alm src/libs/alm - clemens . zeidler