/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 * 
 *************************************************************/



#ifndef CSI_DSAPI_D_TOKEN_HXX
#define CSI_DSAPI_D_TOKEN_HXX

// BASE CLASSES
#include <ary_i/ci_text2.hxx>
#include <ary_i/ci_atag2.hxx>


namespace ary
{
namespace inf
{
    class DocumentationDisplay;
}
}



namespace csi
{
namespace dsapi
{

using ary::inf::DocumentationDisplay;


class DT_Dsapi : public ary::inf::DocuToken
{
  public:
	virtual void		DisplayAt(
							DocumentationDisplay &
												o_rDisplay ) const  = 0;
	virtual bool		IsWhiteOnly() const;
};



class DT_TextToken : public DT_Dsapi
{
  public:
	explicit		    DT_TextToken(
							const char *		i_sText )
												:	sText(i_sText) {}
	explicit		    DT_TextToken(
							const String &  	i_sText )
												:	sText(i_sText) {}
    virtual             ~DT_TextToken();

	virtual void		DisplayAt(
							DocumentationDisplay &
												o_rDisplay ) const;
	const char *		GetText() const			{ return sText; }
	const String &      GetTextStr() const		{ return sText; }

	String &            Access_Text()   		{ return sText; }

	virtual bool		IsWhiteOnly() const;

  private:
	String				sText;
};

class DT_White : public DT_Dsapi
{
  public:
                        DT_White() {}
    virtual             ~DT_White();

	virtual void		DisplayAt(
							DocumentationDisplay &
												o_rDisplay ) const;
	virtual bool		IsWhiteOnly() const;
};


class DT_MLTag : public DT_Dsapi
{
  public:
	enum E_Kind
	{
		k_unknown = 0,
		k_begin,
		k_end,
		k_single
	};
};

class DT_MupType : public DT_MLTag
{
  public:
	explicit		    DT_MupType(             /// Constructor for End-Tag
							bool				)	/// Must be there, but is not evaluated.
                                                :	bIsBegin(false) {}
	explicit		    DT_MupType(             /// Constructor for Begin-Tag
							const String &		i_sScope )
												:	sScope(i_sScope), bIsBegin(true) {}
    virtual             ~DT_MupType();

	virtual void		DisplayAt(
							DocumentationDisplay &
												o_rDisplay ) const;
	const String  &		Scope() const			{ return sScope; }
	bool				IsBegin() const			{ return bIsBegin; }

  private:
	String 				sScope;
	bool				bIsBegin;
};

class DT_MupMember : public DT_MLTag
{
  public:
	explicit		    DT_MupMember(           /// Constructor for End-Tag
							bool				)	/// Must be there, but is not evaluated.
												:	bIsBegin(false) {}
						DT_MupMember(           /// Constructor for Begin-Tag
							const String &      i_sScope )
												:	sScope(i_sScope), bIsBegin(true) {}
    virtual             ~DT_MupMember();

	virtual void		DisplayAt(
							DocumentationDisplay &
												o_rDisplay ) const;
	const String  &		Scope() const			{ return sScope; }
	bool				IsBegin() const			{ return bIsBegin; }

  private:
	String 				sScope;
	bool				bIsBegin;
};

class DT_MupConst : public DT_Dsapi
{
  public:
						DT_MupConst(
							const char *		i_sConstText )
												:	sConstText(i_sConstText) {}
	virtual             ~DT_MupConst();

	virtual void		DisplayAt(
							DocumentationDisplay &
												o_rDisplay ) const;
	const char *		GetText() const			{ return sConstText; }

  private:
	String 				sConstText;				/// Without HTML.
};


class DT_Style : public DT_MLTag
{
  public:
						DT_Style(
							const char *		i_sPlainHtmlTag,
							bool                i_bNewLine )
												: sText(i_sPlainHtmlTag), bNewLine(i_bNewLine) {}
	virtual             ~DT_Style();

	virtual void		DisplayAt(
							DocumentationDisplay &
												o_rDisplay ) const;
	const char *		GetText() const			{ return sText; }
	bool				IsStartOfNewLine() const
												{ return bNewLine; }
  private:
	String 				sText;					/// With HTML.
	E_Kind              eKind;
	bool				bNewLine;
};

class DT_EOL : public DT_Dsapi
{
  public:
                        DT_EOL() {}
    virtual             ~DT_EOL();

	virtual void		DisplayAt(
							DocumentationDisplay &
												o_rDisplay ) const;
	virtual bool		IsWhiteOnly() const;
};


class DT_AtTag : public ary::inf::AtTag2
{
  public:
	void            	AddToken(
							DYN ary::inf::DocuToken &
												let_drToken )
												{	aText.AddToken(let_drToken); }
	void				SetName(
							const char *		i_sName )
												{ sTitle = i_sName; }

  protected:
						DT_AtTag(
							const char *		i_sTitle )
												:	ary::inf::AtTag2(i_sTitle) {}
};

class DT_StdAtTag : public DT_AtTag
{
  public:
	explicit			DT_StdAtTag(
							const char *		i_sTitle )
												:	DT_AtTag(i_sTitle) {}
	virtual             ~DT_StdAtTag();

	virtual void		DisplayAt(
							DocumentationDisplay &
												o_rDisplay ) const;
};

class DT_SeeAlsoAtTag : public DT_AtTag
{
  public:
						DT_SeeAlsoAtTag()		:	DT_AtTag("") {}
    virtual             ~DT_SeeAlsoAtTag();

	virtual void		DisplayAt(
							DocumentationDisplay &
												o_rDisplay ) const;
	const String  &		LinkText() const		{ return sTitle; }	// Missbrauch von sTitle
};

class DT_ParameterAtTag : public DT_AtTag
{
  public:
						DT_ParameterAtTag()		:	DT_AtTag("") {}
    virtual             ~DT_ParameterAtTag();

	void				SetTitle(
		                	const char *		i_sTitle );
	virtual void		DisplayAt(
							DocumentationDisplay &
												o_rDisplay ) const;
};

class DT_SinceAtTag : public DT_AtTag
{
  public:
						DT_SinceAtTag()		:	DT_AtTag("Since version") {}
    virtual             ~DT_SinceAtTag();

	virtual void		DisplayAt(
							DocumentationDisplay &
												o_rDisplay ) const;
};


}   // namespace dsapi
}   // namespace csi

#endif

