diff options
Diffstat (limited to 'kig/misc/object_constructor.h')
-rw-r--r-- | kig/misc/object_constructor.h | 396 |
1 files changed, 396 insertions, 0 deletions
diff --git a/kig/misc/object_constructor.h b/kig/misc/object_constructor.h new file mode 100644 index 00000000..57261c69 --- /dev/null +++ b/kig/misc/object_constructor.h @@ -0,0 +1,396 @@ +// Copyright (C) 2002-2003 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_MISC_OBJECT_CONSTRUCTOR_H +#define KIG_MISC_OBJECT_CONSTRUCTOR_H + +#include "argsparser.h" +#include "object_hierarchy.h" + +class KigPainter; +class KigDocument; +class KigGUIAction; +class KigWidget; +class ArgsParserObjectType; +class ObjectType; +class BaseConstructMode; + +class QString; +class QCString; + +/** + * This class represents a way to construct a set of objects from a + * set of other objects. There are some important child classes, like + * MacroConstructor, StandardObjectConstructor etc. ( see below ) + * Actually, it is more generic than that, it provides a way to do + * _something_ with a set of objects, but for now, i only use it to + * construct objects. Maybe some day, i'll find something more + * interesting to do with it, who knows... ;) + */ +class ObjectConstructor +{ +public: + virtual ~ObjectConstructor(); + + virtual const QString descriptiveName() const = 0; + virtual const QString description() const = 0; + virtual const QCString iconFileName( const bool canBeNull = false ) const = 0; + + /** + * the following function is called in case of duplication of arguments + * and returns true if this is acceptable; this will return false for + * typical objects + */ + virtual const bool isAlreadySelectedOK( const std::vector<ObjectCalcer*>& os, + const int& ) const = 0; + /** + * can this constructor do something useful with \p os ? return + * ArgsParser::Complete, Valid or NotGood + */ + virtual const int wantArgs( const std::vector<ObjectCalcer*>& os, + const KigDocument& d, + const KigWidget& v + ) const = 0; + + /** + * do something fun with \p os .. This func is only called if wantArgs + * returned Complete.. handleArgs should <i>not</i> do any + * drawing.. after somebody calls this function, he should + * redrawScreen() himself.. + */ + virtual void handleArgs( const std::vector<ObjectCalcer*>& os, + KigPart& d, + KigWidget& v + ) const = 0; + + /** + * return a string describing what you would use \p o for if it were + * selected... \p o should be part of \p sel . + */ + virtual QString useText( const ObjectCalcer& o, const std::vector<ObjectCalcer*>& sel, + const KigDocument& d, const KigWidget& v + ) const = 0; + + /** + * return a string describing what argument you want next, if the + * given selection of objects were selected. + */ + virtual QString selectStatement( + const std::vector<ObjectCalcer*>& sel, const KigDocument& d, + const KigWidget& w ) const = 0; + + /** + * show a preliminary version of what you would do when \ref handleArgs + * would be called.. E.g. if this constructor normally constructs a + * locus through some 5 points, then it will try to draw a locus + * through whatever number of points it gets.. + */ + virtual void handlePrelim( KigPainter& p, + const std::vector<ObjectCalcer*>& sel, + const KigDocument& d, + const KigWidget& v + ) const = 0; + + virtual void plug( KigPart* doc, KigGUIAction* kact ) = 0; + + virtual bool isTransform() const = 0; + virtual bool isTest() const; + virtual bool isIntersection() const; + + /** + * Which construct mode should be used for this ObjectConstructor. + * In fact, this is not a pretty design. The Kig + * GUIAction-ObjectConstructor stuff should be reworked into a + * general GUIAction, which just models something which can be + * executed given a certain number of arguments. The code for + * drawPrelim and such should all be in the ConstructMode, and the + * new GUIAction should just start the correct KigMode with the + * correct arguments. + * + * This function is only overridden in TestConstructor. + */ + virtual BaseConstructMode* constructMode( KigPart& doc ); +}; + +/** + * This class provides wraps ObjectConstructor in a more simple + * interface for the most common object types.. + */ +class StandardConstructorBase + : public ObjectConstructor +{ + const char* mdescname; + const char* mdesc; + const char* miconfile; + const ArgsParser& margsparser; +public: + StandardConstructorBase( const char* descname, + const char* desc, + const char* iconfile, + const ArgsParser& parser ); + + virtual ~StandardConstructorBase(); + + const QString descriptiveName() const; + const QString description() const; + const QCString iconFileName( const bool canBeNull = false ) const; + + const bool isAlreadySelectedOK( const std::vector<ObjectCalcer*>& os, + const int& ) const; + virtual const int wantArgs( + const std::vector<ObjectCalcer*>& os, const KigDocument& d, + const KigWidget& v + ) const; + + void handleArgs( const std::vector<ObjectCalcer*>& os, + KigPart& d, + KigWidget& v + ) const; + + void handlePrelim( KigPainter& p, const std::vector<ObjectCalcer*>& sel, + const KigDocument& d, const KigWidget& v + ) const; + + virtual void drawprelim( const ObjectDrawer& drawer, KigPainter& p, const std::vector<ObjectCalcer*>& parents, + const KigDocument& ) const = 0; + + QString useText( const ObjectCalcer& o, const std::vector<ObjectCalcer*>& sel, + const KigDocument& d, const KigWidget& v ) const; + + QString selectStatement( + const std::vector<ObjectCalcer*>& sel, const KigDocument& d, + const KigWidget& w ) const; + + virtual std::vector<ObjectHolder*> build( + const std::vector<ObjectCalcer*>& os, + KigDocument& d, KigWidget& w + ) const = 0; +}; + +/** + * A standard implementation of StandardConstructorBase for simple + * types.. + */ +class SimpleObjectTypeConstructor + : public StandardConstructorBase +{ + const ArgsParserObjectType* mtype; +public: + SimpleObjectTypeConstructor( + const ArgsParserObjectType* t, const char* descname, + const char* desc, const char* iconfile ); + + ~SimpleObjectTypeConstructor(); + + void drawprelim( const ObjectDrawer& drawer, KigPainter& p, const std::vector<ObjectCalcer*>& parents, + const KigDocument& ) const; + + std::vector<ObjectHolder*> build( const std::vector<ObjectCalcer*>& os, + KigDocument& d, + KigWidget& w ) const; + + void plug( KigPart* doc, KigGUIAction* kact ); + + bool isTransform() const; +}; + +/** + * A standard implementation of StandardConstructorBase for property + * objects... + */ +class PropertyObjectConstructor + : public StandardConstructorBase +{ + ArgsParser mparser; + const char* mpropinternalname; +public: + PropertyObjectConstructor( + const ObjectImpType* imprequirement, const char* usetext, + const char* selectstat, const char* descname, const char* desc, + const char* iconfile, const char* propertyinternalname ); + + ~PropertyObjectConstructor(); + + void drawprelim( const ObjectDrawer& drawer, KigPainter& p, const std::vector<ObjectCalcer*>& parents, + const KigDocument& ) const; + + std::vector<ObjectHolder*> build( const std::vector<ObjectCalcer*>& os, + KigDocument& d, KigWidget& w ) const; + + void plug( KigPart* doc, KigGUIAction* kact ); + + bool isTransform() const; +}; + +/** + * This class is the equivalent of \ref SimpleObjectTypeConstructor + * for object types that are constructed in groups of more than one. + * For example, the intersection of a circle and line in general + * produces two points, in general. Internally, we differentiate + * betweem them by passing them a parameter of ( in this case ) 1 or + * -1. There are still other object types that work the same, and + * they all require this sort of parameter. + * E.g. CubicLineIntersectionType takes a parameter between 1 and 3. + * This class knows about that, and constructs the objects along this + * scheme.. + */ +class MultiObjectTypeConstructor + : public StandardConstructorBase +{ + const ArgsParserObjectType* mtype; + std::vector<int> mparams; + ArgsParser mparser; +public: + MultiObjectTypeConstructor( + const ArgsParserObjectType* t, const char* descname, + const char* desc, const char* iconfile, + const std::vector<int>& params ); + MultiObjectTypeConstructor( + const ArgsParserObjectType* t, const char* descname, + const char* desc, const char* iconfile, + int a, int b, int c = -999, int d = -999 ); + ~MultiObjectTypeConstructor(); + + void drawprelim( const ObjectDrawer& drawer, KigPainter& p, const std::vector<ObjectCalcer*>& parents, + const KigDocument& ) const; + + std::vector<ObjectHolder*> build( + const std::vector<ObjectCalcer*>& os, + KigDocument& d, KigWidget& w ) const; + + void plug( KigPart* doc, KigGUIAction* kact ); + + bool isTransform() const; +}; + +/** + * This class is a collection of some other ObjectConstructors, that + * makes them appear to the user as a single ObjectConstructor. It is + * e.g. used for the "intersection" constructor. + */ +class MergeObjectConstructor + : public ObjectConstructor +{ + const char* mdescname; + const char* mdesc; + const char* miconfilename; + typedef std::vector<ObjectConstructor*> vectype; + vectype mctors; +public: + MergeObjectConstructor( const char* descname, const char* desc, + const char* iconfilename ); + ~MergeObjectConstructor(); + + void merge( ObjectConstructor* e ); + + const QString descriptiveName() const; + const QString description() const; + const QCString iconFileName( const bool canBeNull = false ) const; + + const bool isAlreadySelectedOK( const std::vector<ObjectCalcer*>& os, + const int& ) const; + const int wantArgs( const std::vector<ObjectCalcer*>& os, + const KigDocument& d, + const KigWidget& v + ) const; + + QString useText( const ObjectCalcer& o, const std::vector<ObjectCalcer*>& sel, + const KigDocument& d, const KigWidget& v ) const; + + QString selectStatement( + const std::vector<ObjectCalcer*>& sel, const KigDocument& d, + const KigWidget& w ) const; + + void handleArgs( const std::vector<ObjectCalcer*>& os, KigPart& d, KigWidget& v ) const; + + void handlePrelim( KigPainter& p, const std::vector<ObjectCalcer*>& sel, + const KigDocument& d, const KigWidget& v ) const; + + void plug( KigPart* doc, KigGUIAction* kact ); + + bool isTransform() const; +}; + +/** + * MacroConstructor is a class that represents Kig macro's: these are + * constructed by the user, and defined by a set of input and a set of + * output objects. The macro-constructor saves the way in which the + * output objects have been built from the input objects, and when + * given similar input objects, it will produce objects in the given + * way. The data is saved in a \ref ObjectHierarchy. + */ +class MacroConstructor + : public ObjectConstructor +{ + ObjectHierarchy mhier; + QString mname; + QString mdesc; + bool mbuiltin; + QCString miconfile; + ArgsParser mparser; +public: + MacroConstructor( const std::vector<ObjectCalcer*>& input, const std::vector<ObjectCalcer*>& output, + const QString& name, const QString& description, + const QCString& iconfile = 0 ); + MacroConstructor( const ObjectHierarchy& hier, const QString& name, + const QString& desc, + const QCString& iconfile = 0 ); + ~MacroConstructor(); + + const ObjectHierarchy& hierarchy() const; + + const QString descriptiveName() const; + const QString description() const; + const QCString iconFileName( const bool canBeNull = false ) const; + + const bool isAlreadySelectedOK( const std::vector<ObjectCalcer*>& os, + const int& ) const; + const int wantArgs( const std::vector<ObjectCalcer*>& os, const KigDocument& d, + const KigWidget& v ) const; + + void handleArgs( const std::vector<ObjectCalcer*>& os, KigPart& d, + KigWidget& v ) const; + + QString useText( const ObjectCalcer& o, const std::vector<ObjectCalcer*>& sel, + const KigDocument& d, const KigWidget& v + ) const; + + QString selectStatement( + const std::vector<ObjectCalcer*>& sel, const KigDocument& d, + const KigWidget& w ) const; + + void handlePrelim( KigPainter& p, const std::vector<ObjectCalcer*>& sel, + const KigDocument& d, const KigWidget& v + ) const; + + void plug( KigPart* doc, KigGUIAction* kact ); + + void setBuiltin( bool builtin ); + + /** + * is this the ctor for a transformation type. We want to know this + * cause transform types are shown separately in an object's RMB + * menu.. + */ + bool isTransform() const; + + void setName( const QString& name ); + void setDescription( const QString& desc ); + void setIcon( QCString& icon ); +}; + +#endif |