move towards smarter scrollers

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3100 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
shatty 2003-04-24 07:55:28 +00:00
parent 39749b49af
commit 0873b6e545
9 changed files with 294 additions and 70 deletions

View File

@ -5,11 +5,10 @@ SubDir OBOS_TOP src apps terminal ;
# ;
App Terminal :
ToggleScrollView.cpp
TerminalTextView.cpp
TerminalWindow.cpp
TerminalApp.cpp
TerminalView.cpp
TerminalWindow.cpp ;
# ColorMenuItem.cpp
# FindWindow.cpp
# ReplaceWindow.cpp
;
LinkSharedOSLibs Terminal : be stdc++.r4 translation tracker ;

View File

@ -0,0 +1,42 @@
#include <Handler.h>
#include <Messenger.h>
#include <Rect.h>
#include "TerminalTextView.h"
#include "Constants.h"
TerminalTextView::TerminalTextView(BRect viewFrame, BRect textBounds, BHandler *handler)
: BTextView(viewFrame, "textview", textBounds,
B_FOLLOW_ALL, B_FRAME_EVENTS|B_WILL_DRAW)
{
fHandler = handler;
fMessenger = new BMessenger(handler);
SetWordWrap(false);
}
TerminalTextView::~TerminalTextView(){
}
void
TerminalTextView::Select(int32 start, int32 finish)
{
if (start == finish) {
fMessenger->SendMessage(DISABLE_ITEMS);
} else {
fMessenger->SendMessage(ENABLE_ITEMS);
}
BTextView::Select(start, finish);
}
void
TerminalTextView::FrameResized(float width, float height)
{
BRect oldText = TextRect();
BTextView::FrameResized(width, height);
BRect textRect;
textRect = Bounds();
textRect.InsetBy(TEXT_INSET,TEXT_INSET);
SetTextRect(textRect);
}

View File

@ -0,0 +1,19 @@
#ifndef TERMINAL_TEXT_VIEW_H
#define TERMINAL_TEXT_VIEW_H
#include <TextView.h>
class TerminalTextView : public BTextView {
public:
TerminalTextView(BRect viewframe, BRect textframe, BHandler *handler);
~TerminalTextView();
virtual void Select(int32 start, int32 finish);
virtual void FrameResized(float width, float height);
private:
BHandler *fHandler;
BMessenger *fMessenger;
};
#endif // TERMINAL_TEXT_VIEW_H

View File

@ -1,35 +0,0 @@
#include <Message.h>
#include <Messenger.h>
#include <Rect.h>
#include <Region.h>
#include <TranslationUtils.h>
#include <TranslatorRoster.h>
#include <Node.h>
#include "TerminalView.h"
#include "Constants.h"
TerminalView::TerminalView(BRect viewFrame, BRect textBounds, BHandler *handler)
: BTextView(viewFrame, "textview", textBounds,
B_FOLLOW_ALL, B_FRAME_EVENTS|B_WILL_DRAW)
{
fHandler= handler;
fMessenger= new BMessenger(handler);
}
TerminalView::~TerminalView(){
}
void
TerminalView::Select(int32 start, int32 finish)
{
if(start==finish)
fChangeMessage= new BMessage(DISABLE_ITEMS);
else
fChangeMessage= new BMessage(ENABLE_ITEMS);
fMessenger->SendMessage(fChangeMessage);
BTextView::Select(start, finish);
}

View File

@ -1,21 +0,0 @@
#ifndef TERMINAL_VIEW_H
#define TERMINAL_VIEW_H
#include <File.h>
#include <TextView.h>
#include <DataIO.h>
class TerminalView : public BTextView {
public:
TerminalView(BRect viewframe, BRect textframe, BHandler *handler);
~TerminalView();
virtual void Select(int32 start, int32 finish);
private:
BHandler *fHandler;
BMessage *fChangeMessage;
BMessenger *fMessenger;
};
#endif // TERMINAL_VIEW_H

View File

