/*
 * Copyright 2006-2015, Haiku, Inc. All rights reserved.
 * Distributed under the terms of the MIT License.
 */
#ifndef	_TEXT_CONTROL_H
#define	_TEXT_CONTROL_H


#include <Control.h>
#include <TextView.h>


class BLayoutItem;
namespace BPrivate {
	class _BTextInput_;
}


class BTextControl : public BControl {
public:
								BTextControl(BRect frame, const char* name,
									const char* label, const char* initialText,
									BMessage* message,
									uint32 resizeMask = B_FOLLOW_LEFT_TOP,
									uint32 flags = B_WILL_DRAW | B_NAVIGABLE);
								BTextControl(const char* name,
									const char* label, const char* initialText,
									BMessage* message,
									uint32 flags = B_WILL_DRAW | B_NAVIGABLE);
								BTextControl(const char* label,
									const char* initialText,
									BMessage* message);
	virtual						~BTextControl();

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

	virtual	void				SetText(const char* text);
			const char*			Text() const;
			int32				TextLength() const;
			void				MarkAsInvalid(bool invalid);

	virtual	void				SetValue(int32 value);
	virtual	status_t			Invoke(BMessage* message = NULL);

			BTextView*			TextView() const;

	virtual	void				SetModificationMessage(BMessage* message);
			BMessage*			ModificationMessage() const;

	virtual	void				SetAlignment(alignment label, alignment text);
			void				GetAlignment(alignment* _label,
									alignment* _text) const;
	virtual	void				SetDivider(float position);
			float				Divider() const;

	virtual	void				Draw(BRect updateRect);
	virtual	void				MouseDown(BPoint where);
	virtual	void				AttachedToWindow();
	virtual	void				MakeFocus(bool focus = true);
	virtual	void				SetEnabled(bool enable);
	virtual	void				FrameMoved(BPoint newPosition);
	virtual	void				FrameResized(float newWidth, float newHeight);
	virtual	void				WindowActivated(bool active);

	virtual	void				GetPreferredSize(float* _width,
									float* _height);
	virtual	void				ResizeToPreferred();

	virtual	void				MessageReceived(BMessage* message);
	virtual	BHandler*			ResolveSpecifier(BMessage* message,
									int32 index, BMessage* specifier,
									int32 what, const char* property);

	virtual	void				MouseUp(BPoint where);
	virtual	void				MouseMoved(BPoint where, uint32 transit,
									const BMessage* dragMessage);
	virtual	void				DetachedFromWindow();

	virtual	void				AllAttached();
	virtual	void				AllDetached();
	virtual	status_t			GetSupportedSuites(BMessage* data);
	virtual	void				SetFlags(uint32 flags);

	virtual	BSize				MinSize();
	virtual	BSize				MaxSize();
	virtual	BSize				PreferredSize();
	virtual	BAlignment			LayoutAlignment();

			BLayoutItem*		CreateLabelLayoutItem();
			BLayoutItem*		CreateTextViewLayoutItem();

protected:
	virtual	status_t			AllArchived(BMessage* into) const;
	virtual	status_t			AllUnarchived(const BMessage* from);

	virtual	void				LayoutInvalidated(bool descendants);
	virtual	void				DoLayout();

	virtual	status_t			SetIcon(const BBitmap* icon, uint32 flags = 0);

private:
	// FBC padding and forbidden methods
	virtual	status_t			Perform(perform_code d, void* arg);

	virtual	void				_ReservedTextControl1();
	virtual	void				_ReservedTextControl2();
	virtual	void				_ReservedTextControl3();
	virtual	void				_ReservedTextControl4();

			BTextControl&		operator=(const BTextControl& other);

private:
	class LabelLayoutItem;
	class TextViewLayoutItem;
	struct LayoutData;

	friend class _BTextInput_;
	friend class LabelLayoutItem;
	friend class TextViewLayoutItem;

			void				_CommitValue();
			void				_UpdateTextViewColors(bool enable);
			void				_InitData(const char* label,
									const BMessage* archive = NULL);
			void				_InitText(const char* initialText,
									const BMessage* archive = NULL);
			void				_ValidateLayout();
			void				_LayoutTextView();
			void				_UpdateFrame();

			void				_ValidateLayoutData();

private:
			BPrivate::_BTextInput_* fText;
			BMessage*			fModificationMessage;
			alignment			fLabelAlign;
			float				fDivider;

			LayoutData*			fLayoutData;
			uint32				fLook;

			uint32				_reserved[8];
};


#endif	// _TEXT_CONTROL_H
