/*
 * Copyright 2005, Haiku, Inc. All Rights Reserved.
 * Distributed under the terms of the MIT License.
 */
#ifndef _COLOR_CONTROL_H
#define _COLOR_CONTROL_H


#include <Control.h>

class BBitmap;


enum color_control_layout {
	B_CELLS_4x64	= 4,
	B_CELLS_8x32	= 8,
	B_CELLS_16x16	= 16,
	B_CELLS_32x8	= 32,
	B_CELLS_64x4	= 64,
};

class BTextControl;


class BColorControl : public BControl {
	public:
							BColorControl(BPoint start, color_control_layout layout,
								float cellSize, const char* name,
								BMessage* message = NULL, bool useOffscreen = false);
							BColorControl(BMessage* archive);
		virtual				~BColorControl();

		static BArchivable*	Instantiate(BMessage* archive);
		virtual status_t	Archive(BMessage* archive, bool deep = true) const;

		virtual void		SetValue(int32 color_value);
		void				SetValue(rgb_color color);
		rgb_color			ValueAsColor();

		virtual void		SetEnabled(bool state);

		virtual void		AttachedToWindow();
		virtual void		MessageReceived(BMessage* message);
		virtual void		Draw(BRect updateRect);
		virtual void		MouseDown(BPoint where);
		virtual void		KeyDown(const char* bytes, int32 numBytes);

		virtual void		SetCellSize(float size);
		float				CellSize() const;
		virtual void		SetLayout(color_control_layout layout);
		color_control_layout Layout() const;

		virtual void		WindowActivated(bool state);
		virtual void		MouseUp(BPoint point);
		virtual void		MouseMoved(BPoint point, uint32 code,
								const BMessage* dragMessage);
		virtual void		DetachedFromWindow();
		virtual void		GetPreferredSize(float* _width, float* _height);
		virtual void		ResizeToPreferred();
		virtual status_t	Invoke(BMessage* message = NULL);
		virtual void		FrameMoved(BPoint newPosition);
		virtual void		FrameResized(float newWidth, float newHeight);

		virtual BHandler*	ResolveSpecifier(BMessage* message, int32 index,
								BMessage* specifier, int32 what,
								const char* property);
		virtual status_t	GetSupportedSuites(BMessage* data);

		virtual void		MakeFocus(bool state = true);
		virtual void		AllAttached();
		virtual void		AllDetached();

	private:
		virtual status_t	Perform(perform_code d, void *arg);
			// this can be made public again if needed

		virtual void		_ReservedColorControl1();
		virtual void		_ReservedColorControl2();
		virtual void		_ReservedColorControl3();
		virtual void		_ReservedColorControl4();

		BColorControl&		operator=(const BColorControl &other);

		void				_InitData(color_control_layout layout,
								float size, bool useOffscreen,
								BMessage* archive = NULL);
		void				_LayoutView();
		void				_UpdateOffscreen(BRect update);
		void				_DrawColorArea(BView* target, BRect update);
		void				_ColorRamp(BRect rect, BView* target,
								rgb_color baseColor, int16 flag,
								bool focused);

	private:
		float				fCellSize;
		int32				fRows;
		int32				fColumns;

		BTextControl*		fRedText;
		BTextControl*		fGreenText;
		BTextControl*		fBlueText;

		BBitmap*			fBitmap;
		BView*				fOffscreenView;

		int32				fFocusedComponent;
		uint32				_reserved[8];
};

inline void
BColorControl::SetValue(rgb_color color)
{
	int32 c = (color.red << 24) + (color.green << 16) + (color.blue << 8);
	SetValue(c);
}

#endif /* _COLOR_CONTROL_H */