[haiku-commits] r38207 - in haiku/trunk: headers/libs/alm headers/os/interface headers/private/interface src/apps/aboutsystem src/kits/interface ...

  • From: yourpalal2@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Tue, 17 Aug 2010 20:43:41 +0200 (CEST)

Author: yourpalal
Date: 2010-08-17 20:43:41 +0200 (Tue, 17 Aug 2010)
New Revision: 38207
Changeset: http://dev.haiku-os.org/changeset/38207
Ticket: http://dev.haiku-os.org/ticket/6407

Added:
   haiku/trunk/headers/os/interface/AbstractLayout.h
   haiku/trunk/src/kits/interface/AbstractLayout.cpp
Modified:
   haiku/trunk/headers/libs/alm/BALMLayout.h
   haiku/trunk/headers/os/interface/CardLayout.h
   haiku/trunk/headers/os/interface/GridLayoutBuilder.h
   haiku/trunk/headers/os/interface/GroupLayoutBuilder.h
   haiku/trunk/headers/os/interface/Layout.h
   haiku/trunk/headers/os/interface/LayoutBuilder.h
   haiku/trunk/headers/os/interface/LayoutItem.h
   haiku/trunk/headers/os/interface/TwoDimensionalLayout.h
   haiku/trunk/headers/os/interface/View.h
   haiku/trunk/headers/os/interface/Window.h
   haiku/trunk/headers/private/interface/ViewPrivate.h
   haiku/trunk/src/apps/aboutsystem/AboutSystem.cpp
   haiku/trunk/src/kits/interface/CardLayout.cpp
   haiku/trunk/src/kits/interface/GridLayoutBuilder.cpp
   haiku/trunk/src/kits/interface/GroupLayoutBuilder.cpp
   haiku/trunk/src/kits/interface/Jamfile
   haiku/trunk/src/kits/interface/Layout.cpp
   haiku/trunk/src/kits/interface/LayoutItem.cpp
   haiku/trunk/src/kits/interface/SplitLayout.cpp
   haiku/trunk/src/kits/interface/SplitLayout.h
   haiku/trunk/src/kits/interface/TwoDimensionalLayout.cpp
   haiku/trunk/src/kits/interface/View.cpp
   haiku/trunk/src/kits/interface/ViewLayoutItem.cpp
   haiku/trunk/src/kits/interface/ViewLayoutItem.h
   haiku/trunk/src/kits/interface/Window.cpp
   haiku/trunk/src/libs/alm/BALMLayout.cpp
Log:
Big change deriving BLayout from BLayoutItem, and allowing viewless BLayouts.
a few highlights:
* BLayout now derives publicly from BLayoutItem
* Added BAbstractLayout class, which our layouts now derive from
* updated layout builders to avoid creating views when they don't need to
* updated layout classes
* updated AboutSystem to fix a little regression
* more details on #6407
* please tell me about any regressions, I've tried to find them all, but some
  may have slipped by.


Modified: haiku/trunk/headers/libs/alm/BALMLayout.h
===================================================================
--- haiku/trunk/headers/libs/alm/BALMLayout.h   2010-08-17 18:22:17 UTC (rev 
38206)
+++ haiku/trunk/headers/libs/alm/BALMLayout.h   2010-08-17 18:43:41 UTC (rev 
38207)
@@ -7,8 +7,8 @@
 #ifndef        BALM_LAYOUT_H
 #define        BALM_LAYOUT_H
 
+#include <AbstractLayout.h>
 #include <File.h>
-#include <Layout.h>
 #include <List.h>
 #include <Size.h>
 #include <SupportDefs.h>
@@ -29,7 +29,7 @@
 /**
  * A GUI layout engine using the ALM.
  */
