/*
 * Copyright (c)1998 by Angry Red Planet.
 *
 * This code is distributed under a modified form of the
 * Artistic License.  A copy of this license should have
 * been included with it; if this wasn't the case, the
 * entire package can be obtained at
 * <URL:http://www.angryredplanet.com/>.
 *
 * A logical GUI layout engine: the programmer describes
 * high-level relationships between the different user interface
 * object through formal container classes, which then take care
 * of their physical placement.  The system is completely
 * font-sensitive and resizeable.
 *
 * ----------------------------------------------------------------------
 *
 * ViewStubs.h
 *
 * Interfaces to various Be UI objects that need a bit
 * of extra help...
 *
 * ----------------------------------------------------------------------
 *
 * Known Bugs
 * ~~~~~~~~~~
 *
 * • ArpListView and ArpOutlineListView currently set their
 *   preferred height to the total height of the text in the
 *   list view.  This is wrong -- it should probably place some
 *   limit on this height, such as no more than six lines.
 *
 * ----------------------------------------------------------------------
 *
 * To Do
 * ~~~~~
 *
 * • All of these should provide an ArpLayoutable parameters
 *   interface for setting their associated object's values.
 *
 * • It would probably be good to split this out into separate
 *   files.
 *
 * ----------------------------------------------------------------------
 *
 * History
 * ~~~~~~~
 *
 * Dec 6, 1998:
 *	First public release.
 *
 * May 5, 1999:
 *	- ArpBox was not correctly propagating its child's maximum
 *	  dimensions up to itself.
 *	- Added special magic to ArpMenuBar to correctly redraw the
 *	  menu when resizing, without using B_FULL_UPDATE_ON_RESIZE.
 *
 */

#ifndef ARPLAYOUT_VIEWSTUBS_H
#define ARPLAYOUT_VIEWSTUBS_H

#ifndef ARPLAYOUT_ARPVIEWWRAPPER_H
#include <ArpLayout/ArpViewWrapper.h>
#endif

#ifndef _VIEW_H
#include <be/interface/View.h>
#endif

#ifndef _MENUBAR_H
#include <be/interface/MenuBar.h>
#endif

#ifndef _BOX_H
#include <be/interface/Box.h>
#endif

#ifndef _BUTTON_H
#include <be/interface/Button.h>
#endif

#ifndef _COLORCONTROL_H
#include <be/interface/ColorControl.h>
#endif

#ifndef _LISTVIEW_H
#include <be/interface/ListView.h>
#endif

#ifndef _OUTLINELISTVIEW_H
#include <be/interface/OutlineListView.h>
#endif

#ifndef _MENUBAR_H
#include <be/interface/MenuBar.h>
#endif

#ifndef _MENUFIELD_H
#include <be/interface/MenuField.h>
#endif

#ifndef _TEXTCONTROL_H
#include <be/interface/TextControl.h>
#endif

/* -----------------------------------------------------------
 * ArpBox: Interface to BBox.
 *
 * Addresses the following problems:
 *
 *	•	Need to place proper space between box and child.
 */
