2017-04-17 06:17:10 -06:00

931 lines
34 KiB
C++
Executable File

/*
* Rollouts.h - Rollout panel classes & functions for MAXScript
*
* Copyright © John Wainwright 1996
*
*/
#ifndef _H_ROLLOUTS
#define _H_ROLLOUTS
#include "Arrays.h"
typedef struct // rollout control layout data
{
int left;
int top;
int width;
int height;
int columns;
} layout_data;
/* some layout constants (in pixels) ... */
#define TOP_MARGIN 2
#define SIDE_MARGIN 4
#define RADIO_DOT_WIDTH 23
#define CHECK_BOX_WIDTH 24
#define LEFT_ALIGN 13
#define RIGHT_ALIGN 13
#define GROUP_BOX_Y_MARGIN 6
#define GROUP_BOX_X_MARGIN 4
#define SPACING_BEFORE 5
/* ---------------------- Rollout class ----------------------- */
/* contains the defintion of rollout panel. This includes:
* - an 'instance variable' array, these variables can be accessed as locals in rollout handlers
* - a control array, containing rolout control instances
* - a hashtable of event handler functions
* there are associated Thunks for the locals & controls so you can ref them as variables in
* handlers
*/
class RolloutControl;
class RolloutFloater;
class MSPlugin;
class RolloutChangeCallback;
class PB2Param;
visible_class (Rollout)
class Rollout : public Value
{
public:
Value* name; // rollout's variable name
Value* title; // title factor
HashTable* local_scope; // local name space
Value** locals; // local var array
Value** local_inits; // " " " init vals
int local_count; // " " count
RolloutControl** controls; // control array
int control_count; // " " count
HashTable* handlers; // handler tables
short flags; // rollout flags
short order; // rollout open order no.
Interface* ip; // Interface pointer
HWND page; // my dialog HWND when visible
HDC rollout_dc; // my dialog dev. context
HFONT font; // dialog's default font
int text_height; // metrics....
int default_control_leading;
int rollout_width;
int rollout_height;
int rollout_category;
int current_width; // used for across: processing...
int current_left;
int max_y, last_y;
int across_count;
WORD close_button_ID; // id of gen'd close button
BOOL selected; // selected to be open
BOOL disabled; // error in handler -> ro disabled
CharStream* source; // source text if available
BOOL init_values; // whether to init ctrl/local values on (re)open
MSPlugin* plugin; // plugin I'm open on if non-NULL
RolloutChangeCallback* tcb; // timechange callback if rollout has controller-linked spinners
IMtlParams* imp; // MtlEditor interface if open in Mtl Editor and other stuff...
TexDADMgr* texDadMgr;
MtlDADMgr* mtlDadMgr;
HWND hwMtlEdit;
RolloutFloater* rof; // owning rolloutfloater window if present there
WORD next_id; // dialog item ID allocators
Tab<RolloutControl*> id_map; // dialog item ID map for taking item ID's to associated RolloutControl
Rollout(short iflags);
void init(Value* name, Value* title, int local_count, Value** inits, HashTable* local_scope, RolloutControl** controls, int control_count, HashTable* handlers, CharStream* source);
~Rollout();
classof_methods (Rollout, Value);
void collect() { delete this; }
void gc_trace();
ScripterExport void sprin1(CharStream* s);
ScripterExport BOOL add_page(Interface *ip, HINSTANCE hInstance, int ro_flags = 0, RolloutFloater* rof = NULL);
ScripterExport void delete_page(Interface *ip, RolloutFloater* rof = NULL);
void open(Interface *ip, BOOL rolled_up = FALSE);
ScripterExport void close(Interface *ip, RolloutFloater* rof = NULL);
ScripterExport BOOL ok_to_close(RolloutFloater* rof = NULL);
ScripterExport void run_event_handler(Value* event, Value** arg_list, int count);
Value* call_event_handler(Value* event, Value** arg_list, int count);
void add_close_button(HINSTANCE hInstance, int& current_y);
void edit_script();
void TimeChanged(TimeValue t);
// various open/close for scripted plug-in rollouts
// command panel
void BeginEditParams(IObjParam* ip, MSPlugin* plugin, ULONG flags, Animatable *prev);
void EndEditParams(IObjParam* ip, MSPlugin* plugin, ULONG flags, Animatable *next);
// mtl editor
void CreateParamDlg(HWND hwMtlEdit, IMtlParams* imp, MSPlugin* plugin, TexDADMgr* texDadMgr, MtlDADMgr* mtlDadMgr);
void SetThing(MSPlugin* plugin);
void ReloadDialog();
void SetTime(TimeValue t);
void DeleteThis();
// update/reload
void InvalidateUI();
void InvalidateUI(ParamID id, int tabIndex=-1); // nominated param
virtual Value* get_property(Value** arg_list, int count);
virtual Value* set_property(Value** arg_list, int count);
virtual Value* set_nested_controller(Value** arg_list, int count);
};
#define RO_NO_CLOSEBUTTON 0x0001
#define RO_HIDDEN 0x0002
#define RO_ROLLED_UP 0x0004
#define RO_IN_FLOATER 0x0008
#define RO_INSTALLED 0x0010
#define RO_UTIL_MASTER 0x0020
#define RO_SILENT_ERRORS 0x0040
#define RO_HIDDEN2 0x0080
#define RO_PLUGIN_OWNED 0x0100
#define RO_CONTROLS_INSTALLED 0x0200
/* --------------------- RolloutFloater class ------------------------ */
visible_class (RolloutFloater)
class RolloutFloater : public Value
{
public:
HWND window; // modeless dialog window
HWND ru_window; // host rollup winddow cust control
IRollupWindow* irw;
Tab<Rollout*> rollouts; // my rollouts
int width, height; // window size...
int left, top;
bool inDelete;
RolloutFloater(TCHAR* title, int left, int top, int width, int height);
RolloutFloater() {window=ru_window=NULL;irw=NULL;width=height=left=top=0;inDelete=false;tag = class_tag(RolloutFloater);}
~RolloutFloater();
classof_methods (RolloutFloater, Value);
void collect() { delete this; }
void add_rollout(Rollout* ro, BOOL rolledUp);
void remove_rollout(Rollout* ro);
Value* get_property(Value** arg_list, int count);
Value* set_property(Value** arg_list, int count);
};
/* -------------------- RolloutControl classes ----------------------- */
/* represent controls such as buttons & spinners on rollout panels, RolloutControl is abstract
* root of all controls */
visible_class (RolloutControl)
class RolloutControl : public Value, public ReferenceMaker
{
public:
Value* name;
Value* caption;
Value* init_caption;
BOOL enabled;
Value** keyparms;
int keyparm_count;
Rollout* parent_rollout;
WORD control_ID;
Control* controller; // optional linked animation controller
ParamDimension* dim; // controllers dimension
PB2Param* pid; // if non-NULL, indicates this control is associated with an MSPlugin parameter &
// points at ParamUIRep-like data for it
short flags;
ScripterExport RolloutControl();
ScripterExport RolloutControl(Value* name, Value* caption, Value** keyparms, int keyparm_count);
ScripterExport ~RolloutControl();
classof_methods (RolloutControl, Value);
BOOL _is_rolloutcontrol() { return 1; }
# define is_rolloutcontrol(o) ((o)->_is_rolloutcontrol())
void collect() { delete this; }
ScripterExport void gc_trace();
virtual ScripterExport void add_control(Rollout *ro, HWND parent, HINSTANCE hInstance, int& current_y);
virtual LPCTSTR get_control_class() = 0;
virtual DWORD get_control_style() { return WS_TABSTOP; }
virtual DWORD get_control_ex_style() { return 0; }
virtual void init_control(HWND control) { }
virtual void compute_layout(Rollout *ro, layout_data* pos) { }
virtual ScripterExport void compute_layout(Rollout *ro, layout_data* pos, int& current_y);
virtual ScripterExport void process_layout_params(Rollout *ro, layout_data* pos, int& current_y);
virtual ScripterExport void setup_layout(Rollout *ro, layout_data* pos, int& current_y);
virtual ScripterExport void process_common_params();
virtual ScripterExport void call_event_handler(Rollout *ro, Value* event, Value** arg_list, int count);
virtual ScripterExport void run_event_handler(Rollout *ro, Value* event, Value** arg_list, int count);
virtual BOOL handle_message(Rollout *ro, UINT message, WPARAM wParam, LPARAM lParam) { return FALSE; }
ScripterExport WORD next_id();
virtual ScripterExport Value* get_property(Value** arg_list, int count);
virtual ScripterExport Value* set_property(Value** arg_list, int count);
virtual ScripterExport void set_text(TCHAR* text, HWND ctl = NULL, Value* align = NULL);
virtual ScripterExport void set_enable();
virtual ScripterExport BOOL set_focus();
virtual ScripterExport int num_controls() { return 1; }
ScripterExport Value* get_event_handler(Value* event);
// ReferenceMaker
int NumRefs() { return (controller != NULL) ? 1 : 0; }
RefTargetHandle GetReference(int i) { return controller; }
void SetReference(int i, RefTargetHandle rtarg) { controller = (Control*)rtarg; }
ScripterExport RefResult NotifyRefChanged(Interval changeInt, RefTargetHandle hTarget, PartID& partID, RefMessage message);
virtual void controller_changed() { }
virtual BOOL controller_ok(Control* c) { return FALSE; }
// PB2 UI update
ScripterExport IParamBlock2* get_pblock();
virtual void Reload() { }
virtual void InvalidateUI() { }
virtual void set_pb2_value() { }
virtual void get_pb2_value(BOOL load_UI=TRUE) { }
virtual void SetTexDADMgr(DADMgr* dad) { }
virtual int FindSubTexFromHWND(HWND hw) { return -1; }
virtual void SetMtlDADMgr(DADMgr* dad) { }
virtual int FindSubMtlFromHWND(HWND hw) { return -1; }
};
// flag bits for RolloutControl::flags
#define ROC_FIXED_WIDTH 0x0001 // a specific width: supplied, don't resize buttons on .text =
#define ROC_MAKING_EDIT 0x0002
#define ROC_INVISIBLE 0x0004 // rollout control is set to invisible and is disabled
#define ROC_VAL_CHANGED 0x0008 // value was changed while control had focus
#define ROC_EDITTEXT_MULTILINE 0x0010 // edittext control is multiline
#define ROC_COLORSWATCH_POINT4 0x0010 // Set if color swatch is a Point4 (FRGBA)
#define ROC_PICKBUTTON_AUTODISP 0x0010 // Set if autoDisplay is turned on for pickbutton (autodisplay node name)
#define ROC_IN_HANDLER 0x0020 // Set if currently running event handler
#define ROC_HANDLER_REENTRANT 0x0040 // Set if rollout control's event handlers are re-entrant. Only case is checkbutton.
#define ROC_EDITTEXT_READONLY 0x0080 // edittext control is read-only
extern LPCTSTR cust_button_class;
/* ------------- PB2Param class -------------------- */
// present in a UI control if rollout is part of a scripted plugin
// and this control is associated with a ParamBlock2 param
class PB2Param
{
public:
ParamID id; // pblock param ID
int index; // pblock direct index of param
int tabIndex; // element index if param is Tab<>
int block_id; // owning block's ID
int subobjno; // texmap or mtl param subobjno in the block
ParamDimension* dim;// parameter's dimension
ParamType2 type; // parameter's type
PB2Param(ParamDef& pd, int index, int block_id, int subobjno, int tabIndex = -1);
};
/* -------------------- LabelControl ------------------- */
visible_class (LabelControl)
class LabelControl : public RolloutControl
{
public:
LabelControl(Value* name, Value* caption, Value** keyparms, int keyparm_count)
: RolloutControl(name, caption, keyparms, keyparm_count) { tag = class_tag(LabelControl); }
static RolloutControl* create(Value* name, Value* caption, Value** keyparms, int keyparm_count)
{ return new LabelControl (name, caption, keyparms, keyparm_count); }
classof_methods (LabelControl, RolloutControl);
void collect() { delete this; }
ScripterExport void sprin1(CharStream* s) { s->printf(_T("LabelControl:%s"), name->to_string()); }
LPCTSTR get_control_class() { return _T("STATIC"); }
DWORD get_control_style() { return 0; }
void compute_layout(Rollout *ro, layout_data* pos);
};
/* -------------------- ButtonControl ------------------- */
visible_class (ButtonControl)
class ButtonControl : public RolloutControl
{
public:
HIMAGELIST images;
int image_width, image_height;
int iOutEn, iInEn, iOutDis, iInDis;
ButtonControl(Value* name, Value* caption, Value** keyparms, int keyparm_count)
: RolloutControl(name, caption, keyparms, keyparm_count)
{
tag = class_tag(ButtonControl);
images = NULL;
}
~ButtonControl();
static RolloutControl* create(Value* name, Value* caption, Value** keyparms, int keyparm_count)
{ return new ButtonControl (name, caption, keyparms, keyparm_count); }
classof_methods (ButtonControl, RolloutControl);
void collect() { delete this; }
void sprin1(CharStream* s) { s->printf(_T("ButtonControl:%s"), name->to_string()); }
LPCTSTR get_control_class() { return cust_button_class; }
void init_control(HWND control);
void compute_layout(Rollout *ro, layout_data* pos);
BOOL handle_message(Rollout *ro, UINT message, WPARAM wParam, LPARAM lParam);
Value* get_property(Value** arg_list, int count);
Value* set_property(Value** arg_list, int count);
void set_enable();
};
/* -------------------- CheckButtonControl ------------------- */
visible_class (CheckButtonControl)
class CheckButtonControl : public RolloutControl
{
public:
int checked; // LAM - 2/11/02 - changed from BOOL (which is actually an int) since now tristate
HIMAGELIST images;
int image_width, image_height;
int iOutEn, iInEn, iOutDis, iInDis;
CheckButtonControl(Value* name, Value* caption, Value** keyparms, int keyparm_count)
: RolloutControl(name, caption, keyparms, keyparm_count)
{
tag = class_tag(CheckButtonControl);
images = NULL;
}
~CheckButtonControl();
static RolloutControl* create(Value* name, Value* caption, Value** keyparms, int keyparm_count)
{ return new CheckButtonControl (name, caption, keyparms, keyparm_count); }
classof_methods (CheckButtonControl, RolloutControl);
void collect() { delete this; }
void sprin1(CharStream* s) { s->printf(_T("CheckButtonControl:%s"), name->to_string()); }
LPCTSTR get_control_class() { return cust_button_class; }
void init_control(HWND control);
void compute_layout(Rollout *ro, layout_data* pos);
BOOL handle_message(Rollout *ro, UINT message, WPARAM wParam, LPARAM lParam);
Value* get_property(Value** arg_list, int count);
Value* set_property(Value** arg_list, int count);
void set_enable();
void Reload();
void InvalidateUI();
void set_pb2_value();
void get_pb2_value(BOOL load_UI=TRUE);
};
/* -------------------- EditTextControl ------------------- */
visible_class (EditTextControl)
class EditTextControl : public RolloutControl
{
public:
Value* text;
Value* bold;
bool in_setvalue;
EditTextControl(Value* name, Value* caption, Value** keyparms, int keyparm_count);
static RolloutControl* create(Value* name, Value* caption, Value** keyparms, int keyparm_count)
{ return new EditTextControl (name, caption, keyparms, keyparm_count); }
classof_methods (EditTextControl, RolloutControl);
void collect() { delete this; }
void sprin1(CharStream* s) { s->printf(_T("EditTextControl:%s"), name->to_string()); }
void gc_trace();
void add_control(Rollout *ro, HWND parent, HINSTANCE hInstance, int& current_y);
LPCTSTR get_control_class() { return CUSTEDITWINDOWCLASS; }
void compute_layout(Rollout *ro, layout_data* pos, int& current_y);
BOOL handle_message(Rollout *ro, UINT message, WPARAM wParam, LPARAM lParam);
Value* get_property(Value** arg_list, int count);
Value* set_property(Value** arg_list, int count);
void set_enable();
int num_controls() { return 2; }
void Reload();
void InvalidateUI();
void set_pb2_value();
void get_pb2_value(BOOL load_UI=TRUE);
};
/* -------------------- ComboBoxControl ------------------- */
visible_class (ComboBoxControl)
class ComboBoxControl : public RolloutControl
{
public:
Array* item_array;
int selection;
short type;
short flags;
ComboBoxControl(Value* name, Value* caption, Value** keyparms, int keyparm_count, int type = CBS_SIMPLE);
static RolloutControl* create_cb(Value* name, Value* caption, Value** keyparms, int keyparm_count)
{ return new ComboBoxControl (name, caption, keyparms, keyparm_count); }
static RolloutControl* create_dd(Value* name, Value* caption, Value** keyparms, int keyparm_count)
{ return new ComboBoxControl (name, caption, keyparms, keyparm_count, CBS_DROPDOWNLIST); }
classof_methods (ComboBoxControl, RolloutControl);
void collect() { delete this; }
void sprin1(CharStream* s) { s->printf(_T("ComboBoxControl:%s"), name->to_string()); }
void gc_trace();
void add_control(Rollout *ro, HWND parent, HINSTANCE hInstance, int& current_y);
LPCTSTR get_control_class() { return _T("COMBOBOX"); }
DWORD get_control_style() { return CBS_DROPDOWNLIST | CBS_NOINTEGRALHEIGHT | WS_TABSTOP; }
void compute_layout(Rollout *ro, layout_data* pos, int& current_y);
BOOL handle_message(Rollout *ro, UINT message, WPARAM wParam, LPARAM lParam);
Value* get_property(Value** arg_list, int count);
Value* set_property(Value** arg_list, int count);
void set_enable();
int num_controls() { return 2; }
void Reload();
void InvalidateUI();
void set_pb2_value();
void get_pb2_value(BOOL load_UI=TRUE);
};
#define CBF_EDIT_FIELD_CHANGING 0x0001
/* -------------------- ListBoxControl ------------------- */
visible_class (ListBoxControl)
class ListBoxControl : public RolloutControl
{
public:
Array* item_array;
int selection;
ListBoxControl(Value* name, Value* caption, Value** keyparms, int keyparm_count);
static RolloutControl* create(Value* name, Value* caption, Value** keyparms, int keyparm_count)
{ return new ListBoxControl (name, caption, keyparms, keyparm_count); }
classof_methods (ListBoxControl, RolloutControl);
void collect() { delete this; }
void sprin1(CharStream* s) { s->printf(_T("ListBoxControl:%s"), name->to_string()); }
void gc_trace();
void add_control(Rollout *ro, HWND parent, HINSTANCE hInstance, int& current_y);
LPCTSTR get_control_class() { return _T("LISTBOX"); }
DWORD get_control_style() { return WS_TABSTOP; }
void compute_layout(Rollout *ro, layout_data* pos, int& current_y);
BOOL handle_message(Rollout *ro, UINT message, WPARAM wParam, LPARAM lParam);
Value* get_property(Value** arg_list, int count);
Value* set_property(Value** arg_list, int count);
void set_enable();
int num_controls() { return 2; }
void Reload();
void InvalidateUI();
void set_pb2_value();
void get_pb2_value(BOOL load_UI=TRUE);
};
/* -------------------- SpinnerControl ------------------- */
visible_class (SpinnerControl)
class SpinnerControl : public RolloutControl
{
public:
float fvalue;
int ivalue;
float max, min;
float scale;
EditSpinnerType spin_type;
SpinnerControl(Value* name, Value* caption, Value** keyparms, int keyparm_count)
: RolloutControl(name, caption, keyparms, keyparm_count) { tag = class_tag(SpinnerControl); }
static RolloutControl* create(Value* name, Value* caption, Value** keyparms, int keyparm_count)
{ return new SpinnerControl (name, caption, keyparms, keyparm_count); }
classof_methods (SpinnerControl, RolloutControl);
void collect() { delete this; }
void sprin1(CharStream* s) { s->printf(_T("SpinnerControl:%s"), name->to_string()); }
void add_control(Rollout *ro, HWND parent, HINSTANCE hInstance, int& current_y);
LPCTSTR get_control_class() { return SPINNERWINDOWCLASS; }
void compute_layout(Rollout *ro, layout_data* pos, int& current_y);
BOOL handle_message(Rollout *ro, UINT message, WPARAM wParam, LPARAM lParam);
Value* get_property(Value** arg_list, int count);
Value* set_property(Value** arg_list, int count);
void set_enable();
BOOL set_focus();
int num_controls() { return 3; }
void controller_changed();
BOOL controller_ok(Control* c) { return c->SuperClassID() == CTRL_FLOAT_CLASS_ID; }
void Reload();
void InvalidateUI();
void set_pb2_value();
void get_pb2_value(BOOL load_UI=TRUE);
};
/* -------------------- SliderControl ------------------- */
visible_class (SliderControl)
class SliderControl : public RolloutControl
{
public:
float value;
float max, min;
int ticks;
int slider_type;
bool vertical;
bool sliding;
SliderControl(Value* name, Value* caption, Value** keyparms, int keyparm_count)
: RolloutControl(name, caption, keyparms, keyparm_count), sliding(false) { tag = class_tag(SliderControl); }
static RolloutControl* create(Value* name, Value* caption, Value** keyparms, int keyparm_count)
{ return new SliderControl (name, caption, keyparms, keyparm_count); }
classof_methods (SliderControl, RolloutControl);
void collect() { delete this; }
void sprin1(CharStream* s) { s->printf(_T("SliderControl:%s"), name->to_string()); }
void add_control(Rollout *ro, HWND parent, HINSTANCE hInstance, int& current_y);
LPCTSTR get_control_class() { return TRACKBAR_CLASS; }
void compute_layout(Rollout *ro, layout_data* pos, int& current_y);
BOOL handle_message(Rollout *ro, UINT message, WPARAM wParam, LPARAM lParam);
Value* get_property(Value** arg_list, int count);
Value* set_property(Value** arg_list, int count);
void set_enable();
int num_controls() { return 2; }
void Reload();
void InvalidateUI();
void set_pb2_value();
void get_pb2_value(BOOL load_UI=TRUE);
};
/* -------------------- PickerControl ------------------- */
class PickerControl;
class PickerControlFilter : public PickNodeCallback
{
public:
Value* filter_fn;
PickerControl* picker;
PickerControlFilter(Value* filter, PickerControl* picker) : filter_fn(filter), picker(picker) { }
BOOL Filter(INode *node);
};
class PickerControlMode : public PickModeCallback
{
public:
PickerControlFilter* pick_filter;
TCHAR* msg;
PickerControl* picker;
PickerControlMode(PickerControlFilter* ifilter, TCHAR* imsg, PickerControl* ipick);
BOOL HitTest(IObjParam *ip, HWND hWnd, ViewExp *vpt, IPoint2 m, int flags);
BOOL Pick(IObjParam *ip, ViewExp *vpt);
PickNodeCallback *GetFilter() { return pick_filter; }
BOOL RightClick(IObjParam *ip, ViewExp *vpt) { return TRUE; }
void EnterMode(IObjParam *ip);
void ExitMode(IObjParam *ip);
};
visible_class (PickerControl)
class PickerControl : public RolloutControl
{
public:
PickerControlFilter* pick_filter;
PickerControlMode* pick_mode;
ICustButton* cust_button;
Value* picked_object;
PickerControl(Value* name, Value* caption, Value** keyparms, int keyparm_count);
~PickerControl();
static RolloutControl* create(Value* name, Value* caption, Value** keyparms, int keyparm_count)
{ return new PickerControl (name, caption, keyparms, keyparm_count); }
classof_methods (PickerControl, RolloutControl);
void collect() { delete this; }
void gc_trace();
void sprin1(CharStream* s) { s->printf(_T("PickerControl:%s"), name->to_string()); }
LPCTSTR get_control_class() { return cust_button_class; }
void compute_layout(Rollout *ro, layout_data* pos);
void init_control(HWND control);
BOOL handle_message(Rollout *ro, UINT message, WPARAM wParam, LPARAM lParam);
Value* get_property(Value** arg_list, int count);
Value* set_property(Value** arg_list, int count);
void set_enable();
void Reload();
void InvalidateUI();
void set_pb2_value();
void get_pb2_value(BOOL load_UI=TRUE);
};
/* -------------------- ColorPickerControl ------------------- */
visible_class (ColorPickerControl)
class ColorPickerControl : public RolloutControl
{
public:
Value* color;
IColorSwatch* csw;
Value* title;
ColorPickerControl(Value* name, Value* caption, Value** keyparms, int keyparm_count);
~ColorPickerControl();
static RolloutControl* create(Value* name, Value* caption, Value** keyparms, int keyparm_count)
{ return new ColorPickerControl (name, caption, keyparms, keyparm_count); }
classof_methods (ColorPickerControl, RolloutControl);
void collect() { delete this; }
void gc_trace();
void sprin1(CharStream* s) { s->printf(_T("ColorPickerControl:%s"), name->to_string()); }
LPCTSTR get_control_class() { return COLORSWATCHWINDOWCLASS; }
void init_control(HWND control);
void add_control(Rollout *ro, HWND parent, HINSTANCE hInstance, int& current_y);
void compute_layout(Rollout *ro, layout_data* pos, int& current_y);
BOOL handle_message(Rollout *ro, UINT message, WPARAM wParam, LPARAM lParam);
Value* get_property(Value** arg_list, int count);
Value* set_property(Value** arg_list, int count);
void set_enable();
int num_controls() { return 2; }
void Reload();
void InvalidateUI();
void set_pb2_value();
void get_pb2_value(BOOL load_UI=TRUE);
};
/* -------------------- RadioControl ------------------- */
visible_class (RadioControl)
class RadioControl : public RolloutControl
{
public:
int state;
int btn_count;
RadioControl(Value* name, Value* caption, Value** keyparms, int keyparm_count)
: RolloutControl(name, caption, keyparms, keyparm_count) { tag = class_tag(RadioControl); }
static RolloutControl* create(Value* name, Value* caption, Value** keyparms, int keyparm_count)
{ return new RadioControl (name, caption, keyparms, keyparm_count); }
classof_methods (RadioControl, RolloutControl);
void collect() { delete this; }
void sprin1(CharStream* s) { s->printf(_T("RadioControl:%s"), name->to_string()); }
void add_control(Rollout *ro, HWND parent, HINSTANCE hInstance, int& current_y);
LPCTSTR get_control_class() { return _T("BUTTON"); }
DWORD get_control_style() { return BS_AUTORADIOBUTTON; }
void compute_layout(Rollout *ro, layout_data* pos, int& current_y);
BOOL handle_message(Rollout *ro, UINT message, WPARAM wParam, LPARAM lParam);
Value* get_property(Value** arg_list, int count);
Value* set_property(Value** arg_list, int count);
void set_enable();
BOOL set_focus();
int num_controls() { return btn_count + 1; } // buttons and caption. don't count 1 dummy button that ends group
void Reload();
void InvalidateUI();
void set_pb2_value();
void get_pb2_value(BOOL load_UI=TRUE);
};
/* -------------------- CheckBoxControl ------------------- */
visible_class (CheckBoxControl)
class CheckBoxControl : public RolloutControl
{
public:
int checked; // LAM - 2/11/02 - added 3rd state (indeterminate). Changed from BOOL to int just for clarity.
CheckBoxControl(Value* name, Value* caption, Value** keyparms, int keyparm_count)
: RolloutControl(name, caption, keyparms, keyparm_count) { tag = class_tag(CheckBoxControl); }
static RolloutControl* create(Value* name, Value* caption, Value** keyparms, int keyparm_count)
{ return new CheckBoxControl (name, caption, keyparms, keyparm_count); }
classof_methods (CheckBoxControl, RolloutControl);
void collect() { delete this; }
void sprin1(CharStream* s) { s->printf(_T("CheckBoxControl:%s"), name->to_string()); }
LPCTSTR get_control_class() { return _T("BUTTON"); }
DWORD get_control_style() { return BS_AUTO3STATE | WS_TABSTOP; }
void init_control(HWND control);
void compute_layout(Rollout *ro, layout_data* pos);
BOOL handle_message(Rollout *ro, UINT message, WPARAM wParam, LPARAM lParam);
Value* get_property(Value** arg_list, int count);
Value* set_property(Value** arg_list, int count);
void Reload();
void InvalidateUI();
void set_pb2_value();
void get_pb2_value(BOOL load_UI=TRUE);
};
/* -------------------- BitmapControl ------------------- */
visible_class (BitmapControl)
class BitmapControl : public RolloutControl
{
public:
Value* file_name;
Value* max_bitmap; // if supplied
HBITMAP bitmap;
BitmapControl(Value* name, Value* caption, Value** keyparms, int keyparm_count);
~BitmapControl();
static RolloutControl* create(Value* name, Value* caption, Value** keyparms, int keyparm_count)
{ return new BitmapControl (name, caption, keyparms, keyparm_count); }
classof_methods (BitmapControl, RolloutControl);
void collect() { delete this; }
void sprin1(CharStream* s) { s->printf(_T("BitmapControl:%s"), name->to_string()); }
void gc_trace();
LPCTSTR get_control_class() { return _T("STATIC"); }
DWORD get_control_style() { return SS_BITMAP + SS_CENTERIMAGE; }
DWORD get_control_ex_style() { return WS_EX_CLIENTEDGE; }
void compute_layout(Rollout *ro, layout_data* pos);
void process_layout_params(Rollout *ro, layout_data* pos, int& current_y);
void init_control(HWND control);
Value* get_property(Value** arg_list, int count);
Value* set_property(Value** arg_list, int count);
};
/* -------------------- MapButtonControl ------------------- */
visible_class (MapButtonControl)
class MapButtonControl : public ButtonControl
{
public:
Value* map;
ICustButton* btn;
MapButtonControl(Value* name, Value* caption, Value** keyparms, int keyparm_count)
: ButtonControl(name, caption, keyparms, keyparm_count)
{
tag = class_tag(MapButtonControl);
btn = NULL;
map = NULL;
}
~MapButtonControl() { if (btn != NULL) ReleaseICustButton(btn); }
static RolloutControl* create(Value* name, Value* caption, Value** keyparms, int keyparm_count)
{ return new MapButtonControl (name, caption, keyparms, keyparm_count); }
classof_methods (MapButtonControl, RolloutControl);
void gc_trace();
void collect() { delete this; }
void sprin1(CharStream* s) { s->printf(_T("MapButtonControl:%s"), name->to_string()); }
void init_control(HWND control);
BOOL handle_message(Rollout *ro, UINT message, WPARAM wParam, LPARAM lParam);
Value* get_property(Value** arg_list, int count);
Value* set_property(Value** arg_list, int count);
void Reload();
void InvalidateUI();
void set_pb2_value();
void get_pb2_value(BOOL load_UI=TRUE);
void SetTexDADMgr(DADMgr* dad) { if (btn) btn->SetDADMgr(dad); }
int FindSubTexFromHWND(HWND hw);
};
/* -------------------- MtlButtonControl ------------------- */
visible_class (MtlButtonControl)
class MtlButtonControl : public ButtonControl
{
public:
Value* mtl;
ICustButton* btn;
MtlButtonControl(Value* name, Value* caption, Value** keyparms, int keyparm_count)
: ButtonControl(name, caption, keyparms, keyparm_count)
{
tag = class_tag(MtlButtonControl);
btn = NULL;
mtl = NULL;
}
~MtlButtonControl() { if (btn != NULL) ReleaseICustButton(btn); }
static RolloutControl* create(Value* name, Value* caption, Value** keyparms, int keyparm_count)
{ return new MtlButtonControl (name, caption, keyparms, keyparm_count); }
classof_methods (MtlButtonControl, RolloutControl);
void gc_trace();
void collect() { delete this; }
void sprin1(CharStream* s) { s->printf(_T("MtlButtonControl:%s"), name->to_string()); }
void init_control(HWND control);
BOOL handle_message(Rollout *ro, UINT message, WPARAM wParam, LPARAM lParam);
Value* get_property(Value** arg_list, int count);
Value* set_property(Value** arg_list, int count);
void set_enable();
void Reload();
void InvalidateUI();
void set_pb2_value();
void get_pb2_value(BOOL load_UI=TRUE);
void SetMtlDADMgr(DADMgr* dad) { if (btn) btn->SetDADMgr(dad); }
int FindSubMtlFromHWND(HWND hw);
};
/* ----------------------- GroupControls ---------------------- */
visible_class (GroupStartControl)
class GroupStartControl : public RolloutControl
{
public:
int start_y; /* y coord of top of group */
GroupStartControl(Value* caption)
: RolloutControl(NULL, caption, NULL, 0) { tag = class_tag(GroupStartControl); }
classof_methods (GroupStartControl, RolloutControl);
void collect() { delete this; }
void sprin1(CharStream* s) { s->printf(_T("GroupStartControl:%s"), caption->to_string()); }
void add_control(Rollout *ro, HWND parent, HINSTANCE hInstance, int& current_y);
LPCTSTR get_control_class() { return _T(""); }
void compute_layout(Rollout *ro, layout_data* pos) { }
};
visible_class (GroupEndControl)
class GroupEndControl : public RolloutControl
{
GroupStartControl* my_start; /* link back to my group start control */
public:
GroupEndControl(GroupStartControl* starter)
: RolloutControl(NULL, starter->caption, NULL, 0) { tag = class_tag(GroupEndControl); my_start = starter; }
classof_methods (GroupEndControl, RolloutControl);
void collect() { delete this; }
void sprin1(CharStream* s) { s->printf(_T("GroupEndControl:%s"), caption->to_string()); }
void add_control(Rollout *ro, HWND parent, HINSTANCE hInstance, int& current_y);
LPCTSTR get_control_class() { return _T(""); }
void compute_layout(Rollout *ro, layout_data* pos) { }
};
// ---- time change callback for rollouts with controller-linked spinners in them ----
class RolloutChangeCallback : public TimeChangeCallback
{
public:
Rollout* ro;
RolloutChangeCallback(Rollout* iro) { ro = iro; }
void TimeChanged(TimeValue t) { ro->TimeChanged(t); }
};
/* control keyword parameter access macros... */
extern ScripterExport Value* _get_control_param(Value** keyparms, int count, Value* key_name);
extern ScripterExport Value* _get_control_param_or_default(Value** keyparms, int count, Value* key_name, Value* def);
#define control_param(key) _get_control_param(keyparms, keyparm_count, n_##key)
#define control_param_or_default(key, def) _get_control_param_or_default(keyparms, keyparm_count, n_##key##, def)
#define int_control_param(key, var, def) ((var = _get_control_param(keyparms, keyparm_count, n_##key)) == &unsupplied ? def : var->to_int())
#define float_control_param(key, var, def) ((var = _get_control_param(keyparms, keyparm_count, n_##key)) == &unsupplied ? def : var->to_float())
#endif