vfs: check userland buffers before reading them.
[haiku.git] / src / kits / interface / SplitView.cpp
blob79fc9814e0e19b3a6f6c1af2a816be718239f729
1 /*
2 * Copyright 2006, Ingo Weinhold <bonefish@cs.tu-berlin.de>.
3 * Copyright 2015, Haiku, Inc.
4 * All rights reserved. Distributed under the terms of the MIT License.
5 */
7 #include <SplitView.h>
9 #include <stdio.h>
11 #include <Archivable.h>
12 #include <ControlLook.h>
13 #include <Cursor.h>
15 #include "SplitLayout.h"
18 BSplitView::BSplitView(orientation orientation, float spacing)
20 BView(NULL,
21 B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE | B_INVALIDATE_AFTER_LAYOUT,
22 fSplitLayout = new BSplitLayout(orientation, spacing))
27 BSplitView::BSplitView(BMessage* from)
29 BView(BUnarchiver::PrepareArchive(from)),
30 fSplitLayout(NULL)
32 BUnarchiver(from).Finish();
36 BSplitView::~BSplitView()
41 void
42 BSplitView::SetInsets(float left, float top, float right, float bottom)
44 left = BControlLook::ComposeSpacing(left);
45 top = BControlLook::ComposeSpacing(top);
46 right = BControlLook::ComposeSpacing(right);
47 bottom = BControlLook::ComposeSpacing(bottom);
49 fSplitLayout->SetInsets(left, top, right, bottom);
53 void
54 BSplitView::SetInsets(float horizontal, float vertical)
56 horizontal = BControlLook::ComposeSpacing(horizontal);
57 vertical = BControlLook::ComposeSpacing(vertical);
58 fSplitLayout->SetInsets(horizontal, vertical, horizontal, vertical);
62 void
63 BSplitView::SetInsets(float insets)
65 insets = BControlLook::ComposeSpacing(insets);
66 fSplitLayout->SetInsets(insets, insets, insets, insets);
70 void
71 BSplitView::GetInsets(float* left, float* top, float* right,
72 float* bottom) const
74 fSplitLayout->GetInsets(left, top, right, bottom);
78 float
79 BSplitView::Spacing() const
81 return fSplitLayout->Spacing();
85 void
86 BSplitView::SetSpacing(float spacing)
88 fSplitLayout->SetSpacing(spacing);
92 orientation
93 BSplitView::Orientation() const
95 return fSplitLayout->Orientation();
99 void
100 BSplitView::SetOrientation(orientation orientation)
102 fSplitLayout->SetOrientation(orientation);
106 float
107 BSplitView::SplitterSize() const
109 return fSplitLayout->SplitterSize();
113 void
114 BSplitView::SetSplitterSize(float size)
116 fSplitLayout->SetSplitterSize(size);
120 int32
121 BSplitView::CountItems() const
123 return fSplitLayout->CountItems();
127 float
128 BSplitView::ItemWeight(int32 index) const
130 return fSplitLayout->ItemWeight(index);
134 float
135 BSplitView::ItemWeight(BLayoutItem* item) const
137 return fSplitLayout->ItemWeight(item);
141 void
142 BSplitView::SetItemWeight(int32 index, float weight, bool invalidateLayout)
144 fSplitLayout->SetItemWeight(index, weight, invalidateLayout);
148 void
149 BSplitView::SetItemWeight(BLayoutItem* item, float weight)
151 fSplitLayout->SetItemWeight(item, weight);
155 bool
156 BSplitView::IsCollapsible(int32 index) const
158 return fSplitLayout->IsCollapsible(index);
162 void
163 BSplitView::SetCollapsible(bool collapsible)
165 fSplitLayout->SetCollapsible(collapsible);
169 void
170 BSplitView::SetCollapsible(int32 index, bool collapsible)
172 fSplitLayout->SetCollapsible(index, collapsible);
176 void
177 BSplitView::SetCollapsible(int32 first, int32 last, bool collapsible)
179 fSplitLayout->SetCollapsible(first, last, collapsible);
183 bool
184 BSplitView::IsItemCollapsed(int32 index) const
186 return fSplitLayout->IsItemCollapsed(index);
190 void
191 BSplitView::SetItemCollapsed(int32 index, bool collapsed)
193 fSplitLayout->SetItemCollapsed(index, collapsed);
197 void
198 BSplitView::AddChild(BView* child, BView* sibling)
200 BView::AddChild(child, sibling);
204 bool
205 BSplitView::AddChild(BView* child, float weight)
207 return fSplitLayout->AddView(child, weight);
211 bool
212 BSplitView::AddChild(int32 index, BView* child, float weight)
214 return fSplitLayout->AddView(index, child, weight);
218 bool
219 BSplitView::AddChild(BLayoutItem* child)
221 return fSplitLayout->AddItem(child);
225 bool
226 BSplitView::AddChild(BLayoutItem* child, float weight)
228 return fSplitLayout->AddItem(child, weight);
232 bool
233 BSplitView::AddChild(int32 index, BLayoutItem* child, float weight)
235 return fSplitLayout->AddItem(index, child, weight);
239 void
240 BSplitView::AttachedToWindow()
242 AdoptParentColors();
246 void
247 BSplitView::Draw(BRect updateRect)
249 // draw the splitters
250 int32 draggedSplitterIndex = fSplitLayout->DraggedSplitter();
251 int32 count = fSplitLayout->CountItems();
252 for (int32 i = 0; i < count - 1; i++) {
253 BRect frame = fSplitLayout->SplitterItemFrame(i);
254 DrawSplitter(frame, updateRect, Orientation(),
255 draggedSplitterIndex == i);
260 void
261 BSplitView::DrawAfterChildren(BRect r)
263 return BView::DrawAfterChildren(r);
267 void
268 BSplitView::MouseDown(BPoint where)
270 SetMouseEventMask(B_POINTER_EVENTS,
271 B_LOCK_WINDOW_FOCUS | B_SUSPEND_VIEW_FOCUS);
273 if (fSplitLayout->StartDraggingSplitter(where))
274 Invalidate();
278 void
279 BSplitView::MouseUp(BPoint where)
281 if (fSplitLayout->StopDraggingSplitter()) {
282 Relayout();
283 Invalidate();
288 void
289 BSplitView::MouseMoved(BPoint where, uint32 transit, const BMessage* message)
291 BCursor cursor(B_CURSOR_ID_SYSTEM_DEFAULT);
293 int32 splitterIndex = fSplitLayout->DraggedSplitter();
295 if (splitterIndex >= 0 || fSplitLayout->IsAboveSplitter(where)) {
296 if (Orientation() == B_VERTICAL)
297 cursor = BCursor(B_CURSOR_ID_RESIZE_NORTH_SOUTH);
298 else
299 cursor = BCursor(B_CURSOR_ID_RESIZE_EAST_WEST);
302 if (splitterIndex >= 0) {
303 BRect oldFrame = fSplitLayout->SplitterItemFrame(splitterIndex);
304 if (fSplitLayout->DragSplitter(where)) {
305 Invalidate(oldFrame);
306 Invalidate(fSplitLayout->SplitterItemFrame(splitterIndex));
310 SetViewCursor(&cursor, true);
314 void
315 BSplitView::MessageReceived(BMessage* message)
317 return BView::MessageReceived(message);
321 void
322 BSplitView::SetLayout(BLayout* layout)
324 // not allowed
328 status_t
329 BSplitView::Archive(BMessage* into, bool deep) const
331 return BView::Archive(into, deep);
335 status_t
336 BSplitView::AllArchived(BMessage* archive) const
338 return BView::AllArchived(archive);
342 status_t
343 BSplitView::AllUnarchived(const BMessage* from)
345 status_t err = BView::AllUnarchived(from);
346 if (err == B_OK) {
347 fSplitLayout = dynamic_cast<BSplitLayout*>(GetLayout());
348 if (!fSplitLayout && GetLayout())
349 return B_BAD_TYPE;
350 else if (!fSplitLayout)
351 return B_ERROR;
353 return err;
357 BArchivable*
358 BSplitView::Instantiate(BMessage* from)
360 if (validate_instantiation(from, "BSplitView"))
361 return new BSplitView(from);
362 return NULL;
366 void
367 BSplitView::DrawSplitter(BRect frame, const BRect& updateRect,
368 orientation orientation, bool pressed)
370 _DrawDefaultSplitter(this, frame, updateRect, orientation, pressed);
374 void
375 BSplitView::_DrawDefaultSplitter(BView* view, BRect frame,
376 const BRect& updateRect, orientation orientation, bool pressed)
378 uint32 flags = pressed ? BControlLook::B_ACTIVATED : 0;
379 be_control_look->DrawSplitter(view, frame, updateRect, view->ViewColor(),
380 orientation, flags, 0);
384 status_t
385 BSplitView::Perform(perform_code d, void* arg)
387 return BView::Perform(d, arg);
391 void BSplitView::_ReservedSplitView1() {}
392 void BSplitView::_ReservedSplitView2() {}
393 void BSplitView::_ReservedSplitView3() {}
394 void BSplitView::_ReservedSplitView4() {}
395 void BSplitView::_ReservedSplitView5() {}
396 void BSplitView::_ReservedSplitView6() {}
397 void BSplitView::_ReservedSplitView7() {}
398 void BSplitView::_ReservedSplitView8() {}
399 void BSplitView::_ReservedSplitView9() {}
400 void BSplitView::_ReservedSplitView10() {}