1/* 2 * Copyright 2010, Haiku, Inc. 3 * Copyright 2006, Ingo Weinhold <bonefish@cs.tu-berlin.de>. 4 * All rights reserved. Distributed under the terms of the MIT License. 5 */ 6 7 8#include "ViewLayoutItem.h" 9 10#include <new> 11 12#include <Layout.h> 13#include <View.h> 14#include <ViewPrivate.h> 15 16 17namespace { 18 const char* const kViewField = "BViewLayoutItem:view"; 19} 20 21 22BViewLayoutItem::BViewLayoutItem(BView* view) 23 : 24 fView(view), 25 fAncestorsVisible(true) 26{ 27} 28 29 30BViewLayoutItem::BViewLayoutItem(BMessage* from) 31 : 32 BLayoutItem(BUnarchiver::PrepareArchive(from)), 33 fView(NULL), 34 fAncestorsVisible(true) 35{ 36 BUnarchiver unarchiver(from); 37 unarchiver.Finish(unarchiver.FindObject<BView>(kViewField, 0, 38 BUnarchiver::B_DONT_ASSUME_OWNERSHIP, fView)); 39} 40 41 42BViewLayoutItem::~BViewLayoutItem() 43{ 44} 45 46 47BSize 48BViewLayoutItem::MinSize() 49{ 50 return fView->MinSize(); 51} 52 53 54BSize 55BViewLayoutItem::MaxSize() 56{ 57 return fView->MaxSize(); 58} 59 60 61BSize 62BViewLayoutItem::PreferredSize() 63{ 64 return fView->PreferredSize(); 65} 66 67 68BAlignment 69BViewLayoutItem::Alignment() 70{ 71 return fView->LayoutAlignment(); 72} 73 74 75void 76BViewLayoutItem::SetExplicitMinSize(BSize size) 77{ 78 fView->SetExplicitMinSize(size); 79} 80 81 82void 83BViewLayoutItem::SetExplicitMaxSize(BSize size) 84{ 85 fView->SetExplicitMaxSize(size); 86} 87 88 89void 90BViewLayoutItem::SetExplicitPreferredSize(BSize size) 91{ 92 fView->SetExplicitPreferredSize(size); 93} 94 95 96void 97BViewLayoutItem::SetExplicitAlignment(BAlignment alignment) 98{ 99 fView->SetExplicitAlignment(alignment); 100} 101 102 103bool 104BViewLayoutItem::IsVisible() 105{ 106 int16 showLevel = BView::Private(fView).ShowLevel(); 107 return showLevel - (fAncestorsVisible ? 0 : 1) <= 0; 108} 109 110 111void 112BViewLayoutItem::SetVisible(bool visible) 113{ 114 if (visible != IsVisible()) { 115 if (visible) 116 fView->Show(); 117 else 118 fView->Hide(); 119 } 120} 121 122 123BRect 124BViewLayoutItem::Frame() 125{ 126 return fView->Frame(); 127} 128 129 130void 131BViewLayoutItem::SetFrame(BRect frame) 132{ 133 fView->MoveTo(frame.LeftTop()); 134 fView->ResizeTo(frame.Width(), frame.Height()); 135} 136 137 138bool 139BViewLayoutItem::HasHeightForWidth() 140{ 141 return fView->HasHeightForWidth(); 142} 143 144 145void 146BViewLayoutItem::GetHeightForWidth(float width, float* min, float* max, 147 float* preferred) 148{ 149 fView->GetHeightForWidth(width, min, max, preferred); 150} 151 152 153BView* 154BViewLayoutItem::View() 155{ 156 return fView; 157} 158 159 160void 161BViewLayoutItem::Relayout(bool immediate) 162{ 163 if (immediate) 164 fView->Layout(false); 165 else 166 fView->Relayout(); 167} 168 169 170status_t 171BViewLayoutItem::Archive(BMessage* into, bool deep) const 172{ 173 BArchiver archiver(into); 174 status_t err = BLayoutItem::Archive(into, deep); 175 176 return archiver.Finish(err); 177} 178 179 180status_t 181BViewLayoutItem::AllArchived(BMessage* into) const 182{ 183 BArchiver archiver(into); 184 status_t err = BLayoutItem::AllArchived(into); 185 186 if (err == B_OK) { 187 if (archiver.IsArchived(fView)) 188 err = archiver.AddArchivable(kViewField, fView); 189 else 190 err = B_NAME_NOT_FOUND; 191 } 192 193 return err; 194} 195 196 197status_t 198BViewLayoutItem::AllUnarchived(const BMessage* from) 199{ 200 if (!fView) 201 return B_ERROR; 202 203 return BLayoutItem::AllUnarchived(from); 204} 205 206 207BArchivable* 208BViewLayoutItem::Instantiate(BMessage* from) 209{ 210 if (validate_instantiation(from, "BViewLayoutItem")) 211 return new(std::nothrow) BViewLayoutItem(from); 212 return NULL; 213} 214 215 216void 217BViewLayoutItem::LayoutInvalidated(bool children) 218{ 219 fView->InvalidateLayout(children); 220} 221 222 223void 224BViewLayoutItem::AncestorVisibilityChanged(bool shown) 225{ 226 if (fAncestorsVisible == shown) 227 return; 228 229 fAncestorsVisible = shown; 230 if (shown) 231 fView->Show(); 232 if (!shown) 233 fView->Hide(); 234} 235 236