00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "advancedrenameinput.moc"
00025
00026
00027
00028 #include <QFontMetrics>
00029 #include <QLayout>
00030 #include <QTimer>
00031 #include <QScrollBar>
00032
00033
00034
00035 #include <kapplication.h>
00036 #include <kconfig.h>
00037 #include <kconfiggroup.h>
00038 #include <kdialog.h>
00039 #include <klocale.h>
00040
00041
00042
00043 #include "highlighter.h"
00044 #include "parser.h"
00045
00046
00047
00048 const int INVALID = -1;
00049
00050 namespace Digikam
00051 {
00052
00053 AdvancedRenameLineEditProxy::AdvancedRenameLineEditProxy(QWidget* parent)
00054 : ProxyLineEdit(parent)
00055 {
00056 setClearButtonShown(true);
00057 }
00058
00059 void AdvancedRenameLineEditProxy::setWidget(QWidget *widget)
00060 {
00061 if (m_widget)
00062 {
00063 delete m_widget;
00064 }
00065
00066 if (m_layout)
00067 {
00068 delete m_layout;
00069 }
00070
00071 m_widget = widget;
00072 m_widget->setParent(this);
00073
00074 QWidget* placeholder = new QWidget(this);
00075 placeholder->setFixedHeight(1);
00076 placeholder->setFixedWidth(clearButtonUsedSize().width());
00077
00078 QGridLayout* mainLayout = new QGridLayout(this);
00079 mainLayout->addWidget(m_widget, 0, 0, 1, 1);
00080 mainLayout->addWidget(placeholder, 0, 1, 1, 1);
00081 mainLayout->setSpacing(0);
00082 mainLayout->setMargin(0);
00083 setLayout(mainLayout);
00084 updateGeometry();
00085 }
00086
00087 void AdvancedRenameLineEditProxy::mousePressEvent(QMouseEvent* event)
00088 {
00089 KLineEdit::mousePressEvent(event);
00090 }
00091
00092 void AdvancedRenameLineEditProxy::mouseReleaseEvent(QMouseEvent* event)
00093 {
00094 KLineEdit::mouseReleaseEvent(event);
00095 }
00096
00097
00098
00099 class AdvancedRenameLineEditPriv
00100 {
00101 public:
00102
00103 AdvancedRenameLineEditPriv() :
00104 verticalSliderPosition(INVALID),
00105 parseTimer(0),
00106 parser(0)
00107 {}
00108
00109 int verticalSliderPosition;
00110 QTimer* parseTimer;
00111 Parser* parser;
00112 };
00113
00114 AdvancedRenameLineEdit::AdvancedRenameLineEdit(QWidget* parent)
00115 : KTextEdit(parent), d(new AdvancedRenameLineEditPriv)
00116 {
00117 setLineWrapMode(KTextEdit::NoWrap);
00118 setWordWrapMode(QTextOption::NoWrap);
00119 setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
00120 setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
00121 setFrameStyle(QFrame::NoFrame);
00122 setPalette(kapp->palette());
00123 setFocusPolicy(Qt::StrongFocus);
00124
00125 viewport()->setAutoFillBackground(false);
00126 setAutoFillBackground(false);
00127
00128 QFontMetrics fm = fontMetrics();
00129 setFixedHeight(fm.height());
00130
00131
00132
00133 d->parseTimer = new QTimer(this);
00134 d->parseTimer->setInterval(500);
00135 d->parseTimer->setSingleShot(true);
00136
00137
00138
00139
00140
00141 setPlainText("DUMMY TEXT");
00142 ensureCursorVisible();
00143 d->verticalSliderPosition = verticalScrollBar()->value();
00144 clear();
00145
00146
00147
00148 connect(d->parseTimer, SIGNAL(timeout()),
00149 this, SLOT(slotParseTimer()));
00150
00151 connect(this, SIGNAL(textChanged()),
00152 this, SLOT(slotTextChanged()));
00153
00154 connect(this, SIGNAL(cursorPositionChanged()),
00155 this, SLOT(slotCursorPositionChanged()));
00156 }
00157
00158 AdvancedRenameLineEdit::~AdvancedRenameLineEdit()
00159 {
00160 delete d;
00161 }
00162
00163 void AdvancedRenameLineEdit::setParser(Parser* parser)
00164 {
00165 if (parser)
00166 {
00167 d->parser = parser;
00168 }
00169 }
00170
00171 Parser* AdvancedRenameLineEdit::parser()
00172 {
00173 return d->parser;
00174 }
00175
00176 void AdvancedRenameLineEdit::keyPressEvent(QKeyEvent* e)
00177 {
00178 if (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return)
00179 {
00180 emit signalReturnPressed();
00181 }
00182 else
00183 {
00184 KTextEdit::keyPressEvent(e);
00185 }
00186 }
00187
00188 void AdvancedRenameLineEdit::wheelEvent(QWheelEvent* e)
00189 {
00190 e->setAccepted(false);
00191 }
00192
00193 void AdvancedRenameLineEdit::slotTextChanged()
00194 {
00195 d->parseTimer->start();
00196 }
00197
00198 void AdvancedRenameLineEdit::slotParseTimer()
00199 {
00200 emit signalTextChanged(toPlainText());
00201 }
00202
00203 void AdvancedRenameLineEdit::scrollContentsBy(int dx, int dy)
00204 {
00205 Q_UNUSED(dx)
00206 Q_UNUSED(dy)
00207
00208 if (d->verticalSliderPosition != INVALID)
00209 {
00210 verticalScrollBar()->setValue(d->verticalSliderPosition);
00211 }
00212 viewport()->update();
00213 }
00214
00215 void AdvancedRenameLineEdit::slotCursorPositionChanged()
00216 {
00217 bool found = false;
00218
00219 if (d->parser)
00220 {
00221 int start = INVALID;
00222 int length = INVALID;
00223 QString parseString = toPlainText();
00224 int pos = textCursor().position();
00225 found = d->parser->tokenAtPosition(Parser::Token,
00226 parseString, pos, start, length);
00227 found = found && ( (start + length) == pos );
00228
00229 if (!found)
00230 {
00231 found = d->parser->tokenAtPosition(Parser::TokenAndModifiers,
00232 parseString, pos, start, length);
00233 found = found && ( (start + length) == pos );
00234 }
00235 }
00236 emit signalTokenMarked(found);
00237 }
00238
00239 void AdvancedRenameLineEdit::slotSetHistoryItem(const QString& text)
00240 {
00241 clear();
00242 setPlainText(text);
00243 QTextCursor cursor = textCursor();
00244 cursor.movePosition(QTextCursor::EndOfLine);
00245 setTextCursor(cursor);
00246 setFocus();
00247 }
00248
00249
00250
00251 class AdvancedRenameInputPriv
00252 {
00253 public:
00254
00255 AdvancedRenameInputPriv() :
00256 configGroupName("AdvancedRename Input"),
00257 configPatternHistoryListEntry("Pattern History List"),
00258
00259 maxVisibleItems(10),
00260 maxHistoryItems(20),
00261 lineEdit(0),
00262 highlighter(0)
00263 {}
00264
00265 const QString configGroupName;
00266 const QString configPatternHistoryListEntry;
00267
00268 const int maxVisibleItems;
00269 const int maxHistoryItems;
00270
00271 QStringList patternHistory;
00272
00273 AdvancedRenameLineEdit* lineEdit;
00274 Highlighter* highlighter;
00275 };
00276
00277
00278
00279 AdvancedRenameInput::AdvancedRenameInput(QWidget* parent)
00280 : KComboBox(parent), d(new AdvancedRenameInputPriv)
00281 {
00282
00283
00284 setEditable(true);
00285 setMaxVisibleItems(d->maxVisibleItems);
00286 setMaxCount(d->maxHistoryItems);
00287 setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLength);
00288
00289 AdvancedRenameLineEditProxy* proxy = new AdvancedRenameLineEditProxy(this);
00290 d->lineEdit = new AdvancedRenameLineEdit(this);
00291 proxy->setWidget(d->lineEdit);
00292
00293 setLineEdit(proxy);
00294 proxy->setAutoFillBackground(false);
00295
00296
00297
00298 connect(proxy, SIGNAL(clearButtonClicked()),
00299 this, SLOT(clearText()));
00300
00301 connect(d->lineEdit, SIGNAL(signalTextChanged(const QString&)),
00302 proxy, SLOT(setText(const QString&)));
00303
00304 connect(d->lineEdit, SIGNAL(signalTextChanged(const QString&)),
00305 this, SIGNAL(signalTextChanged(const QString&)));
00306
00307 connect(d->lineEdit, SIGNAL(signalTokenMarked(bool)),
00308 this, SIGNAL(signalTokenMarked(bool)));
00309
00310 connect(d->lineEdit, SIGNAL(signalReturnPressed()),
00311 this, SIGNAL(signalReturnPressed()));
00312
00313 connect(this, SIGNAL(activated(const QString&)),
00314 d->lineEdit, SLOT(slotSetHistoryItem(const QString&)));
00315
00316
00317
00318 readSettings();
00319 }
00320
00321 AdvancedRenameInput::~AdvancedRenameInput()
00322 {
00323 writeSettings();
00324 delete d;
00325 }
00326
00327 void AdvancedRenameInput::setParser(Parser* parser)
00328 {
00329 d->lineEdit->setParser(parser);
00330
00331 delete d->highlighter;
00332 d->highlighter = new Highlighter(d->lineEdit, parser);
00333 }
00334
00335 void AdvancedRenameInput::setText(const QString& text)
00336 {
00337 d->lineEdit->setPlainText(text);
00338 }
00339
00340 void AdvancedRenameInput::clearText()
00341 {
00342 d->lineEdit->clear();
00343 }
00344
00345 void AdvancedRenameInput::clearTextAndHistory()
00346 {
00347 d->lineEdit->clear();
00348 clear();
00349 }
00350
00351 QString AdvancedRenameInput::text() const
00352 {
00353 return d->lineEdit->toPlainText();
00354 }
00355
00356 void AdvancedRenameInput::slotAddToken(const QString& token)
00357 {
00358 d->lineEdit->insertPlainText(token);
00359 d->lineEdit->setFocus();
00360 d->lineEdit->ensureCursorVisible();
00361 }
00362
00363 void AdvancedRenameInput::readSettings()
00364 {
00365 KSharedConfig::Ptr config = KGlobal::config();
00366 KConfigGroup group = config->group(d->configGroupName);
00367
00368 d->patternHistory = group.readEntry(d->configPatternHistoryListEntry, QStringList());
00369 d->patternHistory.removeAll(QString(""));
00370 addItems(d->patternHistory);
00371 d->lineEdit->clear();
00372 }
00373
00374 void AdvancedRenameInput::writeSettings()
00375 {
00376 KSharedConfig::Ptr config = KGlobal::config();
00377 KConfigGroup group = config->group(d->configGroupName);
00378
00379
00380 QString pattern = d->lineEdit->toPlainText();
00381 d->patternHistory.removeAll(pattern);
00382 d->patternHistory.removeAll(QString(""));
00383 d->patternHistory.prepend(pattern);
00384 group.writeEntry(d->configPatternHistoryListEntry, d->patternHistory);
00385 }
00386
00387 }