/*************************************************************************** begin : Sun Mar 6 2003 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. * * * ***************************************************************************/ #ifndef PLAYLISTSEARCH_H #define PLAYLISTSEARCH_H #include #include class Playlist; typedef TQValueList PlaylistList; class PlaylistItem; typedef TQValueList PlaylistItemList; typedef TQValueList ColumnList; class PlaylistSearch { public: class Component; typedef TQValueList ComponentList; enum SearchMode { MatchAny = 0, MatchAll = 1 }; PlaylistSearch(); PlaylistSearch(const PlaylistList &playlists, const ComponentList &components, SearchMode mode = MatchAny, bool searchNow = true); void search(); bool checkItem(PlaylistItem *item); PlaylistItemList searchedItems() const { return m_items; } PlaylistItemList matchedItems() const { return m_matchedItems; } PlaylistItemList unmatchedItems() const { return m_unmatchedItems; } void addPlaylist(Playlist *p) { m_playlists.append(p); } void clearPlaylists() { m_playlists.clear(); } PlaylistList playlists() const { return m_playlists; } void addComponent(const Component &c); void clearComponents(); ComponentList components() const; void setSearchMode(SearchMode m) { m_mode = m; } SearchMode searchMode() const { return m_mode; } bool isNull() const; bool isEmpty() const; /** * This is used to clear an item from the matched and unmatched lists. This * is useful because it can prevent keeping a dangling pointer around without * requiring invalidating the search. */ void clearItem(PlaylistItem *item); private: PlaylistList m_playlists; ComponentList m_components; SearchMode m_mode; PlaylistItemList m_items; PlaylistItemList m_matchedItems; PlaylistItemList m_unmatchedItems; }; /** * A search is built from several search components. These corespond to to lines * in the search bar. */ class PlaylistSearch::Component { public: enum MatchMode { Contains = 0, Exact = 1, ContainsWord = 2 }; /** * Create an empty search component. This is only provided for use by * TQValueList and should not be used in any other context. */ Component(); /** * Create a query component. This defaults to searching all visible coulumns. */ Component(const TQString &query, bool caseSensitive = false, const ColumnList &columns = ColumnList(), MatchMode mode = Contains); /** * Create a query component. This defaults to searching all visible coulumns. */ Component(const TQRegExp &query, const ColumnList &columns = ColumnList()); TQString query() const { return m_query; } TQRegExp pattern() const { return m_queryRe; } ColumnList columns() const { return m_columns; } bool matches(PlaylistItem *item) const; bool isPatternSearch() const { return m_re; } bool isCaseSensitive() const { return m_caseSensitive; } MatchMode matchMode() const { return m_mode; } bool operator==(const Component &v) const; private: TQString m_query; TQRegExp m_queryRe; mutable ColumnList m_columns; MatchMode m_mode; bool m_searchAllVisible; bool m_caseSensitive; bool m_re; }; /** * Streams \a search to the stream \a s. * \note This does not save the playlist list, but instead will assume that the * search is just relevant to the collection list. This is all that is presently * needed by JuK. */ TQDataStream &operator<<(TQDataStream &s, const PlaylistSearch &search); /** * Streams \a search from the stream \a s. * \note This does not save the playlist list, but instead will assume that the * search is just relevant to the collection list. This is all that is presently * needed by JuK. */ TQDataStream &operator>>(TQDataStream &s, PlaylistSearch &search); TQDataStream &operator<<(TQDataStream &s, const PlaylistSearch::Component &c); TQDataStream &operator>>(TQDataStream &s, PlaylistSearch::Component &c); #endif