20 #include <tqpainter.h>
22 #include <tqfontmetrics.h>
30 #include "tdepopupmenu.h"
33 #include <tdeapplication.h>
36 : TQWidget(parent, name)
38 setMinimumSize(16, fontMetrics().height()+8);
42 const TQColor &,
const TQColor &,
43 TQWidget *parent,
const char *name)
44 : TQWidget(parent, name)
50 const TQColor &, TQWidget *parent,
52 : TQWidget(parent, name)
63 miniicon.resize(0, 0);
80 void TDEPopupTitle::calcSize()
84 int w = miniicon.width()+TQFontMetrics(f).width(titleStr);
85 int h = TQMAX( fontMetrics().height(), miniicon.height() );
86 setMinimumSize( w+16, h+8 );
89 void TDEPopupTitle::paintEvent(TQPaintEvent *)
93 kapp->style().tqdrawPrimitive(TQStyle::PE_HeaderSectionMenu, &p, r, palette().active());
95 if (!miniicon.isNull())
96 p.drawPixmap(4, (r.height()-miniicon.height())/2, miniicon);
98 if (!titleStr.isNull())
100 p.setPen(palette().active().text());
104 if(!miniicon.isNull())
106 p.drawText(miniicon.width()+8, 0, width()-(miniicon.width()+8),
107 height(), AlignLeft | AlignVCenter | SingleLine,
112 p.drawText(0, 0, width(), height(),
113 AlignCenter | SingleLine, titleStr);
118 TQSize TDEPopupTitle::sizeHint()
const
120 return minimumSize();
123 class TDEPopupMenu::TDEPopupMenuPrivate
126 TDEPopupMenuPrivate ()
131 ,
state(Qt::NoButton)
135 ~TDEPopupMenuPrivate ()
140 TQString m_lastTitle;
150 TQString originalText;
153 TQt::ButtonState
state;
156 TQPopupMenu* m_ctxMenu;
157 static bool s_continueCtxMenuShow;
158 static int s_highlightedItem;
162 int TDEPopupMenu::TDEPopupMenuPrivate::s_highlightedItem(-1);
163 TDEPopupMenu* TDEPopupMenu::TDEPopupMenuPrivate::s_contextedMenu(0);
164 bool TDEPopupMenu::TDEPopupMenuPrivate::s_continueCtxMenuShow(
true);
167 : TQPopupMenu(parent, name)
169 d =
new TDEPopupMenuPrivate;
176 if (TDEPopupMenuPrivate::s_contextedMenu ==
this)
178 TDEPopupMenuPrivate::s_contextedMenu = 0;
179 TDEPopupMenuPrivate::s_highlightedItem = -1;
189 int ret = insertItem(titleItem,
id, index);
190 setItemEnabled(ret,
false);
199 int ret = insertItem(titleItem,
id, index);
200 setItemEnabled(ret,
false);
206 TQMenuItem *item = findItem(
id);
212 kdWarning() <<
"TDEPopupMenu: changeTitle() called with non-title id "<<
id <<
endl;
217 kdWarning() <<
"TDEPopupMenu: changeTitle() called with invalid id " <<
id <<
endl;
223 TQMenuItem *item = findItem(
id);
229 kdWarning() <<
"TDEPopupMenu: changeTitle() called with non-title id "<<
id <<
endl;
234 kdWarning() <<
"TDEPopupMenu: changeTitle() called with invalid id " <<
id <<
endl;
241 return d->m_lastTitle;
242 TQMenuItem *item = findItem(
id);
247 tqWarning(
"TDEPopupMenu: title() called with non-title id %d.",
id);
250 tqWarning(
"TDEPopupMenu: title() called with invalid id %d.",
id);
251 return TQString::null;
256 TQMenuItem *item = findItem(
id);
261 tqWarning(
"TDEPopupMenu: titlePixmap() called with non-title id %d.",
id);
264 tqWarning(
"TDEPopupMenu: titlePixmap() called with invalid id %d.",
id);
276 TQPopupMenu::closeEvent(e);
281 d->state = Qt::NoButton;
282 TQPopupMenu::activateItemAt(index);
290 void TDEPopupMenu::keyPressEvent(TQKeyEvent* e)
292 d->state = Qt::NoButton;
296 d->state = e->state();
297 TQPopupMenu::keyPressEvent(e);
302 bool firstpass =
true;
303 TQString keyString = e->text();
307 if (key == Key_Escape || key == Key_Return || key == Key_Enter
308 || key == Key_Up || key == Key_Down || key == Key_Left
309 || key == Key_Right || key == Key_F1) {
314 d->state = e->state();
315 TQPopupMenu::keyPressEvent(e);
317 }
else if ( key == Key_Shift || key == Key_Control || key == Key_Alt || key == Key_Meta )
318 return TQPopupMenu::keyPressEvent(e);
322 if (!d->keySeq.isNull()) {
324 if (key == Key_Backspace) {
326 if (d->keySeq.length() == 1) {
332 keyString = d->keySeq.left(d->keySeq.length() - 1);
337 }
else if (key == Key_Delete) {
344 }
else if (d->noMatches) {
356 }
else if (key == Key_Backspace && parentMenu) {
363 d->keySeq += keyString;
364 int seqLen = d->keySeq.length();
366 for (; i < (int)count(); i++) {
371 if (!isItemEnabled(j))
378 if (i == d->lastHitIndex)
379 thisText = d->originalText;
384 if ((
int)accel(j) != 0)
385 thisText = thisText.replace(
"&", TQString());
388 thisText = thisText.left(seqLen);
391 if (!thisText.find(d->keySeq, 0,
false)) {
398 if (d->lastHitIndex != i)
400 changeItem(idAt(d->lastHitIndex), d->originalText);
403 if (d->lastHitIndex != i || d->lastHitIndex == -1)
404 d->originalText = text(j);
407 changeItem(j,
underlineText(d->originalText, d->keySeq.length()));
413 d->clearTimer.start(5000,
true);
432 }
else if (findItem(idAt(d->lastHitIndex)) &&
433 findItem(idAt(d->lastHitIndex))->popup()) {
445 TQPopupMenu::keyPressEvent(e);
448 bool TDEPopupMenu::focusNextPrevChild(
bool next )
451 return TQPopupMenu::focusNextPrevChild( next );
457 for (uint i = 0; i < length; i++) {
459 ret.insert(2*i,
"&");
467 if (d->lastHitIndex != -1) {
468 changeItem(idAt(d->lastHitIndex), d->originalText);
469 d->lastHitIndex = -1;
473 d->keySeq = TQString::null;
476 d->noMatches = noMatches;
481 d->shortcuts = enable;
486 d->autoExec = enable;
498 if (d->m_ctxMenu && d->m_ctxMenu->isVisible())
501 d->m_ctxMenu->hide();
504 TQPopupMenu::mousePressEvent(e);
510 d->state = TQt::ButtonState(e->button() | (e->state() & KeyButtonMask));
512 if ( !d->m_ctxMenu || !d->m_ctxMenu->isVisible() )
513 TQPopupMenu::mouseReleaseEvent(e);
520 d->m_ctxMenu =
new TQPopupMenu(
this);
521 connect(d->m_ctxMenu, TQT_SIGNAL(aboutToHide()),
this, TQT_SLOT(ctxMenuHiding()));
534 TDEPopupMenuPrivate::s_continueCtxMenuShow =
false;
539 return TDEPopupMenuPrivate::s_highlightedItem;
544 return TDEPopupMenuPrivate::s_contextedMenu;
547 void TDEPopupMenu::itemHighlighted(
int )
549 if (!d->m_ctxMenu || !d->m_ctxMenu->isVisible())
554 d->m_ctxMenu->hide();
555 showCtxMenu(mapFromGlobal(TQCursor::pos()));
558 void TDEPopupMenu::showCtxMenu(TQPoint pos)
560 TQMenuItem* item = findItem(TDEPopupMenuPrivate::s_highlightedItem);
563 TQPopupMenu* subMenu = item->popup();
566 disconnect(subMenu, TQT_SIGNAL(aboutToShow()),
this, TQT_SLOT(ctxMenuHideShowingMenu()));
570 TDEPopupMenuPrivate::s_highlightedItem = idAt(pos);
572 if (TDEPopupMenuPrivate::s_highlightedItem == -1)
574 TDEPopupMenuPrivate::s_contextedMenu = 0;
580 TQPopupMenu* subMenu = findItem(TDEPopupMenuPrivate::s_highlightedItem)->popup();
583 connect(subMenu, TQT_SIGNAL(aboutToShow()), TQT_SLOT(ctxMenuHideShowingMenu()));
584 TQTimer::singleShot(100, subMenu, TQT_SLOT(hide()));
587 if (!TDEPopupMenuPrivate::s_continueCtxMenuShow)
589 TDEPopupMenuPrivate::s_continueCtxMenuShow =
true;
593 TDEPopupMenuPrivate::s_contextedMenu =
this;
594 d->m_ctxMenu->popup(this->mapToGlobal(pos));
595 connect(
this, TQT_SIGNAL(highlighted(
int)),
this, TQT_SLOT(itemHighlighted(
int)));
602 void TDEPopupMenu::ctxMenuHideShowingMenu()
604 TQMenuItem* item = findItem(TDEPopupMenuPrivate::s_highlightedItem);
607 TQPopupMenu* subMenu = item->popup();
610 TQTimer::singleShot(0, subMenu, TQT_SLOT(hide()));
615 void TDEPopupMenu::ctxMenuHiding()
617 if (TDEPopupMenuPrivate::s_highlightedItem)
619 TQPopupMenu* subMenu = findItem(TDEPopupMenuPrivate::s_highlightedItem)->popup();
622 disconnect(subMenu, TQT_SIGNAL(aboutToShow()),
this, TQT_SLOT(ctxMenuHideShowingMenu()));
626 disconnect(
this, TQT_SIGNAL(highlighted(
int)),
this, TQT_SLOT(itemHighlighted(
int)));
627 TDEPopupMenuPrivate::s_continueCtxMenuShow =
true;
630 void TDEPopupMenu::contextMenuEvent(TQContextMenuEvent* e)
634 if (e->reason() == TQContextMenuEvent::Mouse)
636 showCtxMenu(e->pos());
638 else if (actItem != -1)
640 showCtxMenu(itemGeometry(actItem).center());
647 TQPopupMenu::contextMenuEvent(e);
650 void TDEPopupMenu::hideEvent(TQHideEvent*)
652 if (d->m_ctxMenu && d->m_ctxMenu->isVisible())
663 d->m_ctxMenu->hide();
673 : TQPopupMenu(parent, name)
675 d =
new TDEPopupMenuPrivate;
684 insertItem(titleItem);
685 d->m_lastTitle =
title;
688 void TDEPopupTitle::virtual_hook(
int,
void* )
691 void TDEPopupMenu::virtual_hook(
int,
void* )
694 #include "tdepopupmenu.moc"
int key(StdAccel) KDE_DEPRECATED
kdbgstream kdWarning(int area=0)
kndbgstream & endl(kndbgstream &s)