/***************************************************************************
                          textedit.cpp - Rich text editing widget 
                             -------------------
    copyright            : (C) 2002-2003 Marc Britton <consume@optusnet.com.au>
                           (C) 2004      Michal Rudolf <mrudolf@kdewebdev.org>
    email                : consume@optusnet.com.au
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   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.                                   *
 *                                                                         *
 ***************************************************************************/

/* QT INCLUDES */
#include <tqlayout.h>
#include <tqlineedit.h>
#include <tqstringlist.h>
#include <tqevent.h>

/* OTHER INCLUDES */
#include <specials.h>
#include "textedit.h"
#include <tdelocale.h>
#include <kommanderplugin.h>

enum Functions {
  FirstFunction = 450, //CHANGE THIS NUMBER TO AN UNIQUE ONE!!!
  TE_setModified,
  TE_selectText,
  TE_paragraphs,
  TE_length,
//  TE_getCursorPosition,
  TE_paragraphLength,
  TE_linesOfParagraph,
  TE_findText,
  TE_VAsuperScript,
  TE_VAnormalScript,
  LastFunction
};

TextEdit::TextEdit(TQWidget * a_parent, const char *a_name):KTextEdit(a_parent, a_name),
KommanderWidget(this)
{
  TQStringList states;
  states << "default";
  setStates(states);
  setDisplayStates(states);

  connect(this, TQ_SIGNAL(textChanged()), this, TQ_SLOT(setTextChanged()));

  KommanderPlugin::setDefaultGroup(Group::DCOP);
  KommanderPlugin::registerFunction(TE_setModified, "setModified(TQString widget, bool Modified)",  i18n("Set widget modified status."), 1);
  KommanderPlugin::registerFunction(TE_selectText, "selectText(TQString widget, int paraFrom, int indexFrom, int paraTo, int indexTo)",  i18n("Select a block of text using the paragraph number and character index of the line. You can use the cursorPositionChanged(int, int) signal to get this data in real time into a script."), 5);
  KommanderPlugin::registerFunction(TE_findText, "findText(TQString widget, TQString Text, bool Case-Sensitive, bool Forward)",  i18n("Search for text from the cursor or a specified position. You can specifiy case sensitive search and forward or backward."), 5);
//  KommanderPlugin::registerFunction(TE_findText, "findText(TQString widget, TQString Text, bool Case-Sensitive, bool Forward, int Paragraph, int Index)",  i18n("Search for text from the cursor or a specified position. You can specifiy case sensitive search and forward or backward."), 5, 7);
  KommanderPlugin::registerFunction(TE_paragraphs, "paragraphs(TQString widget)",  i18n("Get the number of paragraphs in the widget."), 1);
  KommanderPlugin::registerFunction(TE_length, "length(TQString widget)",  i18n("Get the total length of all text."), 1);
//  KommanderPlugin::registerFunction(TE_getCursorPosition, "getCursorPosition(TQString widget)",  i18n("Get the cursor postion in the form of paragraph and postion integers."), 1);
  KommanderPlugin::registerFunction(TE_paragraphLength, "paragraphLength(TQString widget, int Paragraph)",  i18n("Get the length of the paragraph."), 2);
  KommanderPlugin::registerFunction(TE_linesOfParagraph, "linesOfParagraph(TQString widget, int Paragraph)",  i18n("Get the number of lines in the paragraph."), 2);
  KommanderPlugin::registerFunction(TE_VAsuperScript, "setSuperScript(TQString widget)",  i18n("Use to set superscript."), 1);
  KommanderPlugin::registerFunction(TE_VAnormalScript, "setNormalScript(TQString widget)",  i18n("Use to revert from superscript to normal script."), 1);
}

TQString TextEdit::currentState() const
{
  return TQString("default");
}

TextEdit::~TextEdit()
{
}

bool TextEdit::isKommanderWidget() const
{
  return true;
}

TQStringList TextEdit::associatedText() const
{
  return KommanderWidget::associatedText();
}

void TextEdit::setAssociatedText(const TQStringList & a_at)
{
  KommanderWidget::setAssociatedText(a_at);
}

