| 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 | |
|---|
| 24 | class 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 | |
|---|
| 33 | public: |
|---|
| 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 | |
|---|
| 67 | typedef std::list<SpeciesFlag> SpeciesFlagList; |
|---|
| 68 | typedef SpeciesFlagList::iterator SpeciesFlagIter; |
|---|
| 69 | typedef SpeciesFlagList::const_iterator SpeciesFlagCiter; |
|---|
| 70 | |
|---|
| 71 | class 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 | |
|---|
| 88 | public: |
|---|
| 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 = NULp; |
|---|
| 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 | |
|---|
| 125 | AW_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 | |
|---|