-class BALMLayout : public BLayout, public LinearSpec {
+class BALMLayout : public BAbstractLayout, public LinearSpec {
                
 public:
                                                BALMLayout();
@@ -70,15 +70,15 @@
        bool                            RemoveItem(BLayoutItem* item);
        BLayoutItem*            RemoveItem(int32 index);
 
-       BSize                           MinSize();
-       BSize                           MaxSize();
-       BSize                           PreferredSize();
-       BAlignment                      Alignment();
+       BSize                           BaseMinSize();
+       BSize                           BaseMaxSize();
+       BSize                           BasePreferredSize();
+       BAlignment                      BaseAlignment();
        bool                            HasHeightForWidth();
        void                            GetHeightForWidth(float width, float* 
min,
                                                                float* max, 
float* preferred);
-       void                            InvalidateLayout();
-       void                            LayoutView();
+       void                            InvalidateLayout(bool children = false);
+       virtual void            DerivedLayoutItems();
        
        char*                           PerformancePath() const;
        void                            SetPerformancePath(char* path);

Added: haiku/trunk/headers/os/interface/AbstractLayout.h
===================================================================
--- haiku/trunk/headers/os/interface/AbstractLayout.h                           
(rev 0)
+++ haiku/trunk/headers/os/interface/AbstractLayout.h   2010-08-17 18:43:41 UTC 
(rev 38207)
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010, Haiku, Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef        _ABSTRACT_LAYOUT_H
+#define        _ABSTRACT_LAYOUT_H
+
+#include <Alignment.h>
+#include <Layout.h>
+#include <Size.h>
+
+class BAbstractLayout : public BLayout {
+public:
+                                                               
BAbstractLayout();
+                                                               
BAbstractLayout(BMessage* from);
+       virtual                                         ~BAbstractLayout();
+
+       virtual BSize                           MinSize();
+       virtual BSize                           MaxSize();
+       virtual BSize                           PreferredSize();
+       virtual BAlignment                      Alignment();
+
+       virtual void                            SetExplicitMinSize(BSize size);
+       virtual void                            SetExplicitMaxSize(BSize size);
+       virtual void                            SetExplicitPreferredSize(BSize 
size);
+       virtual void                            SetExplicitAlignment(BAlignment 
alignment);
+
+       virtual BSize                           BaseMinSize();
+       virtual BSize                           BaseMaxSize();
+       virtual BSize                           BasePreferredSize();
+       virtual BAlignment                      BaseAlignment();
+
+       virtual BRect                           Frame();
+       virtual void                            SetFrame(BRect frame);  
+
+       virtual bool                            IsVisible();
+       virtual void                            SetVisible(bool visible);
+
+       virtual status_t                        Archive(BMessage* into, bool 
deep = true) const;
+       virtual status_t                        AllUnarchived(const BMessage* 
from);
+
+protected:
+       virtual void                            OwnerChanged(BView* was);
+       virtual void                            AncestorVisibilityChanged(bool 
shown);
+
+private:
+                       struct  Proxy;
+                       struct  ViewProxy;
+                       struct  DataProxy;
+
+                       Proxy*                          fExplicitData;
+};
+
+#endif //      _ABSTRACT_LAYOUT_ITEM_H

Modified: haiku/trunk/headers/os/interface/CardLayout.h
===================================================================
--- haiku/trunk/headers/os/interface/CardLayout.h       2010-08-17 18:22:17 UTC 
(rev 38206)
+++ haiku/trunk/headers/os/interface/CardLayout.h       2010-08-17 18:43:41 UTC 
(rev 38207)
@@ -5,10 +5,10 @@
 #ifndef        _CARD_LAYOUT_H
 #define        _CARD_LAYOUT_H
 
-#include <Layout.h>
+#include <AbstractLayout.h>
 
 
-class BCardLayout : public BLayout {
+class BCardLayout : public BAbstractLayout {
 public:
                                                                BCardLayout();
                                                                
BCardLayout(BMessage* from);
@@ -19,23 +19,23 @@
                        void                            SetVisibleItem(int32 
index);
                        void                            
SetVisibleItem(BLayoutItem* item);
 
-       virtual BSize                           MinSize();
-       virtual BSize                           MaxSize();
-       virtual BSize                           PreferredSize();
-       virtual BAlignment                      Alignment();
+       virtual BSize                           BaseMinSize();
+       virtual BSize                           BaseMaxSize();
+       virtual BSize                           BasePreferredSize();
+       virtual BAlignment                      BaseAlignment();
 
        virtual bool                            HasHeightForWidth();
        virtual void                            GetHeightForWidth(float width, 
float* min,
                                                                        float* 
max, float* preferred);
 
-       virtual void                            InvalidateLayout();
-       virtual void                            LayoutView();
+       virtual void                            InvalidateLayout(bool children 
= false);
 
        virtual status_t                        Archive(BMessage* into, bool 
deep = true) const;
        virtual status_t                        AllUnarchived(const BMessage* 
from);
        static  BArchivable*            Instantiate(BMessage* from);
 
 protected:
+       virtual void                            DerivedLayoutItems();
        virtual bool                            ItemAdded(BLayoutItem* item, 
int32 atIndex);
        virtual void                            ItemRemoved(BLayoutItem* item, 
int32 fromIndex);
 

Modified: haiku/trunk/headers/os/interface/GridLayoutBuilder.h
===================================================================
--- haiku/trunk/headers/os/interface/GridLayoutBuilder.h        2010-08-17 
18:22:17 UTC (rev 38206)
+++ haiku/trunk/headers/os/interface/GridLayoutBuilder.h        2010-08-17 
18:43:41 UTC (rev 38207)
@@ -16,9 +16,9 @@
                                                                
BGridLayoutBuilder(BGridView* view);
 
                        BGridLayout*            GridLayout() const;
-                       BView*                          View() const;
                        BGridLayoutBuilder& GetGridLayout(BGridLayout** 
_layout);
-                       BGridLayoutBuilder& GetView(BView** _view);
+                       BView*                          View() const;
+                       BGridLayoutBuilder&     GetView(BView** _view);
 
                        BGridLayoutBuilder& Add(BView* view, int32 column, 
int32 row,
                                                                        int32 
columnCount = 1, int32 rowCount = 1);
@@ -32,7 +32,6 @@
                                                                        float 
bottom);
 
                                                                operator 
BGridLayout*();
-                                                               operator 
BView*();
 
 private:
                        BGridLayout*            fLayout;

Modified: haiku/trunk/headers/os/interface/GroupLayoutBuilder.h
===================================================================
--- haiku/trunk/headers/os/interface/GroupLayoutBuilder.h       2010-08-17 
18:22:17 UTC (rev 38206)
+++ haiku/trunk/headers/os/interface/GroupLayoutBuilder.h       2010-08-17 
18:43:41 UTC (rev 38207)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2006, Haiku, Inc. All rights reserved.
+ * Copyright 2006-2010, Haiku, Inc. All rights reserved.
  * Distributed under the terms of the MIT License.
  */
 #ifndef        _GROUP_LAYOUT_BUILDER_H
@@ -39,7 +39,6 @@
                                                                        float 
bottom);
 
                                                                operator 
BGroupLayout*();
-                                                               operator 
BView*();
 
 private:
                        bool                            
_PushLayout(BGroupLayout* layout);

Modified: haiku/trunk/headers/os/interface/Layout.h
===================================================================
--- haiku/trunk/headers/os/interface/Layout.h   2010-08-17 18:22:17 UTC (rev 
38206)
+++ haiku/trunk/headers/os/interface/Layout.h   2010-08-17 18:43:41 UTC (rev 
38207)
@@ -8,22 +8,27 @@
 
 #include <Alignment.h>
 #include <Archivable.h>
+#include <LayoutItem.h>
 #include <List.h>
 #include <Size.h>
 
 
+class BLayoutContext;
 class BLayoutItem;
 class BView;
 
 
-class BLayout : public BArchivable {
+class BLayout : public BLayoutItem {
 public:
                                                                BLayout();
                                                                
BLayout(BMessage* archive);
        virtual                                         ~BLayout();
 
-                       BView*                          View() const;
+                       BView*                          Owner() const;
+                       BView*                          TargetView() const;
+       virtual BView*                          View(); // from BLayoutItem
 
+       // methods dealing with items
        virtual BLayoutItem*            AddView(BView* child);
        virtual BLayoutItem*            AddView(int32 index, BView* child);
 
@@ -39,19 +44,23 @@
                        int32                           IndexOfItem(const 
BLayoutItem* item) const;
                        int32                           IndexOfView(BView* 
child) const;
 
-       virtual BSize                           MinSize() = 0;
-       virtual BSize                           MaxSize() = 0;
-       virtual BSize                           PreferredSize() = 0;
-       virtual BAlignment                      Alignment() = 0;
+                       bool                            AncestorsVisible();
 
-       virtual bool                            HasHeightForWidth() = 0;
-       virtual void                            GetHeightForWidth(float width, 
float* min,
-                                                                       float* 
max, float* preferred) = 0;
+       // Layouting related methods
 
-       virtual void                            InvalidateLayout();
+       virtual void                            InvalidateLayout(bool children 
= false);
+       virtual void                            Relayout(bool immediate = 
false);
+                       void                            RequireLayout();
+                       bool                            IsValid();
+                       void                            
EnableLayoutInvalidation();
+                       void                            
DisableLayoutInvalidation();
 
-       virtual void                            LayoutView() = 0;
+                       void                            LayoutItems(bool force 
= false);
+                       BRect                           LayoutArea();
+                       BLayoutContext*         LayoutContext();
 
+       // Archiving methods
+
        virtual status_t                        Archive(BMessage* into, bool 
deep = true) const;
        virtual status_t                        AllUnarchived(const BMessage* 
from);
 
@@ -59,17 +68,44 @@
                                                                        int32 
index) const;
        virtual status_t                        ItemUnarchived(const BMessage* 
from,
                                                                        
BLayoutItem* item, int32 index);
+
 protected:
+       // BLayout hook methods
        virtual bool                            ItemAdded(BLayoutItem* item, 
int32 atIndex);
        virtual void                            ItemRemoved(BLayoutItem* item, 
int32 fromIndex);
+       virtual void                            DerivedLayoutItems() = 0;
+       virtual void                            OwnerChanged(BView* was);
 
+       // BLayoutItem hook methods
+       virtual void                            AttachedToLayout();
+       virtual void                            DetachedFromLayout(BLayout* 
layout);
+       virtual void                            AncestorVisibilityChanged(bool 
shown);
+
+       // To be called by sub-classes in SetVisible().
+                       void                            VisibilityChanged(bool 
show);
+       // To be called when layout data is known to be good
+                       void                            
ResetLayoutInvalidation();
+
 private:
                        friend class BView;
 
-                       void                            SetView(BView* view);
+                       bool                            
RemoveViewRecursive(BView* view);
+                       bool                            
InvalidateLayoutsForView(BView* view);
+                       bool                            InvalidationLegal();
+                       void                            SetOwner(BView* owner);
+                       void                            SetTarget(BView* 
target);
 
-                       BView*                          fView;
+                       void                            
_LayoutWithinContext(bool force,
+                                                                       
BLayoutContext* context);
+
+                       uint32                          fState;
+                       bool                            fAncestorsVisible;
+                       int32                           fInvalidationDisabled;
+                       BLayoutContext*         fContext;
+                       BView*                          fOwner;
+                       BView*                          fTarget;
                        BList                           fItems;
+                       BList                           fNestedLayouts;
 };
 
 

Modified: haiku/trunk/headers/os/interface/LayoutBuilder.h
===================================================================
--- haiku/trunk/headers/os/interface/LayoutBuilder.h    2010-08-17 18:22:17 UTC 
(rev 38206)
+++ haiku/trunk/headers/os/interface/LayoutBuilder.h    2010-08-17 18:43:41 UTC 
(rev 38207)
@@ -33,7 +33,6 @@
 public:
        inline  void                            SetParent(ParentBuilder* 
parent);
                // conceptually private
-
        inline  ParentBuilder&          End();
 
 protected:
@@ -71,11 +70,23 @@
 
        inline  GroupBuilder            AddGroup(enum orientation orientation,
                                                                        float 
spacing = 0.0f, float weight = 1.0f);
+       inline  GroupBuilder            AddGroup(BGroupView* groupView,
+                                                                       float 
weight = 1.0f);
+       inline  GroupBuilder            AddGroup(BGroupLayout* groupLayout,
+                                                                       float 
weight = 1.0f);
+
        inline  GridBuilder                     AddGrid(float horizontalSpacing 
= 0.0f,
                                                                        float 
verticalSpacing = 0.0f,
                                                                        float 
weight = 1.0f);
+       inline  GridBuilder                     AddGrid(BGridLayout* gridLayout,
+                                                                       float 
weight = 1.0f);
+       inline  GridBuilder                     AddGrid(BGridView* gridView,
+                                                                       float 
weight = 1.0f);
+
        inline  SplitBuilder            AddSplit(enum orientation orientation,
                                                                        float 
spacing = 0.0f, float weight = 1.0f);
+       inline  SplitBuilder            AddSplit(BSplitView* splitView,
+                                                                       float 
weight = 1.0f);
 
        inline  ThisBuilder&            AddGlue(float weight = 1.0f);
        inline  ThisBuilder&            AddStrut(float size);
@@ -84,7 +95,6 @@
                                                                        float 
bottom);
 
        inline                                          operator 
BGroupLayout*();
-       inline                                          operator BView*();
 
 private:
                        BGroupLayout*           fLayout;
@@ -131,13 +141,30 @@
        inline  GroupBuilder            AddGroup(enum orientation orientation,
                                                                        float 
spacing, int32 column, int32 row,
                                                                        int32 
columnCount = 1, int32 rowCount = 1);
+       inline  GroupBuilder            AddGroup(BGroupView* groupView, int32 
column,
+                                                                       int32 
row, int32 columnCount = 1,
+                                                                       int32 
rowCount = 1);
+       inline  GroupBuilder            AddGroup(BGroupLayout* groupLayout, 
+                                                                       int32 
column, int32 row,
+                                                                       int32 
columnCount = 1, int32 rowCount = 1);
+
        inline  GridBuilder                     AddGrid(float horizontalSpacing,
                                                                        float 
verticalSpacing, int32 column,
                                                                        int32 
row, int32 columnCount = 1,
                                                                        int32 
rowCount = 1);
+       inline  GridBuilder                     AddGrid(BGridLayout* gridLayout,
+                                                                       int32 
column, int32 row,
+                                                                       int32 
columnCount = 1, int32 rowCount = 1);
+       inline  GridBuilder                     AddGrid(BGridView* gridView,
+                                                                       int32 
column, int32 row,
+                                                                       int32 
columnCount = 1, int32 rowCount = 1);
+
        inline  SplitBuilder            AddSplit(enum orientation orientation,
                                                                        float 
spacing, int32 column, int32 row,
                                                                        int32 
columnCount = 1, int32 rowCount = 1);
+       inline  SplitBuilder            AddSplit(BSplitView* splitView, int32 
column,
+                                                                       int32 
row, int32 columnCount = 1,
+                                                                       int32 
rowCount = 1);
 
        inline  ThisBuilder&            SetColumnWeight(int32 column, float 
weight);
        inline  ThisBuilder&            SetRowWeight(int32 row, float weight);
@@ -146,7 +173,6 @@
                                                                        float 
bottom);
 
        inline                                          operator BGridLayout*();
