From 50cc24b3f93fecca228ab5040f5d92951b55964d Mon Sep 17 00:00:00 2001 From: Alex Wilson Date: Tue, 17 Jan 2012 10:38:20 +1300 Subject: [PATCH] Add a Builder for BALMLayout. --- headers/libs/alm/ALMLayoutBuilder.h | 119 ++++++++++ src/libs/alm/ALMLayoutBuilder.cpp | 356 ++++++++++++++++++++++++++++ src/libs/alm/Jamfile | 1 + 3 files changed, 476 insertions(+) create mode 100644 headers/libs/alm/ALMLayoutBuilder.h create mode 100644 src/libs/alm/ALMLayoutBuilder.cpp diff --git a/headers/libs/alm/ALMLayoutBuilder.h b/headers/libs/alm/ALMLayoutBuilder.h new file mode 100644 index 0000000000..3b3f92d96b --- /dev/null +++ b/headers/libs/alm/ALMLayoutBuilder.h @@ -0,0 +1,119 @@ +/* + * Copyright 2012, Haiku, Inc. All rights reserved. + * Distributed under the terms of the MIT License. + */ +#ifndef ALM_LAYOUT_BUILDER_H +#define ALM_LAYOUT_BUILDER_H + + +#include "ALMLayout.h" + + +class BWindow; + + +namespace BALM { + + +class BALMLayoutBuilder { +public: + BALMLayoutBuilder(BView* view, float hSpacing, + float vSpacing, + BALMLayout* friendLayout = NULL); + BALMLayoutBuilder(BView* view, + BALMLayout* layout); + BALMLayoutBuilder(BWindow* window, + float hSpacing, float vSpacing, + BALMLayout* friendLayout = NULL); + BALMLayoutBuilder(BWindow* window, + BALMLayout* layout); + BALMLayoutBuilder(BALMLayout* layout); + + BALMLayoutBuilder& Add(BView* view, XTab* left, YTab* top, + XTab* right = NULL, YTab* bottom = NULL); + BALMLayoutBuilder& Add(BView* view, Row* row, Column* column); + + BALMLayoutBuilder& Add(BLayoutItem* item, XTab* left, + YTab* top, XTab* right = NULL, + YTab* bottom = NULL); + BALMLayoutBuilder& Add(BLayoutItem* item, Row* row, + Column* column); + + BALMLayoutBuilder& SetInsets(float insets); + BALMLayoutBuilder& SetInsets(float horizontal, float vertical); + BALMLayoutBuilder& SetInsets(float left, float top, float right, + float bottom); + + BALMLayoutBuilder& SetSpacing(float horizontal, float vertical); + + struct Snake; + + // context setters + Snake StartingAt(BView* view); + Snake StartingAt(BLayoutItem* item); + + struct Snake { + BALMLayoutBuilder::Snake& AddToLeft(BView* view, + XTab* left = NULL, YTab* top = NULL, + YTab* bottom = NULL); + BALMLayoutBuilder::Snake& AddToRight(BView* view, + XTab* right = NULL, YTab* top = NULL, + YTab* bottom = NULL); + BALMLayoutBuilder::Snake& AddAbove(BView* view, + YTab* top = NULL, XTab* left = NULL, + XTab* right = NULL); + BALMLayoutBuilder::Snake& AddBelow(BView* view, YTab* bottom = NULL, + XTab* left = NULL, XTab* right = NULL); + + BALMLayoutBuilder::Snake& AddToLeft(BLayoutItem* item, + XTab* left = NULL, YTab* top = NULL, + YTab* bottom = NULL); + BALMLayoutBuilder::Snake& AddToRight(BLayoutItem* item, + XTab* right = NULL, YTab* top = NULL, + YTab* bottom = NULL); + BALMLayoutBuilder::Snake& AddAbove(BLayoutItem* item, + YTab* top = NULL, XTab* left = NULL, + XTab* right = NULL); + BALMLayoutBuilder::Snake& AddBelow(BLayoutItem* item, + YTab* bottom = NULL, XTab* left = NULL, + XTab* right = NULL); + + + // these methods throw away the stack + Snake StartingAt(BView* view); + Snake StartingAt(BLayoutItem* item); + + Snake Push(); + Snake& Pop(); + + BALMLayoutBuilder& End(); + + private: + friend class BALMLayoutBuilder; + + Snake(Area* area, BALMLayoutBuilder* root); + Snake(Area* area, Snake* previous); + + BALMLayout* _Layout(); + Area* _AddToLayout(BView* view, XTab* left, YTab* top, + XTab* right, YTab* bottom); + Area* _AddToLayout(BLayoutItem* item, XTab* left, + YTab* top, XTab* right, YTab* bottom); + + BALMLayoutBuilder* fRootBuilder; + Snake* fPreviousSnake; + Area* fCurrentArea; + }; + + +private: + friend struct Snake; + + BALMLayout* fLayout; +}; + + +}; + + +#endif diff --git a/src/libs/alm/ALMLayoutBuilder.cpp b/src/libs/alm/ALMLayoutBuilder.cpp new file mode 100644 index 0000000000..62dc5a9245 --- /dev/null +++ b/src/libs/alm/ALMLayoutBuilder.cpp @@ -0,0 +1,356 @@ +/* + * Copyright 2012, Haiku, Inc. All rights reserved. + * Distributed under the terms of the MIT License. + */ +#include "ALMLayoutBuilder.h" + + +#include + + +namespace BALM { + + +BALMLayoutBuilder::BALMLayoutBuilder(BView* view, float hSpacing, + float vSpacing, BALMLayout* friendLayout) +{ + fLayout = new BALMLayout(hSpacing, vSpacing, friendLayout); + view->SetLayout(fLayout); +} + + +BALMLayoutBuilder::BALMLayoutBuilder(BView* view, BALMLayout* layout) +{ + fLayout = layout; + view->SetLayout(layout); +} + + +BALMLayoutBuilder::BALMLayoutBuilder(BWindow* window, float hSpacing, + float vSpacing, BALMLayout* friendLayout) +{ + fLayout = new BALMLayout(hSpacing, vSpacing, friendLayout); + window->SetLayout(fLayout); + + fLayout->Owner()->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); + // TODO: we get a white background if we don't do this +} + + +BALMLayoutBuilder::BALMLayoutBuilder(BWindow* window, BALMLayout* layout) +{ + fLayout = layout; + window->SetLayout(fLayout); + + fLayout->Owner()->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); + // TODO: we get a white background if we don't do this +} + + +BALMLayoutBuilder::BALMLayoutBuilder(BALMLayout* layout) +{ + fLayout = layout; +} + + +BALMLayoutBuilder& +BALMLayoutBuilder::Add(BView* view, XTab* left, YTab* top, + XTab* right, YTab* bottom) +{ + fLayout->AddView(view, left, top, right, bottom); + return *this; +} + + +BALMLayoutBuilder& +BALMLayoutBuilder::Add(BView* view, Row* row, Column* column) +{ + fLayout->AddView(view, row, column); + return *this; +} + + +BALMLayoutBuilder& +BALMLayoutBuilder::Add(BLayoutItem* item, XTab* left, YTab* top, + XTab* right, YTab* bottom) +{ + fLayout->AddItem(item, left, top, right, bottom); + return *this; +} + + +BALMLayoutBuilder& +BALMLayoutBuilder::Add(BLayoutItem* item, Row* row, Column* column) +{ + fLayout->AddItem(item, row, column); + return *this; +} + + + +BALMLayoutBuilder& +BALMLayoutBuilder::SetInsets(float insets) +{ + fLayout->SetInsets(insets); + return *this; +} + + +BALMLayoutBuilder& +BALMLayoutBuilder::SetInsets(float horizontal, float vertical) +{ + fLayout->SetInsets(horizontal, vertical); + return *this; +} + + +BALMLayoutBuilder& +BALMLayoutBuilder::SetInsets(float left, float top, float right, + float bottom) +{ + fLayout->SetInsets(left, top, right, bottom); + return *this; +} + + +BALMLayoutBuilder& +BALMLayoutBuilder::SetSpacing(float horizontal, float vertical) +{ + fLayout->SetSpacing(horizontal, vertical); + return *this; +} + + +BALMLayoutBuilder::Snake +BALMLayoutBuilder::StartingAt(BView* view) +{ + return Snake(fLayout->AreaFor(view), this); +} + + +BALMLayoutBuilder::Snake +BALMLayoutBuilder::StartingAt(BLayoutItem* item) +{ + return Snake(fLayout->AreaFor(item), this); +} + + +BALMLayoutBuilder::Snake::Snake(Area* area, BALMLayoutBuilder* root) +{ + fCurrentArea = area; + fRootBuilder = root; + fPreviousSnake = NULL; +} + + +BALMLayoutBuilder::Snake::Snake(Area* area, Snake* previous) +{ + fCurrentArea = area; + fRootBuilder = previous->fRootBuilder; + fPreviousSnake = previous; +} + + +BALMLayoutBuilder::Snake& +BALMLayoutBuilder::Snake::AddToLeft(BView* view, XTab* _left, YTab* top, + YTab* bottom) +{ + BReference left = _left; + if (_left == NULL) + left = _Layout()->AddXTab(); + XTab* right = fCurrentArea->Left(); + if (!top) + top = fCurrentArea->Top(); + if (!bottom) + bottom = fCurrentArea->Bottom(); + + fCurrentArea = _AddToLayout(view, left, top, right, bottom); + return *this; +} + + +BALMLayoutBuilder::Snake& +BALMLayoutBuilder::Snake::AddToRight(BView* view, XTab* _right, YTab* top, + YTab* bottom) +{ + XTab* left = fCurrentArea->Right(); + BReference right = _right; + if (_right == NULL) + right = _Layout()->AddXTab(); + if (!top) + top = fCurrentArea->Top(); + if (!bottom) + bottom = fCurrentArea->Bottom(); + + fCurrentArea = _AddToLayout(view, left, top, right, bottom); + return *this; +} + + +BALMLayoutBuilder::Snake& +BALMLayoutBuilder::Snake::AddAbove(BView* view, YTab* _top, XTab* left, + XTab* right) +{ + if (!left) + left = fCurrentArea->Left(); + if (!right) + right = fCurrentArea->Right(); + BReference top = _top; + if (_top == NULL) + top = _Layout()->AddYTab(); + YTab* bottom = fCurrentArea->Top(); + + fCurrentArea = _AddToLayout(view, left, top, right, bottom); + return *this; +} + + +BALMLayoutBuilder::Snake& +BALMLayoutBuilder::Snake::AddBelow(BView* view, YTab* _bottom, XTab* left, + XTab* right) +{ + if (!left) + left = fCurrentArea->Left(); + if (!right) + right = fCurrentArea->Right(); + YTab* top = fCurrentArea->Bottom(); + BReference bottom = _bottom; + if (_bottom == NULL) + bottom = _Layout()->AddYTab(); + + fCurrentArea = _AddToLayout(view, left, top, right, bottom); + return *this; +} + + +BALMLayoutBuilder::Snake& +BALMLayoutBuilder::Snake::AddToLeft(BLayoutItem* item, XTab* _left, YTab* top, + YTab* bottom) +{ + BReference left = _left; + if (_left == NULL) + left = _Layout()->AddXTab(); + XTab* right = fCurrentArea->Left(); + if (!top) + top = fCurrentArea->Top(); + if (!bottom) + bottom = fCurrentArea->Bottom(); + + fCurrentArea = _AddToLayout(item, left, top, right, bottom); + return *this; +} + + +BALMLayoutBuilder::Snake& +BALMLayoutBuilder::Snake::AddToRight(BLayoutItem* item, XTab* _right, YTab* top, + YTab* bottom) +{ + XTab* left = fCurrentArea->Right(); + BReference right = _right; + if (_right == NULL) + right = _Layout()->AddXTab(); + if (!top) + top = fCurrentArea->Top(); + if (!bottom) + bottom = fCurrentArea->Bottom(); + + fCurrentArea = _AddToLayout(item, left, top, right, bottom); + return *this; +} + + +BALMLayoutBuilder::Snake& +BALMLayoutBuilder::Snake::AddAbove(BLayoutItem* item, YTab* _top, XTab* left, + XTab* right) +{ + if (!left) + left = fCurrentArea->Left(); + if (!right) + right = fCurrentArea->Right(); + BReference top = _top; + if (_top == NULL) + top = _Layout()->AddYTab(); + YTab* bottom = fCurrentArea->Top(); + + fCurrentArea = _AddToLayout(item, left, top, right, bottom); + return *this; +} + + +BALMLayoutBuilder::Snake& +BALMLayoutBuilder::Snake::AddBelow(BLayoutItem* item, YTab* _bottom, XTab* left, + XTab* right) +{ + if (!left) + left = fCurrentArea->Left(); + if (!right) + right = fCurrentArea->Right(); + YTab* top = fCurrentArea->Bottom(); + BReference bottom = _bottom; + if (_bottom == NULL) + bottom = _Layout()->AddYTab(); + + fCurrentArea = _AddToLayout(item, left, top, right, bottom); + return *this; +} + + +BALMLayoutBuilder::Snake +BALMLayoutBuilder::Snake::StartingAt(BView* view) +{ + return fRootBuilder->StartingAt(view); +} + + +BALMLayoutBuilder::Snake +BALMLayoutBuilder::Snake::StartingAt(BLayoutItem* item) +{ + return fRootBuilder->StartingAt(item); +} + + +BALMLayoutBuilder::Snake +BALMLayoutBuilder::Snake::Push() +{ + return Snake(fCurrentArea, this); +} + + +BALMLayoutBuilder::Snake& +BALMLayoutBuilder::Snake::Pop() +{ + return *fPreviousSnake; +} + + +BALMLayoutBuilder& +BALMLayoutBuilder::Snake::End() +{ + return *fRootBuilder; +} + + +BALMLayout* +BALMLayoutBuilder::Snake::_Layout() +{ + return fRootBuilder->fLayout; +} + + +Area* +BALMLayoutBuilder::Snake::_AddToLayout(BView* view, XTab* left, YTab* top, + XTab* right, YTab* bottom) +{ + return _Layout()->AddView(view, left, top, right, bottom); +} + + +Area* +BALMLayoutBuilder::Snake::_AddToLayout(BLayoutItem* item, XTab* left, + YTab* top, XTab* right, YTab* bottom) +{ + return _Layout()->AddItem(item, left, top, right, bottom); +} + + +}; diff --git a/src/libs/alm/Jamfile b/src/libs/alm/Jamfile index 7726b1818a..32179c2651 100644 --- a/src/libs/alm/Jamfile +++ b/src/libs/alm/Jamfile @@ -8,6 +8,7 @@ UseHeaders [ FDirName $(SUBDIR) $(DOTDOT) $(DOTDOT) kits interface ] ; SharedLibrary libalm.so : ALMLayout.cpp + ALMLayoutBuilder.cpp Area.cpp Column.cpp Row.cpp