/*
    This file is part of libkcal.

    Copyright (c) 2001,2003,2004 Cornelius Schumacher <schumacher@kde.org>
    Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Library General Public License for more details.

    You should have received a copy of the GNU Library General Public License
    along with this library; see the file COPYING.LIB.  If not, write to
    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
    Boston, MA 02110-1301, USA.
*/
#ifndef KCAL_CALFILTER_H
#define KCAL_CALFILTER_H

#include <tqstring.h>
#include <tqptrlist.h>

#include "event.h"
#include "todo.h"
#include "journal.h"
#include "libkcal_export.h"

namespace KCal {

/**
  Filter for calendar objects.
*/
class LIBKCAL_EXPORT CalFilter
{
  public:
    /** Construct filter. */
    CalFilter();
    /** Construct filter with name */
    CalFilter( const TQString &name );
    /** Destruct filter. */
    ~CalFilter();

    /**
      Set name of filter.
    */
    void setName( const TQString &name ) { mName = name; }
    /**
      Return name of filter.
    */
    TQString name() const { return mName; }

    /**
      Apply filter to eventlist, all events not matching filter criterias are
      removed from the list.
    */
    void apply( Event::List *eventlist ) const;

    /**
      Apply filter to todolist, all todos not matching filter criterias are
      removed from the list.
    */
    void apply( Todo::List *todolist ) const;

    /**
      Apply filter to todolist, all todos not matching filter criterias are
      removed from the list.
    */
    void apply( Journal::List *journallist) const;

    /**
      Apply filter criteria on the specified incidence. Return true, if event passes
      criteria, otherwise return false.
    */
    bool filterIncidence( Incidence * ) const;

    /**
      Enable or disable filter.
    */
    void setEnabled( bool );
    /**
      Return wheter the filter is enabled or not.
    */
    bool isEnabled() const;


    /**
      Set list of categories, which is used for showing/hiding categories of
      events.
      See related functions.
    */
    void setCategoryList( const TQStringList & );
    /**
      Return category list, used for showing/hiding categories of events.
      See related functions.
    */
    TQStringList categoryList() const;

    /**
      Set list of email addresses which are to be considered when finding 
      incidences which the current user is not a participant of. This is
      normally the list used by KOPrefs::thatIsMe() as well.
    */
    void setEmailList( const TQStringList & );
    /**
      Return list of email addresses which are to be considered when finding 
      incidences which the current user is not a participant of. This is
      normally the list used by KOPrefs::thatIsMe() as well.
      See related functions.
    */
    TQStringList emailList() const;

    enum { HideRecurring = 1, HideCompleted = 2, ShowCategories = 4,
           HideInactiveTodos = 8, HideTodosWithoutAttendeeInEmailList = 16 };

    /**
      Set criteria, which have to be fulfilled by events passing the filter.
    */
    void setCriteria( int );
    /**
      Get inclusive filter criteria.
    */
    int criteria() const;

    /**
      Set the number of days for "Hide completed todos", after which todos are
      not shown any more. If nothing is set explicitly, all finished todos will
      be hidden if the "hide completed todos" option is selected.
     */
    void setCompletedTimeSpan( int timespan );
    /**
      Return the number of days for "Hide completed todos", after which todos are
      not shown any more.
     */
    int completedTimeSpan() const;

  private:
    TQString mName;

    int mCriteria;

    bool mEnabled;

    TQStringList mCategoryList;
    TQStringList mEmailList;
    int mCompletedTimeSpan;

    class Private;
    Private *d;
};

}

#endif
