summaryrefslogtreecommitdiffstats
path: root/kig/filters/filter.h
blob: f5d8b0f9dddea95512724816ab00a901e982ee7d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
// This file is part of Kig, a KDE program for Interactive Geometry...
// Copyright (C)  2002  Dominique Devriese <devriese@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.

// This program 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 General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
// 02110-1301, USA.

#ifndef FILTER_H
#define FILTER_H

#include <qstring.h>

#include <vector>

class KigFilter;
class ScreenInfo;
class KigDocument;

/**
 * This singleton class handles all the input filters.
 */
class KigFilters
{
public:
  static KigFilters* instance();
  KigFilter* find (const QString& mime);

//  bool save ( const KigDocument& data, QTextStream& stream );
  /**
   * saving is always done with the native filter.  We don't support
   * output filters..
   */
  bool save ( const KigDocument& data, const QString& outfile );
protected:
  KigFilters();
  static KigFilters* sThis;
  typedef std::vector<KigFilter*> vect;
  vect mFilters;
};

// KigFilter::load functions should use this macro to conveniently
// return a very useful parse error in a filter's load function..
#define KIG_FILTER_PARSE_ERROR \
  { \
    QString locs = i18n( "An error was encountered at " \
                         "line %1 in file %2." ) \
      .arg( __LINE__ ).arg( __FILE__ ); \
    parseError( file, locs ); \
    return 0; \
  }

/**
 * This is the base class for an input filter.
 *
 * All the needed work to add a new input filter to Kig is
 * subclassing this class and implement supportMime() and load().
 */
class KigFilter
{
protected:
  // shows errors to the user..
  void fileNotFound( const QString& file ) const;
  void parseError( const QString& file, const QString& explanation = QString::null ) const;
  void notSupported( const QString& file, const QString& explanation ) const;
  void warning( const QString& explanation ) const;
public:
  KigFilter();
  virtual ~KigFilter();

  /**
   * can the filter handle the mimetype \p mime ?
   */
  virtual bool supportMime ( const QString& mime );

  /**
   * load file \p fromfile and build a KigDocument from it..  If this
   * function returns 0, that means that an error occurred while
   * loading ( implementations of this function are responsible for
   * showing an error message themselves, using the above error
   * functions ). If this functions returns non-0, the caller owns
   * the returned KigDocument ( that was allocated with "new" ).
   */
  virtual KigDocument* load ( const QString& fromfile ) = 0;
};
#endif