41 #define AWAR_CL_SELECTED_CONFIGS "configuration_data/win%i/selected"
42 #define AWAR_CL_DISPLAY_CONFIG_MARKERS "configuration_data/win%i/display"
44 #define AWAR_CONFIG_COMMENT "tmp/configuration/comment"
67 for (
int c = 0; c<size(); ++c) {
71 for (
int area = 0; area<=1 && !
error; ++area) {
78 ConfigHits::iterator found = hits.find(item.
name);
79 if (found == hits.end()) {
80 string h(size(),
'0');
85 (found->second)[c] =
'1';
104 const char *
error = errors[markerIdx];
105 const char *name = (*config)[markerIdx];
110 ConfigHits::const_iterator found = hits.find(speciesName);
111 if (found != hits.end()) {
112 const string& hit = found->second;
114 for (
int c = 0; c<size(); ++c) {
115 if (hit[c] ==
'1')
node.incMarker(c);
126 exports.request_structure_update();
134 #define CONFIG_SEPARATOR "\1"
186 ConfigMarkerDisplay *disp =
new ConfigMarkerDisplay(config, ntw->
gb_main);
192 if (selected_configs_list[ntw_id]) {
223 bool is_same_modification = gb_name == gb_lastname && (thiscall == lastcall || thiscall == (lastcall+1));
224 if (!is_same_modification) {
230 for (
size_t c = 0; c<config->
size(); ++c) {
231 if (strcmp((*config)[c], name) == 0) {
238 gb_lastname = gb_name;
242 #define CONFIG_BASE_PATH "/configuration_data/configuration"
245 static bool installed =
false;
265 awar_selCfgs->
touch();
270 #define MANAGED_CONFIGSET_SECTION "configmarkers"
271 #define MANAGED_CONFIGSET_ENTRY "selected_configs"
283 virtual const char *modify(
const char *old)
const = 0;
286 bool changed =
false;
287 for (
size_t i = 0; i<config.
size(); ++i) {
288 const char *newContent = modify(config[i]);
293 else if (strcmp(newContent, config[i]) != 0) {
304 const char *modify(
const char *name)
const OVERRIDE {
305 return strcmp(name, oldName) == 0 ? newName : name;
314 const char *toDelete;
315 const char *modify(
const char *name)
const OVERRIDE {
316 return strcmp(name, toDelete) == 0 ?
NULp : name;
320 : toDelete(toDelete_)
325 char *modified_value =
NULp;
334 return modified_value ? modified_value :
ARB_strdup(value);
352 AW_window_simple *aws =
new AW_window_simple;
355 aws->init(root,
GBS_global_string(
"MARK_CONFIGS_%i", ntw_id),
"Highlight configurations in tree");
356 aws->load_xfig(
"mark_configs.fig");
358 aws->auto_space(10, 10);
362 aws->create_button(
"CLOSE",
"CLOSE",
"C");
366 aws->create_button(
"HELP",
"HELP",
"H");
378 selected_configs_list[ntw_id] = sub_sel;
383 aws->label(
"Display?");
388 aws->create_autosize_button(
"SETTINGS",
"Settings",
"S");
423 void call(
void (*aPizza)(
TreeNode*))
const;
432 if (next) next->
call(aPizza);
448 *extra_marked_species = (
new Store_species(node))->
add(*extra_marked_species);
456 node = node->get_rightson();
475 father = node->get_father();
483 int *auto_mark,
int marked_at_left,
int *marked_at_right)
519 *marked_at_right = marked_at_left;
529 *marked_at_right = 0;
534 if (marked_at_left<use_species_aside) {
540 int step_over = marked_at_left+1;
541 int then_mark = use_species_aside-marked_at_left;
543 while (step_over--) {
548 while (leaf_at_left && then_mark--) {
556 while (marked_back) {
567 marked_at_left = use_species_aside;
570 *auto_mark = use_species_aside;
578 *marked_at_right = marked_at_left+1;
596 int right_of_leftson;
597 long nspecies=
nt_build_conf_string_rek(used, tree->get_leftson(), memfile, extra_marked_species, use_species_aside, auto_mark, marked_at_left, &right_of_leftson);
598 nspecies +=
nt_build_conf_string_rek(used, tree->get_rightson(), memfile, extra_marked_species, use_species_aside, auto_mark, right_of_leftson, marked_at_right);
620 const char *sep = strchr(key, 1);
625 if (!last_group_name || strncmp(key, last_group_name, sep-key)) {
626 if (last_group_name) {
658 bool wantedInTop =
false;
659 for (
unsigned s = 0; !wantedInTop &&
s<topAreaSai.
size(); ++
s) {
660 wantedInTop = strcmp(name, topAreaSai[
s]) == 0;
670 char *cn =
new char[strlen(gn) + strlen(name) + 2];
671 sprintf(cn,
"%s%c%s", gn, 1, name);
681 for (
unsigned s = 0;
s<topAreaSai.
size(); ++
s) {
744 size_t unknown_species = 0;
745 bool refresh =
false;
765 for (
int area = 0; area<=1 && !
error; ++area) {
777 int newmark = oldmark;
790 if (newmark != oldmark) {
803 if (unknown_species>0 && !error) error =
GBS_global_string(
"configuration '%s' contains %zu unknown species", cn, unknown_species);
818 if (gb_configuration) {
822 error = ta.
close(error);
842 if (!conf_name || !conf_name[0]) error =
"no config name given";
844 if (use_species_aside==-1) {
845 static int last_used_species_aside = 3;
848 char *use_species =
aw_input(
"How many extra species to view aside marked:", val);
849 if (use_species) use_species_aside = atoi(use_species);
853 if (use_species_aside<1) error =
"illegal number of 'species aside'";
854 else last_used_species_aside = use_species_aside;
871 if (use_species_aside) {
876 nt_build_conf_string_rek(used, tree, &middlefile, &extra_marked_species, use_species_aside, &auto_mark, use_species_aside, &marked_at_right);
877 if (extra_marked_species) {
879 delete extra_marked_species;
883 int dummy_1=0, dummy_2;
899 const char *prevComment =
NULp;
900 const char *comment =
NULp;
901 bool warnIfSavingDefault =
true;
904 prevComment =
"This configuration will be OVERWRITTEN each time\nARB_EDIT4 is started w/o specifying a config!\n---";
905 comment =
"created for ARB_EDIT4";
906 warnIfSavingDefault =
false;
912 comment =
"updated manually";
916 if (!prevComment[0]) prevComment =
NULp;
917 comment =
"created manually";
923 comment =
"created by importer";
961 char *new_name =
aw_input(
"Rename selection",
"Enter the new name of the selection", old_name);
969 if (gb_existing_cfg) err =
GBS_global_string(
"There is already a selection named '%s'", new_name);
978 else err =
"Selection has no name";
980 else err =
"Can't find that selection";
1001 bool nonexisting_config =
false;
1005 if (gb_configuration) {
1006 gb_target_commment =
GB_entry(gb_configuration,
"comment");
1009 nonexisting_config =
true;
1014 if (gb_target_commment) {
1016 awar_comment->
map(gb_target_commment);
1021 awar_comment->
unmap();
1024 free(reuse_comment);
1043 awar_comment->
unmap();
1050 if (gb_configuration) {
1058 else if (!config[0]) {
1061 error =
"Please select an existing species selection to edit its comment";
1075 #pragma GCC diagnostic push
1076 #if (GCC_VERSION_CODE<700)
1077 #pragma GCC diagnostic ignored "-Wstrict-overflow" // gcc 6.x produces a bogus overflow warning (gcc 7.x is smart enough)
1083 if (i1>i2)
swap(i1, i2);
1084 nt_assert(i1<i2 && i1>=0 && i2<
int(config.size()));
1089 if (!error) error = c1.
saveAsOver(gb_main, config[i1], config[i2],
false);
1090 if (!error) error = c2.
saveAsOver(gb_main, config[i2], config[i1],
false);
1091 if (!error) config.swap(i1, i2);
1096 #pragma GCC diagnostic pop
1103 if (selected && selected[0]) {
1107 int target_idx = -1;
1109 case ARM_TOP: target_idx = 0;
break;
1110 case ARM_UP: target_idx = source_idx-1;
break;
1111 case ARM_DOWN: target_idx = source_idx+1;
break;
1115 int entries = sellist->
size();
1116 target_idx = (target_idx+entries)%entries;
1126 if (source_idx<target_idx) {
1127 for (
int i = source_idx+1; i<=target_idx; ++i) {
1131 else if (source_idx>target_idx) {
1132 for (
int i = source_idx-1; i>=target_idx; --i) {
1137 error = ta.
close(error);
1140 awar_config->
touch();
1151 bool removedDatedLines =
false;
1152 RegExpr datedLine(
"^([A-Z][a-z]{2}\\s){2}[0-9]+\\s([0-9]{2}:){2}[0-9]{2}\\s[0-9]{4}:\\s",
false);
1153 for (
int i = line.
size()-1; i >= 0; --i) {
1158 removedDatedLines =
true;
1162 if (!removedDatedLines) line.
clear();
1172 if (!existing_aws[ntw_id]) {
1175 AW_window_simple *aws =
new AW_window_simple;
1176 aws->init(root,
GBS_global_string(
"SPECIES_SELECTIONS_%i", ntw_id),
"Species Selections");
1177 aws->load_xfig(
"nt_selection.fig");
1181 aws->create_button(
"CLOSE",
"CLOSE",
"C");
1185 aws->create_button(
"HELP",
"HELP",
"H");
1195 aws->create_autosize_button(
"CLEAR",
"Clear",
"l");
1200 aws->button_length(8);
1208 aws->create_button(
"EXTRACT",
"EXTRACT",
"E");
1212 aws->create_button(
"MARK",
"MARK",
"M");
1216 aws->create_button(
"UNMARK",
"UNMARK",
"U");
1220 aws->create_button(
"INVERT",
"INVERT",
"I");
1224 aws->create_button(
"COMBINE",
"COMBINE",
"C");
1228 aws->create_button(
"DELETE",
"DELETE",
"D");
1232 aws->create_button(
"RENAME",
"RENAME",
"R");
1234 aws->at(
"highlight");
1236 aws->create_autosize_button(
GBS_global_string(
"HIGHLIGHT_%i", ntw_id),
"Highlight in tree",
"t");
1238 aws->button_length(0);
1242 existing_aws[ntw_id] = aws;
1244 return existing_aws[ntw_id];
1266 static AW_window_simple *aws =
NULp;
1270 aws =
new AW_window_simple;
1271 aws->init(awr,
"SELECT_CONFIGURATION",
"SELECT A CONFIGURATION");
1273 aws->auto_space(0, 0);
1278 aws->create_button(
"START",
"START");
1281 aws->create_button(
"CLOSE",
"CLOSE",
"C");
1322 if (imported_from_scratch) {
void NT_popup_configuration_admin(AW_window *aw_main, TREE_canvas *ntw)
GB_HASH * GBT_create_marked_species_hash(GBDATA *gb_main)
GB_ERROR GBK_system(const char *system_command)
void GBS_hash_do_const_sorted_loop(const GB_HASH *hs, gb_hash_const_loop_type func, gbs_hash_compare_function sorter, void *client_data)
void set_marker_display(MarkerDisplay *display)
static void reorder_configs_cb(AW_window *aww, awt_reorder_mode mode, AW_DB_selection *sel)
static void configuration_deleted_cb(const char *name)
static AW_selection * selected_configs_list[MAX_NT_WINDOWS]
void add(const char *awar_name, const char *config_name)
GBDATA * GBT_first_marked_species(GBDATA *gb_main)
AW_window * NT_create_startEditorOnOldConfiguration_window(AW_root *awr)
static void selected_configs_display_awar_changed_cb(AW_root *root, TREE_canvas *ntw)
#define GB_USERFLAG_WASMARKED
void NT_create_config_after_import(TREE_canvas *ntw, bool imported_from_scratch)
Store_species(TreeNode *aNode)
GB_ERROR GB_add_hierarchy_callback(GBDATA *gb_main, const char *db_path, GB_CB_TYPE type, const DatabaseCallback &dbcb)
#define implicated(hypothesis, conclusion)
static void nt_build_sai_string_by_hash(const char *key, long, void *cd_sai_builder)
long GBS_write_hash(GB_HASH *hs, const char *key, long val)
GB_ERROR GB_write_string(GBDATA *gbd, const char *s)
static AW_window * create_configuration_marker_window(AW_root *root, TREE_canvas *ntw)
#define ASSERT_NO_ERROR(errorExpr)
long GBT_mark_all(GBDATA *gb_main, int flag)
static const int MIDDLE_AREA
Store_species * add(Store_species *list)
GBS_strstruct * sai_middle
static void nt_build_sai_string(const char *topAreaSaiList, GBS_strstruct *topfile, GBS_strstruct *middlefile)
static void init_config_awars(AW_root *root)
AW_selection * awt_create_subset_selection_list(AW_window *aww, AW_selection_list *parent_selection, const char *at_box, const char *at_add, const char *at_sort, bool autocorrect_subselection, SubsetChangedCb subChanged_cb, AW_CL cl_user)
#define AWAR_CONFIG_COMMENT
#define AWAR_CL_DISPLAY_CONFIG_MARKERS
char * ARB_strdup(const char *str)
void AWT_insert_config_manager(AW_window *aww, AW_default default_file_, const char *id, const StoreConfigCallback &store_cb, const RestoreConfigCallback &load_or_reset_cb, const char *macro_id, const AWT_predefined_config *predef)
static const int TOP_AREA
void NT_start_editor_on_tree(AW_window *aww, int use_species_aside, TREE_canvas *ntw)
const char * GBS_global_string(const char *templat,...)
#define AWAR_CONFIGURATION
static void init_config_admin_awars(AW_root *root)
void AW_POPDOWN(AW_window *window)
void GBS_strncat(GBS_strstruct *strstr, const char *ptr, size_t len)
void GBS_free_hash(GB_HASH *hs)
#define MANAGED_CONFIGSET_ENTRY
static void nt_delete_configuration(AW_window *aww, AW_DB_selection *dbsel)
TreeNode * getNode() const
void get_values(StrArray &intoArray)
bool modifyConfig(ConstStrArray &config) const
static GB_ERROR swap_configs(GBDATA *gb_main, StrArray &config, int i1, int i2)
ConfigRenamer(const char *oldName_, const char *newName_)
GBDATA * GB_get_father(GBDATA *gbd)
AW_awar * get_config_awar(int canvas_id)
#define MAX_NT_WINDOWS_NULLINIT
ConfigDeleter(const char *toDelete_)
static void unmark_species(TreeNode *node)
#define DEFAULT_CONFIGURATION
static SmartPtr< ConstStrArray > get_selected_configs_from_awar(int canvas_id)
#define DOWNCAST(totype, expr)
ConfigMarkerDisplay(SmartPtr< ConstStrArray > config_, GBDATA *gb_main_)
void GBT_split_string(ConstStrArray &dest, const char *namelist, const char *separator, bool dropEmptyTokens)
const char * ARB_dateTime_suffix()
AW_awar * add_callback(const RootCallback &cb)
GB_ERROR GB_delete(GBDATA *&source)
struct Unfixed_cb_parameter * UNFIXED
static struct aisc_static_set_mem md
#define AWAR_CL_SELECTED_CONFIGS
static void nt_build_conf_marked(GB_HASH *used, GBS_strstruct *file)
static TreeNode * left_neighbour_leaf(TreeNode *node)
const char * read_char_pntr() const
bool GB_user_flag(GBDATA *gbd, unsigned char user_bit)
static void configuration_renamed_cb(const char *old_name, const char *new_name)
void to_array(StrArray &array, bool values)
static AW_root * SINGLETON
TreeNode * NT_get_tree_root_of_canvas(TREE_canvas *ntw)
AW_window * TREE_create_marker_settings_window(AW_root *root)
WindowCallback makeHelpCallback(const char *helpfile)
static void selected_config_changed_cb(AW_root *root)
char * GBT_read_string(GBDATA *gb_container, const char *fieldpath)
static char * correct_managed_configsets_cb(const char *key, const char *value, AW_CL cl_ConfigModifier)
long GB_number_of_subentries(GBDATA *gbd)
static void config_modified_cb(GBDATA *gb_cfg_area)
void hide_marker_display()
bool displays_config_markers(MarkerDisplay *md)
static void selected_configs_awar_changed_cb(AW_root *aw_root, TREE_canvas *ntw)
GBT_CONFIG_ITEM_TYPE type
AW_DB_selection * awt_create_CONFIG_selection_list(GBDATA *gb_main, AW_window *aws, const char *varname)
static void nt_extract_configuration(UNFIXED, extractType ext_type)
MarkerDisplay * get_marker_display()
static void modify_configurations(const ConfigModifier &mod)
long GBS_memoffset(GBS_strstruct *strstr)
int get_index_of(const AW_scalar &searched_value)
virtual ~ConfigModifier()
const char * get_comment() const
void GBS_strcat(GBS_strstruct *strstr, const char *ptr)
static void error(const char *msg)
#define AWAR_TREE_REFRESH
#define NO_CONFIG_SELECTED
const RegMatch * match(const std::string &versus, size_t offset=0) const
void set_comment(const char *newComment)
void GBT_splitNdestroy_string(ConstStrArray &names, char *&namelist, const char *separator, bool dropEmptyTokens)
static AW_window * create_configuration_admin_window(AW_root *root, TREE_canvas *ntw)
static void install_config_change_callbacks(GBDATA *gb_main)
GBDATA * GBT_next_marked_species(GBDATA *gb_species)
static bool allow_selection2awar_update
CONSTEXPR_INLINE_Cxx14 void swap(unsigned char &c1, unsigned char &c2)
GB_ULONG GB_time_of_day(void)
GB_ERROR save(GBDATA *gb_main, const char *name, bool warnIfSavingDefault) const
size_t GBS_hash_elements(const GB_HASH *hs)
GBDATA * GBT_first_SAI_rel_SAI_data(GBDATA *gb_sai_data)
static void mark_species(TreeNode *node, Store_species **extra_marked_species)
AW_awar * get_canvas_awar(const char *awar_name_format, int canvas_id)
AW_awar * get_display_toggle_awar(int canvas_id)
static void nt_store_configuration(AW_window *, TREE_canvas *ntw)
void GBS_str_cut_tail(GBS_strstruct *strstr, size_t byte_count)
static void nt_start_editor_on_configuration(AW_window *aww)
static TreeNode * rightmost_leaf(TreeNode *node)
map< string, string > ConfigHits
static SearchTree * tree[SEARCH_PATTERNS]
int GB_read_flag(GBDATA *gbd)
char * read_string() const
AW_awar * awar_no_error(const char *awar)
end timer stuff
GB_ERROR saveAsOver(GBDATA *gb_main, const char *name, const char *oldName, bool warnIfSavingDefault) const
AW_awar * awar(const char *awar)
void awt_create_order_buttons(AW_window *aws, awt_orderfun reorder_cb, AW_CL cl_user)
char * GBS_log_action_to(const char *comment, const char *action, bool stamp)
void awt_set_subset_selection_content(AW_selection *subset_sel_, const CharPtrArray &values)
GBDATA * GBT_find_configuration(GBDATA *gb_main, const char *name)
void call(void(*aPizza)(TreeNode *)) const
const char * get_marker_name(int markerIdx) const OVERRIDE
static void configs_selectionlist_changed_cb(AW_selection *selected_configs, bool interactive_change, AW_CL ntw_id)
static GB_ERROR nt_create_configuration(TreeNode *tree, const char *conf_name, int use_species_aside, ConfigCreation creation)
const std::string * has_failed() const
void GBS_chrcat(GBS_strstruct *strstr, char ch)
static void setup_configmarker_config_cb(AWT_config_definition &config, int ntw_id)
char * GBT_join_strings(const CharPtrArray &strings, char separator)
GBDATA * GBT_next_SAI(GBDATA *gb_sai)
#define AWAR_TOPAREA_SAIS
void ncat(const char *from, size_t count)
AW_awar * awar_int(const char *var_name, long default_value=0, AW_default default_file=AW_ROOT_DEFAULT)
void NT_activate_configMarkers_display(TREE_canvas *ntw)
GB_ERROR close(GB_ERROR error)
char * GBK_singlequote(const char *arg)
void GB_write_flag(GBDATA *gbd, long flag)
void GB_write_user_flag(GBDATA *gbd, unsigned char user_bit, bool state)
GB_ERROR GBT_write_string(GBDATA *gb_container, const char *fieldpath, const char *content)
const GBT_config_item & nextItem(GB_ERROR &error)
void move_selection(int offset)
void nt_create_config_after_import(TREE_canvas *ntw)
int GB_read_byte(GBDATA *gbd)
AW_awar * map(const char *awarn)
char * GB_read_string(GBDATA *gbd)
void AWT_modify_managed_configs(AW_default default_file, const char *id, ConfigModifyCallback mod_cb, AW_CL cl_user)
GBDATA * GBT_first_species(GBDATA *gb_main)
void aw_message(const char *msg)
static void config_comment_changed_cb(AW_root *root)
void GB_clear_user_flag(GBDATA *gbd, unsigned char user_bit)
int GBS_HCF_sortedByKey(const char *k0, long dummy_1x, const char *k1, long dummy_2x)
#define MANAGED_CONFIGSET_SECTION
GBDATA * GBT_next_species(GBDATA *gb_species)
static void write_configs_to_awar(int canvas_id, const CharPtrArray &configs)
GBDATA * GBT_find_species(GBDATA *gb_main, const char *name)
static void clear_comment_cb(AW_window *aww)
static int nt_build_conf_string_rek(GB_HASH *used, TreeNode *tree, GBS_strstruct *memfile, Store_species **extra_marked_species, int use_species_aside, int *auto_mark, int marked_at_left, int *marked_at_right)
void retrieve_marker_state(const char *speciesName, NodeMarkers &node) OVERRIDE
GB_ERROR write_string(const char *aw_string)
const char * get_data() const
GBDATA * GBT_find_SAI_rel_SAI_data(GBDATA *gb_sai_data, const char *name)
#define GB_USERFLAG_QUERY
int GB_get_transaction_level(GBDATA *gbd)
void handle_click(int markerIdx, AW_MouseButton button, AWT_graphic_exports &exports) OVERRIDE
long GBT_get_species_count(GBDATA *gb_main)
GB_transaction ta(gb_var)
GB_CSTR GB_read_char_pntr(GBDATA *gbd)
AW_awar * awar_string(const char *var_name, const char *default_value="", AW_default default_file=AW_ROOT_DEFAULT)
GBDATA * GBT_get_SAI_data(GBDATA *gb_main)
GBDATA * GB_search(GBDATA *gbd, const char *fieldpath, GB_TYPES create)
char * aw_input(const char *title, const char *prompt, const char *default_input)
const char * replace(int i, const char *elem)
static void nt_rename_configuration(AW_window *aww)
long GBS_read_hash(const GB_HASH *hs, const char *key)
GBDATA * GB_entry(GBDATA *father, const char *key)
size_t get_position() const
AW_selection_list * get_sellist()
void aw_message_if(GB_ERROR error)
char * GBS_global_string_copy(const char *templat,...)
void set_definition(int area, char *new_def)
const char * last_group_name
GB_HASH * GBS_create_hash(long estimated_elements, GB_CASE case_sens)
void AWT_system_cb(AW_window *, const char *command)
static bool allow_to_activate_display
GB_write_int const char s