11 #ifndef TREEDISPLAY_HXX
12 #define TREEDISPLAY_HXX
20 #ifndef AWT_CANVAS_HXX
23 #ifndef _GLIBCXX_VECTOR
32 #define TREEDISP_STACKSIZE (1024L*1024L*20) // stacksize required for tree-display
35 #define MAX_TREEDISP_RECURSION_DEPTH 20000
36 #define TREEDISP_TRUNCATION_MESSAGE "Warning: depth limit reached => subtree not shown (use logical zoom to workaround)"
39 #define td_assert(cond) arb_assert(cond)
41 #define AWAR_DTREE_BASELINEWIDTH "awt/dtree/baselinewidth"
42 #define AWAR_DTREE_VERICAL_DIST "awt/dtree/verticaldist"
43 #define AWAR_DTREE_BRANCH_STYLE "awt/dtree/branch_style"
44 #define AWAR_DTREE_ATTACH_SIZE "awt/dtree/attach_size"
45 #define AWAR_DTREE_ATTACH_LEN "awt/dtree/attach_len"
46 #define AWAR_DTREE_ATTACH_GROUP "awt/dtree/attach_group"
47 #define AWAR_DTREE_GROUP_DOWNSCALE "awt/dtree/downscaling"
48 #define AWAR_DTREE_GROUP_SCALE "awt/dtree/groupscaling"
49 #define AWAR_DTREE_AUTO_JUMP "awt/dtree/autojump"
50 #define AWAR_DTREE_AUTO_JUMP_TREE "awt/dtree/autojump_tree"
51 #define AWAR_DTREE_AUTO_UNFOLD "awt/dtree/auto_unfold"
52 #define AWAR_DTREE_SHOW_BRACKETS "awt/dtree/show_brackets"
53 #define AWAR_DTREE_GROUP_STYLE "awt/dtree/groupstyle"
54 #define AWAR_DTREE_GROUP_ORIENT "awt/dtree/grouporient"
55 #define AWAR_DTREE_GREY_LEVEL "awt/dtree/greylevel"
56 #define AWAR_DTREE_GROUPCOUNTMODE "awt/dtree/groupcountmode"
57 #define AWAR_DTREE_GROUPINFOPOS "awt/dtree/groupinfopos"
59 #define AWAR_DTREE_BOOTSTRAP_MIN "awt/dtree/bootstrap/min"
60 #define AWAR_DTREE_BOOTSTRAP_MAX "awt/dtree/bootstrap/max"
61 #define AWAR_DTREE_BOOTSTRAP_SHOW "awt/dtree/bootstrap/show"
62 #define AWAR_DTREE_BOOTSTRAP_STYLE "awt/dtree/bootstrap/style"
63 #define AWAR_DTREE_CIRCLE_SHOW "awt/dtree/bootstrap/circle/show"
64 #define AWAR_DTREE_CIRCLE_FILL "awt/dtree/bootstrap/circle/fill"
65 #define AWAR_DTREE_CIRCLE_ELLIPSE "awt/dtree/bootstrap/circle/ellipse"
66 #define AWAR_DTREE_CIRCLE_ZOOM "awt/dtree/bootstrap/circle/zoom"
67 #define AWAR_DTREE_CIRCLE_LIMIT "awt/dtree/bootstrap/circle/limit"
69 #define AWAR_DTREE_RADIAL_ZOOM_TEXT "awt/dtree/radial/zoomtext"
70 #define AWAR_DTREE_RADIAL_XPAD "awt/dtree/radial/xpadding"
72 #define AWAR_DTREE_DENDRO_ZOOM_TEXT "awt/dtree/dendro/zoomtext"
73 #define AWAR_DTREE_DENDRO_XPAD "awt/dtree/dendro/xpadding"
75 #define AWAR_DTREE_GROUP_MARKED_THRESHOLD "awt/dtree/markers/group_marked_threshold"
76 #define AWAR_DTREE_GROUP_PARTIALLY_MARKED_THRESHOLD "awt/dtree/markers/group_partially_marked_threshold"
77 #define AWAR_DTREE_MARKER_WIDTH "awt/dtree/markers/marker_width"
78 #define AWAR_DTREE_PARTIAL_GREYLEVEL "awt/dtree/markers/partial_greylevel"
80 #define NT_BOX_WIDTH 7 // pixel
81 #define NT_DIAMOND_RADIUS 5
82 #define NT_ROOT_WIDTH 9
83 #define NT_SELECTED_WIDTH 11
85 #define AWT_TREE(ntw) (ntw)->get_graphic_tree()
141 ascent = font_limits.
ascent*factor;
142 descent = font_limits.
descent*factor;
144 width = font_limits.
width*factor;
191 std::vector<int> mark;
205 return mark[markerIdx];
214 size_t size = mark.size();
216 for (
size_t i = 0; i<size; ++i) {
217 mark[i] += other.mark[i];
219 nodeSize += other.nodeSize;
226 typedef std::map<const AP_tree*,NodeMarkers> GroupMarkerCache;
228 GroupMarkerCache
cache;
233 : numMarkers(numMarkers_)
244 GroupMarkerCache::const_iterator found = cache.find(at);
245 return found == cache.end() ?
NULp : &found->second;
249 #if defined(ASSERTION_USED)
253 int size()
const {
return numMarkers; }
363 Group selected_group;
379 bool link_to_database;
384 double list_tree_ruler_y;
385 double irs_tree_ruler_scale_factor;
392 double scaled_branch_distance;
399 const AW_bitset line_filter, vert_line_filter, mark_filter, group_bracket_filter;
400 const AW_bitset leaf_text_filter, group_text_filter, other_text_filter;
401 const AW_bitset ruler_filter, root_filter, marker_filter;
419 GraphicTreeCallback tree_changed_cb;
420 static GraphicTreeCallback group_changed_cb;
428 bool nds_only_marked;
437 void show_nds_list(
GBDATA * gb_main,
bool use_nds,
const NDS_Labeler& labeler);
438 void show_irs_tree(
AP_tree *at,
double height,
const NDS_Labeler& labeler);
441 void drawMarker(
const class MarkerPosition& marker,
const bool partial,
const int midx);
442 void detectAndDrawMarkers(
AP_tree *at,
double y1,
double y2);
447 AP_tree *find_selected_node()
const;
448 AP_tree *find_selected_group();
450 void toggle_folding_at(
AP_tree *at,
bool force_jump);
464 cmd_data = new_cmd_data;
497 return disp_device->
line(gc, root, leaf, filter);
517 displayed_root = node;
560 delete display_markers;
561 display_markers =
NULp;
565 display_markers = display;
573 group_changed_cb = gccb;
581 if (selected_group != group) {
582 selected_group =
group;
583 group_changed_cb(
this);
589 select_group(
Group(node));
592 select_group(gb_group ?
Group(gb_group) :
Group());
595 select_group(
Group());
598 return selected_group;
603 if (selected_group.
locate(in_subtree)) {
614 #if defined(UNIT_TESTS) // UT_DIFF
615 friend class fake_AWT_graphic_tree;
663 ruler = !elem->
cd1();
667 markerflag = elem->
cd1()+1;
731 AWT_canvas(gb_main_, aww_, gc_base_name_, gfx_),
732 awar_tree(awar_tree_),
757 #error TreeDisplay.hxx included twice
758 #endif // TREEDISPLAY_HXX
AP_tree * get_node() const
void reorderTree(TreeOrder mode)
AWT_graphic_tree * get_graphic_tree() const
void combine(const DendroSubtreeLimits &other)
void set_marker_display(MarkerDisplay *display)
AWT_graphic_tree * NT_generate_tree(AW_root *root, GBDATA *gb_main, AD_map_viewer_cb map_viewer_cb)
int get_markerindex() const
AP_tree * get_logical_root()
bool warn_inappropriate_mode(AWT_COMMAND_MODE mode)
MarkerDisplay(int numMarkers_)
AP_tree_root * get_tree_root()
virtual AP_tree_root * create_tree_root(AliView *aliview, AP_sequence *seq_prototype, bool insert_delete_cbs)
GB_ERROR load_from_DB(GBDATA *gb_main, const char *name) FINAL_OVERRIDE __ATTR__USERESULT
#define implicated(hypothesis, conclusion)
void group_rest_tree(AP_tree *at, CollapseMode mode, int color_group)
void set_logical_root_to(AP_tree *node)
void check_for_DB_update(GBDATA *gb_main) FINAL_OVERRIDE
void set_line_attributes(int gc, short width, AW_linestyle style)
const AW_bitset circle_filter
void detect_group_state(AP_tree *at, AWT_graphic_tree_group_state *state, AP_tree *skip_this_son)
void store_command_data(AWT_command_data *new_cmd_data)
double get_irs_tree_ruler_scale_factor() const
void select_group(AP_tree *node)
long mark_species_in_tree_that(AP_tree *at, int mark, bool(*condition)(GBDATA *, void *), void *cd)
GB_ERROR save_to_DB(GBDATA *gb_main, const char *name) FINAL_OVERRIDE __ATTR__USERESULT
DECLARE_ASSIGNMENT_OPERATOR(PaintedNode)
void notify_synchronized(GBDATA *gb_main) FINAL_OVERRIDE
AP_tree * get_node() const
virtual ~AWT_command_data()
void forget_auto_unfolded()
void dislocate_selected_group()
long mark_species_in_tree(AP_tree *at, int mark)
bool tree_has_marks(AP_tree *at)
GBDATA * get_gbmain() const
bool is_logically_zoomed()
double getMarkRate(size_t markerIdx) const
const AP_tree * get_root_node() const
void add(const NodeMarkers &other)
ClickedTarget(AWT_graphic_tree *agt, const AW_clicked_element *clicked)
DECLARE_CBTYPE_FVV_AND_BUILDERS(GraphicTreeCallback, void, AWT_graphic_tree *)
void(* screen_update_callback)(AWT_canvas *, AW_CL cd)
AW_gc_manager * init_devices(AW_window *, AW_device *, AWT_canvas *ntw) OVERRIDE
void incMarker(size_t markerIdx)
#define DOWNCAST(totype, expr)
void diamond(int gc, const AW::Position &pos, int pixel_radius)
void(* AD_map_viewer_cb)(GBDATA *gbd, AD_MAP_VIEWER_TYPE type)
const AW::Position & get_pos() const
const NodeMarkers * read_cache(const AP_tree *at) const
void set_tree_style(AP_tree_display_style style, AWT_canvas *ntw)
void auto_unfold(AP_tree *want_visible)
MARK_NONFINAL_FUNCTION(AWT_graphic_tree, AP_tree_root *, create_tree_root,(AliView *, AP_sequence *, bool), NULp)
NodeMarkers(int numMarks)
static void install_group_changed_callback(const GraphicTreeCallback &gccb)
virtual void read_tree_settings()
void compute_tree() FINAL_OVERRIDE
virtual const char * get_marker_name(int markerIdx) const =0
PaintedNode(const AW::Position &p, AP_tree *n)
int get_linewidth() const
TREE_canvas(GBDATA *gb_main_, AW_window *aww_, const char *gc_base_name_, AWT_graphic *gfx_, AW_awar *awar_tree_)
AW_root * get_root() const
void get_zombies_and_duplicates(int &zomb, int &dups) const
void hide_marker_display()
MARK_NONFINAL_CLASS(AWT_graphic_tree)
MarkerDisplay * get_marker_display()
bool are_distinct(const Position &p1, const Position &p2)
bool line(int gc, const AW::LineVector &Line, AW_bitset filteri=AW_ALL_DEVICES_SCALED)
bool rest_tree_has_marks(AP_tree *at)
void at_screen_update_call(screen_update_callback cb, AW_CL cd)
CONSTEXPR_INLINE_Cxx14 void swap(unsigned char &c1, unsigned char &c2)
screen_update_callback announce_update_cb
double scaled_remark_ascend
void handle_command(AW_device *device, AWT_graphic_event &event) OVERRIDE
~AWT_graphic_tree() OVERRIDE
AWT_command_data * get_command_data()
AW_window * TREE_create_settings_window(AW_root *aw_root)
AP_tree_display_style get_tree_style() const
void uninstall_tree_changed_callback()
void fast_sync_changed_folding(AP_tree *parent_of_all_changes)
AW_window * TREE_create_marker_settings_window(AW_root *root)
virtual void retrieve_marker_state(const char *speciesName, NodeMarkers &matches)=0
void toggle_group(AP_tree *at)
void show_ruler(AW_device *device, int gc)
ClickedTarget(const AW_clicked_element *clicked)
int draw_branch_line(int gc, const AW::Position &root, const AW::Position &leaf, AW_bitset filter)
bool is_list_style(AP_tree_display_style style)
bool group_tree(AP_tree *at, CollapseMode mode, int color_group)
void write_cache(const AP_tree *at, const NodeMarkers &markers)
void display_node_remark(AW_device *device, const AP_tree *at, const AW::Position ¢er, double blen, double bdist, AW::RoughDirection textArea) const
bool has_bootstrap() const
const AW::Position & get_group_cursor() const
const Group & get_selected_group() const
bool locate(AP_tree *subtree) const
void display_remark(AW_device *device, const char *remark, const AW::Position ¢er, double blen, double bdist, const AW::Position &textpos, AW_pos alignment) const
int markerCount(size_t markerIdx) const
double get_rel_pos() const
void TREE_create_awars(AW_root *aw_root, AW_default db)
void select_group(GBDATA *gb_group)
#define __ATTR__USERESULT
void TREE_install_update_callbacks(TREE_canvas *ntw)
double get_rel_attach() const
void filled_box(int gc, const AW::Position &pos, int pixel_width)
AP_tree * locate_selected_group(AP_tree *in_subtree)
const AW::Position & get_cursor() const
void set_line_attributes_for(AP_tree *at) const
AP_tree * get_root_node()
static void tree_changed_cb(AW_root *, BranchWindow *bw)
const AW_bitset text_filter
PaintedNode(const PaintedNode &other)
const char * ruler_awar(const char *name)
bool was_displayed() const
AWT_graphic_tree(AW_root *aw_root, GBDATA *gb_main, AD_map_viewer_cb map_viewer_cb)
virtual void handle_click(int markerIdx, AW_MouseButton button, AWT_graphic_exports &exports)=0
bool is_tree_style(AP_tree_display_style style)
void init(AliView *aliview, AP_sequence *seq_prototype, bool link_to_database_, bool insert_delete_cbs)
void install_tree_changed_callback(const GraphicTreeCallback >cb)
bool shall_show_remark_for(const TreeNode *node) const
void update_empty_branch_behavior(const TreeRoot *troot)
const AP_tree * get_logical_root() const
void empty_box(int gc, const AW::Position &pos, int pixel_width)
void update_structure() FINAL_OVERRIDE
const SmartCharPtr & get_remark_ptr() const
PREPARE_MARK_NONFINAL_CLASS(AWT_graphic_tree)
const AW_clicked_element * element() const
AW_awar * get_awar_tree() const
bool cache_is_flushed() const
const AW_click_cd * get_click_cd() const
void show(AW_device *device) OVERRIDE
void init(const AW_font_limits &font_limits, double factor)
void mark_species_in_rest_of_tree(AP_tree *at, int mark)
void apply_zoom_settings_for_treetype(AWT_canvas *ntw)