#ifndef __dom_selection_h__
#define __dom_selection_h__
#include "xml/dom_position.h"
class KHTMLPart;
class QPainter;
class QRect;
namespace khtml {
class RenderObject;
}
namespace DOM {
class NodeImpl;
class Position;
class Range;
class Selection
{
public:
enum EState { NONE, CARET, RANGE };
enum EAlter { MOVE, EXTEND };
enum EDirection { FORWARD, BACKWARD, RIGHT, LEFT };
enum ETextGranularity { CHARACTER, WORD, LINE, PARAGRAPH };
enum EAffinity { UPSTREAM = 0, DOWNSTREAM = 1 };
Selection();
Selection(const Range &);
Selection(const Position &);
Selection(const Position &, const Position &);
Selection(const Selection &);
EState state() const { return m_state; }
EAffinity affinity() const { return m_affinity; }
void setAffinity(EAffinity);
void moveTo(const Range &);
void moveTo(const Selection &);
void moveTo(const Position &);
void moveTo(const Position &, const Position &);
bool modify(EAlter, EDirection, ETextGranularity);
bool expandUsingGranularity(ETextGranularity);
void clear();
bool moveToRenderedContent();
void setBase(const Position &pos);
void setExtent(const Position &pos);
void setBaseAndExtent(const Position &base, const Position &extent);
void setStart(const Position &pos);
void setEnd(const Position &pos);
void setStartAndEnd(const Position &start, const Position &end);
Position base() const { return m_base; }
Position extent() const { return m_extent; }
Position start() const { return m_start; }
Position end() const { return m_end; }
QRect getRepaintRect() const;
void setNeedsLayout(bool flag=true);
void clearModifyBias() { m_modifyBiasSet = false; }
bool isEmpty() const { return state() == NONE; }
bool notEmpty() const { return !isEmpty(); }
Range toRange() const;
void debugPosition() const;
void debugRenderer(khtml::RenderObject *r, bool selected) const;
Selection &operator=(const Selection &o);
Selection &operator=(const Range &r) { moveTo(r); return *this; }
Selection &operator=(const Position &r) { moveTo(r); return *this; }
friend bool operator==(const Selection &a, const Selection &b);
friend bool operator!=(const Selection &a, const Selection &b);
friend class KHTMLPart;
private:
enum EPositionType { START, END, BASE, EXTENT };
void init();
void validate(ETextGranularity granularity=CHARACTER);
void assignBase(const Position &pos) { m_base = pos; }
void assignExtent(const Position &pos) { m_extent = pos; }
void assignBaseAndExtent(const Position &base, const Position &extent) { m_base = base; m_extent = extent; }
void assignStart(const Position &pos) { m_start = pos; }
void assignEnd(const Position &pos) { m_end = pos; }
void assignStartAndEnd(const Position &start, const Position &end) { m_start = start; m_end = end; }
void layoutCaret();
void needsCaretRepaint();
void paintCaret(QPainter *p, const QRect &rect);
bool nodeIsBeforeNode(NodeImpl *n1, NodeImpl *n2) const;
int xPosForVerticalArrowNavigation(EPositionType, bool recalc=false) const;
Position m_base; Position m_extent; Position m_start; Position m_end;
EState m_state; EAffinity m_affinity;
int m_caretX; int m_caretY;
int m_caretSize;
bool m_baseIsStart : 1; bool m_needsCaretLayout : 1; bool m_modifyBiasSet : 1; };
inline bool operator==(const Selection &a, const Selection &b)
{
return a.start() == b.start() && a.end() == b.end();
}
inline bool operator!=(const Selection &a, const Selection &b)
{
return !(a == b);
}
}
#endif // __dom_selection_h__