void TextEdit::setPopulationText(const TQString & a_text)
{
  KommanderWidget::setPopulationText(a_text);
}

TQString TextEdit::populationText() const
{
  return KommanderWidget::populationText();
}

void TextEdit::populate()
{
  setWidgetText(KommanderWidget::evalAssociatedText(populationText()));
}

void TextEdit::setWidgetText(const TQString & a_text)
{
  setText(a_text);
  emit widgetTextChanged(text());
}

void TextEdit::setTextChanged()
{
  emit widgetTextChanged(text());
}

void TextEdit::focusOutEvent( TQFocusEvent * e)
{
  TQTextEdit::focusOutEvent(e);
  emit lostFocus();
}

void TextEdit::focusInEvent( TQFocusEvent * e)
{
  TQTextEdit::focusInEvent(e);
  emit gotFocus();
}

void TextEdit::showEvent(TQShowEvent * e)
{
  TQTextEdit::showEvent(e);
  emit widgetOpened();
}

void TextEdit::contextMenuEvent( TQContextMenuEvent * e )
{
  e->accept();
  TQPoint p = e->globalPos();
  emit contextMenuRequested(p.x(), p.y());
}

bool TextEdit::isFunctionSupported(int f)
{
  return f == DCOP::text || f == DCOP::setText || f == DCOP::selection || f == DCOP::setSelection || f == DCOP::clear || f == DCOP::setEditable || f == DCOP::geometry || f == DCOP::hasFocus || f == DCOP::getBackgroundColor || f == DCOP::setBackgroundColor || f == DCOP::isModified || (f >= FirstFunction && f <= LastFunction);
}

TQString TextEdit::handleDCOP(int function, const TQStringList& args)
{
  switch (function) {
    case DCOP::text:
      return text();
    case DCOP::setText:
      setWidgetText(args[0]);
      break;
    case DCOP::selection:
      return selectedText();
    case DCOP::setSelection:
      insert(args[0]);
      break;
    case DCOP::clear:
      setWidgetText(TQString());
      break;
    case DCOP::setEditable:
      setReadOnly(args[0] == "false" || args[0] == "0");
      break;
    case DCOP::getBackgroundColor:
      return this->paletteBackgroundColor().name();
      break;
    case DCOP::setBackgroundColor:
    {
      TQColor color;
      color.setNamedColor(args[0]);
      this->setPaletteBackgroundColor(color);
      break;
    }
    case DCOP::isModified:
      return isModified() ? "1" : "0";
      break;
    case TE_setModified:
      this->setModified(args[0].toInt());
      break;
    case TE_selectText:
      TQTextEdit::setSelection(args[0].toInt(), args[1].toInt(), args[2].toInt(), args[3].toInt());
      break;
    case TE_length:
      return TQString::number(TQTextEdit::length() );
      break;
    /*case TE_getCursorPosition:
      return TQString::number(TQTextEdit::getCursorPosition() );
      break;*/
    case TE_paragraphLength:
      return TQString::number(TQTextEdit::paragraphLength(args[0].toInt() ) );
      break;
    case TE_linesOfParagraph:
      return TQString::number(TQTextEdit::linesOfParagraph(args[0].toInt() ) );
      break;
    case TE_findText:
    {
//      int para = args[3].toInt();
//      int idx = args[4].toInt();
//      return TQString::number(TQTextEdit::find(args[0], args[1].toUInt(), false, args[2].toUInt(), para, idx ));
      return TQString::number(TQTextEdit::find(args[0], args[1].toUInt(), false ));
      break;
    }
    case TE_VAsuperScript:
      break;
      TQTextEdit::setVerticalAlignment(AlignSuperScript);
    case TE_VAnormalScript:
      TQTextEdit::setVerticalAlignment(AlignNormal);
      break;
    case DCOP::geometry:
    {
      TQString geo = TQString::number(this->x())+" "+TQString::number(this->y())+" "+TQString::number(this->width())+" "+TQString::number(this->height());
      return geo;
      break;
    }
    case DCOP::hasFocus:
      return TQString::number(this->hasFocus());
      break;
    default:
      return KommanderWidget::handleDCOP(function, args);
  }
  return TQString();
}


#include "textedit.moc"
