MessageListWidget::MessageListWidget(QWidget *parent) : QWidget(parent), m_supportsFuzzySearch(false) { tree = new MsgListView(this); m_quickSearchText = new LineEdit(this); #if QT_VERSION >= 0x040700 m_quickSearchText->setPlaceholderText(tr("Quick Search / Leading \":=\" for direct IMAP search")); #endif m_queryPlaceholder = tr("<query>"); connect(m_quickSearchText, SIGNAL(returnPressed()), this, SLOT(slotApplySearch())); connect(m_quickSearchText, SIGNAL(textChanged(QString)), this, SLOT(slotConditionalSearchReset())); connect(m_quickSearchText, SIGNAL(cursorPositionChanged(int, int)), this, SLOT(slotUpdateSearchCursor())); m_searchOptions = new QToolButton(this); m_searchOptions->setAutoRaise(true); m_searchOptions->setPopupMode(QToolButton::InstantPopup); m_searchOptions->setText("*"); m_searchOptions->setIcon(loadIcon(QLatin1String("imap-search-details"))); QMenu *optionsMenu = new QMenu(m_searchOptions); m_searchFuzzy = optionsMenu->addAction(tr("Fuzzy Search")); m_searchFuzzy->setCheckable(true); optionsMenu->addSeparator(); m_searchInSubject = optionsMenu->addAction(tr("Subject")); m_searchInSubject->setCheckable(true); m_searchInSubject->setChecked(true); m_searchInBody = optionsMenu->addAction(tr("Body")); m_searchInBody->setCheckable(true); m_searchInSenders = optionsMenu->addAction(tr("Senders")); m_searchInSenders->setCheckable(true); m_searchInSenders->setChecked(true); m_searchInRecipients = optionsMenu->addAction(tr("Recipients")); m_searchInRecipients->setCheckable(true); optionsMenu->addSeparator(); QMenu *complexMenu = new QMenu(tr("Complex IMAP query"), optionsMenu); connect(complexMenu, SIGNAL(triggered(QAction*)), this, SLOT(slotComplexSearchInput(QAction*))); complexMenu->addAction(tr("Not ..."))->setData("NOT " + m_queryPlaceholder); complexMenu->addAction(tr("Either... or..."))->setData("OR " + m_queryPlaceholder + " " + m_queryPlaceholder); complexMenu->addSeparator(); complexMenu->addAction(tr("From sender"))->setData("FROM " + m_queryPlaceholder); complexMenu->addAction(tr("To receiver"))->setData("TO " + m_queryPlaceholder); complexMenu->addSeparator(); complexMenu->addAction(tr("About subject"))->setData("SUBJECT " + m_queryPlaceholder); complexMenu->addAction(tr("Message contains ..."))->setData("BODY " + m_queryPlaceholder); complexMenu->addSeparator(); complexMenu->addAction(tr("Before date"))->setData("BEFORE <d-mmm-yyyy>"); complexMenu->addAction(tr("Since date"))->setData("SINCE <d-mmm-yyyy>"); complexMenu->addSeparator(); complexMenu->addAction(tr("Has been seen"))->setData("SEEN"); optionsMenu->addMenu(complexMenu); m_searchOptions->setMenu(optionsMenu); connect (optionsMenu, SIGNAL(aboutToShow()), SLOT(slotDeActivateSimpleSearch())); delete m_quickSearchText->layout(); QHBoxLayout *hlayout = new QHBoxLayout(m_quickSearchText); hlayout->setContentsMargins(0, 0, 0, 0); hlayout->addWidget(m_searchOptions); hlayout->addStretch(); hlayout->addWidget(m_quickSearchText->clearButton()); hlayout->activate(); // this processes the layout and ensures the toolbutton has it's final dimensions #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) if (QGuiApplication::isLeftToRight()) #else if (qApp->keyboardInputDirection() == Qt::LeftToRight) #endif m_quickSearchText->setTextMargins(m_searchOptions->width(), 0, 0, 0); else // ppl. in N Africa and the middle east write the wrong direction... m_quickSearchText->setTextMargins(0, 0, m_searchOptions->width(), 0); m_searchOptions->setCursor(Qt::ArrowCursor); // inherits I-Beam from lineedit otherwise QVBoxLayout *layout = new QVBoxLayout(this); layout->setSpacing(0); layout->addWidget(m_quickSearchText); layout->addWidget(tree); m_searchResetTimer = new QTimer(this); m_searchResetTimer->setSingleShot(true); connect(m_searchResetTimer, SIGNAL(timeout()), SLOT(slotApplySearch())); slotAutoEnableDisableSearch(); }
MessageListWidget::MessageListWidget(QWidget *parent) : QWidget(parent), m_supportsFuzzySearch(false) { tree = new MsgListView(this); m_quickSearchText = new LineEdit(this); m_quickSearchText->setHistoryEnabled(true); // Filter out newline. It will wreak havoc into the direct IMAP passthrough and could lead to data loss. QValidator *validator = new ReplaceCharValidator(QLatin1Char('\n'), QLatin1Char(' '), m_quickSearchText); m_quickSearchText->setValidator(validator); #if QT_VERSION >= 0x040700 m_quickSearchText->setPlaceholderText(tr("Quick Search")); #endif m_quickSearchText->setToolTip(tr("Type in a text to search for within this mailbox. " "The icon on the left can be used to limit the search options " "(like whether to include addresses or message bodies, etc)." "<br/><hr/>" "Experts who have read RFC3501 can use the <code>:=</code> prefix and switch to a raw IMAP mode.")); m_queryPlaceholder = tr("<query>"); connect(m_quickSearchText, SIGNAL(returnPressed()), this, SLOT(slotApplySearch())); connect(m_quickSearchText, SIGNAL(textChanged(QString)), this, SLOT(slotConditionalSearchReset())); connect(m_quickSearchText, SIGNAL(cursorPositionChanged(int, int)), this, SLOT(slotUpdateSearchCursor())); m_searchOptions = new QToolButton(this); m_searchOptions->setAutoRaise(true); m_searchOptions->setPopupMode(QToolButton::InstantPopup); m_searchOptions->setText(QLatin1String("*")); m_searchOptions->setIcon(UiUtils::loadIcon(QLatin1String("imap-search-details"))); QMenu *optionsMenu = new QMenu(m_searchOptions); m_searchFuzzy = optionsMenu->addAction(tr("Fuzzy Search")); m_searchFuzzy->setCheckable(true); optionsMenu->addSeparator(); m_searchInSubject = optionsMenu->addAction(tr("Subject")); m_searchInSubject->setCheckable(true); m_searchInSubject->setChecked(true); m_searchInBody = optionsMenu->addAction(tr("Body")); m_searchInBody->setCheckable(true); m_searchInSenders = optionsMenu->addAction(tr("Senders")); m_searchInSenders->setCheckable(true); m_searchInSenders->setChecked(true); m_searchInRecipients = optionsMenu->addAction(tr("Recipients")); m_searchInRecipients->setCheckable(true); optionsMenu->addSeparator(); QMenu *complexMenu = new QMenu(tr("Complex IMAP query"), optionsMenu); connect(complexMenu, SIGNAL(triggered(QAction*)), this, SLOT(slotComplexSearchInput(QAction*))); complexMenu->addAction(tr("Not ..."))->setData(QLatin1String("NOT ") + m_queryPlaceholder); complexMenu->addAction(tr("Either... or..."))->setData(QLatin1String("OR ") + m_queryPlaceholder + QLatin1Char(' ') + m_queryPlaceholder); complexMenu->addSeparator(); complexMenu->addAction(tr("From sender"))->setData(QLatin1String("FROM ") + m_queryPlaceholder); complexMenu->addAction(tr("To receiver"))->setData(QLatin1String("TO ") + m_queryPlaceholder); complexMenu->addSeparator(); complexMenu->addAction(tr("About subject"))->setData(QLatin1String("SUBJECT " )+ m_queryPlaceholder); complexMenu->addAction(tr("Message contains ..."))->setData(QLatin1String("BODY ") + m_queryPlaceholder); complexMenu->addSeparator(); complexMenu->addAction(tr("Before date"))->setData(QLatin1String("BEFORE <d-mmm-yyyy>")); complexMenu->addAction(tr("Since date"))->setData(QLatin1String("SINCE <d-mmm-yyyy>")); complexMenu->addSeparator(); complexMenu->addAction(tr("Has been seen"))->setData(QLatin1String("SEEN")); m_rawSearch = optionsMenu->addAction(tr("Allow raw IMAP search")); m_rawSearch->setCheckable(true); QAction *rawSearchMenu = optionsMenu->addMenu(complexMenu); rawSearchMenu->setVisible(false); connect (m_rawSearch, SIGNAL(toggled(bool)), rawSearchMenu, SLOT(setVisible(bool))); connect (m_rawSearch, SIGNAL(toggled(bool)), SIGNAL(rawSearchSettingChanged(bool))); m_searchOptions->setMenu(optionsMenu); connect (optionsMenu, SIGNAL(aboutToShow()), SLOT(slotDeActivateSimpleSearch())); delete m_quickSearchText->layout(); QHBoxLayout *hlayout = new QHBoxLayout(m_quickSearchText); hlayout->setContentsMargins(0, 0, 0, 0); hlayout->addWidget(m_searchOptions); hlayout->addStretch(); hlayout->addWidget(m_quickSearchText->clearButton()); hlayout->activate(); // this processes the layout and ensures the toolbutton has it's final dimensions #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) if (QGuiApplication::isLeftToRight()) #else if (qApp->keyboardInputDirection() == Qt::LeftToRight) #endif m_quickSearchText->setTextMargins(m_searchOptions->width(), 0, 0, 0); else // ppl. in N Africa and the middle east write the wrong direction... m_quickSearchText->setTextMargins(0, 0, m_searchOptions->width(), 0); m_searchOptions->setCursor(Qt::ArrowCursor); // inherits I-Beam from lineedit otherwise QVBoxLayout *layout = new QVBoxLayout(this); layout->setSpacing(0); layout->setContentsMargins(0, 0, 0, 0); layout->addWidget(m_quickSearchText); layout->addWidget(tree); m_searchResetTimer = new QTimer(this); m_searchResetTimer->setSingleShot(true); connect(m_searchResetTimer, SIGNAL(timeout()), SLOT(slotApplySearch())); slotAutoEnableDisableSearch(); }