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.
11 #include <Archivable.h>
12 #include <ControlLook.h>
15 #include "SplitLayout.h"
18 BSplitView::BSplitView(orientation orientation
, float spacing
)
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
)),
32 BUnarchiver(from
).Finish();
36 BSplitView::~BSplitView()
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
);
54 BSplitView::SetInsets(float horizontal
, float vertical
)
56 horizontal
= BControlLook::ComposeSpacing(horizontal
);
57 vertical
= BControlLook::ComposeSpacing(vertical
);
58 fSplitLayout
->SetInsets(horizontal
, vertical
, horizontal
, vertical
);
63 BSplitView::SetInsets(float insets
)
65 insets
= BControlLook::ComposeSpacing(insets
);
66 fSplitLayout
->SetInsets(insets
, insets
, insets
, insets
);
71 BSplitView::GetInsets(float* left
, float* top
, float* right
,
74 fSplitLayout
->GetInsets(left
, top
, right
, bottom
);
79 BSplitView::Spacing() const
81 return fSplitLayout
->Spacing();
86 BSplitView::SetSpacing(float spacing
)
88 fSplitLayout
->SetSpacing(spacing
);
93 BSplitView::Orientation() const
95 return fSplitLayout
->Orientation();
100 BSplitView::SetOrientation(orientation orientation
)
102 fSplitLayout
->SetOrientation(orientation
);
107 BSplitView::SplitterSize() const
109 return fSplitLayout
->SplitterSize();
114 BSplitView::SetSplitterSize(float size
)
116 fSplitLayout
->SetSplitterSize(size
);
121 BSplitView::CountItems() const
123 return fSplitLayout
->CountItems();
128 BSplitView::ItemWeight(int32 index
) const
130 return fSplitLayout
->ItemWeight(index
);
135 BSplitView::ItemWeight(BLayoutItem
* item
) const
137 return fSplitLayout
->ItemWeight(item
);
142 BSplitView::SetItemWeight(int32 index
, float weight
, bool invalidateLayout
)
144 fSplitLayout
->SetItemWeight(index
, weight
, invalidateLayout
);
149 BSplitView::SetItemWeight(BLayoutItem
* item
, float weight
)
151 fSplitLayout
->SetItemWeight(item
, weight
);
156 BSplitView::IsCollapsible(int32 index
) const
158 return fSplitLayout
->IsCollapsible(index
);
163 BSplitView::SetCollapsible(bool collapsible
)
165 fSplitLayout
->SetCollapsible(collapsible
);
170 BSplitView::SetCollapsible(int32 index
, bool collapsible
)
172 fSplitLayout
->SetCollapsible(index
, collapsible
);
177 BSplitView::SetCollapsible(int32 first
, int32 last
, bool collapsible
)
179 fSplitLayout
->SetCollapsible(first
, last
, collapsible
);
184 BSplitView::IsItemCollapsed(int32 index
) const
186 return fSplitLayout
->IsItemCollapsed(index
);
191 BSplitView::SetItemCollapsed(int32 index
, bool collapsed
)
193 fSplitLayout
->SetItemCollapsed(index
, collapsed
);
198 BSplitView::AddChild(BView
* child
, BView
* sibling
)
200 BView::AddChild(child
, sibling
);
205 BSplitView::AddChild(BView
* child
, float weight
)
207 return fSplitLayout
->AddView(child
, weight
);
212 BSplitView::AddChild(int32 index
, BView
* child
, float weight
)
214 return fSplitLayout
->AddView(index
, child
, weight
);
219 BSplitView::AddChild(BLayoutItem
* child
)
221 return fSplitLayout
->AddItem(child
);
226 BSplitView::AddChild(BLayoutItem
* child
, float weight
)
228 return fSplitLayout
->AddItem(child
, weight
);
233 BSplitView::AddChild(int32 index
, BLayoutItem
* child
, float weight
)
235 return fSplitLayout
->AddItem(index
, child
, weight
);
240 BSplitView::AttachedToWindow()
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
);
261 BSplitView::DrawAfterChildren(BRect r
)
263 return BView::DrawAfterChildren(r
);
268 BSplitView::MouseDown(BPoint where
)
270 SetMouseEventMask(B_POINTER_EVENTS
,
271 B_LOCK_WINDOW_FOCUS
| B_SUSPEND_VIEW_FOCUS
);
273 if (fSplitLayout
->StartDraggingSplitter(where
))
279 BSplitView::MouseUp(BPoint where
)
281 if (fSplitLayout
->StopDraggingSplitter()) {
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
);
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);
315 BSplitView::MessageReceived(BMessage
* message
)
317 return BView::MessageReceived(message
);
322 BSplitView::SetLayout(BLayout
* layout
)
329 BSplitView::Archive(BMessage
* into
, bool deep
) const
331 return BView::Archive(into
, deep
);
336 BSplitView::AllArchived(BMessage
* archive
) const
338 return BView::AllArchived(archive
);
343 BSplitView::AllUnarchived(const BMessage
* from
)
345 status_t err
= BView::AllUnarchived(from
);
347 fSplitLayout
= dynamic_cast<BSplitLayout
*>(GetLayout());
348 if (!fSplitLayout
&& GetLayout())
350 else if (!fSplitLayout
)
358 BSplitView::Instantiate(BMessage
* from
)
360 if (validate_instantiation(from
, "BSplitView"))
361 return new BSplitView(from
);
367 BSplitView::DrawSplitter(BRect frame
, const BRect
& updateRect
,
368 orientation orientation
, bool pressed
)
370 _DrawDefaultSplitter(this, frame
, updateRect
, orientation
, pressed
);
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);
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() {}