-       inline                                          operator BView*();
 
 private:
                        BGridLayout*            fLayout;
@@ -168,7 +194,8 @@
        inline                                          Split(BSplitView* view);
 
        inline  BSplitView*                     View() const;
-       inline  ThisBuilder&            GetView(BSplitView** _view);
+       inline  ThisBuilder&            GetView(BView** _view);
+       inline  ThisBuilder&            GetSplitView(BSplitView** _view);
 
        inline  ThisBuilder&            Add(BView* view);
        inline  ThisBuilder&            Add(BView* view, float weight);
@@ -177,11 +204,23 @@
 
        inline  GroupBuilder            AddGroup(enum orientation orientation,
                                                                        float 
spacing = 0.0f, float weight = 1.0f);
+       inline  GroupBuilder            AddGroup(BGroupView* groupView,
+                                                                       float 
weight = 1.0f);
+       inline  GroupBuilder            AddGroup(BGroupLayout* groupLayout,
+                                                                       float 
weight = 1.0f);
+
        inline  GridBuilder                     AddGrid(float horizontalSpacing 
= 0.0f,
                                                                        float 
verticalSpacing = 0.0f,
                                                                        float 
weight = 1.0f);
+       inline  GridBuilder                     AddGrid(BGridView* gridView,
+                                                                       float 
weight = 1.0f);
+       inline  GridBuilder                     AddGrid(BGridLayout* gridLayout,
+                                                                       float 
weight = 1.0f);
+
        inline  SplitBuilder            AddSplit(enum orientation orientation,
                                                                        float 
spacing = 0.0f, float weight = 1.0f);
+       inline  SplitBuilder            AddSplit(BSplitView* splitView,
+                                                                       float 
weight = 1.0f);
 
        inline  ThisBuilder&            SetCollapsible(bool collapsible);
        inline  ThisBuilder&            SetCollapsible(int32 index, bool 
collapsible);
@@ -244,7 +283,7 @@
 {
        window->SetLayout(fLayout);
 
-       fLayout->View()->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
+       fLayout->Owner()->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
                // TODO: we get a white background if we don't do this
 }
 
