/* 
 *
 * $Id: sourceheader 380067 2005-01-19 13:03:46Z trueg $
 * Copyright (C) 2005 Sebastian Trueg <trueg@k3b.org>
 *
 * This file is part of the K3b project.
 * Copyright (C) 1998-2007 Sebastian Trueg <trueg@k3b.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.
 * See the file "COPYING" for the exact licensing terms.
 */

#ifndef _K3B_MEDIA_SELECTION_COMBOBOX_H_
#define _K3B_MEDIA_SELECTION_COMBOBOX_H_

#include <kcombobox.h>

#include "k3bmedium.h"

namespace K3bDevice {
  class Device;
  class DeviceManager;
}

/**
 * Combo box which allows to select a media (in comparison 
 * to the K3bDeviceComboBox which allows to select a device.
 *
 * This class uses the K3bMediaCache to update it's status.
 */
class K3bMediaSelectionComboBox : public KComboBox
{
  TQ_OBJECT
  

 public:
  K3bMediaSelectionComboBox( TQWidget* parent );
  virtual ~K3bMediaSelectionComboBox();

  /**
   * Although the widget allows selection of media this
   * results in a device being selected.
   */
  K3bDevice::Device* selectedDevice() const;

  TQValueList<K3bDevice::Device*> allDevices() const;

  int wantedMediumType() const;
  int wantedMediumState() const;
  int wantedMediumContent() const;

 signals:
  /**
   * Be aware that his signal will also be emitted in case
   * no medium is available with a null pointer.
   */
  void selectionChanged( K3bDevice::Device* );

  /**
   * This signal is emitted if the selection of media changed.
   * This includes a change due to changing the wanted medium state.
   */
  void newMedia();

  void newMedium( K3bDevice::Device* dev );

 public slots:
  /**
   * Only works in case the device actually contains a usable medium.
   * Otherwise the currently selected medium stays selected.
   */
  void setSelectedDevice( K3bDevice::Device* );

  /**
   * Set the wanted medium type. Defaults to writable CD.
   *
   * \param type a bitwise combination of the K3bDevice::MediaType enum
   */
  void setWantedMediumType( int type );

  /**
   * Set the wanted medium state. Defaults to empty media.
   *
   * \param state a bitwise combination of the K3bDevice::State enum
   */
  void setWantedMediumState( int state );

  /**
   * Set the wanted medium content type. The default is K3bMedium::CONTENT_ALL (i.e. ignore media 
   * content)
   * Be aware that 0 maps to K3bMedium::CONTENT_NONE, i.e. empty media.
   *
   * \param content A bitwise or of K3bMedium::MediumContent
   */
  void setWantedMediumContent( int content );

  /**
   * Set the device to ignore. This device will not be checked for
   * wanted media. This is many useful for media copy.
   *
   * \param dev The device to ignore or 0 to not ignore any device.
   */
  void setIgnoreDevice( K3bDevice::Device* dev );

 private slots:
  void slotMediumChanged( K3bDevice::Device* );
  void slotDeviceManagerChanged( K3bDevice::DeviceManager* );
  void slotActivated( int i );
  void slotUpdateToolTip( K3bDevice::Device* );

 protected:
  void updateMedia();
  virtual bool showMedium( const K3bMedium& ) const;
  virtual TQString mediumString( const K3bMedium& ) const;
  virtual TQString mediumToolTip( const K3bMedium& ) const;
  virtual TQString noMediumMessage() const;

 private:
  void updateMedium( K3bDevice::Device* );
  void addMedium( K3bDevice::Device* );
  void showNoMediumMessage();
  void clear();

  // usedby the tooltip
  K3bDevice::Device* deviceAt( unsigned int index );

  class ToolTip;
  friend class ToolTip;

  class Private;
  Private* d;
};

#endif