/* * Copyright 2001-2013, Haiku, Inc. * Copyright (c) 2003-4 Kian Duffy * Parts Copyright (C) 1998,99 Kazuho Okui and Takashi Murai. * * Distributed under the terms of the MIT license. * Authors: * Stefano Ceccherini, stefano.ceccherini@gmail.com * Kian Duffy, myob@users.sourceforge.net * Ingo Weinhold, ingo_weinhold@gmx.de * Siarzhuk Zharski, zharik@gmx.li */ #ifndef TERMVIEW_STATES_H #define TERMVIEW_STATES_H #include "HyperLink.h" #include "TerminalCharClassifier.h" #include "TermView.h" class TermView::State { public: State(TermView* view); virtual ~State(); virtual void Entered(); virtual void Exited(); virtual bool MessageReceived(BMessage* message); // returns true, if handled virtual void ModifiersChanged(int32 oldModifiers, int32 modifiers); virtual void KeyDown(const char* bytes, int32 numBytes); virtual void MouseDown(BPoint where, int32 buttons, int32 modifiers); virtual void MouseMoved(BPoint where, uint32 transit, const BMessage* dragMessage, int32 modifiers); virtual void MouseUp(BPoint where, int32 buttons); virtual void WindowActivated(bool active); virtual void VisibleTextBufferChanged(); protected: TermView* fView; }; class TermView::StandardBaseState : public TermView::State { public: StandardBaseState(TermView* view); protected: bool _StandardMouseMoved(BPoint where, int32 modifiers); }; class TermView::DefaultState : public TermView::StandardBaseState { public: DefaultState(TermView* view); virtual void ModifiersChanged(int32 oldModifiers, int32 modifiers); virtual void KeyDown(const char* bytes, int32 numBytes); virtual void MouseDown(BPoint where, int32 buttons, int32 modifiers); virtual void MouseMoved(BPoint where, uint32 transit, const BMessage* dragMessage, int32 modifiers); virtual void MouseUp(BPoint where, int32 buttons); virtual void WindowActivated(bool active); private: bool _CheckEnterHyperLinkState(int32 modifiers); }; class TermView::SelectState : public TermView::StandardBaseState { public: SelectState(TermView* view); void Prepare(BPoint where, int32 modifiers); virtual bool MessageReceived(BMessage* message); virtual void MouseMoved(BPoint where, uint32 transit, const BMessage* dragMessage, int32 modifiers); virtual void MouseUp(BPoint where, int32 buttons); private: void _AutoScrollUpdate(); private: int32 fSelectGranularity; bool fCheckMouseTracking; bool fMouseTracking; }; class TermView::HyperLinkState : public TermView::State, private TermViewHighlighter { public: HyperLinkState(TermView* view); virtual void Entered(); virtual void Exited(); virtual void ModifiersChanged(int32 oldModifiers, int32 modifiers); virtual void MouseDown(BPoint where, int32 buttons, int32 modifiers); virtual void MouseMoved(BPoint where, uint32 transit, const BMessage* dragMessage, int32 modifiers); virtual void WindowActivated(bool active); virtual void VisibleTextBufferChanged(); private: // TermViewHighlighter virtual rgb_color ForegroundColor(); virtual rgb_color BackgroundColor(); virtual uint32 AdjustTextAttributes(uint32 attributes); private: struct CharPosition { int32 index; TermPos position; }; private: bool _GetHyperLinkAt(BPoint where, bool pathPrefixOnly, HyperLink& _link, TermPos& _start, TermPos& _end); bool _EntryExists(const BString& path, BString& _actualPath) const; void _UpdateHighlight(); void _UpdateHighlight(BPoint where, int32 modifiers); void _ActivateHighlight(const TermPos& start, const TermPos& end); void _DeactivateHighlight(); private: DefaultCharClassifier fURLCharClassifier; DefaultCharClassifier fPathComponentCharClassifier; BString fCurrentDirectory; TermViewHighlight fHighlight; bool fHighlightActive; }; class TermView::HyperLinkMenuState : public TermView::State { public: HyperLinkMenuState(TermView* view); void Prepare(BPoint point, const HyperLink& link); virtual void Exited(); virtual bool MessageReceived(BMessage* message); private: class PopUpMenu; private: HyperLink fLink; }; #endif // TERMVIEW_STATES_H