// Link with osg, osgDB, osgGA and osgViewer
#include <osgViewer/CompositeViewer>
#include <iostream>
#include <osgDB/ReadFile>

class ResizeHandler : public osgGA::GUIEventHandler
{
public:
	virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
	{
		switch(ea.getEventType())
		{
		case(osgGA::GUIEventAdapter::RESIZE):
			{
				std::cout << aa.asView()->getName() << " resized to " << ea.getWindowWidth() << "x" << ea.getWindowHeight() << std::endl;
				return true;
			}
			break;
		default:
			return false;
		}
	}
};

osgViewer::View* createView(const std::string& name, int dims)
{
	static int startpos = 50;

	osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
	traits->x = startpos;
	traits->y = startpos;
	traits->width = dims;
	traits->height = dims;
	traits->windowDecoration = true;
	traits->doubleBuffer = true;
	traits->sharedContext = 0;
	traits->windowName = name;

	startpos += dims + 50;

	osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());

	osgViewer::View* view = new osgViewer::View();
	
	view->setName(name);
	view->getCamera()->setGraphicsContext(gc.get());
	view->getCamera()->setViewport(new osg::Viewport(0,0, traits->width, traits->height));

	view->setSceneData(osgDB::readNodeFile("cow.osg"));

	view->addEventHandler(new ResizeHandler());

	return view;
}

int main(int argc, char* argv[])
{
	osgViewer::CompositeViewer viewer;
	
	viewer.addView(createView("small", 200));
	viewer.addView(createView("big", 400));

	return viewer.run();
}
