summaryrefslogtreecommitdiffstats
path: root/kig/objects/object_factory.h
blob: 0ce6ce6228a66a6d80bec44d76ac94d06cf13818 (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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
// 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 KIG_OBJECTS_OBJECT_FACTORY_H
#define KIG_OBJECTS_OBJECT_FACTORY_H

#include "common.h"

class ObjectFactory
{
public:

  static const ObjectFactory* instance();

  /**
   * this returns a fixed point.  Note that the returned object is
   * not added to the document..
   */
  ObjectHolder* fixedPoint( const Coordinate& c ) const;
  ObjectTypeCalcer* fixedPointCalcer( const Coordinate& c ) const;

  /**
   * this returns a CursorPointType; this is used during special
   * constructions (e.g. regular polygons) where the constructor
   * wants to use the cursor position without actually generating
   * an object depending on a new point there.
   */
  ObjectTypeCalcer* cursorPointCalcer( const Coordinate& c ) const;

  /**
   * this returns a relative point (to an object). Note that the returned object
   * is not added to the document..
   */
  ObjectTypeCalcer* relativePointCalcer( ObjectCalcer* o, const Coordinate& loc ) const;

  /**
   * this returns a constrained point. Note that the returned object
   * is not added to the document..
   */
  ObjectHolder* constrainedPoint( ObjectCalcer* curve, double param ) const;
  ObjectTypeCalcer* constrainedPointCalcer( ObjectCalcer* curve, double param ) const;
  /**
   * \overload, changes nothing to the semantics, only calcs the param
   * value for you..
   */
  ObjectTypeCalcer* constrainedPointCalcer(
    ObjectCalcer* curve, const Coordinate& c, const KigDocument& ) const;
  ObjectHolder* constrainedPoint(
    ObjectCalcer* curve, const Coordinate& c, const KigDocument& ) const;

  /**
   * this returns a "sensible point".
   * By a "sensible point", I mean a point that would be about what
   * the user expects when he asks for a point at point \p c . This is a
   * constrained point if \p c is on a curve, and otherwise a fixed
   * point.  I might add the possibility for an intersection point
   * sometime.. Note that the returned object is not added to
   * the document..
   */
  ObjectTypeCalcer* sensiblePointCalcer(
    const Coordinate& c, const KigDocument& d, const KigWidget& w ) const;
  ObjectHolder* sensiblePoint(
    const Coordinate& c, const KigDocument& d, const KigWidget& w ) const;

  /**
   * set point to what sensiblePoint would have returned..
   */
  void redefinePoint( ObjectTypeCalcer* point, const Coordinate& c,
                      KigDocument& d, const KigWidget& w ) const;

  /**
   * return a locus, defined by the two points ( one constrained, and
   * one following ) \p a and \p b . \p a should be the constrained point,
   * and thus, it has to be of type ObjectTypeCalcer where a->type() is of
   * type ConstrainedPointType.  The semantics of LocusType are a bit
   * weird ( but I believe correct :) ), so this function takes care
   * of the complication there..
   */
  ObjectTypeCalcer* locusCalcer( ObjectCalcer* a, ObjectCalcer* b ) const;
  ObjectHolder* locus( ObjectCalcer* a, ObjectCalcer* b ) const;

  /**
   * returns a label with text \p s at point \p c .. It ( and its parents )
   * is calced already...
   */
  ObjectHolder* label(
    const QString& s, const Coordinate& loc,
    bool needframe, const std::vector<ObjectCalcer*>& parents,
    const KigDocument& doc ) const;
  ObjectTypeCalcer* labelCalcer(
    const QString& s, const Coordinate& loc,
    bool needframe, const std::vector<ObjectCalcer*>& parents,
    const KigDocument& doc ) const;

  /**
   * this one does the same as the above, only that the new label is
   * attached to locationparent if it is non-null..
   */
  ObjectTypeCalcer* attachedLabelCalcer(
    const QString& s, ObjectCalcer* locationparent,
    const Coordinate& loc, bool needframe,
    const std::vector<ObjectCalcer*>& parents,
    const KigDocument& doc ) const;
  /**
   * this has been added because it comes handy when redefining
   * a text label, we move here all the code for getting an
   * attach point from the method above
   */
  ObjectCalcer* getAttachPoint(
    ObjectCalcer* locationparent,
    const Coordinate& loc,
    const KigDocument& doc ) const;
  ObjectHolder* attachedLabel(
    const QString& s, ObjectCalcer* locationparent,
    const Coordinate& loc, bool needframe,
    const std::vector<ObjectCalcer*>& parents,
    const KigDocument& doc ) const;

  /**
   * returns a property object for the property \p p of object \p o .
   *
   * \note
   * \p o should have already been calc'd, or this will fail and
   * return 0..  The returned object also needs to be calced after
   * this..
   */
  ObjectPropertyCalcer* propertyObjectCalcer( ObjectCalcer* o, const char* p ) const;
  ObjectHolder* propertyObject( ObjectCalcer* o, const char* p ) const;
};

#endif