Blob Blame Raw


#ifndef TNZ_COMBOBOX_INCLUDED
#define TNZ_COMBOBOX_INCLUDED

#include "tw/tw.h"

#undef DVAPI
#undef DVVAR
#ifdef TWIN_EXPORTS
#define DVAPI DV_EXPORT_API
#define DVVAR DV_EXPORT_VAR
#else
#define DVAPI DV_IMPORT_API
#define DVVAR DV_IMPORT_VAR
#endif

// forward declaration
class TTextField;
class TComboMenu;
class TComboBoxActionInterface;

//-------------------------------------------------------------------

class DVAPI TComboBox : public TWidget
{
	TTextField *m_textField;
	TComboMenu *m_menu;

	vector<pair<string, string>> *m_options;
	vector<TComboBoxActionInterface *> *m_actions;
	void sendCommand();

public:
	TComboBox(TWidget *parent, string name = "combobox");
	~TComboBox();

	void draw();

	void configureNotify(const TDimension &size);

	void leftButtonDown(const TMouseEvent &);
	/*

  void leftButtonDrag(const TPoint &pos, UCHAR pressure);
*/
	TPoint getHotSpot() const;

	string getText() const;
	void setText(string s);
	void addOption(string s, string help);
	void deleteOptions();

	void addAction(TComboBoxActionInterface *action);

	friend class TComboMenu;
	//	int getOptionsCount() const;
	//  string getOption(int index) const;
};

class DVAPI TComboBoxActionInterface
{
public:
	TComboBoxActionInterface() {}
	virtual ~TComboBoxActionInterface() {}
	virtual void triggerAction(TComboBox *cb, string text) = 0;
};

template <class T>
class TComboBoxAction : public TComboBoxActionInterface
{
	typedef void (T::*Method)(TComboBox *vf, string text);
	T *m_target;
	Method m_method;

public:
	TComboBoxAction(T *target, Method method) : m_target(target), m_method(method) {}
	void triggerAction(TComboBox *vf, string text)
	{
		(m_target->*m_method)(vf, text);
	}
};

template <class T>
inline void tconnect(TComboBox &src, T *target, void (T::*method)(TComboBox *vf, string text))
{
	src.addAction(new TComboBoxAction<T>(target, method));
}

#endif