root/src/apps/terminal/TermViewStates.h
/*
 * Copyright 2001-2013, Haiku, Inc.
 * Copyright (c) 2003-4 Kian Duffy <myob@users.sourceforge.net>
 * 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