update for beta release
[framework/uifw/e17.git] / src / modules / everything / evry_plug_collection.c
1 #include "e_mod_main.h"
2
3 typedef struct _Plugin Plugin;
4
5 struct _Plugin
6 {
7    Evry_Plugin base;
8
9    Eina_List  *plugins;
10 };
11
12 static Eina_List *plugins = NULL;
13 static Evry_Type COLLECTION_PLUGIN;
14 static Plugin_Config plugin_config;
15
16 static Evry_Plugin *
17 _browse(Evry_Plugin *plugin, const Evry_Item *item)
18 {
19    Evry_Plugin *inst;
20    Evry_Plugin *pp;
21
22    Plugin_Config *pc;
23
24    if (!CHECK_TYPE(item, COLLECTION_PLUGIN))
25      return NULL;
26
27    if (item->plugin != plugin)
28      return NULL;
29
30    pc = item->data;
31    pp = pc->plugin;
32
33    if (pp->begin && (inst = pp->begin(pp, NULL)))
34      {
35         if (!strcmp(plugin->name, "Plugins"))
36           inst->config = &plugin_config;
37         else
38           inst->config = pc;
39
40         return inst;
41      }
42
43    return NULL;
44 }
45
46 static Evry_Item *
47 _add_item(Plugin *p, Plugin_Config *pc)
48 {
49    Evry_Plugin *pp;
50    Evry_Item *it = NULL;
51
52    if (pc->enabled && (pp = evry_plugin_find(pc->name)))
53      {
54         pc->plugin = pp;
55
56         GET_ITEM(itp, pp);
57         it = EVRY_ITEM_NEW(Evry_Item, EVRY_PLUGIN(p), itp->label, NULL, NULL);
58         if (itp->icon) it->icon = eina_stringshare_ref(itp->icon);
59         it->icon_get = itp->icon_get;
60         it->data = pc;
61         it->browseable = EINA_TRUE;
62         it->detail = eina_stringshare_ref(EVRY_ITEM(p)->label);
63         p->plugins = eina_list_append(p->plugins, it);
64      }
65    return it;
66 }
67
68 static Evry_Plugin *
69 _begin(Evry_Plugin *plugin, const Evry_Item *item __UNUSED__)
70 {
71    Plugin_Config *pc;
72    Eina_List *l;
73    Plugin *p;
74
75    EVRY_PLUGIN_INSTANCE(p, plugin);
76
77    EINA_LIST_FOREACH (plugin->config->plugins, l, pc)
78      _add_item(p, pc);
79
80    return EVRY_PLUGIN(p);
81 }
82
83 static Evry_Plugin *
84 _begin_all(Evry_Plugin *plugin, const Evry_Item *item __UNUSED__)
85 {
86    Plugin_Config *pc;
87    Eina_List *l;
88    Plugin *p;
89
90    EVRY_PLUGIN_INSTANCE(p, plugin);
91
92    EINA_LIST_FOREACH (evry_conf->conf_subjects, l, pc)
93      {
94         if (!strcmp(pc->name, "All") ||
95             !strcmp(pc->name, "Actions") ||
96             !strcmp(pc->name, "Calculator") ||
97             !strcmp(pc->name, "Plugins"))
98           continue;
99
100         _add_item(p, pc);
101      }
102
103    return EVRY_PLUGIN(p);
104 }
105
106 static void
107 _finish(Evry_Plugin *plugin)
108 {
109    Evry_Item *it;
110
111    GET_PLUGIN(p, plugin);
112
113    EVRY_PLUGIN_ITEMS_CLEAR(p);
114
115    EINA_LIST_FREE (p->plugins, it)
116      EVRY_ITEM_FREE(it);
117
118    E_FREE(p);
119 }
120
121 static int
122 _fetch(Evry_Plugin *plugin, const char *input)
123 {
124    GET_PLUGIN(p, plugin);
125
126    EVRY_PLUGIN_ITEMS_CLEAR(p);
127
128    EVRY_PLUGIN_ITEMS_ADD(p, p->plugins, input, 1, 0);
129
130    return EVRY_PLUGIN_HAS_ITEMS(p);
131 }
132
133 static Evry_Plugin *
134 _add_plugin(const char *name)
135 {
136    Evry_Plugin *p;
137    char path[4096];
138    char title[4096];
139
140    p = EVRY_PLUGIN_BASE(name, NULL, COLLECTION_PLUGIN,
141                         _begin, _finish, _fetch);
142    p->browse = &_browse;
143
144    snprintf(path, sizeof(path), "launcher/everything-%s", p->name);
145
146    snprintf(title, sizeof(title), "%s: %s", _("Everything Plugin"), p->base.label);
147
148    e_configure_registry_item_params_add
149      (path, 110, title, NULL, p->base.icon, evry_collection_conf_dialog, p->name);
150
151    p->config_path = eina_stringshare_add(path);
152
153    plugins = eina_list_append(plugins, p);
154
155    return p;
156 }
157
158 Eina_Bool
159 evry_plug_collection_init(void)
160 {
161    Evry_Plugin *p;
162    Plugin_Config *pc;
163    Eina_List *l;
164
165    plugin_config.min_query = 0;
166    plugin_config.top_level = EINA_TRUE;
167    plugin_config.aggregate = EINA_FALSE;
168    plugin_config.view_mode = VIEW_MODE_DETAIL;
169
170    COLLECTION_PLUGIN = evry_type_register("COLLECTION_PLUGIN");
171
172    p = _add_plugin("Plugins");
173    p->begin = &_begin_all;
174    EVRY_ITEM_ICON_SET(p, "preferences-plugin");
175
176    if (evry_plugin_register(p, EVRY_PLUGIN_SUBJECT, 100))
177      {
178         p->config->aggregate = EINA_TRUE;
179         p->config->top_level = EINA_TRUE;
180         p->config->view_mode = VIEW_MODE_THUMB;
181      }
182
183    EINA_LIST_FOREACH (evry_conf->collections, l, pc)
184      {
185         p = _add_plugin(pc->name);
186         EVRY_ITEM_ICON_SET(p, "start-here");
187         p->config = pc;
188         pc->plugin = p;
189
190         if (evry_plugin_register(p, EVRY_PLUGIN_SUBJECT, 1))
191           p->config->aggregate = EINA_FALSE;
192      }
193
194    return EINA_TRUE;
195 }
196
197 void
198 evry_plug_collection_shutdown(void)
199 {
200    Evry_Plugin *p;
201
202    EINA_LIST_FREE (plugins, p)
203      {
204         if (p->config_path)
205           {
206              e_configure_registry_item_del(p->config_path);
207              eina_stringshare_del(p->config_path);
208           }
209
210         EVRY_PLUGIN_FREE(p);
211      }
212 }
213