/* ImLib3D
 * Copyright (c) 2001, ULP-IPB Strasbourg.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or (at
 * your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
/*! \file Display.hpp */
//! Display.hpp
/*! 

 */

#ifndef _Display_hpp
#define _Display_hpp

#include<ImLib3D/Image3D.hpp>
#include<ImLib3D.hpp>
#include<ImLib3D/Image3DSet.hpp>
class ImLib3DDisplay;


//! Display is an abstract base class for simple image displaying and limited user interaction
/*! This is meant more as a debuging tool than a full abstract interface to
a visualisation system;  
 */
class ImLib3DDisplay
{
protected:
	ImLib3DDisplay(){;}
public:
	template<class ImageType>
	static  void Show(const ImageType &ima);
//	template<class ImageType>
	static  void ShowSet(Image3DSet<Image3Df> &images);
	virtual void ShowImage(const Image3Df &ima)=0;	
	virtual void ShowImages(Image3DSet<Image3Df> &ima)=0;	
	static  void Set(ImLib3DDisplay *newDisp);
};

//! Very simple text mode display
class TextDisplay : public ImLib3DDisplay
{
public:
	virtual void ShowImage(const Image3Df &ima);
	virtual void ShowImages(Image3DSet<Image3Df> &images);	
	TextDisplay(){;}
};

//! Display using an external viewer program
class ViewerDisplay : public ImLib3DDisplay
{
	string prgPath;
public:
	virtual ~ViewerDisplay(){;}
	virtual void ShowImage(const Image3Df &ima);
	virtual void ShowImages(Image3DSet<Image3Df> &images);	
	ViewerDisplay();
};

template<class ImageType>
void ImLib3DDisplay::Show(const ImageType &ima)
{
	Image3Df imaf;imaf=ima;
	imLib3D.display->ShowImage(imaf);
}

//works only for Image3Df at the moment
//template <class ImageType>
inline void 
ImLib3DDisplay::ShowSet(Image3DSet<Image3Df> & images)
{
  	imLib3D.display->ShowImages(images);
}


#endif // _Display_hpp
