Milán Major

netscape-revival

1 branch
Code

lib/mac/VText/V_PowerPlant_Mods/LStyleSet.h

//	===========================================================================
//	LStyleSet.h					©1994 Metrowerks Inc. All rights reserved.
//	===========================================================================

#pragma once

#include	<LSharableModel.h>
#include	<LStreamable.h>
#include	<UTextTraits.h>
#include	<LTextEngine.h>
#include	<WFixed.h>

class	LAEStream;
class	LAESubDesc;

//	===========================================================================

typedef enum {
	textDirection_Undefined,
	textDirection_LeftToRight,
	textDirection_RightToLeft
}	TextDirectionE;

typedef struct StyleRunPositionT {
protected:
	enum {
		stylePosition_First	= 0x10,
		stylePosition_Last = 0x20
	};
	
	Int16	mPosition;
public:
			StyleRunPositionT()						{}
			StyleRunPositionT(
				Boolean inLeftToRight,
				Boolean inFirstRun,
				Boolean	inLastRun);
			~StyleRunPositionT()					{}

	inline	operator	JustStyleCode()	const		{return mPosition & 0x03;}
	inline	Boolean		IsLast(void) const			{return (mPosition & stylePosition_Last) != 0;}
} StyleRunPositionT;

//	===========================================================================

class	LStyleSet
			:	public LSharableModel
			,	public LStreamable
{
private:
	typedef	LSharableModel	inheritAEOM;
	
public:
						LStyleSet(const LStyleSet *inOriginal);
						LStyleSet();
	virtual				~LStyleSet();
	
	virtual Boolean		operator==(const LStyleSet &inRhs) const;

	virtual void		WriteFlavorRecord(
							FlavorType	inFlavor,
							LStream		&inStream) const;
	virtual void		ReadFlavorRecord(
							FlavorType	inFlavor,
							LStream		&inStream);

	virtual void		SetTextTraits(const TextTraitsRecord &inTraits);
	virtual void		GetTextTraits(TextTraitsRecord *outTraits) const;

				//	Query
	virtual	FixedT		Insertion2Pixel(
							const TextRangeT	&inQueryRange,
							const Ptr			inText,
							const TextRangeT	&inRangePt,
							StyleRunPositionT	inPosition,
							FixedT				inSlop) const = 0;							
	virtual void		Pixel2Range(
							const TextRangeT	&inQueryRange,
							const Ptr			inText,
							FixedT				inPixelOffset,
							StyleRunPositionT	inPosition,
							FixedT				inSlop,
							TextRangeT			&outRange,
							Boolean				&outLeadingEdge) const = 0;
	virtual	Int32		GetHeight(void) const = 0;
	virtual	Int32		GetAscent(void) const = 0;
	virtual	Boolean		CaretInside(void) const;
	virtual	Boolean		IsProportional(void) const;
//-	virtual	FixedT		MaxCharWidth(void) const;
/*-	virtual	Int32		FindCharSize(
							const Ptr	inBuffer,
							Uint16		inOffset = 0) const;
	virtual	Int32		PrevCharSize(
							const Ptr	inBuffer,
							Uint16		inOffset) const;
	virtual Boolean		CharIsLeftToRight(const Ptr inCharPtr) const;
	virtual Boolean		IsLeftToRight(void) const;	
*/
	virtual	Int32		FindCharSize(
							const TextRangeT	&inStyleRange,
							const Ptr			inText,
							const TextRangeT	&inInsertionPt) const;
	virtual	TextDirectionE
						CharDirection(
							const TextRangeT	&inStyleRange,
							const Ptr			inText,
							const TextRangeT	&inInsertionPt) const;
	virtual TextDirectionE
						StyleDirection(void) const;	
							
	
		virtual ScriptCode	GetScript(void) const;
	virtual	LangCode	GetLanguage(void) const;
						//	avoid using these...
	virtual	Int32		GetFontNumber(void) const;
	virtual Int32		GetFontSize(void) const;
	virtual Int32		GetFontFace(void) const;
	
				//	Formatting
	virtual void		LineBreakScan(
							const TextRangeT	&inLineRange,
							const TextRangeT	&inScriptRange,
							const TextRangeT	&inStyleRange,
							const Ptr			inText,
							FixedT				inWidth,
							TextRangeT			&outRange,
							FixedT				&outWidthUnused,
							StyledLineBreakCode	&outBreakCode) const;
	virtual Int32		VisibleLength(
							const Ptr			inText,
							Int32				inLength) const;
	virtual FixedT		TextWidth(
							const Ptr			inText,
							Int32				inLength) const;
	virtual	FixedT		Portion(
							const Ptr				inText,
							Int32					inVisibleLength,
							const StyleRunPositionT	&inPosition) const;
				
				//	Drawing
	virtual void		Draw(
							const TextRangeT	&inRange,
							const Ptr			inText,
							StyleRunPositionT	inPosition,
							FixedT				inSlop) const;

				//	Implementation
/*-
	virtual Boolean		FindCommandStatus(CommandT inCommand,
							Boolean &outEnabled, Boolean &outUsesMark,
							Char16 &outMark, Str255 outName);
*/

	virtual	void		Focus(void) const;	//	Necessary?

				//	AEOM
	virtual void		GetAEProperty(
								DescType		inProperty,
								const AEDesc	&inRequestedType,
								AEDesc			&outPropertyDesc) const;
	virtual void		SetAEProperty(
								DescType		inProperty,
								const AEDesc	&inValue,
								AEDesc			&outAEReply);

	virtual void		ModifyProperty(
								DescType			inProperty,
								const LAESubDesc	&inValueDelta);
/*
	Ease of use functions?
	
			void		GetFontByName(Str255 outFontName);
			void		SetFontByName(const Str255 inFontName);
			void		GetFontSize(Int16 *outFontSize);
			void		SetFontSize(Int16 inFontSize);
	
	NOT!
	
	These are not included because they shouldn't be used and just clutter
	the API.
	
	If you're setting up a default style for your application, read it from a
	resource using UTextTraits and then set it using style->SetTextTraits().
	
	If you're implementing some sort of menu or toolbar style support, you'll
	need to codify the operation in AppleEvents for the sake of recordability
	and or undoability  (ie, you're going to be calling Get/SetAEProperty
	anyway).
	
	And, if you're going to be applying a new style across a range of styles,
	you get to write an iterator that probably uses the copy feature
	of the style constructor.  Do it and if it is flexible, send it to us :)
*/

						//	Implementation support...
	virtual const StringPtr	GetModelNamePtr(void) const;

protected:
	virtual void		ChangedGeometry(void);
	virtual void		Changed(void);
	
	Str31				mName;
	virtual void		MakeSelfSpecifier(
								AEDesc		&inSuperSpecifier,
								AEDesc		&outSelfSpecifier) const;
};