source: tags/ms_r16q3/EDIT4/ed4_flags.hxx

Last change on this file was 15288, checked in by westram, 8 years ago
File size: 3.6 KB
Line 
1// ============================================================== //
2//                                                                //
3//   File      : ed4_flags.hxx                                    //
4//   Purpose   : Representation of species-flag setup             //
5//                                                                //
6//   Coded by Ralf Westram (coder@reallysoft.de) in August 2016   //
7//   http://www.arb-home.de/                                      //
8//                                                                //
9// ============================================================== //
10
11#ifndef ED4_FLAGS_HXX
12#define ED4_FLAGS_HXX
13
14#ifndef _GLIBCXX_STRING
15#include <string>
16#endif
17#ifndef _GLIBCXX_LIST
18#include <list>
19#endif
20#ifndef ED4_DEFS_HXX
21#include "ed4_defs.hxx"
22#endif
23
24class SpeciesFlag {
25    std::string shortname; // abbreviation used in flag-header
26    std::string fieldname; // name of species field
27
28    int awar_index; // index of awars
29
30    int xpos; // inside terminal
31    int width;
32
33public:
34    SpeciesFlag(const std::string& shortname_, const std::string& fieldname_, int awar_idx) :
35        shortname(shortname_),
36        fieldname(fieldname_),
37        awar_index(awar_idx),
38        xpos(-1),
39        width(-1)
40    {
41        e4_assert(!shortname.empty()); // not allowed
42    }
43
44    const std::string& get_shortname() const { return shortname; }
45    const std::string& get_fieldname() const { return fieldname; }
46
47    void set_dimension(int xpos_, int width_) {
48        xpos  = xpos_;
49        width = width_;
50    }
51    int get_xpos() const {
52        e4_assert(xpos>=0);
53        return xpos;
54    }
55    int get_width() const {
56        e4_assert(width>=1); // empty header not allowed!
57        return width;
58    }
59
60    double center_xpos() const {
61        return get_xpos() + get_width()*0.5;
62    }
63
64    const char *prepare_itemfield() const;
65};
66
67typedef std::list<SpeciesFlag>          SpeciesFlagList;
68typedef SpeciesFlagList::iterator       SpeciesFlagIter;
69typedef SpeciesFlagList::const_iterator SpeciesFlagCiter;
70
71class SpeciesFlags : public SpeciesFlagList {
72    static SpeciesFlags *SINGLETON;
73    static void create_instance();
74
75    mutable SmartCharPtr header;
76    mutable int          header_length; // characters
77
78    int pixel_width; // width of text (plus a bit extra to avoid char-clipping + CHARACTEROFFSET)
79    int min_flag_distance;
80
81    SpeciesFlags() :
82        header_length(-1),
83        pixel_width(-1),
84        min_flag_distance(INT_MAX)
85    {}
86    void build_header_text() const;
87
88public:
89
90    static const SpeciesFlags& instance() {
91        if (!SINGLETON) create_instance();
92        e4_assert(SINGLETON);
93        return *SINGLETON;
94    }
95    static SpeciesFlags& mutable_instance() {
96        return const_cast<SpeciesFlags&>(instance());
97    }
98    static void forget() {
99        delete SINGLETON;
100        SINGLETON = NULL;
101    }
102
103    const char *get_header_text() const {
104        if (header.isNull()) build_header_text();
105        return &*header;
106    }
107    int get_header_length() const {
108        if (header_length<0) {
109            header_length = strlen(get_header_text());
110        }
111        return header_length;
112    }
113    int get_pixel_width() const {
114        e4_assert(pixel_width>0);
115        return pixel_width;
116    }
117    int get_min_flag_distance() const {
118        e4_assert(min_flag_distance != INT_MAX);
119        return min_flag_distance;
120    }
121
122    void calculate_header_dimensions(AW_device *device, int gc);
123};
124
125AW_window *ED4_configure_species_flags(AW_root *root, GBDATA *gb_main);
126
127#else
128#error ed4_flags.hxx included twice
129#endif // ED4_FLAGS_HXX
130
Note: See TracBrowser for help on using the repository browser.