haiku/src/apps/terminal/TermViewStates.h

178 lines
4.3 KiB
C++

/*
* 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 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