#ifndef __TEXTCONTAINER_HPP__
#define __TEXTCONTAINER_HPP__
#include "String.hpp"
#include "Container.hpp"
#include "MutableContainerAdapter.hpp"
#include "MutableContainer.hpp"
#include "ModifiableContainer.hpp"
#include "RangedContainer.hpp"
#include "PuncturedContainer.hpp"
#include "IndexPosition.hpp"
#include "VersionedObject.hpp"
#include "defines.h"
typedef Index Point;
abstract class TextCommand;
class List;
class PointPosition;
class CaretPosition;
class TextContainer : public RangedContainer,
public ModifiableContainer,
public PuncturedContainer,
public VersionedObject,
public virtual MutableContainerAdapter
{
public: TextContainer( String aSource );
public: TextContainer();
public: virtual ~TextContainer();
public: virtual String getContent() const;
public: virtual Point getCaret() const;
public: virtual Index getX() const;
public: virtual Index getY() const;
public: virtual Index getXOf( Point aPoint ) const;
public: virtual Index getYOf( Point aPoint ) const;
public: virtual void apply( TextCommand *aCommand );
public: virtual Point translate( Point aSource, Version aVersion );
public: virtual PointPosition *getCaretPosition();
public: virtual CaretPosition *getAlwaysCaretPosition() const;
public: virtual Index getLowBound() const;
public: virtual Index getHighBound() const;
public: virtual Top *getAt( const Index anIndex );
public: virtual Top *setAt( const Index anIndex, Top *aNewValue );
public: virtual PositionFactory *getDefaultPositionFactory() const;
public: virtual boolean canRemoveSlot( Position *aPosition ) const;
public: virtual void removeSlot( Position *aPosition );
public: virtual Position *getPunct() const;
public: virtual IndexPosition *getPosition( const Index anIndex );
public: virtual MutablePositionEnumeration *getMutableEnumeration() const;
public: virtual PositionEnumeration *getEnumeration() const;
public: virtual Index getCardinality() const;
public: virtual boolean isValid( const Position *aPosition ) const;
public: virtual Top *clone() const;
public: virtual String getString() const;
public: virtual String getClassName() const;
protected: void init( String aSource );
protected: boolean isChar( const Top *anObject ) const;
protected: Point caret;
protected: String content;
protected: List *history;
};
abstract class TextCommand : public virtual Top
{
public: virtual void apply( TextContainer *aTarget ) = 0;
public: virtual Point translate( Point aSource ) = 0;
public: virtual Point undoTranslate( Point aSource ) = 0;
};
class PointPosition : public IndexPosition
{
public: PointPosition( TextContainer *aContainer, Point aPoint );
public: virtual void update();
public: TextContainer *getTextContainer() const;
public: virtual boolean isValid() const;
public: virtual Top *getValue() const;
public: virtual Top *setValue( Top *aNewValue );
protected: Version version;
};
class CaretPosition : public PointPosition
{
public: CaretPosition( TextContainer *aContainer );
public: virtual boolean isValid() const;
public: virtual Top *getValue() const;
public: virtual Top *setValue( Top *aNewValue );
};
#endif