#define IS_BOX 1
class ArpBox :
#ifdef IS_BOX
				public BBox, public ArpViewWrapper {
  private:
	typedef BBox inherited;
#else
				public ArpLayoutable {
  private:
	typedef ArpLayoutable inherited;
#endif

  public:
	ArpBox(const char* name, const char* label,
			border_style border = B_FANCY_BORDER);
	ArpBox(BMessage* data);
  	
	static ArpBox*		Instantiate(BMessage* archive);
	virtual status_t	Archive(BMessage* data, bool deep=true);

#ifdef IS_BOX
	void Draw(BRect updateRect);
#endif
	
  protected:
  
  	void ComputeDimens(void);
  	void Layout(void);
  	
  private:
	float indent_l, indent_t, indent_r, indent_b;
};

/* -----------------------------------------------------------
 * ArpButton: Interface to BButton.
 *
 * Addresses the following problems:
 *
 *	•	Needs to have B_FULL_UPDATE_ON_RESIZE set to correctly
 *		resize itself.
 *	•	BButton does not completely see a font change until
 *		its SetLabel() function is called.
 */
class ArpButton : public BButton, public ArpViewWrapper {

  public:
	ArpButton(const char* name, const char* label,
				BMessage* message);
	ArpButton(BMessage* data);
  	
	static ArpButton*	Instantiate(BMessage* archive);
	virtual status_t	Archive(BMessage* data, bool deep=true);

  protected:
  
  	void ComputeDimens(void);
  	
  private:
	typedef ArpButton inherited;
	
};

/* -----------------------------------------------------------
 * ArpListView: Interface to BListView.
 *
 * Addresses the following problems:
 *
 *	•	BListView does not return any useful preferred size.
 */
class ArpListView : public BListView, public ArpViewWrapper {
  private:
	typedef ArpViewWrapper inherited;

  public:
  	ArpListView(const char* name,
  				list_view_type type=B_SINGLE_SELECTION_LIST);
  	ArpListView(BMessage* data);
  	
	static ArpListView*	Instantiate(BMessage* archive);
	virtual status_t	Archive(BMessage* data, bool deep=true);

	void	GetPreferredSize(float* w, float* h);
	virtual	void MakeFocus(bool focusState = true);
	
  protected:
  
  	void ComputeDimens(void);
  	
};

/* -----------------------------------------------------------
 * ArpOutlineListView: Interface to BOutlineListView.
 *
 * Addresses the following problems:
 *
 *	•	BOutlineListView does not return any useful preferred size.
 *
 * Remaining problems:
 *
 *	•	Font changes do not change the spacing of its items --
 *		but the items in a sub-hierarchy will be re-spaced if
 *		they are collapsed and then expanded again.
 */
class ArpOutlineListView : public BOutlineListView,
							public ArpViewWrapper {
  private:
	typedef ArpViewWrapper inherited;

  public:
  	ArpOutlineListView(const char* name,
  				list_view_type type=B_SINGLE_SELECTION_LIST);
  	ArpOutlineListView(BMessage* data);
  	
	static ArpOutlineListView*	Instantiate(BMessage* archive);
	virtual status_t			Archive(BMessage* data, bool deep=true);

	void	GetPreferredSize(float* w, float* h);
	virtual	void MakeFocus(bool focusState = true);
	
  protected:
  
  	void ComputeDimens(void);
};

/* -----------------------------------------------------------
 * ArpMenuBar: Interface to BMenuBar.
 *
 * Addresses the following problems:
 *
 *	•	BMenuBar does not always return sane GetPreferredSize()
 * 		values, unless some special magic is performed.
 *	•	Need to distribute font changes to menu children.
 *
 */
class ArpMenuBar : public BMenuBar, public ArpViewWrapper {
  private:
	typedef ArpViewWrapper inherited;

  public:
  	ArpMenuBar(const char* title,
  				menu_layout layout = B_ITEMS_IN_ROW,
				bool resizeToFit = true);
  	ArpMenuBar(BMessage* data);
  	
	static ArpMenuBar*	Instantiate(BMessage* archive);
	virtual status_t	Archive(BMessage* data, bool deep=true);

	virtual void FrameResized(float new_width, float new_height);
	
  protected:
  
  	void ComputeDimens(void);
  	
  private:
	void copy_font(BMenu* menu, BFont* font);
	BRect mLastFrame;
};

/* -----------------------------------------------------------
 * ArpMenuField: Interface to BMenuField.
 *
 * Addresses the following problems:
 *
 *	•	BMenuField does not seem to return anything useful
 *		from GetPreferredSize().
 *	•	Need to correctly manage SetDivider().
 *	•	Need to distribute font changes to menu children.
 *	•	Add parameters to control font of menu.
 *
 */
class ArpMenuField : public BMenuField, public ArpViewWrapper {
  private:
	typedef ArpViewWrapper inherited;

  public:
  	ArpMenuField(const char* name, const char* label,
				BMenu* menu, bool fixed_size=false);
  	ArpMenuField(BMessage* data);
  	
	static ArpMenuField*	Instantiate(BMessage* archive);
	virtual status_t	Archive(BMessage* data, bool deep=true);
	virtual	void FrameResized(float new_width, float new_height);

	static const char*	MenuFontP;
	static const char*	MenuBackColorP;
	static const char*	MenuForeColorP;
	
  protected:
  
	virtual void	DoSetParams(const ArpMessage* g,
								const ArpMessage* p);
	virtual bool	DoParams(ArpMessage& p, const char* name);
  	void ComputeDimens(void);
  	
	ArpString	PG_MenuFont;
	ArpString	PG_MenuBackColor;
	ArpString	PG_MenuForeColor;
	
	BFont		PV_MenuFont;
	rgb_color	PV_MenuBackColor;
	rgb_color	PV_MenuForeColor;
	
  private:
	void copy_attrs(BMenu* menu);
	float		mLabelWidth;
};

/* -----------------------------------------------------------
 * ArpTextControl: Interface to BTextControl.
 *
 * Addresses the following problems:
 *
 *	•	Need to distribute font changes to text child.
 *	•	Add parameters to control fill color of child.
 *	•	Need more control over min/pref/max dimensions.
 */
class ArpTextControl : public BTextControl, public ArpViewWrapper {
  private:
	typedef ArpViewWrapper inherited;

  public:
  	ArpTextControl(const char* name, const char* label,
  					const char* text, BMessage* message);
  	ArpTextControl(BMessage* data);
  	
	static ArpTextControl*	Instantiate(BMessage* archive);
	virtual status_t	Archive(BMessage* data, bool deep=true);
	virtual void AttachedToWindow(void);
	
	static const char*	FillBackColorP;
	static const char*	FillForeColorP;
	static const char*	FillFontP;
	static const char*	MinTextStringP;
	static const char*	PrefTextStringP;
	static const char*	MaxTextStringP;
	
  protected:
  
	virtual void	DoSetParams(const ArpMessage* g,
								const ArpMessage* p);
	virtual bool	DoParams(ArpMessage& p, const char* name);
  	void ComputeDimens(void);
  	
	ArpString	PG_FillBackColor;
	ArpString	PG_FillForeColor;
	ArpString	PG_FillFont;
	
	rgb_color	PV_FillBackColor;
	rgb_color	PV_FillForeColor;
	BFont		PV_FillFont;
	ArpString	PV_MinTextString;
	ArpString	PV_PrefTextString;
	ArpString	PV_MaxTextString;
	
  private:
	void copy_colors(BView* v);
	void copy_font(BView* v);
};

#endif
