You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
397 lines
13 KiB
397 lines
13 KiB
// 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 TQString;
|
|
class TQCString;
|
|
|
|
/**
|
|
* 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 TQString descriptiveName() const = 0;
|
|
virtual const TQString description() const = 0;
|
|
virtual const TQCString 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 TQString 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 TQString 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 TQString descriptiveName() const;
|
|
const TQString description() const;
|
|
const TQCString 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*>& tqparents,
|
|
const KigDocument& ) const = 0;
|
|
|
|
TQString useText( const ObjectCalcer& o, const std::vector<ObjectCalcer*>& sel,
|
|
const KigDocument& d, const KigWidget& v ) const;
|
|
|
|
TQString 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*>& tqparents,
|
|
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*>& tqparents,
|
|
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*>& tqparents,
|
|
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 TQString descriptiveName() const;
|
|
const TQString description() const;
|
|
const TQCString 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;
|
|
|
|
TQString useText( const ObjectCalcer& o, const std::vector<ObjectCalcer*>& sel,
|
|
const KigDocument& d, const KigWidget& v ) const;
|
|
|
|
TQString 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;
|
|
TQString mname;
|
|
TQString mdesc;
|
|
bool mbuiltin;
|
|
TQCString miconfile;
|
|
ArgsParser mparser;
|
|
public:
|
|
MacroConstructor( const std::vector<ObjectCalcer*>& input, const std::vector<ObjectCalcer*>& output,
|
|
const TQString& name, const TQString& description,
|
|
const TQCString& iconfile = 0 );
|
|
MacroConstructor( const ObjectHierarchy& hier, const TQString& name,
|
|
const TQString& desc,
|
|
const TQCString& iconfile = 0 );
|
|
~MacroConstructor();
|
|
|
|
const ObjectHierarchy& hierarchy() const;
|
|
|
|
const TQString descriptiveName() const;
|
|
const TQString description() const;
|
|
const TQCString 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;
|
|
|
|
TQString useText( const ObjectCalcer& o, const std::vector<ObjectCalcer*>& sel,
|
|
const KigDocument& d, const KigWidget& v
|
|
) const;
|
|
|
|
TQString 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 TQString& name );
|
|
void setDescription( const TQString& desc );
|
|
void setIcon( TQCString& icon );
|
|
};
|
|
|
|
#endif
|