@ -17,8 +17,9 @@
#include <TranslationUtils.h>
#include <Window.h>
#include "Constants.h"
#include "ToggleScrollView.h"
#include "TerminalApp.h"
#include "TerminalView.h"
#include "TerminalTextView.h"
#include "TerminalWindow.h"
TerminalWindow::TerminalWindow(BPoint topLeft, int32 id)
@ -96,18 +97,16 @@ TerminalWindow::InitWindow(int32 id, entry_ref * settingsRef)
viewFrame = Bounds();
viewFrame.top = fMenuBar->Bounds().Height()+1;
viewFrame.right -= B_V_SCROLL_BAR_WIDTH;
viewFrame.left = 0;
viewFrame.bottom -= B_H_SCROLL_BAR_HEIGHT;
textBounds = viewFrame;
textBounds.OffsetTo(B_ORIGIN);
textBounds.InsetBy(TEXT_INSET, TEXT_INSET);
fTextView = new TerminalView(viewFrame, textBounds, this);
fTextView = new TerminalTextView(viewFrame, textBounds, this);
fTextView->SetStylable(true);
fScrollView = new BScrollView("scrollview", fTextView, B_FOLLOW_ALL, 0, false, true, B_PLAIN_BORDER);
fScrollView = new ToggleScrollView("scrollview", fTextView, 0, false, true, B_PLAIN_BORDER);
AddChild(fScrollView);
fTextView->MakeFocus(true);

View File

@ -9,7 +9,8 @@
#include <TextView.h>
#include <Window.h>
class TerminalView;
class ToggleScrollView;
class TerminalTextView;
class TerminalWindow
: public BWindow
@ -62,8 +63,8 @@ private:
BMenuItem *fSaveAsSettingsFile;
// Main views
TerminalView *fTextView;
BScrollView *fScrollView;
TerminalTextView*fTextView;
ToggleScrollView*fScrollView;
// File panels
BFilePanel *fLogToFilePanel;

View File

@ -0,0 +1,159 @@
#include <ScrollBar.h>
#include <ScrollView.h>
#include "ToggleScrollView.h"
ToggleScrollView::ToggleScrollView(const char * name, BView * target,
uint32 flags = 0,
bool horizontal = false, bool vertical = false,
border_style border = B_FANCY_BORDER,
bool auto_hide_horizontal = false,
bool auto_hide_vertical = false)
: BView(target->Bounds(),name,target->ResizingMode(),flags)
{
_name = name; _target = target; _flags = flags;
_horizontal = horizontal; _vertical = vertical; _border = border;
_auto_hide_horizontal = auto_hide_horizontal;
_auto_hide_vertical = auto_hide_vertical;
_target = ResizeTarget(_target,_horizontal,_vertical);
fScrollView = new BScrollView(_name,_target,_target->ResizingMode(),_horizontal,_vertical,_border);
AddChild(fScrollView);
}
ToggleScrollView::~ToggleScrollView()
{
}
BArchivable *
ToggleScrollView::Instantiate(BMessage *data) { }
status_t
ToggleScrollView::Archive(BMessage *data, bool deep = true) const { }
BScrollBar *
ToggleScrollView::ScrollBar(orientation flag) const {
return fScrollView->ScrollBar(flag);
}
// extension to BScrollView API
void
ToggleScrollView::ToggleScrollBar(bool horizontal = false, bool vertical = false) {
if (!horizontal && !vertical) {
return;
}
float delta_x = 0, delta_y = 0;
if (vertical) {
if (ScrollBar(B_VERTICAL) != 0) {
delta_x = B_V_SCROLL_BAR_WIDTH;
} else {
delta_x = -B_V_SCROLL_BAR_WIDTH;
}
}
if (horizontal) {
if (ScrollBar(B_HORIZONTAL) != 0) {
delta_y = B_H_SCROLL_BAR_HEIGHT;
} else {
delta_y = -B_H_SCROLL_BAR_HEIGHT;
}
}
_target->ResizeBy(delta_x,delta_y);
BScrollView * oldView = fScrollView;
if (oldView) {
oldView->RemoveChild(_target);
RemoveChild(oldView);
delete oldView;
}
fScrollView = new BScrollView(_name,_target,_target->ResizingMode(),_horizontal,_vertical,_border);
AddChild(fScrollView);
}
void
ToggleScrollView::SetBorder(border_style border) {
fScrollView->SetBorder(border);
}
border_style
ToggleScrollView::Border() const {
return fScrollView->Border();
}
status_t
ToggleScrollView::SetBorderHighlighted(bool state) {
return fScrollView->SetBorderHighlighted(state);
}
bool
ToggleScrollView::IsBorderHighlighted() const {
return fScrollView->IsBorderHighlighted();
}
void
ToggleScrollView::SetTarget(BView *new_target) {
if (new_target != fScrollView->Target()) {
_target = new_target;
ResizeTarget(_target,_horizontal,_vertical);
fScrollView->SetTarget(_target);
SetResizingMode(_target->ResizingMode());
}
}
BView *
ToggleScrollView::Target() const {
return fScrollView->Target();
}
BHandler *
ToggleScrollView::ResolveSpecifier(BMessage *msg,
int32 index,
BMessage *specifier,
int32 form,
const char *property) {
return fScrollView->ResolveSpecifier(msg,index,specifier,form,property);
}
void
ToggleScrollView::ResizeToPreferred() {
fScrollView->ResizeToPreferred();
}
void
ToggleScrollView::GetPreferredSize(float *width, float *height) {
fScrollView->GetPreferredSize(width,height);
}
void
ToggleScrollView::MakeFocus(bool state = true) {
fScrollView->MakeFocus(state);
}
// overloaded functions
void
ToggleScrollView::SetFlags(uint32 flags)
{
_flags = flags;
fScrollView->SetFlags(_flags);
BView::SetFlags(_flags);
}
void
ToggleScrollView::SetResizingMode(uint32 mode)
{
_target->SetResizingMode(mode);
fScrollView->SetResizingMode(mode);
BView::SetResizingMode(mode);
}
// private
BView *
ToggleScrollView::ResizeTarget(BView * target, bool horizontal, bool vertical)
{
float delta_x = 0, delta_y = 0;
if (vertical) {
delta_x = -B_V_SCROLL_BAR_WIDTH;
}
if (horizontal) {
delta_y = -B_H_SCROLL_BAR_HEIGHT;
}
target->ResizeBy(delta_x,delta_y);
target->FrameResized(target->Bounds().Width(),target->Bounds().Height());
return target;
}

