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.
tdeedu/kig/modes/construct_mode.h

155 lines
5.9 KiB

// Copyright (C) 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_MODES_CONSTRUCT_MODE_H
#define KIG_MODES_CONSTRUCT_MODE_H
#include "base_mode.h"
#include "../objects/object_calcer.h"
class ArgsParserObjectType;
class ObjectConstructor;
class ObjectCalcer;
class PointConstructMode
: public BaseMode
{
/**
* this is the point that we move around, for the user to add
* somewhere..
*/
ObjectTypeCalcer::shared_ptr mpt;
public:
PointConstructMode( KigPart& d );
~PointConstructMode();
protected:
void leftClickedObject( ObjectHolder* o, const TQPoint& p,
KigWidget& w, bool ctrlOrShiftDown );
void midClicked( const TQPoint& p, KigWidget& w );
void rightClicked( const std::vector<ObjectHolder*>& oco, const TQPoint& p, KigWidget& w );
void mouseMoved( const std::vector<ObjectHolder*>& os, const TQPoint& p, KigWidget& w, bool shiftpressed );
void enableActions();
void cancelConstruction();
void redrawScreen( KigWidget* );
};
class BaseConstructMode
: public BaseMode
{
/**
* this is the point that we move around, in case the user wants to
* add a point somewhere..
*/
ObjectTypeCalcer::shared_ptr mpt;
/**
* mp: this point always follows the cursor
*
* IMPORTANT: this Calcer must NEVER be added to the document, since
* its is used in constructors that need more input from the user
* to decide parameters of the constructed object that will be fixed
* afterwards (like the number of sides of a regular polygon)
*/
ObjectTypeCalcer* mcursor;
// we also allocate here the corresponding objectholder, since the
// only sensible place where to deallocate it is in the destructor
// of this class
// ObjectHolder* mcursorholder;
std::vector<ObjectHolder*> mparents;
void leftReleased( TQMouseEvent* e, KigWidget* v );
public:
void selectObject( ObjectHolder* o, KigWidget& w );
void selectObjects( const std::vector<ObjectHolder*>& os, KigWidget& w );
virtual ~BaseConstructMode();
protected:
BaseConstructMode( KigPart& d );
protected:
void leftClickedObject( ObjectHolder* o, const TQPoint& p,
KigWidget& w, bool ctrlOrShiftDown );
void midClicked( const TQPoint& p, KigWidget& w );
void rightClicked( const std::vector<ObjectHolder*>& oco, const TQPoint& p, KigWidget& w );
void mouseMoved( const std::vector<ObjectHolder*>& os, const TQPoint& p, KigWidget& w, bool shiftpressed );
void enableActions();
void cancelConstruction();
void finish();
protected:
virtual void handlePrelim( const std::vector<ObjectCalcer*>& os, const TQPoint& p, KigPainter&, KigWidget& w ) = 0;
virtual TQString selectStatement( const std::vector<ObjectCalcer*>& args, const KigWidget& w ) = 0;
virtual int isAlreadySelectedOK( const std::vector<ObjectCalcer*>&, const int& ) = 0;
virtual int wantArgs( const std::vector<ObjectCalcer*>&, KigDocument& d, KigWidget& w ) = 0;
virtual void handleArgs( const std::vector<ObjectCalcer*>& args, KigWidget& w ) = 0;
void redrawScreen( KigWidget* );
};
class ConstructMode
: public BaseConstructMode
{
const ObjectConstructor* mctor;
public:
ConstructMode( KigPart& d, const ObjectConstructor* ctor );
~ConstructMode();
void handlePrelim( const std::vector<ObjectCalcer*>& os, const TQPoint& p, KigPainter&, KigWidget& w );
TQString selectStatement( const std::vector<ObjectCalcer*>& args, const KigWidget& w );
int isAlreadySelectedOK( const std::vector<ObjectCalcer*>&, const int& );
int wantArgs( const std::vector<ObjectCalcer*>&, KigDocument& d, KigWidget& w );
void handleArgs( const std::vector<ObjectCalcer*>& args, KigWidget& w );
};
/**
* This class constructs a test object. It has special needs over
* ConstructMode because first the arguments need to be chosen, and
* then the location for the resulting TextImp needs to be chosen. It
* also needs special code for the drawPrelim and wantArgs code.
*
* Therefore, we inherit from BaseConstructMode, and override the
* event callbacks, so that this mode behaves like a
* BaseConstructMode, until handleArgs is called. After that, mresult
* is no longer 0, and then the mode behaves in its own way, allowing
* the user to choose a location for the new label object.
*/
class TestConstructMode
: public BaseConstructMode
{
const ArgsParserObjectType* mtype;
ObjectCalcer::shared_ptr mresult;
public:
TestConstructMode( KigPart& d, const ArgsParserObjectType* type );
~TestConstructMode();
void handlePrelim( const std::vector<ObjectCalcer*>& os, const TQPoint& p, KigPainter&, KigWidget& w );
TQString selectStatement( const std::vector<ObjectCalcer*>& args, const KigWidget& w );
int isAlreadySelectedOK( const std::vector<ObjectCalcer*>&, const int& );
int wantArgs( const std::vector<ObjectCalcer*>&, KigDocument& d, KigWidget& w );
void handleArgs( const std::vector<ObjectCalcer*>& args, KigWidget& w );
void leftClickedObject( ObjectHolder* o, const TQPoint& p,
KigWidget& w, bool ctrlOrShiftDown );
void midClicked( const TQPoint& p, KigWidget& w );
void rightClicked( const std::vector<ObjectHolder*>& oco, const TQPoint& p, KigWidget& w );
void mouseMoved( const std::vector<ObjectHolder*>& os, const TQPoint& p, KigWidget& w, bool shiftpressed );
};
#endif