/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 *
 * The contents of this file are subject to the Netscape Public License
 * Version 1.0 (the "NPL"); you may not use this file except in
 * compliance with the NPL.  You may obtain a copy of the NPL at
 * http://www.mozilla.org/NPL/
 *
 * Software distributed under the NPL is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
 * for the specific language governing rights and limitations under the
 * NPL.
 *
 * The Initial Developer of this code under the NPL is Netscape
 * Communications Corporation.  Portions created by Netscape are
 * Copyright (C) 1998 Netscape Communications Corporation.  All Rights
 * Reserved.
 */

#ifndef ChangeAttributeTxn_h__
#define ChangeAttributeTxn_h__

#include "nsIDOMSelectionListener.h"
#include "nsIEditProperty.h"

class TypeInState : public nsIDOMSelectionListener
{
public:

  NS_DECL_ISUPPORTS

  TypeInState();
  void Reset();
  virtual ~TypeInState();

  NS_IMETHOD NotifySelectionChanged();

  void GetEnumForName(nsIAtom *aPropName, PRUint32 &aEnum);

  void SetProp(PRUint32 aProp, PRBool aSet);

  void SetPropValue(PRUint32 aProp, const nsString &aValue);

  PRBool IsSet(PRUint32 aStyle);
  PRBool IsAnySet();
  void   UnSet(PRUint32 aStyle);

  void SetBold(PRBool aIsSet);
  PRBool GetBold(); 

  void SetItalic(PRBool aIsSet);
  PRBool GetItalic();

  void SetUnderline(PRBool aIsSet);
  PRBool GetUnderline();
  
  void SetFontFace(const nsString &aFace);
  void GetFontFace(nsString &aFace);
  
  void SetFontColor(const nsString &aColor);
  void GetFontColor(nsString &aColor);
  
  void SetFontSize(const nsString &aSize);
  void GetFontSize(nsString &aSize);

protected:
  PRBool   mBold;
  PRBool   mItalic;
  PRBool   mUnderline;
  nsString mFontFace;
  nsString mFontColor;
  nsString mFontSize;
  PRUint32 mIsSet;
};

#define NS_TYPEINSTATE_UNKNOWN    0x00000000
#define NS_TYPEINSTATE_BOLD       0x00000001
#define NS_TYPEINSTATE_ITALIC     0x00000002
#define NS_TYPEINSTATE_UNDERLINE  0x00000004
#define NS_TYPEINSTATE_FONTFACE   0x00000008
#define NS_TYPEINSTATE_FONTCOLOR  0x00000010
#define NS_TYPEINSTATE_FONTSIZE   0x00000020

/* ----- inline method definitions ----- */
inline
void TypeInState::Reset()
{
  mBold = PR_FALSE;
  mItalic = PR_FALSE;
  mUnderline = PR_FALSE;
  mIsSet = 0;
};

inline
TypeInState::TypeInState()
{
  NS_INIT_REFCNT();
  Reset();
};

inline 
void TypeInState::GetEnumForName(nsIAtom *aPropName, PRUint32 &aEnum)
{
  aEnum = NS_TYPEINSTATE_UNKNOWN;
  if (nsIEditProperty::b==aPropName) { aEnum = NS_TYPEINSTATE_BOLD; }
  else if (nsIEditProperty::i==aPropName) { aEnum = NS_TYPEINSTATE_ITALIC; }
  else if (nsIEditProperty::u==aPropName) { aEnum = NS_TYPEINSTATE_UNDERLINE; }
  else if (nsIEditProperty::face==aPropName) { aEnum = NS_TYPEINSTATE_FONTFACE; }
  else if (nsIEditProperty::color==aPropName) { aEnum = NS_TYPEINSTATE_FONTCOLOR; }
  else if (nsIEditProperty::size==aPropName) { aEnum = NS_TYPEINSTATE_FONTSIZE; }
}

inline 
PRBool TypeInState::IsSet(PRUint32 aStyle)
{
  if ((PRBool)(mIsSet & aStyle))
    return PR_TRUE;
  else
    return PR_FALSE;
};

inline 
void TypeInState::UnSet(PRUint32 aStyle)
{
  mIsSet &= ~aStyle;
};

inline
PRBool TypeInState::IsAnySet()
{
  return (PRBool)(0!=mIsSet);
}

inline
void TypeInState::SetBold(PRBool aIsSet) 
{ 
  mBold = aIsSet; 
  mIsSet |= NS_TYPEINSTATE_BOLD;
};

inline
PRBool TypeInState::GetBold() 
{ return mBold;};

inline
void TypeInState::SetItalic(PRBool aIsSet) 
{ 
  mItalic = aIsSet; 
  mIsSet |= NS_TYPEINSTATE_ITALIC;
};

inline
PRBool TypeInState::GetItalic() 
{ return mItalic; };

inline
void TypeInState::SetUnderline(PRBool aIsSet) 
{ 
  mUnderline = aIsSet; 
  mIsSet |= NS_TYPEINSTATE_UNDERLINE;
};

inline
PRBool TypeInState::GetUnderline() 
{ return mUnderline; };

inline
void TypeInState::SetFontFace(const nsString &aFace)
{
  mFontFace = aFace;
  mIsSet |= NS_TYPEINSTATE_FONTFACE;
};

inline
void TypeInState::GetFontFace(nsString &aFace)
{ aFace = mFontFace; };

inline
void TypeInState::SetFontColor(const nsString &aColor)
{
  mFontColor = aColor;
  mIsSet |= NS_TYPEINSTATE_FONTCOLOR;
};

inline
void TypeInState::GetFontColor(nsString &aColor)
{ aColor = mFontColor; };

inline
void TypeInState::SetFontSize(const nsString &aSize)
{
  mFontSize = aSize;
  mIsSet |= NS_TYPEINSTATE_FONTSIZE;
};

inline
void TypeInState::GetFontSize(nsString &aSize)
{ aSize = mFontSize; };

inline void TypeInState::SetProp(PRUint32 aProp, PRBool aSet)
{
  switch (aProp)
  {
    case NS_TYPEINSTATE_BOLD:
      SetBold(aSet);
      break;
    case NS_TYPEINSTATE_ITALIC:
      SetItalic(aSet);
      break;
    case NS_TYPEINSTATE_UNDERLINE:
      SetUnderline(aSet);
      break;
  }
}

inline void TypeInState::SetPropValue(PRUint32 aProp, const nsString &aValue)
{
  switch (aProp)
  {
    case NS_TYPEINSTATE_FONTFACE:
      SetFontFace(aValue);
      break;
    case NS_TYPEINSTATE_FONTCOLOR:
      SetFontColor(aValue);
      break;
    case NS_TYPEINSTATE_FONTSIZE:
      SetFontSize(aValue);
      break;
  }
}

#endif
