1 | // ============================================================ // |
---|
2 | // // |
---|
3 | // File : refentries.h // |
---|
4 | // Purpose : functions for fields containing references to // |
---|
5 | // other item (as names) // |
---|
6 | // // |
---|
7 | // Coded by Ralf Westram (coder@reallysoft.de) in June 2011 // |
---|
8 | // Institute of Microbiology (Technical University Munich) // |
---|
9 | // http://www.arb-home.de/ // |
---|
10 | // // |
---|
11 | // ============================================================ // |
---|
12 | |
---|
13 | #ifndef REFENTRIES_H |
---|
14 | #define REFENTRIES_H |
---|
15 | |
---|
16 | #ifndef ARB_ERROR_H |
---|
17 | #include <arb_error.h> |
---|
18 | #endif |
---|
19 | #ifndef ARB_STRING_H |
---|
20 | #include <arb_string.h> |
---|
21 | #endif |
---|
22 | #ifndef ARBDB_BASE_H |
---|
23 | #include <arbdb_base.h> |
---|
24 | #endif |
---|
25 | #ifndef AW_BASE_HXX |
---|
26 | #include <aw_base.hxx> |
---|
27 | #endif |
---|
28 | #ifndef _GLIBCXX_SET |
---|
29 | #include <set> |
---|
30 | #endif |
---|
31 | #ifndef DBITEM_SET_H |
---|
32 | #include <dbitem_set.h> |
---|
33 | #endif |
---|
34 | #ifndef ITEMS_H |
---|
35 | #include <items.h> |
---|
36 | #endif |
---|
37 | |
---|
38 | #define re_assert(cond) arb_assert(cond) |
---|
39 | |
---|
40 | |
---|
41 | namespace RefEntries { |
---|
42 | |
---|
43 | typedef ARB_ERROR (*referred_item_handler)(GBDATA *gb_main, const DBItemSet& referred); // called with all referred items |
---|
44 | |
---|
45 | class RefSelector : virtual Noncopyable { |
---|
46 | char *field; // name of field containing references |
---|
47 | char *aci; // postprocess expression for field-content |
---|
48 | |
---|
49 | bool error_if_field_missing; |
---|
50 | bool error_if_ref_unknown; |
---|
51 | public: |
---|
52 | RefSelector(const char *field_, const char *aci_, bool error_if_field_missing_, bool error_if_ref_unknown_) |
---|
53 | : field(ARB_strdup(field_)), |
---|
54 | aci(ARB_strdup(aci_)), |
---|
55 | error_if_field_missing(error_if_field_missing_), |
---|
56 | error_if_ref_unknown(error_if_ref_unknown_) |
---|
57 | {} |
---|
58 | ~RefSelector() { |
---|
59 | free(aci); |
---|
60 | free(field); |
---|
61 | } |
---|
62 | |
---|
63 | const char *get_refs(ItemSelector& itemtype, GBDATA *gb_item) const; |
---|
64 | char *filter_refs(const char *refs, GBDATA *gb_item) const; |
---|
65 | |
---|
66 | bool ignore_unknown_refs() const { return !error_if_ref_unknown; } |
---|
67 | const char *get_field() const { return field; } |
---|
68 | }; |
---|
69 | |
---|
70 | class ReferringEntriesHandler { |
---|
71 | GBDATA *gb_main; |
---|
72 | ItemSelector& itemtype; |
---|
73 | |
---|
74 | public: |
---|
75 | ReferringEntriesHandler(GBDATA *gb_main_, ItemSelector& itemtype_) |
---|
76 | : gb_main(gb_main_), |
---|
77 | itemtype(itemtype_) |
---|
78 | { |
---|
79 | re_assert(&itemtype); |
---|
80 | } |
---|
81 | |
---|
82 | GBDATA *get_gbmain() const { return gb_main; } |
---|
83 | ItemSelector& get_referring_item() const { return itemtype; } |
---|
84 | |
---|
85 | |
---|
86 | ARB_ERROR with_all_referred_items(GBDATA *gb_item, const RefSelector& refsel, referred_item_handler cb); |
---|
87 | ARB_ERROR with_all_referred_items(QUERY_RANGE range, const RefSelector& refsel, referred_item_handler cb); |
---|
88 | }; |
---|
89 | |
---|
90 | // -------------------------- |
---|
91 | // GUI related below |
---|
92 | |
---|
93 | typedef void (*client_area_builder)(AW_window *aw_reh); // callback to build client area in RefEntriesHandler window |
---|
94 | |
---|
95 | AW_window *create_refentries_window(AW_root *awr, ReferringEntriesHandler *reh, const char *window_id, const char *title, const char *help, client_area_builder build_client_area, const char *action, referred_item_handler action_cb); |
---|
96 | void create_refentries_awars(AW_root *aw_root, AW_default aw_def); |
---|
97 | }; |
---|
98 | |
---|
99 | #else |
---|
100 | #error refentries.h included twice |
---|
101 | #endif // REFENTRIES_H |
---|