/* This file is part of the KDE libraries
Copyright (C) 2000 Carsten Pfeiffer <pfeiffer@kde.org>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#ifndef KDIRCOMBOBOX_H
#define KDIRCOMBOBOX_H
#include <qevent.h>
#include <qlist.h>
#include <qmap.h>
#include <qpixmap.h>
#include <qstringlist.h>
#include <kcombobox.h>
#include <kurl.h>
/**
* This combobox shows a number of recent URLs/directories, as well as some
* default directories.
* It will manage the default dirs root-directory, home-directory and
* Desktop-directory, as well as a number of URLs set via @ref setURLs()
* and one additional entry to be set via @ref setURL().
*
* @short A ComboBox showing a number of recent URLs/directories
* @author Carsten Pfeiffer <pfeiffer@kde.org>
*/
class KURLComboBox : public KComboBox
{
Q_OBJECT
public:
enum Mode { Files = -1, Directories = 1, Both = 0 };
/**
* Constructs a KURLComboBox.
* @param mode is either Files, Directories or Both and controls the
* following behavior:
* @li Files all inserted URLs will be treated as files, therefore the
* url shown in the combo will never show a trailing /
* the icon will be the one associated with the file's mimetype.
* @li Directories all inserted URLs will be treated as directories, will
* have a trailing slash in the combobox. The current
* directory will show the "open folder" icon, other
* directories the "folder" icon.
* @li Both Don't mess with anything, just show the url as given.
*/
KURLComboBox( Mode mode, QWidget *parent=0, const char *name=0 );
KURLComboBox( Mode mode, bool rw, QWidget *parent=0, const char *name=0 );
~KURLComboBox();
/**
* Sets the current url. This combo handles exactly one url additionally
* to the default items and those set via @ref setURLs(). So you can call
* setURL() as often as you want, it will always replace the previous one
* set via setURL().
* If @p url is already in the combo, the last item will stay there
* and the existing item becomes the current item.
* The current item will always have the open-directory-pixmap as icon.
*
* Note that you won't receive any signals, e.g. textChanged(),
* returnPressed() or activated() upon calling this method.
*/
void setURL( const KURL& url );
void setURLs( QStringList urls );
/**
* @returns a list of all urls currently handled. The list contains at most
* @ref maxItems() items.
* Use this to save the list of urls in a config-file and reinsert them
* via @ref setURLs() next time.
* Note that all default urls set via @ref addDefaultURL() are not
* returned, they will automatically be set via setURLs() or setURL().
* You will always get fully qualified urls, i.e. with protocol like
* file:/
*/
QStringList urls() const;
/**
* Sets how many items should be handled and displayed by the combobox.
* @see #maxItems
*/
void setMaxItems( int );
/**
* @returns the maximum of items the combobox handles.
* @see #setMaxItems
*/
int maxItems() const { return myMaximum; }
/**
* Adds a url that will always be shown in the combobox, it can't be
* "rotated away". Default urls won't be returned in @ref urls() and don't
* have to be set via @ref setURLs().
* If you want to specify a special pixmap, use the overloaded method with
* the pixmap parameter.
* Default URLs will be inserted into the combobox by @ref setDefaults()
*/
void addDefaultURL( const KURL& url, const QString& text = QString::null );
/**
* Adds a url that will always be shown in the combobox, it can't be
* "rotated away". Default urls won't be returned in @ref urls() and don't
* have to be set via @ref setURLs().
* If you don't need to specify a pixmap, use the overloaded method without
* the pixmap parameter.
* Default URLs will be inserted into the combobox by @ref setDefaults()
*/
void addDefaultURL( const KURL& url, const QPixmap& pix,
const QString& text = QString::null );
/**
* Clears all items and inserts the default urls into the combo. Will be
* called implicitly upon the first call to @ref setURLs() or @ref setURL()
* @see #addDefaultURL
*/
void setDefaults();
/**
* Removes any occurence of @p url. If @p checkDefaultURLs is false
* default-urls won't be removed.
*/
void removeURL( const KURL& url, bool checkDefaultURLs = true );
signals:
/**
* emitted when an item was clicked at
* @param url is the url of the now current item. If it is a local url,
* it won't have a protocol (file:/), otherwise it will.
*/
void urlActivated( const KURL& url );
protected slots:
void slotActivated( int );
protected:
struct _KURLComboItem {
QString text;
KURL url;
QPixmap pixmap;
};
typedef _KURLComboItem KURLComboItem;
QList<KURLComboItem> itemList;
QList<KURLComboItem> defaultList;
QMap<int,const KURLComboItem*> itemMapper;
void init( Mode mode );
void insertURLItem( const KURLComboItem * );
/**
* Uses KMimeType::pixmapForURL() to return a proper pixmap for @p url.
* In directory mode, a folder icon is always returned.
*/
QPixmap getPixmap( const KURL& url ) const;
/**
* Updates @p item with @p pixmap and sets the url instead of the text
* of the KURLComboItem.
* Also works around a Qt bug.
*/
void updateItem( const KURLComboItem *item, int index, const QPixmap& pix);
QPixmap opendirPix;
int firstItemIndex;
private:
bool urlAdded;
int myMaximum;
Mode myMode; // can be used as parameter to KUR::path( int ) or url( int )
// to specify if we want a trailing slash or not
private:
class KURLComboBoxPrivate;
KURLComboBoxPrivate *d;
};
#endif // KDIRCOMBOBOX_H