21 #include <QtCore/QDir>
22 #include <QtGui/QMouseEvent>
23 #include <QtGui/QDrag>
32 class KUrlComboBox::KUrlComboBoxPrivate
37 dirIcon(QLatin1String(
"folder"))
40 ~KUrlComboBoxPrivate()
42 qDeleteAll( itemList );
43 qDeleteAll( defaultList );
52 void init(
Mode mode );
53 void insertUrlItem(
const KUrlComboItem * );
54 QIcon getIcon(
const KUrl& url )
const;
55 void updateItem(
const KUrlComboItem *item,
int index,
const QIcon& icon );
57 void _k_slotActivated(
int );
76 :
KComboBox( parent),d(new KUrlComboBoxPrivate(this))
83 :
KComboBox( rw, parent),d(new KUrlComboBoxPrivate(this))
95 void KUrlComboBox::KUrlComboBoxPrivate::init(
Mode mode )
100 m_parent->setInsertPolicy( NoInsert );
101 m_parent->setTrapReturnKey(
true );
102 m_parent->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ));
103 m_parent->setLayoutDirection( Qt::LeftToRight );
104 if ( m_parent->completionObject() ) {
108 opendirIcon =
KIcon(QLatin1String(
"folder-open"));
110 m_parent->connect( m_parent, SIGNAL(activated(
int)), SLOT(_k_slotActivated(
int)));
116 kDebug(250) <<
"::urls()";
120 for (
int i = d->defaultList.count(); i < count(); i++ ) {
122 if ( !url.isEmpty() ) {
143 KUrlComboBoxPrivate::KUrlComboItem *item =
new KUrlComboBoxPrivate::KUrlComboItem;
146 if ( text.isEmpty() )
153 d->defaultList.append( item );
160 d->itemMapper.clear();
162 const KUrlComboBoxPrivate::KUrlComboItem *item;
163 for (
int id = 0;
id < d->defaultList.count();
id++ ) {
164 item = d->defaultList.at(
id );
165 d->insertUrlItem( item );
177 qDeleteAll( d->itemList );
181 if ( _urls.isEmpty() )
185 QStringList::ConstIterator it = _urls.constBegin();
188 while ( it != _urls.constEnd() ) {
189 if ( !urls.contains( *it ) )
197 int Overload = urls.count() - d->myMaximum + d->defaultList.count();
198 while ( Overload > 0) {
210 it = urls.constBegin();
212 KUrlComboBoxPrivate::KUrlComboItem *item = 0L;
214 while ( it != urls.constEnd() ) {
215 if ( (*it).isEmpty() ) {
227 item =
new KUrlComboBoxPrivate::KUrlComboItem;
229 item->icon = d->getIcon( u );
234 d->insertUrlItem( item );
235 d->itemList.append( item );
246 bool blocked = blockSignals(
true );
251 while ( mit != d->itemMapper.constEnd() ) {
252 Q_ASSERT( mit.value() );
255 setCurrentIndex( mit.key() );
258 d->updateItem( mit.value(), mit.key(), d->opendirIcon );
260 blockSignals( blocked );
270 Q_ASSERT(!d->itemList.isEmpty());
271 d->itemList.removeLast();
277 int offset = qMax (0, d->itemList.count() - d->myMaximum + d->defaultList.count());
278 for (
int i = offset; i < d->itemList.count(); i++ )
279 d->insertUrlItem( d->itemList[i] );
281 KUrlComboBoxPrivate::KUrlComboItem *item =
new KUrlComboBoxPrivate::KUrlComboItem;
283 item->icon = d->getIcon( url );
287 kDebug(250) <<
"setURL: text=" << item->text;
293 KComboBox::insertItem(
id, d->opendirIcon, text);
295 KComboBox::insertItem(
id,item->icon, text);
297 d->itemMapper.insert(
id, item );
298 d->itemList.append( item );
300 setCurrentIndex(
id );
301 Q_ASSERT(!d->itemList.isEmpty());
303 blockSignals( blocked );
307 void KUrlComboBox::KUrlComboBoxPrivate::_k_slotActivated(
int index )
309 const KUrlComboItem *item = itemMapper.value(index);
312 m_parent->setUrl( item->url );
313 emit m_parent->urlActivated( item->url );
318 void KUrlComboBox::KUrlComboBoxPrivate::insertUrlItem(
const KUrlComboBoxPrivate::KUrlComboItem *item )
323 int id = m_parent->count();
324 m_parent->KComboBox::insertItem(
id, item->icon, item->text);
325 itemMapper.insert(
id, item );
333 if (count() > d->myMaximum) {
334 int oldCurrent = currentIndex();
338 int offset = qMax (0, d->itemList.count() - d->myMaximum + d->defaultList.count());
339 for (
int i = offset; i < d->itemList.count(); i++ )
340 d->insertUrlItem( d->itemList[i] );
343 if ( oldCurrent >= count() )
344 oldCurrent = count() -1;
345 setCurrentIndex( oldCurrent );
358 while ( mit != d->itemMapper.constEnd() ) {
360 if ( !d->itemList.removeAll( mit.value() ) && checkDefaultURLs )
361 d->defaultList.removeAll( mit.value() );
366 bool blocked = blockSignals(
true );
368 QListIterator<const KUrlComboBoxPrivate::KUrlComboItem*> it( d->itemList );
369 while ( it.hasNext() ) {
370 d->insertUrlItem( it.next() );
372 blockSignals( blocked );
388 QStyleOptionComboBox comboOpt;
389 comboOpt.initFrom(
this);
390 const int x0 = QStyle::visualRect(layoutDirection(), rect(),
391 style()->subControlRect(QStyle::CC_ComboBox, &comboOpt, QStyle::SC_ComboBoxEditField,
this)).x();
392 const int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth, &comboOpt,
this);
395 d->m_dragPoint =
event->pos();
397 d->m_dragPoint =
QPoint();
400 KComboBox::mousePressEvent(event);
405 const int index = currentIndex();
407 if (!itemIcon(index).isNull() && !d->m_dragPoint.isNull() &&
event->buttons() & Qt::LeftButton &&
409 QDrag *drag =
new QDrag(
this);
410 QMimeData *mime =
new QMimeData();
412 mime->setText(itemText(index));
414 drag->setMimeData(mime);
418 KComboBox::mouseMoveEvent(event);
421 QIcon KUrlComboBox::KUrlComboBoxPrivate::getIcon(
const KUrl& url )
const
423 if (myMode == Directories)
426 return KIcon(KMimeType::iconNameForUrl(url, 0));
431 void KUrlComboBox::KUrlComboBoxPrivate::updateItem(
const KUrlComboBoxPrivate::KUrlComboItem *item,
432 int index,
const QIcon& icon)
434 m_parent->setItemIcon(index,icon);
436 if ( m_parent->isEditable() ) {
437 m_parent->setItemText(index, item->url.pathOrUrl(myMode == Directories
442 m_parent->setItemText(index,item->text);
447 #include "kurlcombobox.moc"