diff --git a/headers/libs/alm/Area.h b/headers/libs/alm/Area.h index a69923176a..cf9bed2faa 100644 --- a/headers/libs/alm/Area.h +++ b/headers/libs/alm/Area.h @@ -33,6 +33,8 @@ class Area { public: ~Area(); + BView* View(); + XTab* Left() const; void SetLeft(XTab* left); XTab* Right() const; @@ -47,13 +49,12 @@ public: Column* GetColumn() const; void SetColumn(Column* column); - BView* Content() const; - void SetContent(BView* content); XTab* ContentLeft() const; YTab* ContentTop() const; XTab* ContentRight() const; YTab* ContentBottom() const; BSize MinContentSize() const; + void SetMinContentSize(BSize min); BSize MaxContentSize() const; void SetMaxContentSize(BSize max); @@ -62,17 +63,17 @@ public: 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; void SetGrowPenalties(BSize grow); - BAlignment Alignment() const; - void SetAlignment(BAlignment alignment); - void SetHorizontalAlignment(alignment horizontal); - void SetVerticalAlignment( - vertical_alignment vertical); - int32 LeftInset() const; void SetLeftInset(int32 left); int32 TopInset() const; @@ -94,23 +95,20 @@ public: BList* HasSameSizeAs(Area* area); protected: - Area(BALMLayout* layout, - LinearSpec* ls, XTab* left, YTab* top, + Area(BALMLayout* layout, BLayoutItem* item); + + void Init(LinearSpec* ls, XTab* left, YTab* top, XTab* right, YTab* bottom, BView* content, BSize minContentSize); - Area(BALMLayout* layout, - LinearSpec* ls, Row* row, Column* column, + void Init(LinearSpec* ls, Row* row, Column* column, BView* content, BSize minContentSize); + void DoLayout(); private: void InitChildArea(); void UpdateHorizontal(); void UpdateVertical(); - void Init(BALMLayout* layout, - LinearSpec* ls, XTab* left, YTab* top, - XTab* right, YTab* bottom, BView* content, - BSize minContentSize); public: static BSize kMaxSize; @@ -118,12 +116,12 @@ public: static BSize kUndefinedSize; protected: - BView* fContent; BList* fConstraints; private: // TODO remove the layout pointer when making Area a LayoutItem BALMLayout* fALMLayout; + BLayoutItem* fLayoutItem; LinearSpec* fLS; XTab* fLeft; diff --git a/headers/libs/alm/BALMLayout.h b/headers/libs/alm/BALMLayout.h index 5d0c0b1ffa..c1a80cbc6a 100644 --- a/headers/libs/alm/BALMLayout.h +++ b/headers/libs/alm/BALMLayout.h @@ -30,6 +30,8 @@ namespace BALM { class BALMLayout : public BAbstractLayout { public: BALMLayout(); + virtual ~BALMLayout(); + void SolveLayout(); XTab* AddXTab(); @@ -39,15 +41,15 @@ public: Column* AddColumn(); Column* AddColumn(XTab* left, XTab* right); - Area* AddArea(XTab* left, YTab* top, XTab* right, YTab* bottom, - BView* content, BSize minContentSize); - Area* AddArea(Row* row, Column* column, BView* content, - BSize minContentSize); - Area* AddArea(XTab* left, YTab* top, XTab* right, YTab* bottom, - BView* content); - Area* AddArea(Row* row, Column* column, BView* content); + Area* AddArea(XTab* left, YTab* top, XTab* right, + YTab* bottom, BView* content, BSize minContentSize); + Area* AddArea(Row* row, Column* column, + BView* content, BSize minContentSize); + Area* AddArea(XTab* left, YTab* top, XTab* right, + YTab* bottom, BView* content); + Area* AddArea(Row* row, Column* column, + BView* content); Area* AreaOf(BView* control); - BList* Areas() const; XTab* Left() const; XTab* Right() const; @@ -59,23 +61,16 @@ public: LayoutStyleType LayoutStyle() const; void SetLayoutStyle(LayoutStyleType style); - BLayoutItem* AddView(BView* child); - BLayoutItem* AddView(int32 index, BView* child); - bool AddItem(BLayoutItem* item); - bool AddItem(int32 index, BLayoutItem* item); - bool RemoveView(BView* child); - bool RemoveItem(BLayoutItem* item); - BLayoutItem* RemoveItem(int32 index); - BSize BaseMinSize(); BSize BaseMaxSize(); BSize BasePreferredSize(); BAlignment BaseAlignment(); - bool HasHeightForWidth(); - void GetHeightForWidth(float width, float* min, - float* max, float* preferred); - void InvalidateLayout(bool children = false); - virtual void DerivedLayoutItems(); + + virtual void InvalidateLayout(bool children = false); + + virtual bool ItemAdded(BLayoutItem* item, int32 atIndex); + virtual void ItemRemoved(BLayoutItem* item, int32 fromIndex); + virtual void DerivedLayoutItems(); char* PerformancePath() const; void SetPerformancePath(char* path); @@ -83,6 +78,8 @@ public: LinearSpec* Solver(); private: + Area* _AreaForItem(BLayoutItem* item) const; + BSize CalculateMinSize(); BSize CalculateMaxSize(); BSize CalculatePreferredSize(); @@ -93,7 +90,6 @@ private: LinearSpec fSolver; - BList* fAreas; XTab* fLeft; XTab* fRight; YTab* fTop; diff --git a/src/libs/alm/Area.cpp b/src/libs/alm/Area.cpp index ebf55114a5..d1d42480cc 100644 --- a/src/libs/alm/Area.cpp +++ b/src/libs/alm/Area.cpp @@ -30,6 +30,13 @@ BSize Area::kMinSize(0, 0); BSize Area::kUndefinedSize(-1, -1); +BView* +Area::View() +{ + return fLayoutItem->View(); +} + + /** * Gets the auto preferred content size. * @@ -234,28 +241,6 @@ Area::SetColumn(Column* column) } -/** - * Gets the control that is the content of the area. - */ -BView* -Area::Content() const -{ - return (fChildArea == NULL) ? fContent : fChildArea->Content(); -} - - -/** - * Sets the control that is the content of the area. - */ -void -Area::SetContent(BView* content) -{ - if (fChildArea == NULL) fContent = content; - else fChildArea->fContent = content; - fALMLayout->InvalidateLayout(); -} - - /** * Left tab of the area's content. May be different from the left tab of the area. */ @@ -487,25 +472,16 @@ Area::SetContentAspectRatio(double ratio) } -/** - * Gets alignment of the content in its area. - */ -BAlignment -Area::Alignment() const -{ - return fAlignment; -} - - /** * Sets alignment of the content in its area. */ void -Area::SetAlignment(BAlignment alignment) +Area::SetExplicitAlignment(BAlignment alignment) { fAlignment = alignment; UpdateHorizontal(); UpdateVertical(); + fALMLayout->InvalidateLayout(); } @@ -625,24 +601,24 @@ Area::SetBottomInset(int32 bottom) void Area::SetDefaultBehavior() { - if (Content() == NULL) { + if (View() == NULL) { SetPreferredContentSize(BSize(0, 0)); SetShrinkPenalties(BSize(0, 0)); SetGrowPenalties(BSize(0, 0)); return; } - if (PreferredContentSize() != Content()->PreferredSize()){ - SetPreferredContentSize(Content()->PreferredSize()); + if (PreferredContentSize() != View()->PreferredSize()){ + SetPreferredContentSize(View()->PreferredSize()); fALMLayout->InvalidateLayout(); } - if (dynamic_cast(Content()) != NULL - || dynamic_cast(Content()) != NULL - || dynamic_cast(Content()) != NULL - || dynamic_cast(Content()) != NULL - || dynamic_cast(Content()) != NULL - || dynamic_cast(Content()) != NULL) { + if (dynamic_cast(View()) != NULL + || dynamic_cast(View()) != NULL + || dynamic_cast(View()) != NULL + || dynamic_cast(View()) != NULL + || dynamic_cast(View()) != NULL + || dynamic_cast(View()) != NULL) { fShrinkPenalties = BSize(4, 4); fGrowPenalties = BSize(3, 3); } else { @@ -727,10 +703,10 @@ Area::HasSameSizeAs(Area* area) */ Area::~Area() { - if (fChildArea != NULL) delete fChildArea; + if (fChildArea != NULL) + delete fChildArea; for (int32 i = 0; i < fConstraints->CountItems(); i++) delete (Constraint*)fConstraints->ItemAt(i); - fALMLayout->Areas()->RemoveItem(this); } @@ -738,25 +714,12 @@ Area::~Area() * Constructor. * Uses XTabs and YTabs. */ -Area::Area(BALMLayout* layout, LinearSpec* ls, XTab* left, YTab* top, - XTab* right, YTab* bottom, BView* content, BSize minContentSize) -{ - Init(layout, ls, left, top, right, bottom, content, minContentSize); -} - - -/** - * Constructor. - * Uses Rows and Columns. - */ -Area::Area(BALMLayout* layout, LinearSpec* ls, Row* row, Column* column, - BView* content, BSize minContentSize) +Area::Area(BALMLayout* layout, BLayoutItem* item) + : + fALMLayout(layout), + fLayoutItem(item) { - Init(layout, ls, column->Left(), row->Top(), column->Right(), row->Bottom(), - content, minContentSize); - fRow = row; - fColumn = column; } @@ -764,11 +727,9 @@ Area::Area(BALMLayout* layout, LinearSpec* ls, Row* row, Column* column, * Initialize variables. */ void -Area::Init(BALMLayout* layout, LinearSpec* ls, XTab* left, YTab* top, +Area::Init(LinearSpec* ls, XTab* left, YTab* top, XTab* right, YTab* bottom, BView* content, BSize minContentSize) { - fALMLayout = layout; - fConstraints = new BList(2); fMaxContentSize = kMaxSize; @@ -804,7 +765,6 @@ Area::Init(BALMLayout* layout, LinearSpec* ls, XTab* left, YTab* top, fRight = right; fTop = top; fBottom = bottom; - SetContent(content); fMinContentSize = minContentSize; // adds the two essential constraints of the area that make sure that the left x-tab is @@ -819,23 +779,34 @@ Area::Init(BALMLayout* layout, LinearSpec* ls, XTab* left, YTab* top, } +void +Area::Init(LinearSpec* ls, Row* row, Column* column, + BView* content, BSize minContentSize) +{ + Init(ls, column->Left(), row->Top(), column->Right(), row->Bottom(), + content, minContentSize); + fRow = row; + fColumn = column; +} + + /** * Perform layout on the area. */ void Area::DoLayout() { - if (Content() == NULL) + if (View() == NULL) return; // empty areas need no layout // 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->Content()->MoveTo(floor(area->Left()->Value() + 0.5), + 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->Content()->ResizeTo(width, height); + area->View()->ResizeTo(width, height); } @@ -850,8 +821,10 @@ Area::InitChildArea() // 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, fLS, new XTab(fLS), new YTab(fLS), - new XTab(fLS), new YTab(fLS), fContent, BSize(0, 0)); + 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()); diff --git a/src/libs/alm/BALMLayout.cpp b/src/libs/alm/BALMLayout.cpp index 6306c2fdb0..a07e6c5053 100644 --- a/src/libs/alm/BALMLayout.cpp +++ b/src/libs/alm/BALMLayout.cpp @@ -5,6 +5,10 @@ */ #include "BALMLayout.h" + +#include // for floor +#include + #include "Area.h" #include "Column.h" #include "ResultType.h" @@ -12,8 +16,6 @@ #include "XTab.h" #include "YTab.h" -#include // for floor - /** * Constructor. @@ -26,7 +28,6 @@ BALMLayout::BALMLayout() fLayoutStyle = FIT_TO_SIZE; fActivated = true; - fAreas = new BList(1); fLeft = new XTab(&fSolver); fRight = new XTab(&fSolver); fTop = new YTab(&fSolver); @@ -46,6 +47,12 @@ BALMLayout::BALMLayout() } +BALMLayout::~BALMLayout() +{ + +} + + /** * Solves the layout. */ @@ -54,11 +61,9 @@ BALMLayout::SolveLayout() { // if autoPreferredContentSize is set on an area, // readjust its preferredContentSize and penalties settings - int32 sizeAreas = fAreas->CountItems(); - Area* currentArea; - for (int32 i = 0; i < sizeAreas; i++) { - currentArea = (Area*)fAreas->ItemAt(i); - if (currentArea->AutoPreferredContentSize()) + for (int32 i = 0; i < CountItems(); i++) { + Area* currentArea = _AreaForItem(ItemAt(i)); + if (currentArea && currentArea->AutoPreferredContentSize()) currentArea->SetDefaultBehavior(); } @@ -167,8 +172,10 @@ Column* BALMLayout::AddColumn(XTab* left, XTab* right) { Column* column = new Column(&fSolver); - if (left != NULL) column->Constraints()->AddItem(column->Left()->IsEqual(left)); - if (right != NULL) column->Constraints()->AddItem(column->Right()->IsEqual(right)); + if (left != NULL) + column->Constraints()->AddItem(column->Left()->IsEqual(left)); + if (right != NULL) + column->Constraints()->AddItem(column->Right()->IsEqual(right)); return column; } @@ -188,12 +195,13 @@ Area* BALMLayout::AddArea(XTab* left, YTab* top, XTab* right, YTab* bottom, BView* content, BSize minContentSize) { - InvalidateLayout(); - if (content != NULL) - TargetView()->AddChild(content); - Area* area = new Area(this, &fSolver, left, top, right, bottom, content, + BLayoutItem* item = AddView(content); + Area* area = _AreaForItem(item); + if (!area) + return NULL; + + area->Init(&fSolver, left, top, right, bottom, content, minContentSize); - fAreas->AddItem(area); return area; } @@ -211,11 +219,12 @@ Area* BALMLayout::AddArea(Row* row, Column* column, BView* content, BSize minContentSize) { - InvalidateLayout(); - if (content != NULL) - TargetView()->AddChild(content); - Area* area = new Area(this, &fSolver, row, column, content, minContentSize); - fAreas->AddItem(area); + BLayoutItem* item = AddView(content); + Area* area = _AreaForItem(item); + if (!area) + return NULL; + + area->Init(&fSolver, row, column, content, minContentSize); return area; } @@ -234,14 +243,15 @@ Area* BALMLayout::AddArea(XTab* left, YTab* top, XTab* right, YTab* bottom, BView* content) { - InvalidateLayout(); - if (content != NULL) - TargetView()->AddChild(content); - Area* area = new Area(this, &fSolver, left, top, right, bottom, content, + BLayoutItem* item = AddView(content); + Area* area = _AreaForItem(item); + if (!area) + return NULL; + + area->Init(&fSolver, left, top, right, bottom, content, BSize(0, 0)); area->SetDefaultBehavior(); area->SetAutoPreferredContentSize(false); - fAreas->AddItem(area); return area; } @@ -257,13 +267,14 @@ BALMLayout::AddArea(XTab* left, YTab* top, XTab* right, YTab* bottom, Area* BALMLayout::AddArea(Row* row, Column* column, BView* content) { - InvalidateLayout(); - if (content != NULL) - TargetView()->AddChild(content); - Area* area = new Area(this, &fSolver, row, column, content, BSize(0, 0)); + BLayoutItem* item = AddView(content); + Area* area = _AreaForItem(item); + if (!area) + return NULL; + + area->Init(&fSolver, row, column, content, BSize(0, 0)); area->SetDefaultBehavior(); area->SetAutoPreferredContentSize(false); - fAreas->AddItem(area); return area; } @@ -277,25 +288,7 @@ BALMLayout::AddArea(Row* row, Column* column, BView* content) Area* BALMLayout::AreaOf(BView* control) { - Area* area; - for (int32 i = 0; i < fAreas->CountItems(); i++) { - area = (Area*)fAreas->ItemAt(i); - if (area->Content() == control) - return area; - } - return NULL; -} - - -/** - * Gets the ares. - * - * @return the areas - */ -BList* -BALMLayout::Areas() const -{ - return fAreas; + return _AreaForItem(ItemAt(IndexOfView(control))); } @@ -367,76 +360,6 @@ BALMLayout::SetLayoutStyle(LayoutStyleType style) } -/** - * Adds view to layout. - */ -BLayoutItem* -BALMLayout::AddView(BView* child) -{ - return NULL; -} - - -/** - * Adds view to layout. - */ -BLayoutItem* -BALMLayout::AddView(int32 index, BView* child) -{ -return NULL; -} - - -/** - * Adds item to layout. - */ -bool -BALMLayout::AddItem(BLayoutItem* item) -{ - return false; -} - - -/** - * Adds item to layout. - */ -bool -BALMLayout::AddItem(int32 index, BLayoutItem* item) -{ - return false; -} - - -/** - * Removes view from layout. - */ -bool -BALMLayout::RemoveView(BView* child) -{ - return false; -} - - -/** - * Removes item from layout. - */ -bool -BALMLayout::RemoveItem(BLayoutItem* item) -{ - return false; -} - - -/** - * Removes item from layout. - */ -BLayoutItem* -BALMLayout::RemoveItem(int32 index) -{ - return NULL; -} - - /** * Gets minimum size. */ @@ -485,23 +408,6 @@ BALMLayout::BaseAlignment() } -/** - * Gets whether the height of the layout depends on its width. - */ -bool -BALMLayout::HasHeightForWidth() -{ - return false; -} - - -/** - * Gets height constraints for a given width. - */ -void -BALMLayout::GetHeightForWidth(float width, float* min, float* max, float* preferred) {} - - /** * Invalidates the layout. * Resets minimum/maximum/preferred size. @@ -516,6 +422,24 @@ BALMLayout::InvalidateLayout(bool children) } +bool +BALMLayout::ItemAdded(BLayoutItem* item, int32 atIndex) +{ + item->SetLayoutData(new(std::nothrow) Area(this, item)); + return item->LayoutData() != NULL; +} + + +void +BALMLayout::ItemRemoved(BLayoutItem* item, int32 fromIndex) +{ + if (Area* area = _AreaForItem(item)) { + item->SetLayoutData(NULL); + delete area; + } +} + + /** * Calculate and set the layout. * If no layout specification is given, a specification is reverse engineered automatically. @@ -533,6 +457,9 @@ BALMLayout::DerivedLayoutItems() if (Owner() == NULL) return; +//TODO +// _UpdateConstraints(); + // reverse engineer a layout specification if none was given //~ if (this == NULL) RecoverLayout(View()); @@ -568,8 +495,8 @@ BALMLayout::DerivedLayoutItems() } // set the calculated positions and sizes for every area - for (int32 i = 0; i < Areas()->CountItems(); i++) - ((Area*)Areas()->ItemAt(i))->DoLayout(); + for (int32 i = 0; i < CountItems(); i++) + _AreaForItem(ItemAt(i))->DoLayout(); fActivated = true; } @@ -685,3 +612,11 @@ BALMLayout::CalculatePreferredSize() Bottom()->Value() - Top()->Value()); } + +Area* +BALMLayout::_AreaForItem(BLayoutItem* item) const +{ + if (!item) + return NULL; + return static_cast(item->LayoutData()); +} diff --git a/src/libs/alm/Jamfile b/src/libs/alm/Jamfile index 5a084e0dc4..fc96b2707d 100644 --- a/src/libs/alm/Jamfile +++ b/src/libs/alm/Jamfile @@ -4,6 +4,8 @@ SetSubDirSupportedPlatformsBeOSCompatible ; UseLibraryHeaders lp_solve linprog alm ; UsePrivateHeaders shared ; +UsePrivateHeaders [ FDirName $(SUBDIR) $(DOTDOT) $(DOTDOT) kits interface ] ; + SharedLibrary libalm.so : Area.cpp