#ifndef SEEN_VIEWS_H
#define SEEN_VIEWS_H

/**
 * @file
 * Phoebe DOM Implementation.
 *
 * This is a C++ approximation of the W3C DOM model, which follows
 * fairly closely the specifications in the various .idl files, copies of
 * which are provided for reference.  Most important is this one:
 *
 * http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/idl-definitions.html
 */
/*
 * Authors:
 *   Bob Jamison
 *
 * Copyright (C) 2005-2008 Bob Jamison
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *
 *  This library 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
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *  
 * =========================================================================
 * NOTES
 * 
 * This is the Level 2 Views definition, which is very minimalist.  It is
 * described here:
 * http://www.w3.org/TR/2000/REC-DOM-Level-2-Views-20001113
 * 
 * Note that SVG uses the DOM Core and Events Level 3, but Level 2 CSS and Views.         
 * 
 * The level 3 version is much larger:
 * http://www.w3.org/TR/2004/NOTE-DOM-Level-3-Views-20040226
 * Be prepared in the future to adjust to this, if SVG ever switches .
 */



#include "dom.h"



namespace org
{
namespace w3c
{
namespace dom
{
namespace views
{


//local aliases
typedef dom::Node Node;
typedef dom::DOMString DOMString;

//forward declarations
class DocumentView;
class AbstractView;



/*#########################################################################
## AbstractView
#########################################################################*/

/**
 * A base interface that all views shall derive from.
 */
class AbstractView
{
public:

    /**
     * The source DocumentView of which this is an AbstractView.
     */
    virtual DocumentView *getDocument()
        {
        return documentView;
		}

    //##################
    //# Non-API methods
    //##################

    /**
     *
     */
    AbstractView()
	    { documentView = NULL; }

    /**
     *
     */
    AbstractView(const AbstractView &other)
        {
        assign(other);
        }

    /**
     *
     */
    AbstractView &operator=(const AbstractView &other)
        {
        assign(other);
        return *this;
        }

    /**
     *
     */
    virtual ~AbstractView() {}

private:

    void assign(const AbstractView &other)
    {
        if (documentView != NULL)
        {
            free(documentView); //NOTE: is free the correct method?
        }
        documentView = other.documentView;
    }
    DocumentView *documentView;
};


/*#########################################################################
## DocumentView
#########################################################################*/


/**
 * The DocumentView interface is implemented by Document objects in DOM 
 * implementations supporting DOM Views. It provides an attribute to retrieve the 
 * default view of a document.
 */
class DocumentView
{
public:

    /**
     * The default AbstractView for this Document, or null if none available.
     */
    virtual AbstractView *getDefaultView()
        {
		return defaultView;
		}

    //##################
    //# Non-API methods
    //##################

    /**
     *
     */
    DocumentView() {defaultView = NULL;}

    /**
     *
     */
    DocumentView(const DocumentView &other)
        {
        assign(other);
        }

    /**
     *
     */
    DocumentView &operator=(const DocumentView &other)
        {
        assign(other);
        return *this;
        }

    /**
     *
     */
    virtual ~DocumentView() {}

private:

    void assign(const DocumentView &other)
    {
        if (defaultView != NULL)
        {
            free(defaultView); //NOTE: is free the correct method?
        }
        defaultView = other.defaultView;
    }
    AbstractView *defaultView;
    		
};






}  //namespace views
}  //namespace dom
}  //namespace w3c
}  //namespace org


#endif // SEEN_VIEWS_H
/*#########################################################################
## E N D    O F    F I L E
#########################################################################*/

