// be sure to use a unique ID obtained from www.plugincafe.com
var PLUGINID = 1000158;
// be sure to use a unique ID obtained from www.plugincafe.com

enum
{
	GADGET_MENU1 = 5000,
	GADGET_MENU2,
	GADGET_MENU3,
	GADGET_ADDROW,
	GADGET_SUBROW,
	GROUP_DYNAMIC,
	GROUP_SCROLL,

	GADGET_DRAG = 6000,

	_dummy
}

// definition of my dialog class
class MyDialog : GeDialog
{
	private:
		var rows;
		var array_org,array_drag;

		CreateMenu(i);
		CreateDynamicGroup();
		ReLayout();
		EnableItems();

	public:
		MyDialog();

		CreateLayout();
		Command(id,msg);
		Message(msg);
}

MyDialog::MyDialog()
{
	super(PLUGINID);
//	super();
	array_org  = new(array,100);
	array_drag = new(array,100);
	var i;
	for (i=0;i<100;i++)
	{
		array_org[i]="";
	}
	rows = 1;
}


MyDialog::Message(msg)
{
	switch (msg->GetId())
	{
		case BFM_DRAGRECEIVE:
			{
				var prefix = "Dragging ";
				var i,id=-1;
				if (msg->GetData(BFM_DRAG_FINISHED)) prefix = "Dropped ";

				if (CheckDropArea(GROUP_SCROLL,msg,TRUE,TRUE))
				{
					for (i=0;i<rows;i++)
					{
						if (CheckDropArea(GADGET_DRAG+i,msg,FALSE,TRUE)) { id = i; break; }
					}
				}
				if (id!=-1)
				{
					if (msg->GetData(BFM_DRAG_LOST))
					{
						for (i=0;i<rows;i++)
						{
							SetString(GADGET_DRAG+i,array_org[i]);
						}
					}
					else
					{
						var string;
						var obj = GetDragObject(msg);
						if (instanceof(obj,BaseObject))
						{
							string = prefix+"BaseObject: "+obj->GetName();
						}
						else if (instanceof(obj,BaseTag))
						{
							string = prefix+"BaseTag";
						}
						else if (instanceof(obj,BaseSequence))
						{
							string = prefix+"BaseSequence";
						}
						else if (instanceof(obj,BaseTrack))
						{
							string = prefix+"BaseTrack";
						}
						else if (instanceof(obj,BaseKey))
						{
							string = prefix+"BaseKey";
						}
						else if (instanceof(obj,BaseMaterial))
						{
							string = prefix+"BaseMaterial: "+obj->GetName();
						}
						else
						{
							string = prefix+"unknown object";
						}

						for (i=0;i<rows;i++)
						{
							array_drag[i] = array_org[i];
						}
						array_drag[id] = string;

						if (msg->GetData(BFM_DRAG_FINISHED))
							array_org[id] = string;

						for (i=0;i<rows;i++)
						{
							SetString(GADGET_DRAG+i,array_drag[i]);
						}

						return FALSE;
					}
				}
			}
			break;
	}
	return super::Message(msg);
}

MyDialog::CreateMenu(i)
{
	MenuFlushAll();	// call to create a complete new menu
	for(;i>0;i--)
	{
		MenuSubBegin("Menu1");
			MenuAddCommand(1000160);
			MenuAddCommand(1000159);
			MenuAddCommand(1000450);
			MenuAddSeparator();
			MenuAddString(GADGET_ADDROW,"add row");
			MenuAddString(GADGET_SUBROW,"sub row");
			MenuAddString(GADGET_MENU1,"1 menus");
			MenuAddSeparator();
			MenuAddString(GADGET_MENU2,"2 menus");
			MenuAddString(GADGET_MENU3,"3 menus");
			MenuSubBegin("SubMenu1");
				MenuAddCommand(1000160);
				MenuAddCommand(1000159);
				MenuSubBegin("SubMenu2");
					MenuAddCommand(1000450);
				MenuSubEnd();
			MenuSubEnd();
		MenuSubEnd();
	}
	MenuFinished();
	EnableItems();
}