@@ -277,7 +316,7 @@
 BView*
 Group<ParentBuilder>::View() const
 {
-       return fLayout->View();
+       return fLayout->Owner();
 }
 
 
@@ -294,7 +333,7 @@
 typename Group<ParentBuilder>::ThisBuilder&
 Group<ParentBuilder>::GetView(BView** _view)
 {
-       *_view = fLayout->View();
+       *_view = fLayout->Owner();
        return *this;
 }
 
@@ -340,26 +379,70 @@
 Group<ParentBuilder>::AddGroup(enum orientation orientation, float spacing,
        float weight)
 {
-       GroupBuilder builder(orientation, spacing);
+       GroupBuilder builder(new BGroupLayout(orientation, spacing));
        builder.SetParent(this);
-       fLayout->AddView(builder.View(), weight);
+       fLayout->AddItem(builder.Layout(), weight);
        return builder;
 }
 
 
 template<typename ParentBuilder>
+typename Group<ParentBuilder>::GroupBuilder
+Group<ParentBuilder>::AddGroup(BGroupView* groupView, float weight)
+{
+       GroupBuilder builder(groupView);
+       builder.SetParent(this);
+       fLayout->AddItem(builder.Layout(), weight);
+       return builder;
+}
+
+
+template<typename ParentBuilder>
+typename Group<ParentBuilder>::GroupBuilder
+Group<ParentBuilder>::AddGroup(BGroupLayout* groupLayout, float weight)
+{
+       GroupBuilder builder(groupLayout);
+       builder.SetParent(this);
+       fLayout->AddItem(builder.Layout(), weight);
+       return builder;
+}
+
+
+template<typename ParentBuilder>
 typename Group<ParentBuilder>::GridBuilder
