Milán Major

netscape-revival

1 branch
Code

lib/mac/VText/V_PowerPlant_Mods/LDataTube.h

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

#pragma	once

#include	<UAEGizmos.h>

#ifndef __DRAG__
#include <Drag.h>
#endif

//	---------------------------------------------------------------------------
/*
	Data tubes constitute an abstract i/o interface for "tubeable items."
	As a result, tubeable item data i/o is simplified since a tubeable item
	need not be concerned with wether i/o is to a drag, clipboard, file, or
	whatever.
	
	Tube instances come in two varieties:
	
		"tube filling"			fill structures (file | clipboard | drag) with
								data from a tubeable item.
		
		"data item extraction"	get data from existing structures (file |
								clipboard | drag).
	
	These varieties are determined at tube construction time with tube filling
	constructors typically having a tubeable item parameter.
*/
		
/*
	Sometimes, a given flavor type could refer to different types of data
	depending on the source of the data.  This overlap should never be
	designed into a system.  But, if a legacy system or legacy file format is
	being worked with, the flavors must be distinguished.  Use
	GetFlavorForType to do that distinguishing.  Associated enumerations...
*/
             
class	LTubeableItem;

typedef enum {
	flavorForClipboard,
	flavorForDrag,
	flavorForFile,
	flavorForDesc
} FlavorForT;

//	Reserved flavor types -- don't use
const FlavorType	typeTubeMapItems = 'timi';

const ItemReference	defaultItemReference = -1;

//	===========================================================================
//	Abstract data tube:

class	StCurrentItemChanger;
class	LTubeFlavorStream;
class	LStream;

class	LDataTube
{
public:
friend	class	StTubeItemChanger;
friend	class	LSelection;

				//	Maintenance
protected:				//	Only tubes can construct abstract tubes
						LDataTube();
						LDataTube(
							const LDataTube		*inSuperTube,
							ItemReference		inItemRef,
							const LAESubDesc	&inSubTubeMap,
							Int32				inTubeDepth
						);
public:
	virtual				~LDataTube();

	virtual FlavorForT	GetFlavorForType(void) const;
	virtual Boolean		GetOnlyReqdFlavors(void) const;
	virtual void		WriteDesc(LAEStream *inStream) const;

				//	New features
					//	Read
	virtual	Boolean		FlavorExists(FlavorType inFlavor) const;
	virtual	Int32		GetFlavorSize(FlavorType inFlavor) const;
	virtual void *		GetFlavorData(
							FlavorType	inFlavor,
							void		*outFlavorData) const;
	virtual	LStream &	GetFlavorStreamOpen(FlavorType inFlavor) const;
	virtual	void		GetFlavorStreamClose(void) const;
						//	Multi-item read
	virtual Int32		CountItems(void) const;
	virtual LDataTube	NthItem(Int32 inIndex, ItemReference *outReference = NULL) const;
	virtual LDataTube	KeyedItem(ItemReference inItemRef) const;

					//	Write
	virtual void		AddFlavor(FlavorType inFlavor);
	virtual void		SetFlavorData(
							FlavorType	inFlavor,
							const void	*inFlavorData,
							Int32		inFlavorSize);
	virtual LStream &	SetFlavorStreamOpen(FlavorType inFlavor);
	virtual void		SetFlavorStreamClose(void);
						//	Multi-item write
	virtual	void		OpenItem(const LTubeableItem *inItem, ItemReference inItemRef = defaultItemReference);
	virtual void		CloseItem(void);
	
					//	Helper read write f's:
						//	Read
	virtual void		GetFlavorHandle(FlavorType inFlavor, Handle outFlavorData) const;
	virtual void		GetFlavorAsDesc(FlavorType inFlavor, AEDesc *outFlavorDesc) const;
						//	Write
	virtual void		SetFlavorHandle(FlavorType inFlavor, const Handle inFlavorData);
//?	virtual void		SetFlavorByDesc(FlavorType inFlavor, const AEDesc &inFlavorDesc);


protected:
	virtual void		SetItem(LTubeableItem *inItem);	//	Don't use this
	virtual	Int32		FlavorCount(void) const;
	virtual FlavorType	NthFlavor(Int32 inIndex) const;
	
						//	all for reading...
	LDataTube			*mSuperTube;
	ItemReference		mItemRef;
	LAESubDesc			mTubeMap;
	Int32				mTubeDepth;
};

class	StTubeItemChanger
{
public:
	StTubeItemChanger(const LDataTube *inRealTube, const LDataTube *inSubTube);
	~StTubeItemChanger();

protected:
	LDataTube		*mRealTube,
					*mSubTube;

	Int32			mOldDepth;
	LAESubDesc		mOldMap;
	ItemReference	mOldRef;
};