#pragma once
#ifndef TNZ_OPTIONMENU_INCLUDED
#define TNZ_OPTIONMENU_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 TPopupMenu;
#ifdef WIN32
#pragma warning(disable : 4251)
#endif
//-------------------------------------------------------------------
class DVAPI TGenericOptionMenuAction
{
public:
virtual ~TGenericOptionMenuAction() {}
virtual void sendCommand(string item) = 0;
};
class DVAPI TGenericOptionMenuWAction
{
public:
virtual ~TGenericOptionMenuWAction() {}
virtual void sendCommand(wstring item) = 0;
};
//-------------------------------------------------------------------
template <class T>
class TOptionMenuAction : public TGenericOptionMenuAction
{
public:
typedef void (T::*Method)(string item);
TOptionMenuAction(T *target, Method method) : m_target(target), m_method(method) {}
void sendCommand(string item) { (m_target->*m_method)(item); }
private:
T *m_target;
Method m_method;
};
//-------------------------------------------------------------------
template <class T>
class TOptionMenuActionW : public TGenericOptionMenuWAction
{
public:
typedef void (T::*Method)(wstring item);
TOptionMenuActionW(T *target, Method method) : m_target(target), m_method(method) {}
void sendCommand(wstring item) { (m_target->*m_method)(item); }
private:
T *m_target;
Method m_method;
};
//-------------------------------------------------------------------
class DVAPI TOptionMenu : public TWidget
{
public:
TOptionMenu(TWidget *parent, string name = "optionMenu");
~TOptionMenu();
void setAction(TGenericOptionMenuAction *action)
{
m_action = action;
}
void repaint();
void configureNotify(const TDimension &size);
void leftButtonDown(const TMouseEvent &);
string getText() const;
void setText(string s);
void setLabel(wstring title);
void setLabelWidth(int lx);
wstring getLabel() const { return m_label; }
int getLabelWidth() const { return m_labelWidth; }
bool isOption(string s) const;
void addOption(string cmdName);
void addOption(string cmdName, wstring title);
void deleteOption(string s);
void deleteAllOptions();
private:
TPopupMenu *m_menu;
string m_currentOption;
wstring m_currentOptionTitle;
wstring m_label;
int m_labelWidth;
typedef std::vector<std::pair<string, wstring>> OptionList;
OptionList m_options;
TGenericOptionMenuAction *m_action;
};
//-------------------------------------------------------------------
template <class T>
class TOptionMenuWAction : public TGenericOptionMenuWAction
{
public:
typedef void (T::*Method)(wstring item);
TOptionMenuWAction(T *target, Method method) : m_target(target), m_method(method) {}
void sendCommand(wstring item) { (m_target->*m_method)(item); }
private:
T *m_target;
Method m_method;
};
//-------------------------------------------------------------------
class DVAPI TOptionMenuW : public TWidget
{
public:
TOptionMenuW(TWidget *parent, string name = "optionMenu");
~TOptionMenuW();
void setAction(TGenericOptionMenuWAction *action)
{
m_action = action;
}
void repaint();
void configureNotify(const TDimension &size);
void leftButtonDown(const TMouseEvent &);
wstring getText() const;
void setText(wstring s);
void setLabel(wstring label);
void setLabelWidth(int width);
bool isOption(wstring s) const;
void addOption(wstring item);
void deleteOption(wstring s);
void deleteAllOptions();
typedef std::vector<wstring> OptionList;
const OptionList getOptions() const { return m_options; };
private:
TPopupMenu *m_menu;
wstring m_currentOption;
wstring m_label;
int m_labelWidth;
OptionList m_options;
TGenericOptionMenuWAction *m_action;
};
//-------------------------------------------------------------------
/*
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));
}
*/
//-------------------------------------------------------------------
template <class T>
void tconnect(TOptionMenu &menu, T *target, void (T::*method)(string))
{
menu.setAction(new TOptionMenuAction<T>(target, method));
}
//-------------------------------------------------------------------
template <class T>
void tconnect(TOptionMenuW &menu, T *target, void (T::*method)(wstring))
{
menu.setAction(new TOptionMenuActionW<T>(target, method));
}
#endif