| 21 | | static ED4_blocktype blocktype = ED4_BT_NOBLOCK; |
| 22 | | |
| 23 | | // linerange for COLUMNBLOCK is stored in EDIT4 marks, |
| 24 | | // columnrange for COLUMNBLOCK is stored here: |
| 25 | | |
| 26 | | static PosRange blockrange; |
| 27 | | static int columnBlockUsed = 0; |
| | 21 | class ED4_block : virtual Noncopyable { |
| | 22 | // stores columnrange of selected region |
| | 23 | // (linerange is stored in EDIT4 marks) |
| | 24 | ED4_blocktype type; |
| | 25 | bool columnBlockUsed; |
| | 26 | PosRange range; |
| | 27 | |
| | 28 | public: |
| | 29 | ED4_block() |
| | 30 | : type(ED4_BT_NOBLOCK), |
| | 31 | columnBlockUsed(false) |
| | 32 | {} |
| | 33 | |
| | 34 | ED4_blocktype get_type() const { return type; } |
| | 35 | void set_type(ED4_blocktype bt); |
| | 36 | void toggle_type(); |
| | 37 | void autocorrect_type(); |
| | 38 | |
| | 39 | const PosRange& get_range() const { return range; } |
| | 40 | void set_range(const PosRange& new_range) { range = new_range; } |
| | 41 | }; |
| | 42 | |
| | 43 | static ED4_block block; |
| | 70 | |
| | 71 | static void refresh_selected(bool refresh_name_terminals) { |
| | 72 | ED4_list_elem *listElem = ED4_ROOT->selected_objects.first(); |
| | 73 | while (listElem) { |
| | 74 | ED4_selection_entry *selected = (ED4_selection_entry*)listElem->elem(); |
| | 75 | ED4_species_name_terminal *name_term = selected->object->to_species_name_terminal(); |
| | 76 | ED4_sequence_terminal *seq_term = name_term->corresponding_sequence_terminal(); |
| | 77 | |
| | 78 | if (refresh_name_terminals) { |
| | 79 | name_term->set_refresh(1); |
| | 80 | name_term->parent->refresh_requested_by_child(); |
| | 81 | } |
| | 82 | if (seq_term) col_block_refresh_on_seq_term(seq_term); |
| | 83 | |
| | 84 | listElem = listElem->next(); |
| | 85 | } |
| | 86 | } |
| | 87 | |
| | 88 | // -------------------------------------------------------------------------------- |
| | 89 | |
| | 90 | void ED4_block::set_type(ED4_blocktype bt) { |
| | 91 | if (type != bt) { |
| | 92 | type = bt; |
| | 93 | refresh_selected(true); |
| | 94 | if (type==ED4_BT_COLUMNBLOCK || type==ED4_BT_MODIFIED_COLUMNBLOCK) { |
| | 95 | columnBlockUsed = true; |
| | 96 | } |
| | 97 | } |
| | 98 | } |
| | 99 | |
| | 100 | void ED4_block::toggle_type() { |
| | 101 | switch (type) { |
| | 102 | case ED4_BT_NOBLOCK: { |
| | 103 | aw_message("No block selected."); |
| | 104 | break; |
| | 105 | } |
| | 106 | case ED4_BT_LINEBLOCK: { |
| | 107 | if (columnBlockUsed) { |
| | 108 | set_type(ED4_BT_MODIFIED_COLUMNBLOCK); |
| | 109 | } |
| | 110 | else { |
| | 111 | aw_message("No columnblock marked so far - I can't guess the column range"); |
| | 112 | } |
| | 113 | break; |
| | 114 | } |
| | 115 | case ED4_BT_MODIFIED_COLUMNBLOCK: |
| | 116 | case ED4_BT_COLUMNBLOCK: { |
| | 117 | set_type(ED4_BT_LINEBLOCK); |
| | 118 | break; |
| | 119 | } |
| | 120 | } |
| | 121 | } |
| | 122 | |
| | 123 | void ED4_block::autocorrect_type() { |
| | 124 | // this has to be called every time the selection has changed |
| | 125 | |
| | 126 | if (ED4_ROOT->selected_objects.first()==0) { // no objects are selected |
| | 127 | set_type(ED4_BT_NOBLOCK); |
| | 128 | } |
| | 129 | else { |
| | 130 | switch (type) { |
| | 131 | case ED4_BT_NOBLOCK: { |
| | 132 | set_type(ED4_BT_LINEBLOCK); |
| | 133 | break; |
| | 134 | } |
| | 135 | case ED4_BT_COLUMNBLOCK: { |
| | 136 | set_type(ED4_BT_MODIFIED_COLUMNBLOCK); |
| | 137 | break; |
| | 138 | } |
| | 139 | case ED4_BT_LINEBLOCK: |
| | 140 | case ED4_BT_MODIFIED_COLUMNBLOCK: { |
| | 141 | break; |
| | 142 | } |
| | 143 | } |
| | 144 | } |
| | 145 | } |
| | 146 | |
| 243 | | ED4_blocktype ED4_getBlocktype() { |
| 244 | | return blocktype; |
| 245 | | } |
| 246 | | void ED4_setBlocktype(ED4_blocktype bt) { |
| 247 | | if (blocktype!=bt) { |
| 248 | | blocktype = bt; |
| 249 | | |
| 250 | | ED4_list_elem *listElem = ED4_ROOT->selected_objects.first(); |
| 251 | | while (listElem) { |
| 252 | | ED4_selection_entry *selected = (ED4_selection_entry*)listElem->elem(); |
| 253 | | ED4_species_name_terminal *name_term = selected->object->to_species_name_terminal(); |
| 254 | | ED4_sequence_terminal *seq_term = name_term->corresponding_sequence_terminal(); |
| 255 | | |
| 256 | | name_term->set_refresh(1); |
| 257 | | name_term->parent->refresh_requested_by_child(); |
| 258 | | if (seq_term) col_block_refresh_on_seq_term(seq_term); |
| 259 | | |
| 260 | | listElem = listElem->next(); |
| 261 | | } |
| 262 | | |
| 263 | | if (blocktype==ED4_BT_COLUMNBLOCK || blocktype==ED4_BT_MODIFIED_COLUMNBLOCK) { |
| 264 | | columnBlockUsed = 1; |
| 265 | | } |
| 266 | | } |
| 267 | | } |
| 268 | | |
| 269 | | void ED4_toggle_block_type() { |
| 270 | | switch (blocktype) { |
| 271 | | case ED4_BT_NOBLOCK: { |
| 272 | | aw_message("No block selected."); |
| 273 | | break; |
| 274 | | } |
| 275 | | case ED4_BT_LINEBLOCK: { |
| 276 | | if (columnBlockUsed) { |
| 277 | | ED4_setBlocktype(ED4_BT_MODIFIED_COLUMNBLOCK); |
| 278 | | } |
| 279 | | else { |
| 280 | | aw_message("No columnblock marked so far - I can't guess the column range"); |
| 281 | | } |
| 282 | | break; |
| 283 | | } |
| 284 | | case ED4_BT_MODIFIED_COLUMNBLOCK: |
| 285 | | case ED4_BT_COLUMNBLOCK: { |
| 286 | | ED4_setBlocktype(ED4_BT_LINEBLOCK); |
| 287 | | break; |
| 288 | | } |
| 289 | | default: { |
| 290 | | e4_assert(0); |
| 291 | | break; |
| 292 | | } |
| 293 | | } |
| 294 | | } |
| 295 | | |
| 296 | | void ED4_correctBlocktypeAfterSelection() { // this has to be called every time the selection has changed |
| 297 | | |
| 298 | | if (ED4_ROOT->selected_objects.first()==0) { // no objects are selected |
| 299 | | ED4_setBlocktype(ED4_BT_NOBLOCK); |
| 300 | | } |
| 301 | | else { |
| 302 | | switch (ED4_getBlocktype()) { |
| 303 | | case ED4_BT_NOBLOCK: { |
| 304 | | ED4_setBlocktype(ED4_BT_LINEBLOCK); |
| 305 | | break; |
| 306 | | } |
| 307 | | case ED4_BT_COLUMNBLOCK: { |
| 308 | | ED4_setBlocktype(ED4_BT_MODIFIED_COLUMNBLOCK); |
| 309 | | break; |
| 310 | | } |
| 311 | | case ED4_BT_LINEBLOCK: |
| 312 | | case ED4_BT_MODIFIED_COLUMNBLOCK: { |
| 313 | | break; |
| 314 | | } |
| 315 | | default: { |
| 316 | | e4_assert(0); |
| 317 | | break; |
| 318 | | } |
| 319 | | } |
| 320 | | } |
| 321 | | } |
| | 337 | ED4_blocktype ED4_getBlocktype() { return block.get_type(); } |
| | 338 | void ED4_setBlocktype(ED4_blocktype bt) { block.set_type(bt); } |
| | 339 | void ED4_toggle_block_type() { block.toggle_type(); } |
| | 340 | void ED4_correctBlocktypeAfterSelection() { block.autocorrect_type(); } |
| 331 | | blockrange = PosRange(pos1, pos2); |
| 332 | | } |
| 333 | | |
| 334 | | if (blocktype==ED4_BT_MODIFIED_COLUMNBLOCK) { |
| 335 | | ED4_list_elem *listElem = ED4_ROOT->selected_objects.first(); |
| 336 | | while (listElem) { |
| 337 | | ED4_selection_entry *selectionEntry = (ED4_selection_entry*)listElem->elem(); |
| 338 | | ED4_species_name_terminal *name_term = selectionEntry->object->to_species_name_terminal(); |
| 339 | | ED4_sequence_terminal *seq_term = name_term->corresponding_sequence_terminal(); |
| 340 | | |
| 341 | | if (seq_term) col_block_refresh_on_seq_term(seq_term); |
| 342 | | |
| 343 | | listElem = listElem->next(); |
| 344 | | } |
| | 350 | block.set_range(PosRange(pos1, pos2)); |
| | 351 | } |
| | 352 | |
| | 353 | if (block.get_type()==ED4_BT_MODIFIED_COLUMNBLOCK) { |
| | 354 | refresh_selected(false); |