KDEUI
ksqueezedtextlabel.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "ksqueezedtextlabel.h"
00020 #include <kdebug.h>
00021 #include <klocale.h>
00022 #include <QContextMenuEvent>
00023 #include <kaction.h>
00024 #include <QMenu>
00025 #include <QClipboard>
00026 #include <QApplication>
00027 #include <QMimeData>
00028 #include <kglobalsettings.h>
00029
00030 class KSqueezedTextLabelPrivate
00031 {
00032 public:
00033
00034 void _k_copyFullText() {
00035 QMimeData* data = new QMimeData;
00036 data->setText(fullText);
00037 QApplication::clipboard()->setMimeData(data);
00038 }
00039
00040 QString fullText;
00041 Qt::TextElideMode elideMode;
00042 };
00043
00044 KSqueezedTextLabel::KSqueezedTextLabel( const QString &text , QWidget *parent )
00045 : QLabel ( parent ),
00046 d( new KSqueezedTextLabelPrivate )
00047 {
00048 setSizePolicy(QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ));
00049 d->fullText = text;
00050 d->elideMode = Qt::ElideMiddle;
00051 squeezeTextToLabel();
00052 }
00053
00054 KSqueezedTextLabel::KSqueezedTextLabel( QWidget *parent )
00055 : QLabel ( parent ),
00056 d( new KSqueezedTextLabelPrivate )
00057 {
00058 setSizePolicy(QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ));
00059 d->elideMode = Qt::ElideMiddle;
00060 }
00061
00062 KSqueezedTextLabel::~KSqueezedTextLabel()
00063 {
00064 delete d;
00065 }
00066
00067 void KSqueezedTextLabel::resizeEvent( QResizeEvent * ) {
00068 squeezeTextToLabel();
00069 }
00070
00071 QSize KSqueezedTextLabel::minimumSizeHint() const
00072 {
00073 QSize sh = QLabel::minimumSizeHint();
00074 sh.setWidth(-1);
00075 return sh;
00076 }
00077
00078 QSize KSqueezedTextLabel::sizeHint() const
00079 {
00080 int maxWidth = KGlobalSettings::desktopGeometry( this ).width() * 3 / 4;
00081 QFontMetrics fm(fontMetrics());
00082 int textWidth = fm.width(d->fullText);
00083 if (textWidth > maxWidth) {
00084 textWidth = maxWidth;
00085 }
00086 return QSize(textWidth, QLabel::sizeHint().height());
00087 }
00088
00089 void KSqueezedTextLabel::setText( const QString &text ) {
00090 d->fullText = text;
00091 squeezeTextToLabel();
00092 }
00093
00094 void KSqueezedTextLabel::squeezeTextToLabel() {
00095 QFontMetrics fm(fontMetrics());
00096 int labelWidth = size().width();
00097 QStringList squeezedLines;
00098 bool squeezed = false;
00099 Q_FOREACH(const QString& line, d->fullText.split("\n")) {
00100 int lineWidth = fm.width(line);
00101 if (lineWidth > labelWidth) {
00102 squeezed = true;
00103 squeezedLines << fm.elidedText(line, d->elideMode, labelWidth);
00104 } else {
00105 squeezedLines << line;
00106 }
00107 }
00108
00109 if (squeezed) {
00110 QLabel::setText(squeezedLines.join("\n"));
00111 setToolTip(d->fullText);
00112 } else {
00113 QLabel::setText(d->fullText);
00114 setToolTip( QString() );
00115 }
00116 }
00117
00118 void KSqueezedTextLabel::setAlignment( Qt::Alignment alignment )
00119 {
00120
00121 QString tmpFull(d->fullText);
00122 QLabel::setAlignment(alignment);
00123 d->fullText = tmpFull;
00124 }
00125
00126 Qt::TextElideMode KSqueezedTextLabel::textElideMode() const
00127 {
00128 return d->elideMode;
00129 }
00130
00131 void KSqueezedTextLabel::setTextElideMode(Qt::TextElideMode mode)
00132 {
00133 d->elideMode = mode;
00134 squeezeTextToLabel();
00135 }
00136
00137 void KSqueezedTextLabel::contextMenuEvent(QContextMenuEvent* ev)
00138 {
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148 const bool squeezed = text() != d->fullText;
00149 const bool showCustomPopup = squeezed;
00150 if (showCustomPopup) {
00151 QMenu menu(this);
00152
00153 KAction* act = new KAction(i18n("&Copy Full Text"), this);
00154 connect(act, SIGNAL(triggered()), this, SLOT(_k_copyFullText()));
00155 menu.addAction(act);
00156
00157 ev->accept();
00158 menu.exec(ev->globalPos());
00159 } else {
00160 QLabel::contextMenuEvent(ev);
00161 }
00162 }
00163
00164 #include "ksqueezedtextlabel.moc"