diff --git a/src/apps/terminal/Jamfile b/src/apps/terminal/Jamfile index f73db08417..91ad216381 100644 --- a/src/apps/terminal/Jamfile +++ b/src/apps/terminal/Jamfile @@ -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 ; diff --git a/src/apps/terminal/TerminalTextView.cpp b/src/apps/terminal/TerminalTextView.cpp new file mode 100644 index 0000000000..da922465cb --- /dev/null +++ b/src/apps/terminal/TerminalTextView.cpp @@ -0,0 +1,42 @@ +#include +#include +#include + +#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); +} diff --git a/src/apps/terminal/TerminalTextView.h b/src/apps/terminal/TerminalTextView.h new file mode 100644 index 0000000000..073b999981 --- /dev/null +++ b/src/apps/terminal/TerminalTextView.h @@ -0,0 +1,19 @@ +#ifndef TERMINAL_TEXT_VIEW_H +#define TERMINAL_TEXT_VIEW_H + +#include + +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 diff --git a/src/apps/terminal/TerminalView.cpp b/src/apps/terminal/TerminalView.cpp deleted file mode 100644 index 939f55020d..0000000000 --- a/src/apps/terminal/TerminalView.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#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); -} - diff --git a/src/apps/terminal/TerminalView.h b/src/apps/terminal/TerminalView.h deleted file mode 100644 index 3aa06b7643..0000000000 --- a/src/apps/terminal/TerminalView.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef TERMINAL_VIEW_H -#define TERMINAL_VIEW_H - -#include -#include -#include - -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 diff --git a/src/apps/terminal/TerminalWindow.cpp b/src/apps/terminal/TerminalWindow.cpp index 6b5d4b58e2..5333aa9b61 100644 --- a/src/apps/terminal/TerminalWindow.cpp +++ b/src/apps/terminal/TerminalWindow.cpp @@ -17,8 +17,9 @@ #include #include #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); diff --git a/src/apps/terminal/TerminalWindow.h b/src/apps/terminal/TerminalWindow.h index 24d19feb8c..28c5799577 100644 --- a/src/apps/terminal/TerminalWindow.h +++ b/src/apps/terminal/TerminalWindow.h @@ -9,7 +9,8 @@ #include #include -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; diff --git a/src/apps/terminal/ToggleScrollView.cpp b/src/apps/terminal/ToggleScrollView.cpp new file mode 100644 index 0000000000..f80c8fb26a --- /dev/null +++ b/src/apps/terminal/ToggleScrollView.cpp @@ -0,0 +1,159 @@ +#include +#include +#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; +} diff --git a/src/apps/terminal/ToggleScrollView.h b/src/apps/terminal/ToggleScrollView.h new file mode 100644 index 0000000000..06c4ba9abf --- /dev/null +++ b/src/apps/terminal/ToggleScrollView.h @@ -0,0 +1,61 @@ +#ifndef TOGGLE_SCROLL_VIEW_H +#define TOGGLE_SCROLL_VIEW_H + +#include + +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