bpp-phyl3 3.0.0
AbstractTreeDrawing.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: The Bio++ Development Group
2//
3// SPDX-License-Identifier: CECILL-2.1
4
5#ifndef BPP_PHYL_GRAPHICS_ABSTRACTTREEDRAWING_H
6#define BPP_PHYL_GRAPHICS_ABSTRACTTREEDRAWING_H
7
8
9#include "../Tree/NodeTemplate.h"
10#include "../Tree/TreeTemplate.h"
11#include "TreeDrawing.h"
12#include "TreeDrawingListener.h"
13
14// From the STL:
15#include <vector>
16#include <string>
17#include <memory>
18
19namespace bpp
20{
22{
23private:
26
27public:
30
31public:
32 const Point2D<double>& getPosition() const { return pos_; }
34 void setPosition(const Point2D<double>& position) { pos_ = position; }
35 double getX() const { return pos_.getX(); }
36 double getY() const { return pos_.getY(); }
37 void setX(double x) { pos_.setX(x); }
38 void setY(double y) { pos_.setY(y); }
39 void collapse(bool yn) { collapsed_ = yn; }
40 bool isCollapsed() const { return collapsed_; }
41};
42
44
45
50 public DrawNodeEvent
51{
52private:
53 const INode* node_;
54
55public:
56 DrawINodeEvent(const TreeDrawing* source, GraphicDevice* gd, const INode* node, const Cursor& cursor) :
57 DrawNodeEvent(source, gd, node->getId(), cursor),
58 node_(node)
59 {}
60
62 DrawNodeEvent(dne), node_(dne.node_)
63 {}
64
66 {
68 node_ = dne.node_;
69 return *this;
70 }
71
72public:
73 const INode* getINode() const { return node_; }
74};
75
76
81 public DrawBranchEvent
82{
83private:
84 const INode* node_;
85
86public:
87 DrawIBranchEvent(const TreeDrawing* source, GraphicDevice* gd, const INode* node, const Cursor& cursor) :
88 DrawBranchEvent(source, gd, node->getId(), cursor),
89 node_(node)
90 {}
91
93 DrawBranchEvent(dne), node_(dne.node_)
94 {}
95
97 {
99 node_ = dne.node_;
100 return *this;
101 }
102
103public:
104 const INode* getINode() const { return node_; }
105};
106
107
115 public virtual TreeDrawing
116{
117protected:
118 std::unique_ptr<TreeTemplate<INode>> tree_;
119 double xUnit_;
120 double yUnit_;
121 std::shared_ptr<const TreeDrawingSettings> settings_;
122 std::vector<TreeDrawingListener*> listeners_;
123
124public:
126
128 tree_(atd.tree_.get() ? dynamic_cast<TreeTemplate<INode>*>(atd.tree_->clone()) : 0),
129 xUnit_(atd.xUnit_),
130 yUnit_(atd.yUnit_),
131 settings_(atd.settings_),
132 listeners_(atd.listeners_.size())
133 {
134 for (unsigned int i = 0; i < listeners_.size(); ++i)
135 {
136 if (atd.listeners_[i]->isAutonomous())
137 listeners_[i] = atd.listeners_[i];
138 else
139 listeners_[i] = dynamic_cast<TreeDrawingListener*>(atd.listeners_[i]->clone());
140 }
141 }
142
144 {
145 if (atd.tree_.get())
146 tree_.reset(dynamic_cast<TreeTemplate<INode>*>(atd.tree_->clone()));
147 else tree_.reset();
148 xUnit_ = atd.xUnit_;
149 yUnit_ = atd.yUnit_;
150 settings_ = atd.settings_;
151 listeners_.resize(atd.listeners_.size());
152 for (unsigned int i = 0; i < listeners_.size(); ++i)
153 {
154 if (atd.listeners_[i]->isAutonomous())
155 listeners_[i] = atd.listeners_[i];
156 else
157 listeners_[i] = dynamic_cast<TreeDrawingListener*>(atd.listeners_[i]->clone());
158 }
159 return *this;
160 }
161
163 {
164 for (unsigned int i = 0; i < listeners_.size(); i++)
165 {
166 if (!listeners_[i]->isAutonomous())
167 delete listeners_[i];
168 }
169 }
170
171public:
172 bool hasTree() const override
173 {
174 if (tree_) return true;
175 else return false;
176 }
177
178 const Tree& tree() const override
179 {
180 if (hasTree())
181 {
182 return *tree_;
183 }
184 else
185 {
186 throw Exception("AbstractTreeDrawing::tree(). No tree is associated.");
187 }
188 }
189
191 {
192 if (hasTree())
193 {
194 return *tree_;
195 }
196 else
197 {
198 throw Exception("AbstractTreeDrawing::treeTemplate(). No tree is associated.");
199 }
200 }
201
202 void setTree(const Tree& tree) override
203 {
204 tree_.reset(new TreeTemplate<INode>(tree)); // We copy the tree
206 }
207
208 Point2D<double> getNodePosition(int nodeId) const override;
209
210 int getNodeAt(const Point2D<double>& position) const override;
211
221 bool belongsTo(const Point2D<double>& p1, const Point2D<double>& p2) const;
222
235 virtual void drawAtNode(GraphicDevice& gDevice, const INode& node, const std::string& text,
236 double xOffset = 0, double yOffset = 0,
237 short hpos = GraphicDevice::TEXT_HORIZONTAL_LEFT, short vpos = GraphicDevice::TEXT_VERTICAL_CENTER, double angle = 0) const;
238
251 virtual void drawAtBranch(GraphicDevice& gDevice, const INode& node, const std::string& text, double xOffset = 0, double yOffset = 0, short hpos = GraphicDevice::TEXT_HORIZONTAL_LEFT, short vpos = GraphicDevice::TEXT_VERTICAL_CENTER, double angle = 0) const;
252
253 void setDisplaySettings(std::shared_ptr<const TreeDrawingSettings> tds) override
254 {
255 if (!tds)
256 throw NullPointerException("AbstractTreeDrawing::setDisplaySettings. Null pointer provided.");
257 settings_ = tds;
258 }
259 const TreeDrawingSettings& displaySettings() const override { return *settings_; }
260
261 double getXUnit() const override { return xUnit_; }
262
263 double getYUnit() const override { return yUnit_; }
264
265 void setXUnit(double xu) override { xUnit_ = xu; }
266
267 void setYUnit(double yu) override { yUnit_ = yu; }
268
269 void collapseNode(int nodeId, bool yn) override
270 {
271 if (!tree_.get()) throw Exception("AbstractTreeDrawing::collapseNode. No tree is associated to the drawing.");
272 tree_->getNode(nodeId)->getInfos().collapse(yn);
273 }
274
275 bool isNodeCollapsed(int nodeId) const override
276 {
277 if (!tree_.get()) throw Exception("AbstractTreeDrawing::isNodeCollapsed. No tree is associated to the drawing.");
278 return tree_->getNode(nodeId)->getInfos().isCollapsed();
279 }
280
282 {
283 if (find(listeners_.begin(), listeners_.end(), listener) != listeners_.end())
284 throw Exception("AbstractTreeDrawing::addTreeDrawingListener. Listener is already associated to this drawing.");
285 listeners_.push_back(listener);
286 }
287
289 {
290 std::vector<TreeDrawingListener*>::iterator it = std::find(listeners_.begin(), listeners_.end(), listener);
291 if (it == listeners_.end())
292 throw Exception("AbstractTreeDrawing::addTreeDrawingListener. Listener is not associated to this drawing, and therefore can't be removed.");
293 listeners_.erase(it);
294 if (!listener->isAutonomous())
295 delete listener;
296 }
297
301 virtual void treeHasChanged() = 0;
302
303protected:
304 void fireBeforeTreeEvent_(const DrawTreeEvent& event) const
305 {
306 for (unsigned int i = 0; i < listeners_.size(); i++)
307 {
308 if (listeners_[i]->isEnabled())
309 listeners_[i]->beforeDrawTree(event);
310 }
311 }
312
313 void fireAfterTreeEvent_(const DrawTreeEvent& event) const
314 {
315 for (unsigned int i = 0; i < listeners_.size(); i++)
316 {
317 if (listeners_[i]->isEnabled())
318 listeners_[i]->afterDrawTree(event);
319 }
320 }
321
322 void fireBeforeNodeEvent_(const DrawINodeEvent& event) const
323 {
324 for (unsigned int i = 0; i < listeners_.size(); i++)
325 {
326 if (listeners_[i]->isEnabled())
327 listeners_[i]->beforeDrawNode(event);
328 }
329 }
330
331 void fireAfterNodeEvent_(const DrawINodeEvent& event) const
332 {
333 for (unsigned int i = 0; i < listeners_.size(); i++)
334 {
335 if (listeners_[i]->isEnabled())
336 listeners_[i]->afterDrawNode(event);
337 }
338 }
339
341 {
342 for (unsigned int i = 0; i < listeners_.size(); i++)
343 {
344 if (listeners_[i]->isEnabled())
345 listeners_[i]->beforeDrawBranch(event);
346 }
347 }
348
350 {
351 for (unsigned int i = 0; i < listeners_.size(); i++)
352 {
353 if (listeners_[i]->isEnabled())
354 listeners_[i]->afterDrawBranch(event);
355 }
356 }
357
358public:
359 static std::shared_ptr<const TreeDrawingSettings> DEFAULT_SETTINGS;
360};
361} // end of namespace bpp.
362#endif // BPP_PHYL_GRAPHICS_ABSTRACTTREEDRAWING_H
Partial implementation of the TreeDrawing interface.
void setDisplaySettings(std::shared_ptr< const TreeDrawingSettings > tds) override
Global drawing settings.
const TreeTemplate< INode > & treeTemplate() const
void fireBeforeBranchEvent_(const DrawIBranchEvent &event) const
int getNodeAt(const Point2D< double > &position) const override
Get the node corresponding to a position on the device.
void addTreeDrawingListener(TreeDrawingListener *listener) override
Add a drawing listener to this instance.
bool isNodeCollapsed(int nodeId) const override
std::vector< TreeDrawingListener * > listeners_
Point2D< double > getNodePosition(int nodeId) const override
Get the position of a node.
AbstractTreeDrawing(const AbstractTreeDrawing &atd)
void removeTreeDrawingListener(TreeDrawingListener *listener) override
Remove a drawing listener from this instance.
static std::shared_ptr< const TreeDrawingSettings > DEFAULT_SETTINGS
const Tree & tree() const override
double getXUnit() const override
void collapseNode(int nodeId, bool yn) override
Properties to draw.
double getYUnit() const override
void setTree(const Tree &tree) override
bool belongsTo(const Point2D< double > &p1, const Point2D< double > &p2) const
Utilitary function, telling if a point belongs to a specified area.
std::unique_ptr< TreeTemplate< INode > > tree_
virtual void drawAtBranch(GraphicDevice &gDevice, const INode &node, const std::string &text, double xOffset=0, double yOffset=0, short hpos=GraphicDevice::TEXT_HORIZONTAL_LEFT, short vpos=GraphicDevice::TEXT_VERTICAL_CENTER, double angle=0) const
Draw some text at a particular branch position.
void fireAfterTreeEvent_(const DrawTreeEvent &event) const
void fireBeforeNodeEvent_(const DrawINodeEvent &event) const
void setXUnit(double xu) override
Set the 'horizontal' expansion unit.
virtual void drawAtNode(GraphicDevice &gDevice, const INode &node, const std::string &text, double xOffset=0, double yOffset=0, short hpos=GraphicDevice::TEXT_HORIZONTAL_LEFT, short vpos=GraphicDevice::TEXT_VERTICAL_CENTER, double angle=0) const
Draw some text at a particular node position.
AbstractTreeDrawing & operator=(const AbstractTreeDrawing &atd)
const TreeDrawingSettings & displaySettings() const override
virtual void treeHasChanged()=0
Method to implement to deal with redrawing when the underlying tree has been modified.
void fireAfterNodeEvent_(const DrawINodeEvent &event) const
bool hasTree() const override
std::shared_ptr< const TreeDrawingSettings > settings_
void fireBeforeTreeEvent_(const DrawTreeEvent &event) const
void fireAfterBranchEvent_(const DrawIBranchEvent &event) const
void setYUnit(double yu) override
Set the 'vertical' expansion unit.
Data structure describing a plotting direction.
Definition: TreeDrawing.h:54
Event class used by TreeDrawing classes.
Definition: TreeDrawing.h:128
DrawBranchEvent & operator=(const DrawBranchEvent &dne)
Definition: TreeDrawing.h:144
Event class that uses INode object (more efficient than relying on nodes id, but less generic).
const INode * getINode() const
DrawIBranchEvent(const TreeDrawing *source, GraphicDevice *gd, const INode *node, const Cursor &cursor)
DrawIBranchEvent & operator=(const DrawIBranchEvent &dne)
DrawIBranchEvent(const DrawIBranchEvent &dne)
Event class that uses INode object (more efficient than relying on nodes id, but less generic).
const INode * getINode() const
DrawINodeEvent(const TreeDrawing *source, GraphicDevice *gd, const INode *node, const Cursor &cursor)
DrawINodeEvent(const DrawINodeEvent &dne)
DrawINodeEvent & operator=(const DrawINodeEvent &dne)
Event class used by TreeDrawing classes.
Definition: TreeDrawing.h:89
DrawNodeEvent & operator=(const DrawNodeEvent &dne)
Definition: TreeDrawing.h:105
Event class used by TreeDrawing classes.
Definition: TreeDrawing.h:172
static short TEXT_HORIZONTAL_LEFT
static short TEXT_VERTICAL_CENTER
The NodeTemplate class.
Definition: NodeTemplate.h:39
void setY(const T y)
const T & getY() const
void setX(const T x)
const T & getX() const
Interface allowing to capture drawing events.
virtual bool isAutonomous() const =0
Tells if the listener is autonomous. If so, it will never be hard-copied or deleted.
Point2D< double > & getPosition()
const Point2D< double > & getPosition() const
void setPosition(const Point2D< double > &position)
A set of options to tune the display of a TreeDrawing object.
Definition: TreeDrawing.h:28
Basal interface for tree drawing classes.
Definition: TreeDrawing.h:223
TreeDrawing * clone() const =0
The phylogenetic tree class.
Definition: TreeTemplate.h:59
Interface for phylogenetic tree objects.
Definition: Tree.h:115
Defines the basic types of data flow nodes.
NodeTemplate< TreeDrawingNodeInfo > INode