1 #ifndef INKSCAPE_UI_VIEW_VIEW_H
2 #define INKSCAPE_UI_VIEW_VIEW_H
4 /** \file
5 * Abstract base class for all SVG document views
6 *
7 * Authors:
8 * Lauris Kaplinski <lauris@kaplinski.com>
9 * Ralf Stephan <ralf@ark.in-berlin.de>
10 *
11 * Copyright (C) 2001-2002 Lauris Kaplinski
12 * Copyright (C) 2001 Ximian, Inc.
13 *
14 * Released under GNU GPL, read the file 'COPYING' for more information
15 */
17 #include <gdk/gdktypes.h>
18 #include <sigc++/connection.h>
19 #include "message.h"
20 #include "gc-managed.h"
21 #include "gc-finalized.h"
22 #include "gc-anchored.h"
23 #include <libnr/nr-forward.h>
25 /**
26 * Iterates until true or returns false.
27 * When used as signal accumulator, stops emission if one slot returns true.
28 */
29 struct StopOnTrue {
30 typedef bool result_type;
32 template<typename T_iterator>
33 result_type operator()(T_iterator first, T_iterator last) const{
34 for (; first != last; ++first)
35 if (*first) return true;
36 return false;
37 }
38 };
40 /**
41 * Iterates until nonzero or returns 0.
42 * When used as signal accumulator, stops emission if one slot returns nonzero.
43 */
44 struct StopOnNonZero {
45 typedef int result_type;
47 template<typename T_iterator>
48 result_type operator()(T_iterator first, T_iterator last) const{
49 for (; first != last; ++first)
50 if (*first) return *first;
51 return 0;
52 }
53 };
55 class SPDocument;
57 namespace Inkscape {
58 class MessageContext;
59 class MessageStack;
60 namespace UI {
61 namespace View {
63 /**
64 * View is an abstract base class of all UI document views. This
65 * includes both the editing window and the SVG preview, but does not
66 * include the non-UI RGBA buffer-based NRArena nor the XML editor or
67 * similar views. The View base class has very little functionality of
68 * its own.
69 */
70 class View : public GC::Managed<>,
71 public GC::Finalized,
72 public GC::Anchored
73 {
74 public:
76 View();
77 virtual ~View();
79 void close() { _close(); }
81 /// Returns a pointer to the view's document.
82 SPDocument *doc() const
83 { return _doc; }
84 /// Returns a pointer to the view's message stack.
85 Inkscape::MessageStack *messageStack() const
86 { return _message_stack; }
87 /// Returns a pointer to the view's tipsMessageContext.
88 Inkscape::MessageContext *tipsMessageContext() const
89 { return _tips_message_context; }
91 void setPosition(gdouble x, gdouble y);
92 void setPosition(NR::Point const &p);
93 void emitResized(gdouble width, gdouble height);
94 void requestRedraw();
96 // view subclasses must give implementations of these methods
98 virtual bool shutdown() = 0;
99 virtual void mouseover() = 0;
100 virtual void mouseout() = 0;
102 virtual void onPositionSet (double, double) = 0;
103 virtual void onResized (double, double) = 0;
104 virtual void onRedrawRequested() = 0;
105 virtual void onStatusMessage (Inkscape::MessageType type, gchar const *message) = 0;
106 virtual void onDocumentURISet (gchar const* uri) = 0;
107 virtual void onDocumentResized (double, double) = 0;
109 protected:
110 SPDocument *_doc;
111 Inkscape::MessageStack *_message_stack;
112 Inkscape::MessageContext *_tips_message_context;
114 virtual void _close();
115 virtual void setDocument(SPDocument *doc);
117 sigc::signal<void,double,double> _position_set_signal;
118 sigc::signal<void,double,double> _resized_signal;
119 sigc::signal<void,gchar const*> _document_uri_set_signal;
120 sigc::signal<void> _redraw_requested_signal;
122 private:
123 sigc::connection _position_set_connection;
124 sigc::connection _resized_connection;
125 sigc::connection _redraw_requested_connection;
126 sigc::connection _message_changed_connection; // foreign
127 sigc::connection _document_uri_set_connection; // foreign
128 sigc::connection _document_resized_connection; // foreign
129 };
131 }}}
133 #endif // INKSCAPE_UI_VIEW_VIEW_H
135 /*
136 Local Variables:
137 mode:c++
138 c-file-style:"stroustrup"
139 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
140 indent-tabs-mode:nil
141 fill-column:99
142 End:
143 */
144 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :