source: tags/ms_r16q3/SL/DB_UI/info_window.cxx

Last change on this file was 10444, checked in by epruesse, 11 years ago

rename buttons in species information window

  • DETACH → "New window…" (more easy to understand, detach was a mystery to many)
  • GET → "Update"
  • do not shout (CLOSE → Close, etc.)
File size: 3.8 KB
Line 
1// ============================================================ //
2//                                                              //
3//   File      : info_window.cxx                                //
4//   Purpose   :                                                //
5//                                                              //
6//   Coded by Ralf Westram (coder@reallysoft.de) in July 2013   //
7//   Institute of Microbiology (Technical University Munich)    //
8//   http://www.arb-home.de/                                    //
9//                                                              //
10// ============================================================ //
11
12#include "info_window.h"
13#include <dbui.h>
14#include <arb_str.h>
15#include <aw_msg.hxx>
16
17InfoWindowRegistry InfoWindowRegistry::infowin;
18
19// ------------------------------------------------
20//      item-independent info window callbacks
21
22static void map_item_cb(AW_root *, const InfoWindow *infoWin) {
23    infoWin->map_selected_item();
24}
25
26static void store_unused_detached_info_window_cb(AW_window *aw_detached) {
27    const InfoWindow *infoWin = InfoWindowRegistry::infowin.find(aw_detached);
28    arb_assert(infoWin); // forgot to registerInfoWindow?
29    if (infoWin) {
30        arb_assert(infoWin->is_used());
31        infoWin->set_used(false);
32        infoWin->map_item(NULL);
33    }
34}
35
36void DBUI::init_info_window(AW_root *aw_root, AW_window_simple_menu *aws, const ItemSelector& itemType, int detach_id) {
37    char *window_id;
38    char *window_title;
39    {
40        const char *itemname = itemType.item_name;
41        char       *ITEMNAME = ARB_strupper(strdup(itemname));
42
43        if (detach_id == InfoWindow::MAIN_WINDOW) {
44            char *Itemname = strdup(itemname); Itemname[0] = ITEMNAME[0];
45            window_id      = GBS_global_string_copy("%s_INFORMATION", ITEMNAME);
46            window_title   = GBS_global_string_copy("%s information", Itemname);
47            free(Itemname);
48        }
49        else {
50            window_id    = GBS_global_string_copy("%s_INFODETACH_%i", ITEMNAME, detach_id);
51            window_title = strdup("<detaching>");
52        }
53        free(ITEMNAME);
54    }
55
56    aws->init(aw_root, window_id, window_title);
57
58    free(window_title);
59    free(window_id);
60
61    if (!detach_id == InfoWindow::MAIN_WINDOW) {
62        aws->on_hide(store_unused_detached_info_window_cb);
63    }
64}
65
66void InfoWindow::bind_to_selected_item() const {
67    arb_assert(is_maininfo());
68    getSelector().add_selection_changed_cb(get_root(), makeRootCallback(map_item_cb, this));
69}
70
71void InfoWindow::display_selected_item() const {
72    arb_assert(is_detached());
73    attach_selected_item();
74    if (!get_selected_item()) {
75        aw_message(GBS_global_string("Please select a %s, afterwards retry to attach it here", itemname()));
76    }
77}
78
79void InfoWindow::detach_selected_item(detached_uppopper popup_detached_cb) const {
80    if (get_selected_item()) {
81        popup_detached_cb(aww, this);
82    }
83    else {
84        aw_message(GBS_global_string("Please select a %s, afterwards retry to detach it", itemname()));
85    }
86}
87
88static void detach_selected_item_cb(AW_window *, InfoWindow::detached_uppopper popup_detached_cb, const InfoWindow *infoWin) {
89    infoWin->detach_selected_item(popup_detached_cb);
90}
91static void display_selected_item_cb(AW_window *, const InfoWindow *infoWin) {
92    infoWin->display_selected_item();
93}
94
95void InfoWindow::add_detachOrGet_button(detached_uppopper popup_detached_cb) const {
96    if (is_maininfo()) {
97        bind_to_selected_item();
98
99        aww->callback(makeWindowCallback(detach_selected_item_cb, popup_detached_cb, this));
100        aww->create_autosize_button("DETACH", "New window...", "S");
101    }
102    else {
103        aww->callback(makeWindowCallback(display_selected_item_cb, this));
104        aww->create_autosize_button("GET", "Update", "U");
105    }
106}
Note: See TracBrowser for help on using the repository browser.