-Group<ParentBuilder>::AddGrid(float horizontalSpacing, float verticalSpacing,
-       float weight)
+Group<ParentBuilder>::AddGrid(float horizontalSpacing,
+       float verticalSpacing, float weight)
 {
-       GridBuilder builder(horizontalSpacing, verticalSpacing);
+       GridBuilder builder(new BGridLayout(horizontalSpacing, 
verticalSpacing));
        builder.SetParent(this);
-       fLayout->AddView(builder.View(), weight);
+       fLayout->AddItem(builder.Layout(), weight);
        return builder;
 }
 
 
 template<typename ParentBuilder>
+typename Group<ParentBuilder>::GridBuilder
+Group<ParentBuilder>::AddGrid(BGridLayout* gridLayout, float weight)
+{
+       GridBuilder builder(gridLayout);
+       builder.SetParent(this);
+       fLayout->AddItem(builder.Layout(), weight);
+       return builder;
+}
+
+
+template<typename ParentBuilder>
+typename Group<ParentBuilder>::GridBuilder
+Group<ParentBuilder>::AddGrid(BGridView* gridView, float weight)
+{
+       GridBuilder builder(gridView);
+       builder.SetParent(this);
+       fLayout->AddItem(builder.Layout(), weight);
+       return builder;
+}
+
+
+template<typename ParentBuilder>
 typename Group<ParentBuilder>::SplitBuilder
 Group<ParentBuilder>::AddSplit(enum orientation orientation, float spacing,
        float weight)
@@ -372,6 +455,17 @@
 
 
 template<typename ParentBuilder>
+typename Group<ParentBuilder>::SplitBuilder
+Group<ParentBuilder>::AddSplit(BSplitView* splitView, float weight)
+{
+       SplitBuilder builder(splitView);
+       builder.SetParent(this);
+       fLayout->AddView(builder.View(), weight);
+       return builder;
+}
+
+
+template<typename ParentBuilder>
 typename Group<ParentBuilder>::ThisBuilder&
 Group<ParentBuilder>::AddGlue(float weight)
 {
@@ -410,13 +504,6 @@
 }
 
 
-template<typename ParentBuilder>
-Group<ParentBuilder>::operator BView*()
-{
-       return fLayout->View();
-}
-
-
 // #pragma mark - Grid
 
 
