--- /dev/null
+#ifndef TOOL_H_
+#define TOOL_H_
+
+#include <string>
+#include <sigc++/signal.h>
+#include <sigc++/trackable.h>
+#include <msp/input/mouse.h>
+#include "libr2c2/geometry.h"
+
+class Designer;
+class Selection;
+
+class Tool: public sigc::trackable
+{
+public:
+ sigc::signal<void> signal_done;
+ sigc::signal<void, const std::string &> signal_status;
+
+protected:
+ Designer &designer;
+ R2C2::Vector pointer;
+ R2C2::Vector ground_pointer;
+ std::string status;
+ bool done;
+
+ Tool(Designer &, Msp::Input::Mouse &);
+public:
+ virtual ~Tool() { }
+
+protected:
+ void set_status(const std::string &);
+ void set_done();
+public:
+ const std::string &get_status() const { return status; }
+ bool is_done() const { return done; }
+
+ virtual void button_press(unsigned) { }
+ virtual void axis_motion(unsigned, float, float);
+
+ virtual void update_selection(Selection &) const { }
+};
+
+#endif