/***************************************************************************
 *   CT Environment Variable Implementation                                *
 *   --------------------------------------------------------------------  *
 *   Copyright (C) 1999, Gary Meyer <gary@meyer.net>                       *
 *   --------------------------------------------------------------------  *
 *   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.                                   *
 ***************************************************************************/

// Do not introduce any TQt or KDE dependencies into the "CT"-prefixed classes.
// I want to be able to reuse these classes with another GUI toolkit. -GM 11/99

#include "ctvariable.h"

using namespace std;

CTVariable::CTVariable(string tokStr, string _comment)
{
  if (tokStr.substr(0,2) == "#\\")
  {
    tokStr = tokStr.substr(2,tokStr.length() - 2);
    enabled = false;
  }
  else
    enabled = true;

  int spacepos(0);

  spacepos        = tokStr.find_first_of(" =");
  variable        = tokStr.substr(0,spacepos);

  value           = tokStr.substr(spacepos+1,tokStr.length()-spacepos-1);
  comment         = _comment;

  initialVariable = variable;
  initialValue    = value;
  initialComment  = comment;
  initialEnabled  = enabled;
}

CTVariable::CTVariable(const CTVariable &source) :
  variable(source.variable),
  value(source.value),
  comment(source.comment),
  enabled(source.enabled),
  initialVariable(""),
  initialValue(""),
  initialComment(""),
  initialEnabled(true)
{
}

void CTVariable::operator = (const CTVariable& source)
{
  variable        = source.variable;
  value           = source.value;
  comment         = source.comment;
  enabled         = source.enabled;
  initialVariable = "";
  initialValue    = "";
  initialComment  = "";
  initialEnabled  = true;
  return;
}

ostream& operator << (ostream& outputStream, const CTVariable& source)
{
  if (source.comment != string(""))
    outputStream << "# " << source.comment << "\n";

  if (!source.enabled)
    outputStream << "#\\";

  outputStream << source.variable << "=" << source.value << "\n";

  return outputStream;
}

void CTVariable::apply()
{
  initialVariable = variable;
  initialValue    = value;
  initialComment  = comment;
  initialEnabled  = enabled;
}

void CTVariable::cancel()
{
  variable = initialVariable;
  value    = initialValue;
  comment  = initialComment;
  enabled  = initialEnabled;
}

bool CTVariable::dirty() const
{
  return ((variable != initialVariable) || (value != initialValue) ||
    (comment != initialComment) || (enabled != initialEnabled));
}