haiku/headers/os/interface/ScrollView.h
Adrien Destugues bdb4ae32fd Fix unarchiving of BScrollView with layout
* We archive views using "managed" archives, and the children are not
attached in the BView(BMessage*) constructor, but later. So it's not
possible to find the target and scrollbars in the constructor of
BScrollView.
* Make BScrollView override AllUnarchived and find the target and
scrollbars again there. The code is slightly different as there is no
guarantee that the first child will be the target in that case. The
existing code in the constructor is preserved for non-managed archives.
2014-10-12 16:02:34 +02:00

133 lines
3.8 KiB
C++

/*
* Copyright 2004-2009, Axel Dörfler, axeld@pinc-software.de.
* Copyright 2014 Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Axel Dörfler, axeld@pinc-software.de
* John Scipione, jscpione@gmail.com
*/
#ifndef _SCROLL_VIEW_H
#define _SCROLL_VIEW_H
#include <ScrollBar.h>
/*! The BScrollView is a convenience class to add a scrolling
mechanism to the target view.
*/
class BScrollView : public BView {
public:
BScrollView(const char* name, BView* target,
uint32 resizingMode
= B_FOLLOW_LEFT | B_FOLLOW_TOP,
uint32 flags = 0, bool horizontal = false,
bool vertical = false,
border_style border = B_FANCY_BORDER);
BScrollView(const char* name, BView* target,
uint32 flags, bool horizontal,
bool vertical, border_style border
= B_FANCY_BORDER);
BScrollView(BMessage* archive);
virtual ~BScrollView();
static BArchivable* Instantiate(BMessage* archive);
virtual status_t Archive(BMessage* archive, bool deep = true) const;
virtual status_t AllUnarchived(const BMessage* archive);
// Hook methods
virtual void AllAttached();
virtual void AllDetached();
virtual void AttachedToWindow();
virtual void DetachedFromWindow();
virtual void Draw(BRect updateRect);
virtual void FrameMoved(BPoint newPosition);
virtual void FrameResized(float newWidth, float newHeight);
virtual void MessageReceived(BMessage* message);
virtual void MouseDown(BPoint where);
virtual void MouseMoved(BPoint where, uint32 code,
const BMessage* dragMessage);
virtual void MouseUp(BPoint where);
virtual void WindowActivated(bool active);
// Size
virtual void GetPreferredSize(float* _width, float* _height);
virtual void ResizeToPreferred();
virtual void MakeFocus(bool focus = true);
virtual BSize MinSize();
virtual BSize MaxSize();
virtual BSize PreferredSize();
// BScrollBar
BScrollBar* ScrollBar(orientation posture) const;
virtual void SetBorder(border_style border);
border_style Border() const;
virtual status_t SetBorderHighlighted(bool highlight);
bool IsBorderHighlighted() const;
void SetTarget(BView* target);
BView* Target() const;
// Scripting
virtual BHandler* ResolveSpecifier(BMessage* message,
int32 index, BMessage* specifier,
int32 what, const char* property);
virtual status_t GetSupportedSuites(BMessage* message);
virtual status_t Perform(perform_code d, void* arg);
protected:
virtual void LayoutInvalidated(bool descendants = false);
virtual void DoLayout();
private:
// FBC padding and forbidden methods
virtual void _ReservedScrollView1();
virtual void _ReservedScrollView2();
virtual void _ReservedScrollView3();
virtual void _ReservedScrollView4();
BScrollView& operator=(const BScrollView& other);
private:
friend class BView;
void _Init(bool horizontal, bool vertical);
float _BorderSize() const;
BRect _InnerFrame() const;
BSize _ComputeSize(BSize targetSize) const;
BRect _ComputeFrame(BRect targetRect) const;
void _AlignScrollBars(bool horizontal,
bool vertical, BRect targetFrame);
static BRect _ComputeFrame(BRect frame, bool horizontal,
bool vertical, border_style border);
static BRect _ComputeFrame(BView* target, bool horizontal,
bool vertical, border_style border);
static float _BorderSize(border_style border);
static int32 _ModifyFlags(int32 flags, border_style border);
private:
BView* fTarget;
BScrollBar* fHorizontalScrollBar;
BScrollBar* fVerticalScrollBar;
border_style fBorder;
uint16 fPreviousWidth;
uint16 fPreviousHeight;
bool fHighlighted;
uint32 _reserved[3];
};
#endif // _SCROLL_VIEW_H