summaryrefslogtreecommitdiffstats
path: root/kig/modes/construct_mode.h
diff options
context:
space:
mode:
Diffstat (limited to 'kig/modes/construct_mode.h')
-rw-r--r--kig/modes/construct_mode.h154
1 files changed, 154 insertions, 0 deletions
diff --git a/kig/modes/construct_mode.h b/kig/modes/construct_mode.h
new file mode 100644
index 00000000..fa1be86e
--- /dev/null
+++ b/kig/modes/construct_mode.h
@@ -0,0 +1,154 @@
+// 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 QPoint& p,
+ KigWidget& w, bool ctrlOrShiftDown );
+ void midClicked( const QPoint& p, KigWidget& w );
+ void rightClicked( const std::vector<ObjectHolder*>& oco, const QPoint& p, KigWidget& w );
+ void mouseMoved( const std::vector<ObjectHolder*>& os, const QPoint& 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( QMouseEvent* 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 QPoint& p,
+ KigWidget& w, bool ctrlOrShiftDown );
+ void midClicked( const QPoint& p, KigWidget& w );
+ void rightClicked( const std::vector<ObjectHolder*>& oco, const QPoint& p, KigWidget& w );
+ void mouseMoved( const std::vector<ObjectHolder*>& os, const QPoint& p, KigWidget& w, bool shiftpressed );
+
+ void enableActions();
+ void cancelConstruction();
+ void finish();
+
+protected:
+ virtual void handlePrelim( const std::vector<ObjectCalcer*>& os, const QPoint& p, KigPainter&, KigWidget& w ) = 0;
+ virtual QString 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 QPoint& p, KigPainter&, KigWidget& w );
+ QString 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 QPoint& p, KigPainter&, KigWidget& w );
+ QString 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 QPoint& p,
+ KigWidget& w, bool ctrlOrShiftDown );
+ void midClicked( const QPoint& p, KigWidget& w );
+ void rightClicked( const std::vector<ObjectHolder*>& oco, const QPoint& p, KigWidget& w );
+ void mouseMoved( const std::vector<ObjectHolder*>& os, const QPoint& p, KigWidget& w, bool shiftpressed );
+};
+
+#endif