/***************************************************************************
                          assoctexteditorimpl.h - Associated text editor implementation 
                             -------------------
    copyright            : (C) 2003    Marc Britton <consume@optusnet.com.au>
                           (C) 2004    Michal Rudolf <mrudolf@kdewebdev.org>
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   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.                                   *
 *                                                                         *
 ***************************************************************************/
#ifndef _HAVE_ASSOCTEXTEDITORIMPL_H_
#define _HAVE_ASSOCTEXTEDITORIMPL_H_

#include <q3dict.h>
#include <qstringlist.h>
#include <qstring.h>
#include <qwidget.h>
#include <qobject.h>
#include <qmap.h>
#include <q3ptrvector.h>
#include <qpixmap.h>


#include "assoctexteditor.h"
#include <kommanderwidget.h>

class FormWindow;
class PropertyEditor;

class AssocTextEditor : public AssocTextEditorBase
{
  Q_OBJECT
public:
  AssocTextEditor(QWidget*, FormWindow*, PropertyEditor*, QWidget*, const char* = 0, bool = true);
  ~AssocTextEditor();
  // Set interface for given widget. 
  void setWidget(QWidget *);
  // Save changes for current widget
  void save() const;
  // Return population text for current widget
  QString populationText() const;
  // Return associated text for current widget
  QStringList associatedText() const;
 
public slots:
  // Current script text has changed - save it in m_atdict
  void textEditChanged();
  // Current widget has changed - store script and update interface
  void widgetChanged(int);
  // Current widget has changed - store script and show new script
  void stateChanged(int);
  // Select widget via widget tree dialog
  void selectWidget();
  
  // Functions for script editing:
  
  // Insert given text at cursor position for current widget and state
  void insertAssociatedText(const QString&);
  // Select file and insert its content at cursor position
  void insertFile();
  // Open function browser and insert chosen function at cursor position
  void insertFunction();
  // Insert selected function at cursor position 
  void insertWidgetName(int);

protected slots:

private:
  // Current widget
  QWidget *m_widget;
  KommanderWidget* m_kommanderWidget;
//FIXME: could it be done more cleanly?
  // Current form and property editor
  FormWindow* m_formWindow;
  PropertyEditor* m_propertyEditor;
  // Current state
  QString m_currentState;
  // List of states for current widget
  QStringList m_states;
  // Current widget list
  Q3Dict<QWidget> m_widgetList;
  // Dictionary for current widget; contains pairs (state, script associated with current state)
  QMap<QString, QString> m_atdict;
  // Current population text
  QString m_populationText;
  // Non-enmpty script pixmap
  QPixmap scriptPixmap;
      
  // Create list of all widgets on the same dialog as current widget 
  // Set store to true, to update m_widgetList;
  QStringList buildWidgetList();
  // Convert widget to string displayed in combos
  // If formatted, return formatted string, else just widget's name
  QString widgetToString(QWidget* widget, bool formatted = true);
  // Convert combo string to widget
  QWidget* widgetFromString(const QString& name);
};

#endif
