22 #include <QContextMenuEvent>
26 #include <QApplication>
30 class KSqueezedTextLabelPrivate
34 void _k_copyFullText() {
35 QApplication::clipboard()->setText(fullText);
39 Qt::TextElideMode elideMode;
44 d(new KSqueezedTextLabelPrivate)
46 setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
48 d->elideMode = Qt::ElideMiddle;
54 d(new KSqueezedTextLabelPrivate)
56 setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
57 d->elideMode = Qt::ElideMiddle;
80 QFontMetrics fm(fontMetrics());
81 int textWidth = fm.width(d->fullText);
82 if (textWidth > maxWidth) {
85 return QSize(textWidth, QLabel::sizeHint().height());
102 QFontMetrics fm(fontMetrics());
103 int labelWidth = size().width();
105 bool squeezed =
false;
106 Q_FOREACH(
const QString& line, d->fullText.split(
'\n')) {
107 int lineWidth = fm.width(line);
108 if (lineWidth > labelWidth) {
110 squeezedLines << fm.elidedText(line, d->elideMode, labelWidth);
112 squeezedLines << line;
118 setToolTip(d->fullText);
130 d->fullText = tmpFull;
160 const bool squeezed = text() != d->fullText;
161 const bool showCustomPopup = squeezed;
162 if (showCustomPopup) {
166 connect(act, SIGNAL(triggered()),
this, SLOT(_k_copyFullText()));
170 menu.exec(ev->globalPos());
178 #if QT_VERSION >= 0x040700
179 if (QApplication::clipboard()->supportsSelection() &&
180 textInteractionFlags() != Qt::NoTextInteraction &&
181 ev->button() == Qt::LeftButton &&
182 !d->fullText.isEmpty() &&
186 const QChar ellipsisChar(0x2026);
187 const int dotsPos = txt.indexOf(ellipsisChar);
193 const int start = selectionStart();
194 const int charsAfterSelection = text().length() - start - selectedText().length();
195 txt = d->fullText.mid(selectionStart(), d->fullText.length() - start - charsAfterSelection);
197 QApplication::clipboard()->setText(txt, QClipboard::Selection);
205 #include "ksqueezedtextlabel.moc"