@@ -436,7 +523,7 @@
 {
        window->SetLayout(fLayout);
 
-       fLayout->View()->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
+       fLayout->Owner()->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
                // TODO: we get a white background if we don't do this
 }
 
@@ -469,7 +556,7 @@
 BView*
 Grid<ParentBuilder>::View() const
 {
-       return fLayout->View();
+       return fLayout->Owner();
 }
 
 
@@ -486,7 +573,7 @@
 typename Grid<ParentBuilder>::ThisBuilder&
 Grid<ParentBuilder>::GetView(BView** _view)
 {
-       *_view = fLayout->View();
+       *_view = fLayout->Owner();
        return *this;
 }
 
@@ -546,20 +633,56 @@
 Grid<ParentBuilder>::AddGroup(enum orientation orientation, float spacing,
        int32 column, int32 row, int32 columnCount, int32 rowCount)
 {
-       GroupBuilder builder(orientation, spacing);
+       GroupBuilder builder(new BGroupLayout(orientation, spacing));
        builder.SetParent(this);
-       fLayout->AddView(builder.View(), column, row, columnCount, rowCount);
+       fLayout->AddItem(builder.Layout(), column, row, columnCount, rowCount);
        return builder;
 }
 
 
 template<typename ParentBuilder>
+typename Grid<ParentBuilder>::GroupBuilder
+Grid<ParentBuilder>::AddGroup(BGroupView* groupView, int32 column, int32 row,
+       int32 columnCount, int32 rowCount)
+{
+       GroupBuilder builder(groupView);
+       builder.SetParent(this);
+       fLayout->AddItem(builder.Layout(), column, row, columnCount, rowCount);
+       return builder;
+}
+
+
+template<typename ParentBuilder>
+typename Grid<ParentBuilder>::GroupBuilder
+Grid<ParentBuilder>::AddGroup(BGroupLayout* groupLayout, int32 column,
+       int32 row, int32 columnCount, int32 rowCount)
+{
+       GroupBuilder builder(groupLayout);
+       builder.SetParent(this);
+       fLayout->AddItem(builder.Layout(), column, row, columnCount, rowCount);
+       return builder;
+}
+
+
+template<typename ParentBuilder>
 typename Grid<ParentBuilder>::GridBuilder
 Grid<ParentBuilder>::AddGrid(float horizontalSpacing, float verticalSpacing,
        int32 column, int32 row, int32 columnCount, int32 rowCount)
 {
-       GridBuilder builder(horizontalSpacing, verticalSpacing);
+       GridBuilder builder(new BGridLayout(horizontalSpacing, 
verticalSpacing));
        builder.SetParent(this);
+       fLayout->AddItem(builder.Layout(), column, row, columnCount, rowCount);
+       return builder;
+}
+
+
+template<typename ParentBuilder>
+typename Grid<ParentBuilder>::GridBuilder
+Grid<ParentBuilder>::AddGrid(BGridView* gridView, int32 column, int32 row,
+       int32 columnCount, int32 rowCount)
+{
+       GridBuilder builder(gridView);
+       builder.SetParent(this);
        fLayout->AddView(builder.View(), column, row, columnCount, rowCount);
        return builder;
 }
@@ -574,10 +697,22 @@
        builder.SetParent(this);
        fLayout->AddView(builder.View(), column, row, columnCount, rowCount);
        return builder;
-}
+} 
 
 
 template<typename ParentBuilder>
+typename Grid<ParentBuilder>::SplitBuilder
+Grid<ParentBuilder>::AddSplit(BSplitView* splitView, int32 column, int32 row,
+       int32 columnCount, int32 rowCount)
+{
+       SplitBuilder builder(splitView);
+       builder.SetParent(this);
+       fLayout->AddView(builder.View(), column, row, columnCount, rowCount);
+       return builder;
+} 
+
+
+template<typename ParentBuilder>
 typename Grid<ParentBuilder>::ThisBuilder&
 Grid<ParentBuilder>::SetColumnWeight(int32 column, float weight)
 {
@@ -612,13 +747,6 @@
 }
 
 
-template<typename ParentBuilder>
-Grid<ParentBuilder>::operator BView*()
-{
-       return fLayout->View();
-}
-
-
 // #pragma mark - Split
 
 
@@ -648,7 +776,7 @@
 
 template<typename ParentBuilder>
 typename Split<ParentBuilder>::ThisBuilder&
