Milán Major

netscape-revival

1 branch
Code

lib/mac/UserInterface/Tables/LTableHeader.h

/*
	LTableHeader.h

	© 1996 Netscape Communications, Inc.
	
	Created 3/18/96 - Tim Craycroft

*/


#pragma once


#include <LView.h>
#include "UStdBevels.h"


//
// This is the ioParam in the message broadcast
// when the sort order is changed (msg_SortedColumnChanged).
//
typedef struct
{
	PaneIDT	sortColumnID;	// pane id of header of sort column
	UInt16	sortColumn;		// physical sort column
	Boolean	reverseSort;	// was reverse sort specified ?
} TableHeaderSortChange;



class LTableHeader : public LView, LBroadcaster
{

public:
	enum	{ class_ID = 'tblH' 				};
	enum	{ msg_SortedColumnChanged = 'srtC'	};
	enum	{ kColumnStateResourceType = 'Cols'	};
	

	LTableHeader(LStream *inStream);
	virtual ~LTableHeader();
	static LTableHeader *CreateTableHeaderStream(LStream *inStream);
	
	
	// PowerPlant hooks
	virtual void	FinishCreateSelf();
	virtual void	DrawSelf();
	virtual void	Click(SMouseDownEvent &inMouseDown);
	
	virtual void	AdjustCursor(	Point inPortPt,
									const EventRecord &inMacEvent);

	virtual void	ResizeFrameBy(	Int16	inWidthDelta,
									Int16	inHeightDelta,
									Boolean	inRefresh);
									
									

	
	
	// Column info access
	inline UInt16			CountColumns() const 		{ return mColumnCount;  		};
	inline UInt16			CountVisibleColumns() const { return mLastVisibleColumn; 	};
	
	UInt16					GetSortedColumn(PaneIDT & outHeaderPane) const;
	virtual void 			SetSortedColumn(UInt16 inColumn, Boolean inReverse, Boolean inRefresh=true);
	
	inline PaneIDT			GetColumnPaneID(UInt16 inColumn) 		const;	// returns PaneID of column's header
	SInt16					GetColumnWidth(UInt16 inColumn) 		const;	// returns column's width
	SInt16					GetColumnPosition(UInt16 inColumn) 		const;	// returns column's horiz position
	UInt16					GetHeaderWidth() 						const;	// returns width occupied by columns


	typedef UInt32	HeaderFlags;
	enum {	kHeaderCanHideColumns	=	0x1 };	
	
	
	// Persistence...
	typedef UInt32 ColumnFlags;
	enum 
	{
		kColumnDoesNotSort		=	0x1,
		kColumnDoesNotResize	=	0x2
	};

	typedef struct 
	{
		PaneIDT			paneID;
		SInt16			columnWidth;
		SInt16			columnPosition;		// meaningless when saved/read to/from disk
		ColumnFlags		flags;				
	} ColumnData;
	
	typedef struct
	{
		UInt16		columnCount;
		UInt16		lastVisibleColumn;
		UInt16		sortedColumn;
		UInt16		pad;
		ColumnData	columnData[1];	
	} SavedHeaderState;

	virtual void	WriteColumnState(LStream * inStream);
	virtual void	ReadColumnState(LStream * inStream, Boolean inMoveHeaders = true);
	

protected:
	enum	
	{ 
	 	kColumnMargin 				= 2,
	 	kColumnHidingWidgetWidth 	= 16
	};

	HeaderFlags			mHeaderFlags;
	ColumnData **		mColumnData;
	SBevelColorDesc		mUnsortedBevel;
	SBevelColorDesc		mSortedBevel;

	UInt16				mColumnCount;		// 1-based count of all columns
	UInt16				mLastVisibleColumn;	// 0-based index of rightmost visible column
	UInt16				mSortedColumn;		// 0-based index of sorted columns
	UInt16				mReverseModifiers;	// key event modifier bit-mask for reverse-sort
	SInt16				mFixedWidth;		// total width occupied by fixed-size columns


	// Column geometry
	UInt16			FindColumn( Point inLocalPoint ) 				const;
	void			LocateColumn( UInt16 inColumn, Rect & outWhere) const;
	void			InvalColumn( UInt16 inColumn);
	void			ComputeColumnPositions();
	virtual void	PositionOneColumnHeader( UInt16 inColumn, Boolean inRefresh = true);
	void			PositionColumnHeaders(Boolean inRefresh = true);
	void			ConvertWidthsToAbsolute();
	void			ConvertWidthsToPercentages();
	void			RedistributeSpace(	UInt16	inFromCol,
										UInt16	inToCol,
										SInt16	inNewSpace,
										SInt16	inOldSpace);
										
	SInt16			GetFixedWidthInRange(	UInt16	inFromCol,
											UInt16	inToCol	);
										

	// Column resizing
	Boolean			IsInHorizontalSizeArea(Point inLocalPt, UInt16 &outLeftColumn);
	void			TrackColumnResize(const SMouseDownEvent	&inEvent, UInt16 inLeftColumn);
	virtual void	ComputeResizeDragRect(UInt16 inLeftColumn, Rect	&outDragRect);
	virtual void	ResizeColumn(UInt16 inLeftColumn, SInt16 inLeftColumnDelta);
	
	// Column dragging
	void			TrackColumnDrag(const SMouseDownEvent &	inEvent, UInt16 inColumn);
	virtual void	ComputeColumnDragRect(UInt16 inColumn, Rect& outDragRect);
	virtual void	MoveColumn(UInt16 inColumn, UInt16 inMoveTo);

	
	// Column drawing
	virtual void	DrawColumnBackground(const Rect& inWhere, Boolean inSortColumn);
	virtual void	RedrawColumns(UInt16 inFrom, UInt16 inTo);								

	// Column hiding
	virtual void	ShowHideRightmostColumn(Boolean inShow);
	
	
	// Private Column info
	//
	// These are all excellent candidates for inlines, but we'll
	// let the compiler decide...
	//
	Boolean	CanColumnResize(UInt16 inColumn) 				const;
	Boolean	CanColumnResize(const ColumnData *inColumn) 	const;
	Boolean	CanColumnSort(UInt16 inColumn) 					const;
	Boolean	CanHideColumns() 								const;
	
	LPane*	GetColumnPane(UInt16 inColumn);
};