/******************************** LICENSE ********************************

 Copyright 2007 European Centre for Medium-Range Weather Forecasts (ECMWF)

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at 

    http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.

 ******************************** LICENSE ********************************/

/*! \file FrameBase.h
    \brief Definition of the Template class FrameBase.
    
    Magics Team - ECMWF 2006
    
    Started: Thu 9-Feb-2006
    
    Changes:
    
*/

#ifndef FrameBase_H
#define FrameBase_H

#include "magics.h"
#include "MagTranslator.h"
#include "Factory.h"



namespace magics {

class Polyline;
class PaperPoint;
class Colour;

class FrameBase {

public:
	FrameBase() {}
	virtual ~FrameBase() {}
    
    virtual void set(const XmlNode&) {
        MagLog::dev() << "FrameBase::set(const XmlNode&)---> to be checked!...\n";
    }
    virtual void set(const map<string, string>&) {
        MagLog::dev() << "FrameBase::set(const map<string, string&)---> to be checked!...\n";
    }
    virtual FrameBase* clone() const {
        MagLog::dev() << "FrameBase::set(const map<string, string&)---> to be checked!...\n";
        return new FrameBase();
    } 
     virtual void toxml(ostream&, int = 0) const {
    	 MagLog::dev() << "FrameBase::virtual void toxml(ostream&, int = 0) const ---> to be checked!...\n";
    }  
    virtual bool operator()() const { 
    	MagLog::dev() << " bool FrameBase::operator()() const ---> to be checked!...\n";
    	return false; 
    }
    
    virtual void set(Polyline&) {
     	MagLog::dev() << " bool FrameBase::set(Polyline&) ---> to be checked!...\n";
    }
     virtual void blank(Polyline&) {
     	MagLog::dev() << " bool FrameBase::blank(Polyline&) ---> to be checked!...\n";
    }
    // Simulate the FrameAttributes interface!
    virtual void setColour(Colour*) {} 
	virtual void setStyle(LineStyle) {} 
	virtual void setThickness(int) {} 
	virtual void setBlanking(bool) {}
	
    
protected:
     //! Method to print string about this class on to a stream of type ostream (virtual).
	 virtual void print(ostream& out) const { out << "FrameBase\n"; } 

private:
    //! Copy constructor - No copy allowed
	FrameBase(const FrameBase&);
    //! Overloaded << operator to copy - No copy allowed
	FrameBase& operator=(const FrameBase&);

// -- Friends
    //! Overloaded << operator to call print().
	friend ostream& operator<<(ostream& s,const FrameBase& p)
		{ p.print(s); return s; }

};

template <>
class MagTranslator<string, FrameBase> { 
public:
	FrameBase* operator()(const string& val )
	{
		return SimpleObjectMaker<FrameBase>::create(val);
	}     

	FrameBase* magics(const string& param)
	{
		string val;
		ParameterManager::get(param, val);
		return (*this)(val);
	}
};

} // namespace magics
#endif