View File

@ -0,0 +1,61 @@
#ifndef TOGGLE_SCROLL_VIEW_H
#define TOGGLE_SCROLL_VIEW_H
#include <ScrollView.h>
class ToggleScrollView : public BView {
public:
ToggleScrollView(const char * name, BView * target,
uint32 flags = 0,
bool horizontal = false, bool vertical = false,
border_style border = B_FANCY_BORDER,
bool auto_hide_horizontal = false,
bool auto_hide_vertical = false);
virtual ~ToggleScrollView();
static BArchivable *Instantiate(BMessage *data);
virtual status_t Archive(BMessage *data, bool deep = true) const;
virtual BScrollBar *ScrollBar(orientation flag) const;
// extension to BScrollView API
virtual void ToggleScrollBar(bool horizontal = false,
bool vertical = false);
virtual void SetBorder(border_style border);
virtual border_style Border() const;
virtual status_t SetBorderHighlighted(bool state);
virtual bool IsBorderHighlighted() const;
virtual void SetTarget(BView *new_target);
virtual BView *Target() const;
virtual BHandler *ResolveSpecifier(BMessage *msg,
int32 index,
BMessage *specifier,
int32 form,
const char *property);
virtual void ResizeToPreferred();
virtual void GetPreferredSize(float *width, float *height);
virtual void MakeFocus(bool state = true);
// overloaded functions
virtual void SetFlags(uint32 flags);
virtual void SetResizingMode(uint32 mode);
private:
static BView * ResizeTarget(BView * target, bool horizontal, bool vertical);
const char * _name;
BView * _target;
uint32 _flags;
bool _horizontal;
bool _vertical;
border_style _border;
bool _auto_hide_horizontal;
bool _auto_hide_vertical;
BScrollView * fScrollView;
};
#endif // TOGGLE_SCROLL_VIEW_H