You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdemultimedia/juk/searchwidget.cpp

293 lines
8.3 KiB

/***************************************************************************
begin : Sun Mar 6 2003
copyright : (C) 2003 by Richard L<>rk<72>ng
email : nouseforaname@home.se
copyright : (C) 2003 - 2004 by Scott Wheeler
email : wheeler@kde.org
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include <tdelocale.h>
#include <klineedit.h>
#include <kiconloader.h>
#include <kcombobox.h>
#include <kdebug.h>
#include <tdeaction.h>
#include <tqlayout.h>
#include <tqlabel.h>
#include <tqcheckbox.h>
#include <tqpushbutton.h>
#include <tqtoolbutton.h>
#include "searchwidget.h"
#include "collectionlist.h"
#include "actioncollection.h"
using namespace ActionCollection;
////////////////////////////////////////////////////////////////////////////////
// SearchLine public methods
////////////////////////////////////////////////////////////////////////////////
SearchLine::SearchLine(TQWidget *parent, bool simple, const char *name) :
TQHBox(parent, name),
m_simple(simple),
m_searchFieldsBox(0)
{
setSpacing(5);
if(!m_simple) {
m_searchFieldsBox = new KComboBox(this, "searchFields");
connect(m_searchFieldsBox, TQ_SIGNAL(activated(int)),
this, TQ_SIGNAL(signalQueryChanged()));
}
m_lineEdit = new KLineEdit(this, "searchLineEdit");
m_lineEdit->installEventFilter(this);
connect(m_lineEdit, TQ_SIGNAL(textChanged(const TQString &)),
this, TQ_SIGNAL(signalQueryChanged()));
connect(m_lineEdit, TQ_SIGNAL(returnPressed()),
this, TQ_SLOT(slotActivate()));
if(!m_simple) {
m_caseSensitive = new KComboBox(this);
m_caseSensitive->insertItem(i18n("Normal Matching"), 0);
m_caseSensitive->insertItem(i18n("Case Sensitive"), 1);
m_caseSensitive->insertItem(i18n("Pattern Matching"), 2);
connect(m_caseSensitive, TQ_SIGNAL(activated(int)),
this, TQ_SIGNAL(signalQueryChanged()));
}
else
m_caseSensitive = 0;
updateColumns();
}
PlaylistSearch::Component SearchLine::searchComponent() const
{
TQString query = m_lineEdit->text();
bool caseSensitive = m_caseSensitive && m_caseSensitive->currentItem() == CaseSensitive;
Playlist *playlist = CollectionList::instance();
TQValueList<int> searchedColumns;
if(!m_searchFieldsBox || m_searchFieldsBox->currentItem() == 0) {
TQValueListConstIterator<int> it = m_columnList.begin();
for(; it != m_columnList.end(); ++it) {
if(playlist->isColumnVisible(*it))
searchedColumns.append(*it);
}
}
else
searchedColumns.append(m_columnList[m_searchFieldsBox->currentItem() - 1]);
if(m_caseSensitive && m_caseSensitive->currentItem() == Pattern)
return PlaylistSearch::Component(TQRegExp(query), searchedColumns);
else
return PlaylistSearch::Component(query, caseSensitive, searchedColumns);
}
void SearchLine::setSearchComponent(const PlaylistSearch::Component &component)
{
if(component == searchComponent())
return;
if(m_simple || !component.isPatternSearch()) {
m_lineEdit->setText(component.query());
if(m_caseSensitive)
m_caseSensitive->setCurrentItem(component.isCaseSensitive() ? CaseSensitive : Default);
}
else {
m_lineEdit->setText(component.pattern().pattern());
if(m_caseSensitive)
m_caseSensitive->setCurrentItem(Pattern);
}
if(!m_simple) {
if(component.columns().isEmpty() || component.columns().size() > 1)
m_searchFieldsBox->setCurrentItem(0);
else
m_searchFieldsBox->setCurrentItem(component.columns().front() + 1);
}
}
void SearchLine::clear()
{
// We don't want to emit the signal if it's already empty.
if(!m_lineEdit->text().isEmpty())
m_lineEdit->clear();
}
void SearchLine::setFocus()
{
m_lineEdit->setFocus();
}
bool SearchLine::eventFilter(TQObject *watched, TQEvent *e)
{
if(watched != m_lineEdit || e->type() != TQEvent::KeyPress)
return TQHBox::eventFilter(watched, e);
TQKeyEvent *key = static_cast<TQKeyEvent*>(e);
if(key->key() == TQt::Key_Down)
emit signalDownPressed();
return TQHBox::eventFilter(watched, e);
}
void SearchLine::slotActivate()
{
action("stop")->activate();
action("playFirst")->activate();
}
void SearchLine::updateColumns()
{
TQString currentText;
if(m_searchFieldsBox) {
currentText = m_searchFieldsBox->currentText();
m_searchFieldsBox->clear();
}
TQStringList columnHeaders;
columnHeaders.append(TQString("<%1>").arg(i18n("All Visible")));
Playlist *playlist = CollectionList::instance();
int selection = -1;
m_columnList.clear();
for(int i = 0; i < playlist->columns(); i++) {
m_columnList.append(i);
TQString text = playlist->columnText(i);
columnHeaders.append(text);
if(currentText == text)
selection = m_columnList.size() - 1;
}
if(m_searchFieldsBox) {
m_searchFieldsBox->insertStringList(columnHeaders);
m_searchFieldsBox->setCurrentItem(selection + 1);
}
}
////////////////////////////////////////////////////////////////////////////////
// SearchWidget public methods
////////////////////////////////////////////////////////////////////////////////
SearchWidget::SearchWidget(TQWidget *parent, const char *name) : TDEToolBar(parent, name)
{
setupLayout();
updateColumns();
}
SearchWidget::~SearchWidget()
{
}
void SearchWidget::setSearch(const PlaylistSearch &search)
{
PlaylistSearch::ComponentList components = search.components();
if(components.isEmpty()) {
clear();
return;
}
m_searchLine->setSearchComponent(*components.begin());
}
TQString SearchWidget::searchText() const
{
return m_searchLine->searchComponent().query();
}
void SearchWidget::setSearchText(const TQString &text)
{
m_searchLine->setSearchComponent(PlaylistSearch::Component(text));
}
PlaylistSearch SearchWidget::search(const PlaylistList &playlists) const
{
PlaylistSearch::ComponentList components;
components.append(m_searchLine->searchComponent());
return PlaylistSearch(playlists, components);
}
////////////////////////////////////////////////////////////////////////////////
// SearchWidget public slots
////////////////////////////////////////////////////////////////////////////////
void SearchWidget::clear()
{
m_searchLine->clear();
}
void SearchWidget::setEnabled(bool enable)
{
emit signalShown(enable);
setShown(enable);
}
void SearchWidget::setFocus()
{
m_searchLine->setFocus();
}
////////////////////////////////////////////////////////////////////////////////
// SearchWidget private methods
////////////////////////////////////////////////////////////////////////////////
void SearchWidget::updateColumns()
{
m_searchLine->updateColumns();
}
void SearchWidget::setupLayout()
{
boxLayout()->setSpacing(5);
TQToolButton *clearSearchButton = new TQToolButton(this);
clearSearchButton->setTextLabel(i18n("Clear Search"), true);
clearSearchButton->setIconSet(SmallIconSet("locationbar_erase"));
TQLabel *label = new TQLabel(i18n("Search:"), this, "tde toolbar widget");
m_searchLine = new SearchLine(this, true, "tde toolbar widget");
label->setBuddy(m_searchLine);
connect(m_searchLine, TQ_SIGNAL(signalQueryChanged()), this, TQ_SIGNAL(signalQueryChanged()));
connect(m_searchLine, TQ_SIGNAL(signalDownPressed()), this, TQ_SIGNAL(signalDownPressed()));
connect(clearSearchButton, TQ_SIGNAL(pressed()), m_searchLine, TQ_SLOT(clear()));
setStretchableWidget(m_searchLine);
// I've decided that I think this is ugly, for now.
/*
TQToolButton *b = new TQToolButton(this);
b->setTextLabel(i18n("Advanced Search"), true);
b->setIconSet(SmallIconSet("wizard"));
connect(b, TQ_SIGNAL(clicked()), this, TQ_SIGNAL(signalAdvancedSearchClicked()));
*/
}
#include "searchwidget.moc"