1 /* 2 * Copyright 2006-2010, Haiku Inc. 3 * Distributed under the terms of the MIT License. 4 */ 5 #ifndef _SPLIT_LAYOUT_H 6 #define _SPLIT_LAYOUT_H 7 8 9 #include <Layout.h> 10 #include <Point.h> 11 12 13 namespace BPrivate { 14 namespace Layout { 15 class Layouter; 16 class LayoutInfo; 17 } 18 } 19 20 using BPrivate::Layout::Layouter; 21 using BPrivate::Layout::LayoutInfo; 22 23 24 class BSplitLayout : public BLayout { 25 public: 26 BSplitLayout(enum orientation orientation, 27 float spacing = 0.0f); 28 BSplitLayout(BMessage* from); 29 virtual ~BSplitLayout(); 30 31 void SetInsets(float left, float top, float right, 32 float bottom); 33 void GetInsets(float* left, float* top, float* right, 34 float* bottom) const; 35 36 float Spacing() const; 37 void SetSpacing(float spacing); 38 39 orientation Orientation() const; 40 void SetOrientation(enum orientation orientation); 41 42 float SplitterSize() const; 43 void SetSplitterSize(float size); 44 45 virtual BLayoutItem* AddView(BView* child); 46 virtual BLayoutItem* AddView(int32 index, BView* child); 47 virtual BLayoutItem* AddView(BView* child, float weight); 48 virtual BLayoutItem* AddView(int32 index, BView* child, 49 float weight); 50 51 virtual bool AddItem(BLayoutItem* item); 52 virtual bool AddItem(int32 index, BLayoutItem* item); 53 virtual bool AddItem(BLayoutItem* item, float weight); 54 virtual bool AddItem(int32 index, BLayoutItem* item, 55 float weight); 56 57 58 float ItemWeight(int32 index) const; 59 float ItemWeight(BLayoutItem* item) const; 60 void SetItemWeight(int32 index, float weight, 61 bool invalidateLayout); 62 void SetItemWeight(BLayoutItem* item, float weight); 63 64 void SetCollapsible(bool collapsible); 65 void SetCollapsible(int32 index, bool collapsible); 66 void SetCollapsible(int32 first, int32 last, 67 bool collapsible); 68 69 virtual BSize MinSize(); 70 virtual BSize MaxSize(); 71 virtual BSize PreferredSize(); 72 virtual BAlignment Alignment(); 73 74 virtual bool HasHeightForWidth(); 75 virtual void GetHeightForWidth(float width, float* min, 76 float* max, float* preferred); 77 78 virtual void InvalidateLayout(); 79 80 virtual void LayoutView(); 81 82 // interface for BSplitView 83 BRect SplitterItemFrame(int32 index) const; 84 bool IsAboveSplitter(const BPoint& point) const; 85 86 bool StartDraggingSplitter(BPoint point); 87 bool DragSplitter(BPoint point); 88 bool StopDraggingSplitter(); 89 int32 DraggedSplitter() const; 90 91 // archiving methods 92 virtual status_t Archive(BMessage* into, bool deep = true) const; 93 static BArchivable* Instantiate(BMessage* from); 94 95 virtual status_t ItemArchived(BMessage* into, BLayoutItem* item, 96 int32 index) const; 97 virtual status_t ItemUnarchived(const BMessage* from, 98 BLayoutItem* item, int32 index); 99 100 protected: 101 virtual bool ItemAdded(BLayoutItem* item, int32 atIndex); 102 virtual void ItemRemoved(BLayoutItem* item, int32 fromIndex); 103 104 private: 105 class ItemLayoutInfo; 106 class ValueRange; 107 class SplitterItem; 108 109 void _InvalidateLayout(bool invalidateView); 110 void _InvalidateCachedHeightForWidth(); 111 112 SplitterItem* _SplitterItemAt(const BPoint& point, 113 int32* index = NULL) const; 114 SplitterItem* _SplitterItemAt(int32 index) const; 115 116 void _GetSplitterValueRange(int32 index, 117 ValueRange& range); 118 int32 _SplitterValue(int32 index) const; 119 120 void _LayoutItem(BLayoutItem* item, BRect frame, 121 bool visible); 122 void _LayoutItem(BLayoutItem* item, 123 ItemLayoutInfo* info); 124 125 bool _SetSplitterValue(int32 index, int32 value); 126 127 ItemLayoutInfo* _ItemLayoutInfo(BLayoutItem* item) const; 128 129 130 void _UpdateSplitterWeights(); 131 132 void _ValidateMinMax(); 133 134 void _InternalGetHeightForWidth(float width, 135 bool realLayout, float* minHeight, 136 float* maxHeight, float* preferredHeight); 137 138 float _SplitterSpace() const; 139 140 BSize _AddInsets(BSize size); 141 void _AddInsets(float* minHeight, float* maxHeight, 142 float* preferredHeight); 143 BSize _SubtractInsets(BSize size); 144 145 private: 146 orientation fOrientation; 147 float fLeftInset; 148 float fRightInset; 149 float fTopInset; 150 float fBottomInset; 151 float fSplitterSize; 152 float fSpacing; 153 154 BList fSplitterItems; 155 BList fVisibleItems; 156 157 BSize fMin; 158 BSize fMax; 159 BSize fPreferred; 160 161 Layouter* fHorizontalLayouter; 162 Layouter* fVerticalLayouter; 163 164 LayoutInfo* fHorizontalLayoutInfo; 165 LayoutInfo* fVerticalLayoutInfo; 166 167 BList fHeightForWidthItems; 168 // Incorporates the children's height for width constraints for a 169 // concrete width. Cloned lazily from fVerticalLayout when needed. 170 Layouter* fHeightForWidthVerticalLayouter; 171 LayoutInfo* fHeightForWidthHorizontalLayoutInfo; 172 // for computing height for width info 173 174 bool fLayoutValid; 175 176 float fCachedHeightForWidthWidth; 177 float fHeightForWidthVerticalLayouterWidth; 178 float fCachedMinHeightForWidth; 179 float fCachedMaxHeightForWidth; 180 float fCachedPreferredHeightForWidth; 181 182 BPoint fDraggingStartPoint; 183 int32 fDraggingStartValue; 184 int32 fDraggingCurrentValue; 185 int32 fDraggingSplitterIndex; 186 }; 187 188 #endif // _SPLIT_LAYOUT_H 189