source: trunk/SL/REFENTRIES/refentries.h

Last change on this file was 15176, checked in by westram, 8 years ago
File size: 3.4 KB
Line 
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
41namespace 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
Note: See TracBrowser for help on using the repository browser.