MyDialog::CreateDynamicGroup()
{
	var i;
	for (i=0;i<rows;i++)
	{
		AddCheckbox(0,BFH_LEFT,0,0,"Rows "+tostring(i+1));
		AddStaticText(GADGET_DRAG+i,BFH_SCALEFIT,260,0,array_org[i],BORDER_THIN_IN);
		AddEditSlider(0,BFH_SCALEFIT,0,0);
	}
}

MyDialog::CreateLayout()
{
	SetTitle("Gui Demo");

	CreateMenu(1);

	AddGroupBeginV(0,BFH_SCALEFIT,5,"",0);
	{
		AddGroupBorderSpace(4,4,4,4);
		AddButton(GADGET_ADDROW,BFH_FIT,0,0,"add row");
		AddButton(GADGET_SUBROW,BFH_FIT,0,0,"sub row");
		AddButton(GADGET_MENU1,BFH_FIT,0,0,"1 menus");
		AddButton(GADGET_MENU2,BFH_FIT,0,0,"2 menus");
		AddButton(GADGET_MENU3,BFH_FIT,0,0,"3 menus");
	}
	AddGroupEnd();

	AddGroupBeginV(0,BFV_SCALEFIT|BFH_SCALEFIT,1,"Drop objects, tags, materials here",0);
	{
		AddGroupBorder(BORDER_GROUP_IN|BORDER_WITH_TITLE);
		AddGroupBorderSpace(4,4,4,4);

		AddScrollGroupBegin(GROUP_SCROLL,BFH_SCALEFIT|BFV_SCALEFIT,SCROLLGROUP_VERT);
		{
			AddGroupBeginV(GROUP_DYNAMIC,BFV_TOP|BFH_SCALEFIT,3,"",0);
			{
				CreateDynamicGroup();
			}
			AddGroupEnd();
		}
		AddScrollGroupEnd();
	}
	AddGroupEnd();

	EnableItems();

	return TRUE;
}

MyDialog::ReLayout()
{
	LayoutFlushGroup(GROUP_DYNAMIC);
	CreateDynamicGroup();
	LayoutChanged(GROUP_DYNAMIC);
}

MyDialog::EnableItems()
{
		MenuInitString(GADGET_SUBROW,rows>1,0);
		Enable(GADGET_SUBROW,rows>1);
}

MyDialog::Command(id,msg)
{
	println("Command ",id);
	switch (id)
	{
		case GADGET_MENU1:
			{
				var x,y,w,h;
				GetVisibleArea(GROUP_SCROLL,&x,&y,&w,&h);
				println(x," ",y," ",w," ",h);
			}
			CreateMenu(1);
			break;

		case GADGET_MENU2:
			CreateMenu(2);
			break;

		case GADGET_MENU3:
			CreateMenu(3);
			break;

		case GADGET_ADDROW:
			rows++;
			ReLayout();
			EnableItems();
			break;

		case GADGET_SUBROW:
			if (rows>1)
			{
				rows--;
				ReLayout();
			}
			EnableItems();
			break;
	}
}

class MyMenuPlugin : MenuPlugin
{
	public:
		MyMenuPlugin();

		GetID();
		GetName();
		GetHelp();
		Execute(doc);

		RestoreLayout(secret);
}

MyMenuPlugin::MyMenuPlugin()
{
	super();
}

MyMenuPlugin::GetID()
{
	return PLUGINID;
}

MyMenuPlugin::GetName()
{
	return "Gui Demo";
}

MyMenuPlugin::GetHelp()
{
	return "Demonstrates usage of various GUI elements";
}

var d;

MyMenuPlugin::Execute(doc)
{
	d->Open(TRUE,-1,-1);
}

MyMenuPlugin::RestoreLayout(secret)
{
	if (!d) d = new(MyDialog);
	d->RestoreLayout(secret);
}


main()
{
	d = new(MyDialog);

	Register(MyMenuPlugin);
}
