/*
 * regexpl - Console Registry Explorer
 *
 * Copyright (C) 2000-2005 Nedko Arnaudov <nedko@users.sourceforge.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.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; see the file COPYING.  If not, write to
 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */

// prompt for Registry Explorer

#include "ph.h"
#include "Prompt.h"

#define ESCAPE_CHAR                        _T("\\")
#define CURRENT_PATH_ALIAS_CHAR            _T("w")
#define CURRENT_PATH_ALIAS                 ESCAPE_CHAR CURRENT_PATH_ALIAS_CHAR
#define DEFAULT_PROMPT                     CURRENT_PATH_ALIAS _T("\n# ")

CPrompt::CPrompt(CRegistryTree& rTree, HRESULT& rhr):m_rTree(rTree)
{
  m_pszPrompt = new (std::nothrow) TCHAR[_tcslen(DEFAULT_PROMPT)+1];
  if (!m_pszPrompt)
  {
    rhr = E_OUTOFMEMORY;
    return;
  }

  _tcscpy(m_pszPrompt,DEFAULT_PROMPT);
}

HRESULT CPrompt::SetPrompt(LPCTSTR pszPrompt)
{
  if (!pszPrompt)
  {
    ASSERT(FALSE);
    return E_UNEXPECTED;
  }

  m_pszPrompt = new (std::nothrow) TCHAR[_tcslen(pszPrompt)+1];
  if (!m_pszPrompt)
    return E_OUTOFMEMORY;

  _tcscpy(m_pszPrompt,pszPrompt);

  return S_OK;
}

CPrompt::~CPrompt()
{
  if (m_pszPrompt)
    delete[] m_pszPrompt;
}

void CPrompt::ShowPrompt(CConsole &rConsole)
{
  TCHAR *pch = m_pszPrompt;
  TCHAR Buffer[2] = " ";

  const TCHAR *pszCurrentPath;

  while (*pch)
  {
    if (_tcsncmp(pch,CURRENT_PATH_ALIAS,_tcslen(CURRENT_PATH_ALIAS)) == 0)
    {
      pszCurrentPath = m_rTree.GetCurrentPath();
      rConsole.Write(pszCurrentPath?pszCurrentPath:_T("NULL (Internal Error)"));
      pch += _tcslen(CURRENT_PATH_ALIAS);
    }
    else
    {
      Buffer[0] = *pch++;
      rConsole.Write(Buffer);
    }
  }
}

LPCTSTR CPrompt::GetDefaultPrompt()
{
  return DEFAULT_PROMPT;
}