-Split<ParentBuilder>::GetView(BSplitView** _view)
+Split<ParentBuilder>::GetView(BView** _view)
 {
        *_view = fView;
        return *this;
@@ -657,6 +785,15 @@
 
 template<typename ParentBuilder>
 typename Split<ParentBuilder>::ThisBuilder&
+Split<ParentBuilder>::GetSplitView(BSplitView** _view)
+{
+       *_view = fView;
+       return *this;
+}
+
+
+template<typename ParentBuilder>
+typename Split<ParentBuilder>::ThisBuilder&
 Split<ParentBuilder>::Add(BView* view)
 {
        fView->AddChild(view);
@@ -696,26 +833,70 @@
 Split<ParentBuilder>::AddGroup(enum orientation orientation, float spacing,
        float weight)
 {
-       GroupBuilder builder(orientation, spacing);
+       GroupBuilder builder(new BGroupLayout(orientation, spacing));
        builder.SetParent(this);
-       fView->AddChild(builder.View(), weight);
+       fView->AddChild(builder.Layout(), weight);
        return builder;
 }
 
 
 template<typename ParentBuilder>
+typename Split<ParentBuilder>::GroupBuilder
+Split<ParentBuilder>::AddGroup(BGroupView* groupView, float weight)
+{
+       GroupBuilder builder(groupView);
+       builder.SetParent(this);
+       fView->AddChild(builder.Layout(), weight);
+       return builder;
+}
+
+
+template<typename ParentBuilder>
+typename Split<ParentBuilder>::GroupBuilder
+Split<ParentBuilder>::AddGroup(BGroupLayout* groupLayout, float weight)
+{
+       GroupBuilder builder(groupLayout);
+       builder.SetParent(this);
+       fView->AddChild(builder.Layout(), weight);
+       return builder;
+}
+
+
+template<typename ParentBuilder>
 typename Split<ParentBuilder>::GridBuilder
 Split<ParentBuilder>::AddGrid(float horizontalSpacing, float verticalSpacing,
        float weight)
 {
-       GridBuilder builder(horizontalSpacing, verticalSpacing);
+       GridBuilder builder(new BGridLayout(horizontalSpacing, 
verticalSpacing));
        builder.SetParent(this);
-       fView->AddChild(builder.View(), weight);
+       fView->AddChild(builder.Layout(), weight);
        return builder;
 }
 
 
 template<typename ParentBuilder>
+typename Split<ParentBuilder>::GridBuilder
+Split<ParentBuilder>::AddGrid(BGridView* gridView, float weight)
+{
+       GridBuilder builder(gridView);
+       builder.SetParent(this);
+       fView->AddChild(builder.Layout(), weight);
+       return builder;
+}
+
+
+template<typename ParentBuilder>
+typename Split<ParentBuilder>::GridBuilder
+Split<ParentBuilder>::AddGrid(BGridLayout* layout, float weight)
+{
+       GridBuilder builder(layout);
+       builder.SetParent(this);
+       fView->AddChild(builder.Layout(), weight);
+       return builder;
+}
+
+
+template<typename ParentBuilder>
 typename Split<ParentBuilder>::SplitBuilder
 Split<ParentBuilder>::AddSplit(enum orientation orientation, float spacing,
        float weight)

Modified: haiku/trunk/headers/os/interface/LayoutItem.h
===================================================================
--- haiku/trunk/headers/os/interface/LayoutItem.h       2010-08-17 18:22:17 UTC 
(rev 38206)
+++ haiku/trunk/headers/os/interface/LayoutItem.h       2010-08-17 18:43:41 UTC 
(rev 38207)
@@ -16,7 +16,7 @@
 class BView;
 
 
-class BLayoutItem: public BArchivable {
+class BLayoutItem : public BArchivable {
 public:
                                                                BLayoutItem();
                                                                
BLayoutItem(BMessage* from);
@@ -46,7 +46,8 @@
 
        virtual BView*                          View();
 
-       virtual void                            InvalidateLayout();
+       virtual void                            InvalidateLayout(bool children 
= false);
+       virtual void                            Relayout(bool immediate = 
false);
 
                        void*                           LayoutData() const;
                        void                            SetLayoutData(void* 
data);
@@ -57,11 +58,19 @@
        virtual status_t                        AllArchived(BMessage* into) 
const;
        virtual status_t                        AllUnarchived(const BMessage* 
from);
 
+protected:
+
+                       void                            SetLayout(BLayout* 
layout);
+
+       // hook methods
+       virtual void                            AttachedToLayout();
+       virtual void                            DetachedFromLayout(BLayout* 
layout);
+
+       virtual void                            AncestorVisibilityChanged(bool 
shown);
+
 private:
                        friend class BLayout;
 
-                       void                            SetLayout(BLayout* 
layout);
-
                        BLayout*                        fLayout;
                        void*                           fLayoutData;
 };

Modified: haiku/trunk/headers/os/interface/TwoDimensionalLayout.h
===================================================================
--- haiku/trunk/headers/os/interface/TwoDimensionalLayout.h     2010-08-17 
18:22:17 UTC (rev 38206)
+++ haiku/trunk/headers/os/interface/TwoDimensionalLayout.h     2010-08-17 
18:43:41 UTC (rev 38207)
@@ -6,12 +6,12 @@
 #define        _TWO_DIMENSIONAL_LAYOUT_H
 
 
-#include <Layout.h>
+#include <AbstractLayout.h>
 
 class BLayoutContext;
 
 
-class BTwoDimensionalLayout : public BLayout {
+class BTwoDimensionalLayout : public BAbstractLayout {
 public:
                                                                
BTwoDimensionalLayout();
                                                                
BTwoDimensionalLayout(BMessage* from);
@@ -25,18 +25,18 @@
                        void                            
AlignLayoutWith(BTwoDimensionalLayout* other,
                                                                        enum 
orientation orientation);
 
-       virtual BSize                           MinSize();
-       virtual BSize                           MaxSize();
-       virtual BSize                           PreferredSize();
-       virtual BAlignment                      Alignment();
+       virtual BSize                           BaseMinSize();
+       virtual BSize                           BaseMaxSize();
+       virtual BSize                           BasePreferredSize();
+       virtual BAlignment                      BaseAlignment();
 
        virtual bool                            HasHeightForWidth();
        virtual void                            GetHeightForWidth(float width, 
float* min,
                                                                        float* 
max, float* preferred);
 
-       virtual void                            InvalidateLayout();
+       virtual void                            SetFrame(BRect frame);
 
-       virtual void                            LayoutView();
+       virtual void                            InvalidateLayout(bool children 
= false);
 
        virtual status_t                        Archive(BMessage* into, bool 
deep = true) const;
        virtual status_t                        AllArchived(BMessage* into) 
const;
@@ -56,6 +56,8 @@
                                int32   height;
                        };
 
+       virtual void                            DerivedLayoutItems();
+
                        BSize                           AddInsets(BSize size);
                        void                            AddInsets(float* 
minHeight, float* maxHeight,
                                                                        float* 
preferredHeight);
@@ -82,7 +84,6 @@
                        friend class LocalLayouter;
 
                        void                            _ValidateMinMax();
-                       BLayoutContext*         _CurrentLayoutContext();
 
 protected:
                        float                           fLeftInset;

Modified: haiku/trunk/headers/os/interface/View.h
===================================================================
--- haiku/trunk/headers/os/interface/View.h     2010-08-17 18:22:17 UTC (rev 
38206)
+++ haiku/trunk/headers/os/interface/View.h     2010-08-17 18:43:41 UTC (rev 
38207)
@@ -562,6 +562,8 @@
                        void                            Layout(bool force);
                        void                            Relayout();
 
+       class Private;
+
 protected:
        virtual void                            DoLayout();
 
@@ -580,6 +582,8 @@
 
 private:
                        void                            _Layout(bool force, 
BLayoutContext* context);
+                       void                            _LayoutLeft(BLayout* 
deleted);
+                       void                            
_InvalidateParentLayout();
 
 private:
        // FBC padding and forbidden methods
@@ -595,6 +599,7 @@
 private:
        struct LayoutData;
 
+       friend class Private;
        friend class BBitmap;
        friend class BLayout;
        friend class BPrintJob;

Modified: haiku/trunk/headers/os/interface/Window.h
===================================================================
--- haiku/trunk/headers/os/interface/Window.h   2010-08-17 18:22:17 UTC (rev 
38206)
+++ haiku/trunk/headers/os/interface/Window.h   2010-08-17 18:43:41 UTC (rev 
38207)
@@ -103,6 +103,7 @@
                        void                            Close() { Quit(); }
 
                        void                            AddChild(BView* child, 
BView* before = NULL);
+                       void                            AddChild(BLayoutItem* 
child);
                        bool                            RemoveChild(BView* 
child);
                        int32                           CountChildren() const;
                        BView*                          ChildAt(int32 index) 
const;

Modified: haiku/trunk/headers/private/interface/ViewPrivate.h
===================================================================
--- haiku/trunk/headers/private/interface/ViewPrivate.h 2010-08-17 18:22:17 UTC 
(rev 38206)
+++ haiku/trunk/headers/private/interface/ViewPrivate.h 2010-08-17 18:43:41 UTC 
(rev 38207)
@@ -16,6 +16,7 @@
 #include <Rect.h>
 #include <Region.h>
 #include <ServerProtocolStructs.h>
+#include <View.h>
 
 const static uint32 kDeleteReplicant = 'JAHA';
 
@@ -48,6 +49,27 @@
 };
 
 
+class BView::Private {
+public:
+       Private(BView* view)
+               :
+               fView(view)
+       {
+       }
+
+       int16 ShowLevel()
+       {
+               return fView->fShowLevel;
+       }
+
+       // defined in View.cpp
+       bool    WillLayout();
+       bool    MinMaxValid();
+
+       BView* fView;
+};
+
+
 namespace BPrivate {
 
 class PortLink;

Modified: haiku/trunk/src/apps/aboutsystem/AboutSystem.cpp
===================================================================
--- haiku/trunk/src/apps/aboutsystem/AboutSystem.cpp    2010-08-17 18:22:17 UTC 
(rev 38206)
+++ haiku/trunk/src/apps/aboutsystem/AboutSystem.cpp    2010-08-17 18:43:41 UTC 
(rev 38207)
@@ -579,6 +579,7 @@
        const float offset = 5;
 
        SetLayout(new BGroupLayout(B_HORIZONTAL));
+       SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
 
        BLayoutBuilder::Group<>((BGroupLayout*)GetLayout())
                .AddGroup(B_VERTICAL)

Added: haiku/trunk/src/kits/interface/AbstractLayout.cpp

[... truncated: 2281 lines follow ...]

Other related posts: