//------------------------------------------------------------------------------------
// irr::gui::IGUIEnvironment wrappers
// do not delete a pointer to this
//------------------------------------------------------------------------------------

extern "C" 
{

	bool IrrGUI_IGUIEnvironment_drop(IGUIEnvironment* unk)
	{
		if (unk)
			return unk->drop();
		else return 0;
	}
	
	const c8* IrrGUI_IGUIEnvironment_getDebugName(IGUIEnvironment* unk)
	{
		if (unk)
			return unk->getDebugName();
		else return "";
	}
	
	void IrrGUI_IGUIEnvironment_grab(IGUIEnvironment* unk)
	{
		if (unk)
			unk->grab();
	}

	IGUIButton* IrrGUI_IGUIEnvironment_addButton(IGUIEnvironment* guienv,rect<s32>* rectangle,IGUIElement* parent=0,s32 id=-1,const wchar_t* text=0,const wchar_t* tooltiptext=0)
	{	
		if (guienv)
			return guienv->addButton(*rectangle,parent,id,text,tooltiptext);
		else return 0;
	}
	
	IGUICheckBox* IrrGUI_IGUIEnvironment_addCheckBox(IGUIEnvironment* guienv,bool checked,rect<s32>* rectangle,IGUIElement* parent=0,s32 id=-1,const wchar_t* text=0)
	{
		if (guienv)
			return guienv->addCheckBox(checked,*rectangle,parent,id,text);
		else
			return 0;
	}
	
	IGUIComboBox* IrrGUI_IGUIEnvironment_addComboBox(IGUIEnvironment* guienv,rect<s32>* rectangle,IGUIElement *parent=0,s32 id=-1)
	{
		if (guienv)
			return guienv->addComboBox(*rectangle,parent,id);
		else
			return 0;
	}
	
	IGUIContextMenu* IrrGUI_IGUIEnvironment_addContextMenu(IGUIEnvironment* guienv,rect<s32>* rectangle,IGUIElement *parent=0,s32 id=-1)
	{
		if (guienv)
			return guienv->addContextMenu(*rectangle,parent,id);
		else
			return 0;
	}
	
	IGUIEditBox* IrrGUI_IGUIEnvironment_addEditBox(IGUIEnvironment* guienv,const wchar_t* text,rect<s32>* rectangle,bool border=true,IGUIElement* parent=0,s32 id=-1)
	{	
		if (guienv)
			return guienv->addEditBox(text,*rectangle,border,parent,id);
		else
			return 0;
	}
	
	IGUIFileOpenDialog* IrrGUI_IGUIEnvironment_addFileOpenDialog(IGUIEnvironment* guienv,const wchar_t* title=0,bool modal=true,IGUIElement *parent=0,s32 id=-1)
	{
		if (guienv)
			return guienv->addFileOpenDialog(title,modal,parent,id);
		else return 0;
	}
	
	IGUIColorSelectDialog* IrrGUI_IGUIEnvironment_addColorSelectDialog(IGUIEnvironment* guienv,const wchar_t* title = 0,	bool modal=true, IGUIElement* parent=0, s32 id=-1)
	{
		if (guienv)
			return guienv->addColorSelectDialog(title,modal,parent,id);
		else return 0;
	}
	
	IGUIImage* IrrGUI_IGUIEnvironment_addImage(IGUIEnvironment* guienv,rect<s32>* rectangle,IGUIElement *parent=0,s32 id=-1,const wchar_t* text=0)
	{	
		if (guienv)
			return guienv->addImage(*rectangle,parent,id,text);
		else
			return 0;
	}
	
	IGUIImage* IrrGUI_IGUIEnvironment_addImageFromTexture(IGUIEnvironment* guienv,ITexture *image,position2d<s32>* pos,bool useAlphaChannel=true,IGUIElement *parent=0,s32 id=-1,const wchar_t* text=0)
	{
		if (guienv)
			return guienv->addImage(image,*pos,useAlphaChannel,parent,id,text);
		else
			return 0;
	}
	
	
	IGUIInOutFader* IrrGUI_IGUIEnvironment_addInOutFader(IGUIEnvironment* guienv,rect<s32>* rectangle,IGUIElement *parent=0,s32 id=-1)
	{
		if (guienv)
			return guienv->addInOutFader(rectangle,parent,id);
		else
			return 0;
	}
	
	IGUIListBox* IrrGUI_IGUIEnvironment_addListBox(IGUIEnvironment* guienv,rect<s32>* rectangle,IGUIElement *parent=0,s32 id=-1,bool drawBackground=false)
	{
		if (guienv)
			return guienv->addListBox(*rectangle,parent,id,drawBackground);
		else
			return 0;
	}
	
	IGUIContextMenu* IrrGUI_IGUIEnvironment_addMenu(IGUIEnvironment* guienv,IGUIElement *parent=0,s32 id=-1)
	{
		if (guienv)
			return guienv->addMenu(parent,id);
		else
			return 0;
	}
	
	IGUIMeshViewer* IrrGUI_IGUIEnvironment_addMeshViewer(IGUIEnvironment* guienv,rect<s32>* rectangle,IGUIElement* parent,s32 id=-1,const wchar_t* text=0)
	{
		if (guienv)
			return guienv->addMeshViewer(*rectangle,parent,id,text);
		else
			return 0;
	}
	
	IGUIWindow* IrrGUI_IGUIEnvironment_addMessageBox(IGUIEnvironment* guienv,const wchar_t* caption,const wchar_t* text=0,bool modal=true,s32 flags=EMBF_OK,IGUIElement *parent=0,s32 id=-1, video::ITexture* image=0)
	{
		if (guienv)
			return guienv->addMessageBox(caption,text,modal,flags,parent,id,image);
		else
			return 0;
	}
	
	IGUIScrollBar* IrrGUI_IGUIEnvironment_addScrollBar(IGUIEnvironment* guienv,bool horizontal,rect<s32>* rectangle,IGUIElement *parent=0,s32 id=-1)
	{
		if (guienv)
			return guienv->addScrollBar(horizontal,*rectangle,parent,id);
		else
			return 0;
	}
	
	IGUIStaticText* IrrGUI_IGUIEnvironment_addStaticText(IGUIEnvironment* guienv,const wchar_t* text,rect<s32>* rectangle,bool border=false,bool wordWrap=true,IGUIElement* parent=0,s32 id=-1,bool fillBackground = false)
	{
		if (guienv>0)
			return guienv->addStaticText(text,*rectangle,border,wordWrap,parent,id, fillBackground);
		else
			return 0;
	}
	
	IGUITab* IrrGUI_IGUIEnvironment_addTab(IGUIEnvironment* guienv,rect<s32>* rectangle,IGUIElement *parent=0,s32 id=-1)
	{
		if (guienv)
			return guienv->addTab(*rectangle,parent,id);
		else
			return 0;
	}
	
	IGUITabControl* IrrGUI_IGUIEnvironment_addTabControl(IGUIEnvironment* guienv,rect<s32>* rectangle,IGUIElement *parent=0,bool fillbackground=false,bool border=true,s32 id=-1)
	{
		if (guienv)
			return guienv->addTabControl(*rectangle,parent,fillbackground,border,id);
		else
			return 0;
	}
	
	IGUIToolBar* IrrGUI_IGUIEnvironment_addToolBar(IGUIEnvironment* guienv,IGUIElement *parent=0,s32 id=-1)
	{
		if (guienv)
			return guienv->addToolBar(parent,id);
		else
			return 0;
	}
	
	IGUIWindow* IrrGUI_IGUIEnvironment_addWindow(IGUIEnvironment* guienv,rect<s32>* rectangle,bool modal=false,const wchar_t* text=0,IGUIElement *parent=0,s32 id=-1)
	{
		if (guienv)
			return guienv->addWindow(*rectangle,modal,text,parent,id);
		else
			return 0;
	}
	
	void IrrGUI_IGUIEnvironment_drawAll(IGUIEnvironment* guienv)
	{
		if (guienv>0)
			guienv->drawAll();
	}
	
	IGUIFont* IrrGUI_IGUIEnvironment_getBuiltInFont(IGUIEnvironment* guienv)
	{
		if (guienv)
			return guienv->getBuiltInFont();
		else
			return 0;
	}
	
	IGUIFont* IrrGUI_IGUIEnvironment_getFont(IGUIEnvironment* guienv,const c8 *filename)
	{
		if (guienv)
			return guienv->getFont(path(filename));
		else
			return 0;
	}
	
	IGUIElement* IrrGUI_IGUIEnvironment_getRootGUIElement(IGUIEnvironment* guienv)
	{
		if (guienv)
			return guienv->getRootGUIElement();
		else
			return 0;
	}
	
	IGUISkin* IrrGUI_IGUIEnvironment_getSkin(IGUIEnvironment* guienv)
	{
		if (guienv)
			return guienv->getSkin();
		else
			return 0;
	}
	
	void IrrGUI_IGUIEnvironment_setSkin(IGUIEnvironment* guienv,IGUISkin* skin)
	{
		if (guienv)
			return guienv->setSkin(skin);
	}
	
	IGUISkin* IrrGUI_IGUIEnvironment_createSkin(IGUIEnvironment* guienv,EGUI_SKIN_TYPE type)
	{
		if (guienv)
			return guienv->createSkin(type);
		else
			return 0;
	}
	
	IVideoDriver* IrrGUI_IGUIEnvironment_getVideoDriver(IGUIEnvironment* guienv)
	{
		if (guienv)
			return guienv->getVideoDriver();
		else
			return 0;
	}
	
	bool IrrGUI_IGUIEnvironment_hasFocus(IGUIEnvironment* guienv,IGUIElement* element)
	{
		if (guienv)
			return guienv->hasFocus(element);
		else
			return false;
	}
	
	bool IrrGUI_IGUIEnvironment_postEventFromUser(IGUIEnvironment* guienv,SEvent* ev)
	{
		if (guienv)
			return guienv->postEventFromUser(*ev);
		else
			return false;
	}
	
	void IrrGUI_IGUIEnvironment_removeFocus(IGUIEnvironment* guienv,IGUIElement* element)
	{
		if (guienv)
			guienv->removeFocus(element);
	}
	
	void IrrGUI_IGUIEnvironment_setFocus(IGUIEnvironment* guienv,IGUIElement* element)
	{
		if (guienv)
			guienv->setFocus(element);
	}
	
	void IrrGUI_IGUIEnvironment_setUserEventReceiver(IGUIEnvironment* guienv,BMXEventReceiver* evr)
	{
		if (guienv)
			guienv->setUserEventReceiver((IEventReceiver*)evr);
	}

	// do not delete
	IGUIElement* IrrGUI_IGUIEnvironment_getFocus(IGUIEnvironment* guienv)
	{
		if (guienv)
			return guienv->getFocus();
		else return 0;
	}
	
	// do not delete
	io::IFileSystem* IrrGUI_IGUIEnvironment_getFileSystem(IGUIEnvironment* guienv)
	{
		if (guienv)
			return guienv->getFileSystem();
		else return 0;
	}
	
	void IrrGUI_IGUIEnvironment_clear(IGUIEnvironment* guienv)
	{
		if (guienv)
			guienv->clear();
	}

	// delete
	IGUISpriteBank* IrrGUI_IGUIEnvironment_getSpriteBank(IGUIEnvironment* guienv,const c8* filename)
	{
		if (guienv)
			return guienv->getSpriteBank(path(filename));
		else return 0;
	}
	
	// delete
	IGUISpriteBank* IrrGUI_IGUIEnvironment_addEmptySpriteBank(IGUIEnvironment* guienv,const c8 *name)
	{
		if (guienv)
			return guienv->addEmptySpriteBank(path(name));
		else return 0;
	}
	
	// delete
	IGUIElement* IrrGUI_IGUIEnvironment_addModalScreen(IGUIEnvironment* guienv,IGUIElement* parent)
	{
		if (guienv)
			return guienv->addModalScreen(parent);
		else return 0;
	}
	
	// do not delete
	IGUIElementFactory* IrrGUI_IGUIEnvironment_getDefaultGUIElementFactory(IGUIEnvironment* guienv)	
	{
		if (guienv)
			return guienv->getDefaultGUIElementFactory();
		else return 0;
	}
	
	void IrrGUI_IGUIEnvironment_registerGUIElementFactory(IGUIEnvironment* guienv,IGUIElementFactory* factoryToAdd)
	{
		if (guienv)
			guienv->registerGUIElementFactory(factoryToAdd);
	}
	
	u32 IrrGUI_IGUIEnvironment_getRegisteredGUIElementFactoryCount(IGUIEnvironment* guienv)
	{
		if (guienv)
			return guienv->getRegisteredGUIElementFactoryCount();
		else return -1;
	}
	
	// do not delete
	IGUIElementFactory* IrrGUI_IGUIEnvironment_getGUIElementFactory(IGUIEnvironment* guienv,u32 index)
	{
		if (guienv)
			return guienv->getGUIElementFactory(index);
		else return 0;
	}
	
	// delete 
	IGUIElement* IrrGUI_IGUIEnvironment_addGUIElement(IGUIEnvironment* guienv,const c8* elementName, IGUIElement* parent=0)
	{
		if (guienv)
			return guienv->addGUIElement(elementName,parent);
		else return 0;
	}
	
	bool IrrGUI_IGUIEnvironment_saveGUI(IGUIEnvironment* guienv,const c8* filename)
	{
		if (guienv)
			return guienv->saveGUI(path(filename));
		else return false;
	}
	
	bool IrrGUI_IGUIEnvironment_saveGUIToFileIO(IGUIEnvironment* guienv,io::IWriteFile* file)
	{
		if (guienv)
			return guienv->saveGUI(file);
		else return false;
	}
	
	bool IrrGUI_IGUIEnvironment_loadGUI(IGUIEnvironment* guienv,const c8* filename)
	{
		if (guienv)
			return guienv->loadGUI(path(filename));
		else return false;
	}
	
	bool IrrGUI_IGUIEnvironment_loadGUIFromFileIO(IGUIEnvironment* guienv,io::IReadFile* file)	
	{
		if (guienv)
			return guienv->loadGUI(file);
		else return false;
	}
	
	void IrrGUI_IGUIEnvironment_serializeAttributes(IGUIEnvironment* guienv,io::IAttributes* out, io::SAttributeReadWriteOptions* options=0)
	{
		if (guienv)
			guienv->serializeAttributes(out,options);
	}
	
	void IrrGUI_IGUIEnvironment_deserializeAttributes(IGUIEnvironment* guienv,io::IAttributes* in, io::SAttributeReadWriteOptions* options=0)
	{
		if (guienv)
			guienv->deserializeAttributes(in,options);
	}
	
	void IrrGUI_IGUIEnvironment_writeGUIElement(IGUIEnvironment* guienv,io::IXMLWriter* writer, IGUIElement* node) 
	{
		if (guienv)
			guienv->writeGUIElement(writer,node);
	}
	
	void IrrGUI_IGUIEnvironment_readGUIElement(IGUIEnvironment* guienv,io::IXMLReader* reader, IGUIElement* node) 
	{
		if (guienv)
			guienv->readGUIElement(reader,node);
	}

	IOSOperator* IrrGUI_IGUIEnvironment_getOSOperator(IGUIEnvironment* guienv)
	{
		if (guienv)
			return guienv->getOSOperator();
		else return 0;
	}
	
	IGUISpinBox* IrrGUI_IGUIEnvironment_addSpinBox(IGUIEnvironment* guienv, const wchar_t* text, rect<s32>* rectangle, bool border=true, IGUIElement* parent=0, s32 id=-1)
	{
		if (guienv)
			return guienv->addSpinBox(text, *rectangle, border, parent, id);
		else return 0;
	}

	IGUITable* IrrGUI_IGUIEnvironment_addTable(IGUIEnvironment* guienv, const rect<s32>* rectangle, IGUIElement* parent=0, s32 id=-1, bool drawBackground = false)
	{
		if (guienv)
			return guienv->addTable(*rectangle, parent, id, drawBackground);
		else return 0;
	}	
	
	IGUIImageList* IrrGUI_IGUIEnvironment_createImageList( IGUIEnvironment* guienv, ITexture* texture, dimension2di* imageSize, bool useAlphaChannel )
	{
		if (guienv)
			return guienv->createImageList(texture, *imageSize, useAlphaChannel);
		else return 0;
	}
	
	IGUITreeView* IrrGUI_IGUIEnvironment_addTreeView(IGUIEnvironment* guienv, recti* rectangle,	IGUIElement* parent=0, s32 id=-1, bool drawBackground=false,
		bool scrollBarVertical = true, bool scrollBarHorizontal = false) 
	{
		if (guienv)
			return guienv->addTreeView(*rectangle, parent, id, drawBackground, scrollBarVertical, scrollBarHorizontal);
		else return 0;
	}

	IGUIFont* IrrGUI_IGUIEnvironment_addFont(IGUIEnvironment* guienv, const c8* name, IGUIFont* font) 
	{
		if (guienv)
			return guienv->addFont(path(name), font);
		else return 0;
	}
}

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