#ifndef __htmlediting_h__
#define __htmlediting_h__
#include "dom_position.h"
#include "dom_selection.h"
#include "dom_string.h"
#include "shared.h"
#include "xml/dom_nodeimpl.h"
namespace DOM {
class CSSStyleDeclarationImpl;
class DocumentFragmentImpl;
class DocumentImpl;
class DOMString;
class ElementImpl;
class NodeImpl;
class Position;
class Selection;
class TextImpl;
};
namespace khtml {
class AppendNodeCommandImpl;
class ApplyStyleCommandImpl;
class CompositeEditCommandImpl;
class DeleteCollapsibleWhitespaceCommandImpl;
class DeleteSelectionCommandImpl;
class DeleteTextCommandImpl;
class EditCommand;
class EditCommandImpl;
class InputNewlineCommandImpl;
class InputTextCommandImpl;
class InsertNodeBeforeCommandImpl;
class InsertTextCommandImpl;
class JoinTextNodesCommandImpl;
class MoveSelectionCommandImpl;
class ReplaceSelectionCommandImpl;
class RemoveCSSPropertyCommandImpl;
class RemoveNodeAttributeCommandImpl;
class RemoveNodeCommandImpl;
class RemoveNodeAndPruneCommandImpl;
class RemoveNodePreservingChildrenCommandImpl;
class SetNodeAttributeCommandImpl;
class SplitTextNodeCommandImpl;
class TypingCommandImpl;
enum ECommandID {
EditCommandID, AppendNodeCommandID,
ApplyStyleCommandID,
CompositeEditCommandID,
DeleteCollapsibleWhitespaceCommandID,
DeleteSelectionCommandID,
DeleteTextCommandID,
InputNewlineCommandID,
InputTextCommandID,
InsertNodeBeforeCommandID,
InsertTextCommandID,
JoinTextNodesCommandID,
MoveSelectionCommandID,
ReplaceSelectionCommandID,
RemoveCSSPropertyCommandID,
RemoveNodeAttributeCommandID,
RemoveNodeCommandID,
RemoveNodeAndPruneCommandID,
RemoveNodePreservingChildrenCommandID,
SetNodeAttributeCommandID,
SplitTextNodeCommandID,
TypingCommandID,
};
class SharedCommandImpl : public Shared<SharedCommandImpl>
{
public:
SharedCommandImpl() {}
virtual ~SharedCommandImpl() {}
virtual int commandID() const = 0;
virtual bool isCompositeStep() const = 0;
virtual void apply() = 0;
virtual void unapply() = 0;
virtual void reapply() = 0;
virtual DOM::DocumentImpl * const document() const = 0;
virtual DOM::Selection startingSelection() const = 0;
virtual DOM::Selection endingSelection() const = 0;
virtual void setStartingSelection(const DOM::Selection &s) = 0;
virtual void setEndingSelection(const DOM::Selection &s) = 0;
virtual EditCommand parent() const = 0;
virtual void setParent(const EditCommand &) = 0;
};
class EditCommand : public SharedPtr<SharedCommandImpl>
{
public:
EditCommand();
EditCommand(EditCommandImpl *);
EditCommand(const EditCommand &);
virtual ~EditCommand();
int commandID() const;
bool isCompositeStep() const;
bool isNull() const;
bool notNull() const;
void apply();
void unapply();
void reapply();
DOM::DocumentImpl * const document() const;
DOM::Selection startingSelection() const;
DOM::Selection endingSelection() const;
void setStartingSelection(const DOM::Selection &s);
void setEndingSelection(const DOM::Selection &s);
EditCommand parent() const;
void setParent(const EditCommand &);
EditCommandImpl *handle() const;
static EditCommand &emptyCommand();
};
class CompositeEditCommand : public EditCommand
{
public:
CompositeEditCommand();
CompositeEditCommand(CompositeEditCommandImpl *);
CompositeEditCommand(const CompositeEditCommand &);
virtual ~CompositeEditCommand();
private:
inline CompositeEditCommandImpl *impl() const;
};
class AppendNodeCommand : public EditCommand
{
public:
AppendNodeCommand(DOM::DocumentImpl *, DOM::NodeImpl *parentNode, DOM::NodeImpl *appendChild);
virtual ~AppendNodeCommand();
DOM::NodeImpl *parentNode() const;
DOM::NodeImpl *appendChild() const;
private:
inline AppendNodeCommandImpl *impl() const;
};
class ApplyStyleCommand : public CompositeEditCommand
{
public:
ApplyStyleCommand(DOM::DocumentImpl *, DOM::CSSStyleDeclarationImpl *);
virtual ~ApplyStyleCommand();
DOM::CSSStyleDeclarationImpl *style() const;
private:
inline ApplyStyleCommandImpl *impl() const;
};
class DeleteCollapsibleWhitespaceCommand : public CompositeEditCommand
{
public:
DeleteCollapsibleWhitespaceCommand(DOM::DocumentImpl *document);
DeleteCollapsibleWhitespaceCommand(DOM::DocumentImpl *document, const DOM::Selection &selection);
virtual ~DeleteCollapsibleWhitespaceCommand();
private:
inline DeleteCollapsibleWhitespaceCommandImpl *impl() const;
};
class DeleteSelectionCommand : public CompositeEditCommand
{
public:
DeleteSelectionCommand(DOM::DocumentImpl *document);
DeleteSelectionCommand(DOM::DocumentImpl *document, const DOM::Selection &selection);
virtual ~DeleteSelectionCommand();
private:
inline DeleteSelectionCommandImpl *impl() const;
};
class DeleteTextCommand : public EditCommand
{
public:
DeleteTextCommand(DOM::DocumentImpl *document, DOM::TextImpl *, long offset, long count);
DeleteTextCommand(const DeleteTextCommand &);
virtual ~DeleteTextCommand();
DOM::TextImpl *node() const;
long offset() const;
long count() const;
private:
inline DeleteTextCommandImpl *impl() const;
};
class InputNewlineCommand : public CompositeEditCommand
{
public:
InputNewlineCommand(DOM::DocumentImpl *document);
virtual ~InputNewlineCommand();
private:
inline InputNewlineCommandImpl *impl() const;
};
class InputTextCommand : public CompositeEditCommand
{
public:
InputTextCommand(DOM::DocumentImpl *document);
virtual ~InputTextCommand();
void deleteCharacter();
void input(const DOM::DOMString &text);
unsigned long charactersAdded() const;
private:
inline InputTextCommandImpl *impl() const;
};
class InsertNodeBeforeCommand : public EditCommand
{
public:
InsertNodeBeforeCommand();
InsertNodeBeforeCommand(DOM::DocumentImpl *, DOM::NodeImpl *insertChild, DOM::NodeImpl *refChild);
InsertNodeBeforeCommand(const InsertNodeBeforeCommand &);
virtual ~InsertNodeBeforeCommand();
DOM::NodeImpl *insertChild() const;
DOM::NodeImpl *refChild() const;
private:
inline InsertNodeBeforeCommandImpl *impl() const;
};
class InsertTextCommand : public EditCommand
{
public:
InsertTextCommand(DOM::DocumentImpl *document, DOM::TextImpl *, long, const DOM::DOMString &);
virtual ~InsertTextCommand();
DOM::TextImpl *node() const;
long offset() const;
DOM::DOMString text() const;
private:
inline InsertTextCommandImpl *impl() const;
};
class JoinTextNodesCommand : public EditCommand
{
public:
JoinTextNodesCommand(DOM::DocumentImpl *, DOM::TextImpl *, DOM::TextImpl *);
virtual ~JoinTextNodesCommand();
DOM::TextImpl *firstNode() const;
DOM::TextImpl *secondNode() const;
private:
inline JoinTextNodesCommandImpl *impl() const;
};
class ReplaceSelectionCommand : public CompositeEditCommand
{
public:
ReplaceSelectionCommand(DOM::DocumentImpl *document, DOM::DocumentFragmentImpl *fragment, bool selectReplacement=true);
virtual ~ReplaceSelectionCommand();
private:
inline ReplaceSelectionCommandImpl *impl() const;
};
class MoveSelectionCommand : public CompositeEditCommand
{
public:
MoveSelectionCommand(DOM::DocumentImpl *document, DOM::DocumentFragmentImpl *fragment, DOM::Position &position);
virtual ~MoveSelectionCommand();
private:
inline MoveSelectionCommandImpl *impl() const;
};
class RemoveCSSPropertyCommand : public EditCommand
{
public:
RemoveCSSPropertyCommand(DOM::DocumentImpl *, DOM::CSSStyleDeclarationImpl *, int property);
virtual ~RemoveCSSPropertyCommand();
DOM::CSSStyleDeclarationImpl *styleDeclaration() const;
int property() const;
private:
inline RemoveCSSPropertyCommandImpl *impl() const;
};
class RemoveNodeAttributeCommand : public EditCommand
{
public:
RemoveNodeAttributeCommand(DOM::DocumentImpl *, DOM::ElementImpl *, DOM::NodeImpl::Id attribute);
virtual ~RemoveNodeAttributeCommand();
DOM::ElementImpl *element() const;
DOM::NodeImpl::Id attribute() const;
private:
inline RemoveNodeAttributeCommandImpl *impl() const;
};
class RemoveNodeCommand : public EditCommand
{
public:
RemoveNodeCommand(DOM::DocumentImpl *, DOM::NodeImpl *node);
virtual ~RemoveNodeCommand();
DOM::NodeImpl *node() const;
private:
inline RemoveNodeCommandImpl *impl() const;
};
class RemoveNodeAndPruneCommand : public CompositeEditCommand
{
public:
RemoveNodeAndPruneCommand(DOM::DocumentImpl *, DOM::NodeImpl *pruneNode, DOM::NodeImpl *stopNode=0);
virtual ~RemoveNodeAndPruneCommand();
DOM::NodeImpl *pruneNode() const;
DOM::NodeImpl *stopNode() const;
private:
inline RemoveNodeAndPruneCommandImpl *impl() const;
};
class RemoveNodePreservingChildrenCommand : public CompositeEditCommand
{
public:
RemoveNodePreservingChildrenCommand(DOM::DocumentImpl *document, DOM::NodeImpl *node);
virtual ~RemoveNodePreservingChildrenCommand();
DOM::NodeImpl *node() const;
private:
inline RemoveNodePreservingChildrenCommandImpl *impl() const;
};
class SetNodeAttributeCommand : public EditCommand
{
public:
SetNodeAttributeCommand(DOM::DocumentImpl *, DOM::ElementImpl *, DOM::NodeImpl::Id attribute, const DOM::DOMString &value);
virtual ~SetNodeAttributeCommand();
DOM::ElementImpl *element() const;
DOM::NodeImpl::Id attribute() const;
DOM::DOMString value() const;
private:
inline SetNodeAttributeCommandImpl *impl() const;
};
class SplitTextNodeCommand : public EditCommand
{
public:
SplitTextNodeCommand(DOM::DocumentImpl *, DOM::TextImpl *, long);
virtual ~SplitTextNodeCommand();
DOM::TextImpl *node() const;
long offset() const;
private:
inline SplitTextNodeCommandImpl *impl() const;
};
class TypingCommand : public CompositeEditCommand
{
public:
static void deleteKeyPressed(DOM::DocumentImpl *document);
static void insertText(DOM::DocumentImpl *document, const DOM::DOMString &text);
static void insertNewline(DOM::DocumentImpl *document);
static bool isOpenForMoreTypingCommand(const EditCommand &);
static void closeTyping(EditCommand);
bool openForMoreTyping() const;
void closeTyping();
private:
TypingCommand(DOM::DocumentImpl *document);
TypingCommand(TypingCommand *);
TypingCommand(const TypingCommand &);
virtual ~TypingCommand();
void deleteKeyPressed();
void insertText(const DOM::DOMString &text);
void insertNewline();
inline TypingCommandImpl *impl() const;
};
}
#endif