23 #include <tqdragobject.h>
27 #include <tqtooltip.h>
29 #include <tqpainter.h>
31 #include <kglobalsettings.h>
34 #include <kapplication.h>
38 #include "klistview.h"
39 #include "klistviewlineedit.h"
41 class KListView::Tooltip :
public TQToolTip
44 Tooltip (
KListView* parent, TQToolTipGroup* group = 0L);
45 virtual ~Tooltip () {}
51 virtual void maybeTip (
const TQPoint&);
57 KListView::Tooltip::Tooltip (
KListView* parent, TQToolTipGroup* group)
58 : TQToolTip (parent, group),
63 void KListView::Tooltip::maybeTip (
const TQPoint&)
68 class KListView::KListViewPrivate
77 cursorInExecuteArea(false),
79 selectedBySimpleMove(false),
80 selectedUsingMouse(false),
89 pressedOnSelected (false),
90 wasShiftEvent (false),
95 selectionDirection(0),
98 selectionMode (Single),
101 mDropVisualizerWidth (4),
107 initialFileManagerItem(0)
109 renameable.append(0);
110 connect(editor, TQT_SIGNAL(done(TQListViewItem*,
int)), listview, TQT_SLOT(doneEditing(TQListViewItem*,
int)));
118 TQListViewItem* pCurrentItem;
124 TQListViewItem* dragOverItem;
125 TQPoint dragOverPoint;
127 TQPoint startDragPos;
131 TQValueList<int> renameable;
133 bool cursorInExecuteArea:1;
135 bool bChangeCursorOverItem:1;
137 bool selectedBySimpleMove : 1;
138 bool selectedUsingMouse:1;
147 bool pressedOnSelected:1;
148 bool wasShiftEvent:1;
150 bool sortAscending:1;
156 int selectionDirection;
162 bool showContextMenusOnPress;
164 TQRect mOldDropVisualizer;
165 int mDropVisualizerWidth;
166 TQRect mOldDropHighlighter;
167 TQListViewItem *afterItemDrop;
168 TQListViewItem *parentItemDrop;
170 TQListViewItem *paintAbove;
171 TQListViewItem *paintCurrent;
172 TQListViewItem *paintBelow;
178 TQListViewItem *initialFileManagerItem;
182 KListViewLineEdit::KListViewLineEdit(
KListView *parent)
183 :
KLineEdit(parent->viewport()), item(0), col(0), p(parent)
187 connect( parent, TQT_SIGNAL( selectionChanged() ), TQT_SLOT( slotSelectionChanged() ));
188 connect( parent, TQT_SIGNAL( itemRemoved( TQListViewItem * ) ),
189 TQT_SLOT( slotItemRemoved( TQListViewItem * ) ));
192 KListViewLineEdit::~KListViewLineEdit()
196 TQListViewItem *KListViewLineEdit::currentItem()
const
201 void KListViewLineEdit::load(TQListViewItem *i,
int c)
206 TQRect rect(p->itemRect(i));
210 int fieldX = rect.x() - 1;
211 int fieldW = p->columnWidth(col) + 2;
213 TQHeader*
const pHeader = p->header();
215 const int pos = pHeader->mapToIndex(col);
216 for (
int index = 0; index < pos; ++index )
217 fieldX += p->columnWidth( pHeader->mapToSection( index ));
220 int d = i->depth() + (p->rootIsDecorated() ? 1 : 0);
221 d *= p->treeStepSize();
226 if ( i->pixmap( col ) ) {
227 int d = i->pixmap( col )->width();
232 setGeometry(fieldX, rect.y() - 1, fieldW, rect.height() + 2);
241 static int nextCol (
KListView *pl, TQListViewItem *pi,
int start,
int dir)
246 for (; ((dir == +1) ? (start < pl->columns()) : (start >= 0)); start += dir)
254 static TQListViewItem *prevItem (TQListViewItem *pi)
256 TQListViewItem *pa = pi->itemAbove();
261 if (pa && pa->parent() == pi->parent())
267 static TQListViewItem *lastQChild (TQListViewItem *pi)
275 for (TQListViewItem *pt = pi->nextSibling(); pt; pt = pt->nextSibling())
284 const int ncols = p->columns();
285 const int dir = forward ? +1 : -1;
286 const int restart = forward ? 0 : (ncols - 1);
287 TQListViewItem *top = (pitem && pitem->parent())
288 ? pitem->parent()->firstChild()
290 TQListViewItem *pi = pitem;
302 if ((column = nextCol(p, pi, column + dir, dir)) != -1 ||
303 (column = nextCol(p, (pi = (forward ? pi->nextSibling() : prevItem(pi))), restart, dir)) != -1 ||
304 (column = nextCol(p, (pi = (forward ? top : lastQChild(pitem))), restart, dir)) != -1)
308 p->setCurrentItem(pi);
330 bool KListViewLineEdit::event (TQEvent *pe)
332 if (pe->type() == TQEvent::KeyPress)
334 TQKeyEvent *k = (TQKeyEvent *) pe;
336 if ((k->key() == Qt::Key_Backtab || k->key() == Qt::Key_Tab) &&
338 !(k->state() & ControlButton || k->state() & AltButton))
341 (k->key() == Key_Tab && !(k->state() & ShiftButton)));
346 return KLineEdit::event(pe);
351 if(e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter )
353 else if(e->key() == Qt::Key_Escape)
355 else if (e->key() == Qt::Key_Down || e->key() == Qt::Key_Up)
364 void KListViewLineEdit::terminate()
369 void KListViewLineEdit::terminate(
bool commit)
375 item->setText(col, text());
377 TQListViewItem *i=item;
389 TQFocusEvent * focusEv =
static_cast<TQFocusEvent*
>(ev);
391 if (focusEv->reason() != TQFocusEvent::Popup && focusEv->reason() != TQFocusEvent::ActiveWindow)
397 void KListViewLineEdit::paintEvent( TQPaintEvent *e )
399 KLineEdit::paintEvent( e );
403 p.setClipRegion( e->region() );
404 p.drawRect( rect() );
411 void KListViewLineEdit::slotSelectionChanged()
422 if (currentItem() != i)
432 : TQListView( parent, name ),
433 d (new KListViewPrivate (this))
435 setDragAutoScroll(
true);
437 connect(
this, TQT_SIGNAL( onViewport() ),
439 connect(
this, TQT_SIGNAL( onItem( TQListViewItem * ) ),
440 this, TQT_SLOT(
slotOnItem( TQListViewItem * ) ) );
442 connect (
this, TQT_SIGNAL(contentsMoving(
int,
int)),
444 connect (
this, TQT_SIGNAL(contentsMoving(
int,
int)),
451 kapp->addKipcEventMask( KIPC::SettingsChanged );
454 connect(&d->autoSelect, TQT_SIGNAL( timeout() ),
456 connect(&d->dragExpand, TQT_SIGNAL( timeout() ),
457 this, TQT_SLOT( slotDragExpand() ) );
460 if (d->showContextMenusOnPress)
462 connect (
this, TQT_SIGNAL (rightButtonPressed (TQListViewItem*,
const TQPoint&,
int)),
463 this, TQT_SLOT (
emitContextMenu (TQListViewItem*,
const TQPoint&,
int)));
467 connect (
this, TQT_SIGNAL (rightButtonClicked (TQListViewItem*,
const TQPoint&,
int)),
468 this, TQT_SLOT (
emitContextMenu (TQListViewItem*,
const TQPoint&,
int)));
483 TQListViewItem* item = itemAt( point );
498 if ( allColumnsShowFocus() ) {
503 int width = columnWidth( 0 );
505 TQHeader*
const thisHeader = header();
506 const int pos = thisHeader->mapToIndex( 0 );
508 for (
int index = 0; index < pos; ++index ) {
509 offset += columnWidth( thisHeader->mapToSection( index ) );
518 width = treeStepSize()*( item->depth() + ( rootIsDecorated() ? 1 : 0 ) );
519 width += itemMargin();
520 int ca = AlignHorizontal_Mask & columnAlignment( 0 );
521 if ( ca == AlignLeft || ca == AlignAuto ) {
522 width += item->width( fontMetrics(),
this, 0 );
523 if ( width > columnWidth( 0 ) ) {
524 width = columnWidth( 0 );
530 if (!allColumnsShowFocus()) {
531 offset += treeStepSize()*( item->depth() + ( rootIsDecorated() ? 1 : 0 ) );
535 return ( x > offset && x < ( offset + width ) );
541 TQPoint vp = viewport()->mapFromGlobal( TQCursor::pos() );
542 if ( item &&
isExecuteArea( vp.x() ) && (d->autoSelectDelay > -1) && d->bUseSingle ) {
543 d->autoSelect.start( d->autoSelectDelay,
true );
544 d->pCurrentItem = item;
550 if ( d->bChangeCursorOverItem )
551 viewport()->unsetCursor();
553 d->autoSelect.stop();
554 d->pCurrentItem = 0L;
561 case KApplication::SETTINGS_MOUSE:
565 disconnect(
this, TQT_SIGNAL (mouseButtonClicked (
int, TQListViewItem*,
const TQPoint &,
int)),
566 this, TQT_SLOT (slotMouseButtonClicked (
int, TQListViewItem*,
const TQPoint &,
int)));
569 connect (
this, TQT_SIGNAL (mouseButtonClicked (
int, TQListViewItem*,
const TQPoint &,
int)),
570 this, TQT_SLOT (slotMouseButtonClicked(
int, TQListViewItem*,
const TQPoint &,
int)));
573 if ( !d->disableAutoSelection )
576 if( !d->bUseSingle || !d->bChangeCursorOverItem )
577 viewport()->unsetCursor();
581 case KApplication::SETTINGS_POPUPMENU:
585 if (d->showContextMenusOnPress)
587 disconnect (0L, 0L,
this, TQT_SLOT (
emitContextMenu (TQListViewItem*,
const TQPoint&,
int)));
589 connect(
this, TQT_SIGNAL (rightButtonPressed (TQListViewItem*,
const TQPoint&,
int)),
590 this, TQT_SLOT (
emitContextMenu (TQListViewItem*,
const TQPoint&,
int)));
594 disconnect (0L, 0L,
this, TQT_SLOT (
emitContextMenu (TQListViewItem*,
const TQPoint&,
int)));
596 connect(
this, TQT_SIGNAL (rightButtonClicked (TQListViewItem*,
const TQPoint&,
int)),
597 this, TQT_SLOT (
emitContextMenu (TQListViewItem*,
const TQPoint&,
int)));
612 if (!isActiveWindow())
614 d->autoSelect.stop();
624 TQListViewItem* previousItem = currentItem();
625 setCurrentItem( d->pCurrentItem );
627 if( d->pCurrentItem ) {
629 if( (keybstate & TQt::ShiftButton) ) {
630 bool block = signalsBlocked();
631 blockSignals(
true );
634 if( !(keybstate & TQt::ControlButton) )
637 bool select = !d->pCurrentItem->isSelected();
638 bool update = viewport()->isUpdatesEnabled();
639 viewport()->setUpdatesEnabled(
false );
641 bool down = previousItem->itemPos() < d->pCurrentItem->itemPos();
642 TQListViewItemIterator lit( down ? previousItem : d->pCurrentItem );
643 for ( ; lit.current(); ++lit ) {
644 if ( down && lit.current() == d->pCurrentItem ) {
645 d->pCurrentItem->setSelected( select );
648 if ( !down && lit.current() == previousItem ) {
649 previousItem->setSelected( select );
652 lit.current()->setSelected( select );
655 blockSignals( block );
656 viewport()->setUpdatesEnabled( update );
659 emit selectionChanged();
661 if( selectionMode() == TQListView::Single )
662 emit selectionChanged( d->pCurrentItem );
664 else if( (keybstate & KApplication::ControlModifier) )
665 setSelected( d->pCurrentItem, !d->pCurrentItem->isSelected() );
667 bool block = signalsBlocked();
668 blockSignals(
true );
670 if( !d->pCurrentItem->isSelected() )
673 blockSignals( block );
675 setSelected( d->pCurrentItem,
true );
679 kdDebug() <<
"KListView::slotAutoSelect: That�s not supposed to happen!!!!" <<
endl;
685 const int colCount = columns();
686 if (d->fullWidth && colCount)
689 const int lastColumn = colCount - 1;
690 for (
int i = 0; i < lastColumn; ++i) w += columnWidth(i);
691 setColumnWidth( lastColumn, viewport()->width() - w - 1 );
701 if ( !d->bUseSingle )
703 viewport()->unsetCursor();
711 d->autoSelect.stop();
714 if( !( ((keybstate & TQt::ShiftButton) || (keybstate & TQt::ControlButton)) ) ) {
715 viewport()->unsetCursor();
727 if ((d->selectedBySimpleMove)
728 && (d->selectionMode == FileManager)
729 && (fe->reason()!=TQFocusEvent::Popup)
730 && (fe->reason()!=TQFocusEvent::ActiveWindow)
733 currentItem()->setSelected(
true);
734 currentItem()->repaint();
735 emit selectionChanged();
744 d->autoSelect.stop();
746 if ((d->selectedBySimpleMove)
747 && (d->selectionMode == FileManager)
748 && (fe->reason()!=TQFocusEvent::Popup)
749 && (fe->reason()!=TQFocusEvent::ActiveWindow)
751 && (!d->editor->isVisible()))
753 currentItem()->setSelected(
false);
754 currentItem()->repaint();
755 emit selectionChanged();
763 d->autoSelect.stop();
770 if (e->type() == TQEvent::ApplicationPaletteChange)
778 if( (
selectionModeExt() == Extended) && (e->state() & ShiftButton) && !(e->state() & ControlButton) )
780 bool block = signalsBlocked();
781 blockSignals(
true );
785 blockSignals( block );
789 d->selectedBySimpleMove=
false;
790 d->selectedUsingMouse=
true;
793 currentItem()->setSelected(
false);
794 currentItem()->repaint();
799 TQPoint p( contentsToViewport( e->pos() ) );
800 TQListViewItem *at = itemAt (p);
803 bool rootDecoClicked = at
804 && ( p.x() <= header()->cellPos( header()->mapToActual( 0 ) ) +
805 treeStepSize() * ( at->depth() + ( rootIsDecorated() ? 1 : 0) ) + itemMargin() )
806 && ( p.x() >= header()->cellPos( header()->mapToActual( 0 ) ) );
808 if (e->button() == Qt::LeftButton && !rootDecoClicked)
811 d->startDragPos = e->pos();
816 d->pressedOnSelected = at->isSelected();
825 if (!
dragEnabled() || d->startDragPos.isNull() || !d->validDrag)
826 TQListView::contentsMouseMoveEvent (e);
828 TQPoint vp = contentsToViewport(e->pos());
829 TQListViewItem *item = itemAt( vp );
832 if ( item && d->bChangeCursorOverItem && d->bUseSingle )
835 if( (item != d->pCurrentItem) ||
840 if( d->cursorInExecuteArea )
843 viewport()->unsetCursor();
848 TQPoint newPos = e->pos();
849 if (dragOn && d->validDrag &&
850 (newPos.x() > d->startDragPos.x()+d->dragDelay ||
851 newPos.x() < d->startDragPos.x()-d->dragDelay ||
852 newPos.y() > d->startDragPos.y()+d->dragDelay ||
853 newPos.y() < d->startDragPos.y()-d->dragDelay))
858 d->startDragPos = TQPoint();
859 d->validDrag =
false;
865 if (e->button() == Qt::LeftButton)
870 TQPoint p( contentsToViewport( e->pos() ) );
871 TQListViewItem *at = itemAt (p);
875 bool rootDecoClicked =
876 ( p.x() <= header()->cellPos( header()->mapToActual( 0 ) ) +
877 treeStepSize() * ( at->depth() + ( rootIsDecorated() ? 1 : 0) ) + itemMargin() )
878 && ( p.x() >= header()->cellPos( header()->mapToActual( 0 ) ) );
880 if (!rootDecoClicked)
882 int col = header()->mapToLogical( header()->cellAt( p.x() ) );
883 if ( d->renameable.contains(col) )
889 d->pressedOnSelected =
false;
890 d->validDrag =
false;
891 d->startDragPos = TQPoint();
901 if ( !e || e->button() != Qt::LeftButton ) {
905 TQPoint vp = contentsToViewport(e->pos());
906 TQListViewItem *item = itemAt( vp );
909 int col = item ? header()->mapToLogical( header()->cellAt( vp.x() ) ) : -1;
914 if( (e->button() == Qt::LeftButton) && !d->bUseSingle ) {
920 void KListView::slotMouseButtonClicked(
int btn, TQListViewItem *item,
const TQPoint &pos,
int c )
922 if( (btn == Qt::LeftButton) && item ) {
931 d->dragExpand.stop();
936 TQListViewItem *afterme;
937 TQListViewItem *parent;
939 findDrop(e->pos(), parent, afterme);
946 emit
dropped(
this, e, afterme);
947 emit
dropped(e, parent, afterme);
948 emit
dropped(
this, e, parent, afterme);
955 TQPtrList<TQListViewItem> items, afterFirsts, afterNows;
956 TQListViewItem *current=currentItem();
958 for (TQListViewItem *i = firstChild(), *iNext=0; i; i = iNext)
960 iNext=i->itemBelow();
961 if (!i->isSelected())
969 i->setSelected(
false);
971 TQListViewItem *afterFirst = i->itemAbove();
983 emit
moved(i, afterFirst, afterme);
986 afterFirsts.append (afterFirst);
987 afterNows.append (afterme);
992 for (TQListViewItem *i=items.first(); i; i=items.next() )
993 i->setSelected(
true);
995 setCurrentItem(current);
997 emit
moved(items,afterFirsts,afterNows);
1007 event->acceptAction();
1010 findDrop(event->pos(), d->parentItemDrop, d->afterItemDrop);
1011 TQPoint vp = contentsToViewport( event->pos() );
1012 TQListViewItem *item =
isExecuteArea( vp ) ? itemAt( vp ) : 0L;
1014 if ( item != d->dragOverItem )
1016 d->dragExpand.stop();
1017 d->dragOverItem = item;
1018 d->dragOverPoint = vp;
1019 if ( d->dragOverItem && d->dragOverItem->isExpandable() && !d->dragOverItem->isOpen() )
1020 d->dragExpand.start( TQApplication::startDragTime(),
true );
1025 if (tmpRect != d->mOldDropVisualizer)
1028 d->mOldDropVisualizer=tmpRect;
1029 viewport()->repaint(tmpRect);
1035 if (tmpRect != d->mOldDropHighlighter)
1038 d->mOldDropHighlighter=tmpRect;
1039 viewport()->repaint(tmpRect);
1047 void KListView::slotDragExpand()
1049 if ( itemAt( d->dragOverPoint ) == d->dragOverItem )
1050 d->dragOverItem->setOpen(
true );
1055 d->dragExpand.stop();
1062 if (d->mOldDropVisualizer.isValid())
1064 TQRect rect=d->mOldDropVisualizer;
1065 d->mOldDropVisualizer = TQRect();
1066 viewport()->repaint(rect,
true);
1072 return treeStepSize() * ( depth + (rootIsDecorated() ? 1 : 0) ) + itemMargin();
1077 TQPoint p (contentsToViewport(pos));
1080 TQListViewItem *atpos = itemAt(p);
1082 TQListViewItem *above;
1088 if (p.y() - itemRect(atpos).topLeft().y() < (atpos->height()/2))
1089 above = atpos->itemAbove();
1098 if (above->firstChild() && above->isOpen())
1107 if (above->isExpandable())
1111 (above->isOpen() && above->childCount() > 0) )
1121 TQListViewItem * betterAbove = above->parent();
1122 TQListViewItem * last = above;
1123 while ( betterAbove )
1127 if ( !last->nextSibling() )
1130 above = betterAbove;
1134 betterAbove = betterAbove->parent();
1141 parent = after ? after->parent() : 0L ;
1146 TQListViewItem* lastchild = firstChild();
1149 for (; lastchild->nextSibling(); lastchild = lastchild->nextSibling());
1158 for (TQListViewItemIterator it (last); it.current(); ++it)
1159 last = it.current();
1176 if (drag->drag() && drag->target() != viewport())
1186 return new TQStoredDrag(
"application/x-qlistviewitem", viewport());
1196 return d->itemsMovable;
1201 d->itemsRenameable=b;
1206 return d->itemsRenameable;
1217 return d->dragEnabled;
1232 return d->dropVisualizer;
1237 d->dropVisualizer=b;
1247 TQPtrList<TQListViewItem> list;
1253 switch(selectionMode())
1258 if(selectedItem() && (includeHiddenItems || selectedItem()->isVisible()))
1259 list.append(selectedItem());
1263 int flags = TQListViewItemIterator::Selected;
1264 if (!includeHiddenItems)
1266 flags |= TQListViewItemIterator::Visible;
1269 TQListViewItemIterator it(const_cast<KListView *>(
this), flags);
1271 for(; it.current(); ++it)
1272 list.append(it.current());
1285 TQListViewItem *i = parent;
1295 item->moveItem(after);
1302 item->parent()->takeItem(item);
1307 parent->insertItem(item);
1320 d->mDropVisualizerWidth = w > 0 ? w : 1;
1324 TQListViewItem *after)
1326 TQRect insertmarker;
1328 if (!after && !parent)
1329 insertmarker = TQRect (0, 0, viewport()->width(), d->mDropVisualizerWidth/2);
1335 TQListViewItem* it = 0L;
1336 if (after->isOpen())
1339 it = after->firstChild();
1341 while (it->nextSibling() || it->firstChild())
1342 if ( it->nextSibling() )
1343 it = it->nextSibling();
1345 it = it->firstChild();
1348 insertmarker = itemRect (it ? it : after);
1349 level = after->depth();
1353 insertmarker = itemRect (parent);
1354 level = parent->depth() + 1;
1356 insertmarker.setLeft( treeStepSize() * ( level + (rootIsDecorated() ? 1 : 0) ) + itemMargin() );
1357 insertmarker.setRight (viewport()->width());
1358 insertmarker.setTop (insertmarker.bottom() - d->mDropVisualizerWidth/2 + 1);
1359 insertmarker.setBottom (insertmarker.bottom() + d->mDropVisualizerWidth/2);
1365 p->fillRect(insertmarker, Dense4Pattern);
1367 return insertmarker;
1377 r.setLeft(r.left()+(item->depth()+(rootIsDecorated() ? 1 : 0))*treeStepSize());
1379 style().tqdrawPrimitive(TQStyle::PE_FocusRect, painter, r, colorGroup(),
1380 TQStyle::Style_FocusAtBorder, colorGroup().highlight());
1388 if (d->mOldDropHighlighter.isValid())
1390 TQRect rect=d->mOldDropHighlighter;
1391 d->mOldDropHighlighter = TQRect();
1392 viewport()->repaint(rect,
true);
1398 if (d->renameable.contains(c))
1400 ensureItemVisible(item);
1401 d->editor->load(item,c);
1407 return d->renameable.contains(col);
1412 if (col>=header()->count())
return;
1414 d->renameable.remove(col);
1419 void KListView::doneEditing(TQListViewItem *item,
int row)
1427 return acceptDrops() &&
itemsMovable() && (e->source()==viewport());
1432 d->createChildren=b;
1437 return d->createChildren;
1443 return d->tooltipColumn;
1448 d->tooltipColumn=column;
1453 d->dropHighlighter=b;
1458 return d->dropHighlighter;
1468 return item->text(column);
1478 return d->tabRename;
1484 if (e->key() == d->contextMenuKey)
1490 if (d->selectionMode != FileManager)
1498 d->selectedBySimpleMove=
true;
1499 d->selectedUsingMouse=
false;
1502 currentItem()->setSelected(
true);
1503 currentItem()->repaint();
1504 emit selectionChanged();
1510 d->selectedBySimpleMove=
false;
1515 return d->selectedBySimpleMove;
1520 d->wasShiftEvent =
false;
1521 d->selectionDirection = 0;
1525 TQListViewItem* origItem = currentItem();
1526 if (!d->initialFileManagerItem) {
1527 d->initialFileManagerItem = origItem;
1529 setCurrentItem(item);
1535 int e_state=(e->state() & ~Keypad);
1538 if ((e->key()!=Key_Shift) && (e->key()!=Key_Control)
1539 && (e->key()!=Key_Meta) && (e->key()!=Key_Alt)) {
1540 if ((e_state==ShiftButton) && (!d->wasShiftEvent) && (!d->selectedBySimpleMove)) {
1542 d->selectionRegion = 0;
1543 d->initialFileManagerItem = NULL;
1545 d->selectionDirection=0;
1546 d->wasShiftEvent = (e_state == ShiftButton);
1551 TQListViewItem* item = currentItem();
1556 TQListViewItem* repaintItem1 = item;
1557 TQListViewItem* repaintItem2 = 0L;
1558 TQListViewItem* visItem = 0L;
1560 TQListViewItem* nextItem = 0L;
1563 bool shiftOrCtrl((e_state==ControlButton) || (e_state==ShiftButton));
1565 for (TQListViewItem *tmpItem=firstChild(); tmpItem; tmpItem=tmpItem->nextSibling()) {
1566 if (tmpItem->isSelected()) selectedItems++;
1569 if (((!selectedItems) || ((selectedItems==1) && (d->selectedUsingMouse)))
1570 && (e_state==Qt::NoButton)
1571 && ((e->key()==Key_Down)
1572 || (e->key()==Key_Up)
1573 || (e->key()==Key_Next)
1574 || (e->key()==Key_Prior)
1575 || (e->key()==Key_Home)
1576 || (e->key()==Key_End))) {
1577 d->selectedBySimpleMove=
true;
1578 d->selectedUsingMouse=
false;
1580 else if (selectedItems>1) {
1581 d->selectedBySimpleMove=
false;
1584 bool emitSelectionChanged(
false);
1589 emitSelectionChanged=
true;
1594 if (d->selectedBySimpleMove) {
1595 d->selectedBySimpleMove=
false;
1597 item->setSelected(!item->isSelected());
1598 emitSelectionChanged=
true;
1603 if (d->selectedBySimpleMove) {
1604 d->selectedBySimpleMove=
false;
1605 if (!item->isSelected()) item->setSelected(
true);
1608 item->setSelected(!item->isSelected());
1611 nextItem=item->itemBelow();
1614 repaintItem2=nextItem;
1616 setCurrentItem(nextItem);
1618 d->selectionDirection=1;
1619 emitSelectionChanged=
true;
1623 nextItem=item->itemBelow();
1625 d->selectionDirection=1;
1626 d->selectedBySimpleMove=
false;
1627 if (!d->initialFileManagerItem) {
1628 d->initialFileManagerItem = item;
1629 item->setSelected(
true);
1631 nextItem->setSelected(
true);
1633 emitSelectionChanged=
true;
1634 d->selectionRegion=1;
1637 if (item == d->initialFileManagerItem) {
1638 item->setSelected(
true);
1640 nextItem->setSelected(
true);
1642 emitSelectionChanged=
true;
1643 d->selectionRegion=1;
1646 if (d->selectionRegion == 1) {
1648 nextItem->setSelected(
true);
1650 emitSelectionChanged=
true;
1652 else if (d->selectionRegion == -1) {
1653 item->setSelected(
false);
1654 emitSelectionChanged=
true;
1659 else if ((d->selectedBySimpleMove) && (nextItem)) {
1660 item->setSelected(
false);
1661 emitSelectionChanged=
true;
1665 if (d->selectedBySimpleMove) {
1666 nextItem->setSelected(
true);
1668 repaintItem2=nextItem;
1670 setCurrentItem(nextItem);
1675 nextItem=item->itemAbove();
1677 d->selectionDirection=-1;
1678 d->selectedBySimpleMove=
false;
1679 if (!d->initialFileManagerItem) {
1680 d->initialFileManagerItem = item;
1681 item->setSelected(
true);
1683 nextItem->setSelected(
true);
1685 emitSelectionChanged=
true;
1686 d->selectionRegion=-1;
1689 if (item == d->initialFileManagerItem) {
1690 item->setSelected(
true);
1692 nextItem->setSelected(
true);
1694 emitSelectionChanged=
true;
1695 d->selectionRegion=-1;
1698 if (d->selectionRegion == -1) {
1700 nextItem->setSelected(
true);
1702 emitSelectionChanged=
true;
1704 else if (d->selectionRegion == 1) {
1705 item->setSelected(
false);
1706 emitSelectionChanged=
true;
1711 else if ((d->selectedBySimpleMove) && (nextItem)) {
1712 item->setSelected(
false);
1713 emitSelectionChanged=
true;
1717 if (d->selectedBySimpleMove) {
1718 nextItem->setSelected(
true);
1720 repaintItem2=nextItem;
1722 setCurrentItem(nextItem);
1729 if (d->selectedBySimpleMove) {
1730 item->setSelected(
false);
1733 d->selectedBySimpleMove=
false;
1738 if (!d->initialFileManagerItem) {
1739 d->initialFileManagerItem = nextItem;
1740 nextItem->setSelected(
true);
1741 emitSelectionChanged=
true;
1742 d->selectionRegion=1;
1745 if (nextItem == d->initialFileManagerItem) {
1746 nextItem->setSelected(
true);
1747 emitSelectionChanged=
true;
1748 d->selectionRegion=1;
1751 if (d->selectionRegion == 1) {
1752 nextItem->setSelected(
true);
1753 emitSelectionChanged=
true;
1755 else if (d->selectionRegion == -1) {
1756 nextItem->setSelected(
false);
1757 emitSelectionChanged=
true;
1762 if (!nextItem->itemBelow()) {
1763 if (d->selectedBySimpleMove) {
1764 nextItem->setSelected(
true);
1766 repaintItem2=nextItem;
1768 setCurrentItem(nextItem);
1770 nextItem=nextItem->itemBelow();
1772 emitSelectionChanged=
true;
1778 if (d->selectedBySimpleMove) {
1779 item->setSelected(
false);
1782 d->selectedBySimpleMove=
false;
1787 if (!d->initialFileManagerItem) {
1788 d->initialFileManagerItem = nextItem;
1789 nextItem->setSelected(
true);
1790 emitSelectionChanged=
true;
1791 d->selectionRegion=-1;
1794 if (nextItem == d->initialFileManagerItem) {
1795 nextItem->setSelected(
true);
1796 emitSelectionChanged=
true;
1797 d->selectionRegion=-1;
1800 if (d->selectionRegion == -1) {
1801 nextItem->setSelected(
true);
1802 emitSelectionChanged=
true;
1804 else if (d->selectionRegion == 1) {
1805 nextItem->setSelected(
false);
1806 emitSelectionChanged=
true;
1811 if (!nextItem->itemAbove()) {
1812 if (d->selectedBySimpleMove) {
1813 nextItem->setSelected(
true);
1815 repaintItem2=nextItem;
1817 setCurrentItem(nextItem);
1819 nextItem=nextItem->itemAbove();
1821 emitSelectionChanged=
true;
1825 items=visibleHeight()/item->height();
1827 if (d->selectedBySimpleMove) {
1828 item->setSelected(
false);
1831 d->selectedBySimpleMove=
false;
1832 d->selectionDirection=1;
1835 for (
int i=0; i<items; i++) {
1837 if (!d->initialFileManagerItem) {
1838 d->initialFileManagerItem = nextItem;
1839 nextItem->setSelected(
true);
1840 emitSelectionChanged=
true;
1841 d->selectionRegion=1;
1844 if (nextItem == d->initialFileManagerItem) {
1845 nextItem->setSelected(
true);
1846 emitSelectionChanged=
true;
1847 d->selectionRegion=1;
1850 if (d->selectionRegion == 1) {
1851 nextItem->setSelected(
true);
1852 emitSelectionChanged=
true;
1854 else if (d->selectionRegion == -1) {
1856 nextItem->setSelected(
true);
1859 nextItem->setSelected(
false);
1861 emitSelectionChanged=
true;
1867 if ((i==items-1) || (!nextItem->itemBelow())) {
1868 if (d->selectedBySimpleMove) {
1869 nextItem->setSelected(
true);
1871 ensureItemVisible(nextItem);
1872 setCurrentItem(nextItem);
1874 if ((shiftOrCtrl) || (d->selectedBySimpleMove)) {
1875 emit selectionChanged();
1879 nextItem=nextItem->itemBelow();
1884 items=visibleHeight()/item->height();
1886 if (d->selectedBySimpleMove) {
1887 item->setSelected(
false);
1890 d->selectionDirection=-1;
1891 d->selectedBySimpleMove=
false;
1894 for (
int i=0; i<items; i++) {
1896 if (!d->initialFileManagerItem) {
1897 d->initialFileManagerItem = nextItem;
1898 nextItem->setSelected(
true);
1899 emitSelectionChanged=
true;
1900 d->selectionRegion=-1;
1903 if (nextItem == d->initialFileManagerItem) {
1904 nextItem->setSelected(
true);
1905 emitSelectionChanged=
true;
1906 d->selectionRegion=-1;
1909 if (d->selectionRegion == -1) {
1910 nextItem->setSelected(
true);
1911 emitSelectionChanged=
true;
1913 else if (d->selectionRegion == 1) {
1915 nextItem->setSelected(
true);
1918 nextItem->setSelected(
false);
1920 emitSelectionChanged=
true;
1926 if ((i==items-1) || (!nextItem->itemAbove())) {
1927 if (d->selectedBySimpleMove) {
1928 nextItem->setSelected(
true);
1930 ensureItemVisible(nextItem);
1931 setCurrentItem(nextItem);
1933 if ((shiftOrCtrl) || (d->selectedBySimpleMove)) {
1934 emit selectionChanged();
1938 nextItem=nextItem->itemAbove();
1943 if ( item->isOpen() ) {
1944 setOpen( item,
false );
1948 if ( !item->isOpen() && (item->isExpandable() || item->childCount()) ) {
1949 setOpen( item,
true );
1953 bool realKey = ((e->key()!=Key_Shift) && (e->key()!=Key_Control)
1954 && (e->key()!=Key_Meta) && (e->key()!=Key_Alt));
1956 bool selectCurrentItem = (d->selectedBySimpleMove) && (item->isSelected());
1957 if (realKey && selectCurrentItem) {
1958 item->setSelected(
false);
1961 TQListView::SelectionMode oldSelectionMode = selectionMode();
1962 setSelectionMode (TQListView::Multi);
1964 setSelectionMode (oldSelectionMode);
1965 if (realKey && selectCurrentItem) {
1966 currentItem()->setSelected(
true);
1967 emitSelectionChanged=
true;
1969 repaintItem2=currentItem();
1971 visItem=currentItem();
1977 ensureItemVisible(visItem);
1982 ir = ir.unite( itemRect(repaintItem1) );
1985 ir = ir.unite( itemRect(repaintItem2) );
1988 if ( !ir.isEmpty() ) {
1991 ir.moveBy( -ir.x(), 0 );
1993 viewport()->repaint( ir,
false );
2003 if (emitSelectionChanged) {
2004 emit selectionChanged();
2010 d->selectionMode = mode;
2018 setSelectionMode (static_cast<TQListView::SelectionMode>(static_cast<int>(mode)));
2022 setSelectionMode (TQListView::Extended);
2026 kdWarning () <<
"Warning: illegal selection mode " << int(mode) <<
" set!" <<
endl;
2033 return d->selectionMode;
2041 if ( item == firstChild() )
2044 TQListViewItemIterator it(firstChild());
2046 for (; it.current() && it.current() != item; ++it, ++j );
2061 for (TQListViewItemIterator it=firstChild(); it.current(); ++it)
2064 return it.current();
2076 p = viewport()->mapToGlobal(itemRect(i).center());
2078 p = mapToGlobal(rect().center());
2091 viewport()->setAcceptDrops (val);
2096 return d->mDropVisualizerWidth;
2103 d->paintCurrent = 0;
2109 if (d->mOldDropVisualizer.isValid() && e->rect().intersects(d->mOldDropVisualizer))
2111 TQPainter painter(viewport());
2114 painter.fillRect(d->mOldDropVisualizer, Dense4Pattern);
2116 if (d->mOldDropHighlighter.isValid() && e->rect().intersects(d->mOldDropHighlighter))
2118 TQPainter painter(viewport());
2121 style().tqdrawPrimitive(TQStyle::PE_FocusRect, &painter, d->mOldDropHighlighter, colorGroup(),
2122 TQStyle::Style_FocusAtBorder);
2124 d->painting =
false;
2135 header()->setStretchEnabled(fullWidth, columns()-1);
2140 return d->fullWidth;
2147 header()->setStretchEnabled(
false, columns()-2);
2148 header()->setStretchEnabled(
true, columns()-1);
2157 header()->setStretchEnabled(
false, columns()-2);
2158 header()->setStretchEnabled(
true, columns()-1);
2166 if (d->fullWidth && index == columns()) header()->setStretchEnabled(
true, columns()-1);
2176 return d->alternateBackground;
2181 d->alternateBackground = c;
2193 return d->shadeSortColumn;
2199 TQStringList widths, order;
2201 const int colCount = columns();
2202 TQHeader*
const thisHeader = header();
2203 for (
int i = 0; i < colCount; ++i)
2205 widths << TQString::number(columnWidth(i));
2206 order << TQString::number(thisHeader->mapToIndex(i));
2210 config->
writeEntry(
"SortColumn", d->sortColumn);
2211 config->
writeEntry(
"SortAscending", d->sortAscending);
2220 TQStringList::ConstIterator it = cols.constBegin();
2221 const TQStringList::ConstIterator itEnd = cols.constEnd();
2222 for (; it != itEnd; ++it)
2223 setColumnWidth(i++, (*it).toInt());
2230 const int colCount = columns();
2231 for (i = 0; i < colCount; ++i)
2233 TQStringList::ConstIterator it = cols.constBegin();
2234 const TQStringList::ConstIterator itEnd = cols.constEnd();
2237 for (; (it != itEnd) && ((*it).toInt() != i); ++it, ++section) ;
2239 if ( it != itEnd ) {
2241 header()->moveSection(section, i);
2245 if (config->
hasKey(
"SortColumn"))
2251 TQListViewItem *selected = 0;
2253 if (selectionMode() == TQListView::Single) {
2254 selected = selectedItem();
2255 if (selected && !selected->isVisible())
2258 else if (selectionMode() != TQListView::NoSelection) {
2259 TQListViewItem *item = firstChild();
2260 while (item && !selected) {
2261 if (item->isSelected() && item->isVisible())
2263 item = item->itemBelow();
2267 d->sortColumn = column;
2268 d->sortAscending = ascending;
2272 ensureItemVisible(selected);
2274 TQListViewItem* item = firstChild();
2277 if (kItem) kItem->m_known =
false;
2278 item = item->itemBelow();
2284 return d->sortColumn;
2289 return d->sortAscending;
2294 if(item && item == d->editor->currentItem())
2295 d->editor->terminate();
2302 if ( d->disableAutoSelection )
2305 d->disableAutoSelection =
true;
2306 d->autoSelect.stop();
2307 d->autoSelectDelay = -1;
2312 if ( !d->disableAutoSelection )
2315 d->disableAutoSelection =
false;
2325 : TQListViewItem(parent)
2331 : TQListViewItem(parent)
2337 : TQListViewItem(parent, after)
2343 : TQListViewItem(parent, after)
2349 TQString label1, TQString label2, TQString label3, TQString label4,
2350 TQString label5, TQString label6, TQString label7, TQString label8)
2351 : TQListViewItem(parent, label1, label2, label3, label4, label5, label6, label7, label8)
2357 TQString label1, TQString label2, TQString label3, TQString label4,
2358 TQString label5, TQString label6, TQString label7, TQString label8)
2359 : TQListViewItem(parent, label1, label2, label3, label4, label5, label6, label7, label8)
2365 TQString label1, TQString label2, TQString label3, TQString label4,
2366 TQString label5, TQString label6, TQString label7, TQString label8)
2367 : TQListViewItem(parent, after, label1, label2, label3, label4, label5, label6, label7, label8)
2373 TQString label1, TQString label2, TQString label3, TQString label4,
2374 TQString label5, TQString label6, TQString label7, TQString label8)
2375 : TQListViewItem(parent, after, label1, label2, label3, label4, label5, label6, label7, label8)
2380 KListViewItem::~KListViewItem()
2383 emit
static_cast<KListView *
>(listView())->itemRemoved(
this);
2386 void KListViewItem::init()
2388 m_odd = m_known =
false;
2390 setDragEnabled( dragEnabled() || lv->dragEnabled() );
2391 emit lv->itemAdded(
this);
2394 void KListViewItem::insertItem(TQListViewItem *item)
2396 TQListViewItem::insertItem(item);
2398 emit
static_cast<KListView *
>(listView())->itemAdded(item);
2401 void KListViewItem::takeItem(TQListViewItem *item)
2403 TQListViewItem::takeItem(item);
2405 emit
static_cast<KListView *
>(listView())->itemRemoved(item);
2411 return static_cast< KListView*
>(listView())->alternateBackground();
2412 return listView()->viewport()->colorGroup().base();
2419 view->alternateBackground() :
2420 view->viewport()->colorGroup().base();
2423 if ( (view->columns() > 1) && view->shadeSortColumn() && (column == view->
columnSorted()) )
2425 if ( color == Qt::black )
2426 color = TQColor(55, 55, 55);
2430 color.hsv(&h, &s, &v);
2432 color = color.dark(104);
2434 color = color.light(120);
2444 if (lv && lv->alternateBackground().isValid())
2448 KListView::KListViewPrivate*
const lvD = lv->d;
2467 if (lvD->painting) {
2468 if (lvD->paintCurrent !=
this)
2470 lvD->paintAbove = lvD->paintBelow ==
this ? lvD->paintCurrent : itemAbove();
2471 lvD->paintCurrent =
this;
2472 lvD->paintBelow = itemBelow();
2482 m_known = above ? above->m_known :
true;
2485 m_odd = above ? !above->m_odd :
false;
2490 bool previous =
true;
2495 previous = item->m_odd;
2496 item =
dynamic_cast<KListViewItem *
>(parent()->firstChild());
2505 previous = !previous;
2506 item->m_odd = previous;
2507 item->m_known =
true;
2516 void KListViewItem::paintCell(TQPainter *p,
const TQColorGroup &cg,
int column,
int width,
int alignment)
2518 TQColorGroup _cg = cg;
2519 TQListView* lv = listView();
2520 const TQPixmap *pm = lv->viewport()->backgroundPixmap();
2522 if (pm && !pm->isNull())
2524 _cg.setBrush(TQColorGroup::Base, TQBrush(
backgroundColor(column), *pm));
2525 TQPoint o = p->brushOrigin();
2526 p->setBrushOrigin( o.x()-lv->contentsX(), o.y()-lv->contentsY() );
2530 _cg.setColor((lv->viewport()->backgroundMode() == TQt::FixedColor) ?
2531 TQColorGroup::Background : TQColorGroup::Base,
2534 TQListViewItem::paintCell(p, _cg, column, width, alignment);
2547 bool b = signalsBlocked();
2548 blockSignals( TRUE );
2549 bool anything = FALSE;
2550 TQListViewItemIterator it(
this );
2551 while ( it.current() ) {
2552 TQListViewItem *i = it.current();
2553 if ( select == TRUE ) {
2554 if ( (
bool)i->isVisible() == TRUE ) {
2555 i->setSelected( TRUE );
2558 if ( (
bool)i->isVisible() == FALSE ) {
2559 i->setSelected( FALSE );
2564 if ( (
bool)i->isSelected() != select ) {
2565 i->setSelected( select );
2573 emit selectionChanged();
2577 }
else if ( currentItem() ) {
2578 TQListViewItem * i = currentItem();
2579 setSelected( i, select );
2583 void KListView::virtual_hook(
int,
void* )
2586 #include "klistview.moc"
2587 #include "klistviewlineedit.moc"