/***************************************************************************
 *   Copyright (C) 2003 by Julian Rockey                                   *
 *   linux@jrockey.com                                                     *
 *                                                                         *
 *   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 __KDEVPART_FILECREATE_H__
#define __KDEVPART_FILECREATE_H__


#include <tqguardedptr.h>
#include <tqptrlist.h>

#include <tqwidget.h>
#include <kdevplugin.h>
#include <kdevcreatefile.h>

#include "filecreate_typechooser.h"

class TDEPopupMenu;

namespace FileCreate {
  class Widget;
  class FileType;
}

class KDialogBase;
class FCConfigWidget;
class ConfigWidgetProxy;

using namespace FileCreate;

class FileCreatePart : public KDevCreateFile
{
  Q_OBJECT
  

  friend class FCConfigWidget;
public:
  FileCreatePart(TQObject *parent, const char *name, const TQStringList &);
  virtual ~FileCreatePart();

  /**
   * Returns the list of available file types.
   */
  TQPtrList<FileType> getFileTypes() const { return m_filetypes; }

  /**
   * Call this method to create a new file, within or without the project. Supply as
   * much information as you know. Leave what you don't know as TQString().
   * The user will be prompted as necessary for the missing information, and the
   * file created, and added to the project as necessary.
   */
  virtual KDevCreateFile::CreatedFile createNewFile(TQString ext = TQString(),
                     TQString dir = TQString(),
                     TQString name = TQString(),
                     TQString subtype = TQString());

  /**
   * Finds the file type object for a given extension and optionally subtype.
   * You can omit the subtype and specify the extension as ext-subtype if you wish.
   */
  FileType * getType(const TQString & ext, const TQString subtype = TQString());
  /**
   * Finds the file type object for a given file type or subtype ID.
   * IDs for file types are not persistent. ID is a sequence number assigned when
   * reading file type definitions from an XML file. Negative numbers are assigned
   * for custom file types.
   */
  FileType * getType(int id);
  /**
   * Finds the file type object for a given extension and optionally subtype.
   * You can omit the subtype and specify the extension as ext-subtype if you wish.
   * Returns only enabled type (i.e. used in the project).
   */
  FileType * getEnabledType(const TQString & ext, const TQString subtype = TQString());

public slots:

  void slotProjectOpened();
  void slotProjectClosed();
  void slotInitialize();
  void slotGlobalInitialize();

  /**
   * Called when a file type is selected from the docked widget.
   */
  void slotFiletypeSelected(const FileType *);

  /**
   * Called when a new file is required - for example, from the "New.." menu action.
   */
  void slotNewFile();

  /**
   * Called from TDEToolBarPopupMenu to request a new file action
   * @param fileTypeId is a sequence number that identifies a particular FileType
   */
  void slotNewFilePopup(int fileTypeId);

protected slots:
  void slotNoteFiletype(const FileType * filetype);
  void slotAboutToShowNewPopupMenu();
  void insertConfigWidget( const KDialogBase * dlg, TQWidget * page, unsigned int );

private:
  /**
   * If a file has been successfully created, open it
   */
  void openCreatedFile(const KDevCreateFile::CreatedFile & createdFile);

  /**
   * Reads in file type definitions from a config DOM and adds them
   * to the file type list. If enable is true, sets them all to
   * enabled=true by default.
   */
  int readTypes(const TQDomDocument & dom, TQPtrList<FileType> &m_filetypes, bool enable);

  /**
   * Add a file type
   */
  void addFileType(const TQString & filename);

  /**
   * Finds the global XML file that has the same version as KDevelop
   */
  TQString findGlobalXMLFile() const;

  /**
   * List of file types from which the user can choose
   */
  TQPtrList<FileType> m_filetypes;

  /**
   * The file type selected by the new file dialog, if appropriate.
   */
  const FileType * m_filedialogFiletype;

  ConfigWidgetProxy * _configProxy;

  TDEPopupMenu* m_newPopupMenu;
  TQPtrList<TDEPopupMenu>* m_subPopups;
};


#endif
