#ifndef Selection_h
#define Selection_h
#include "TextGranularity.h"
#include "VisiblePosition.h"
namespace WebCore {
class Position;
const EAffinity SEL_DEFAULT_AFFINITY = DOWNSTREAM;
class Selection {
public:
enum EState { NONE, CARET, RANGE };
enum EDirection { FORWARD, BACKWARD, RIGHT, LEFT };
Selection();
Selection(const Position&, EAffinity);
Selection(const Position&, const Position&, EAffinity);
Selection(const Range*, EAffinity = SEL_DEFAULT_AFFINITY);
Selection(const VisiblePosition&);
Selection(const VisiblePosition&, const VisiblePosition&);
static Selection selectionFromContentsOfNode(Node*);
EState state() const { return m_state; }
void setAffinity(EAffinity affinity) { m_affinity = affinity; }
EAffinity affinity() const { return m_affinity; }
void setBase(const Position&);
void setBase(const VisiblePosition&);
void setExtent(const Position&);
void setExtent(const VisiblePosition&);
Position base() const { return m_base; }
Position extent() const { return m_extent; }
Position start() const { return m_start; }
Position end() const { return m_end; }
VisiblePosition visibleStart() const { return VisiblePosition(m_start, isRange() ? DOWNSTREAM : affinity()); }
VisiblePosition visibleEnd() const { return VisiblePosition(m_end, isRange() ? UPSTREAM : affinity()); }
bool isNone() const { return state() == NONE; }
bool isCaret() const { return state() == CARET; }
bool isRange() const { return state() == RANGE; }
bool isCaretOrRange() const { return state() != NONE; }
bool isBaseFirst() const { return m_baseIsFirst; }
bool expandUsingGranularity(TextGranularity granularity);
TextGranularity granularity() const { return m_granularity; }
PassRefPtr<Range> toRange() const;
Element* rootEditableElement() const;
bool isContentEditable() const;
bool isContentRichlyEditable() const;
void debugPosition() const;
#ifndef NDEBUG
void formatForDebugger(char* buffer, unsigned length) const;
void showTreeForThis() const;
#endif
private:
void validate();
void adjustForEditableContent();
Position m_base; Position m_extent; Position m_start; Position m_end;
EAffinity m_affinity; TextGranularity m_granularity;
EState m_state; bool m_baseIsFirst; };
inline bool operator==(const Selection& a, const Selection& b)
{
return a.start() == b.start() && a.end() == b.end() && a.affinity() == b.affinity() && a.granularity() == b.granularity();
}
inline bool operator!=(const Selection& a, const Selection& b)
{
return !(a == b);
}
}
#ifndef NDEBUG
void showTree(const WebCore::Selection&);
void showTree(const WebCore::Selection*);
#endif
#endif // Selection_h