merge with master
[apps/home/mobileprint.git] / mobileprint / smsc / lib / smsc_smart.c
1 #include <Evas.h>
2
3 #include "smsc_debug.h"
4 #include "smsc_widget.h"
5
6 #include "smsc_smart.h"
7
8
9 #define _evas_smart_smsc_type "Evas_Smart_Smsc"
10
11
12 #define _evas_smart_smsc_type           "Evas_Smart_Smsc"
13 #define EVT_CHILDREN_NUMBER_CHANGED     "children,changed"
14
15
16 static const Evas_Smart_Cb_Description _smart_callbacks[] =
17 {
18    {EVT_CHILDREN_NUMBER_CHANGED, "i"},
19    {NULL, NULL}
20 };
21
22
23 struct _Evas_Smart_Smsc_Data {
24         Evas_Object_Smart_Clipped_Data base;
25         struct smsc_widget widget;
26         //Evas_Object *children[2];
27         /*Evas_Object *rect;
28         Evas_Object *bg;*/
29         int is_ready;
30         struct size_px widget_size;
31
32         int is_process_file;
33         char *fname;
34         char *ppd;
35         struct paper_size_pts paper_size;
36         enum page_orientation orientation;
37         int n_up;
38         struct page_scale scale;
39         int is_grayscale;
40 };
41
42
43 typedef struct _Evas_Smart_Smsc_Data Evas_Smart_Smsc_Data;
44
45
46 #define EVAS_SMART_SMSC_DATA_GET(o, ptr) \
47         Evas_Smart_Smsc_Data *ptr = evas_object_smart_data_get(o)
48
49 #define EVAS_SMART_SMSC_DATA_GET_OR_RETURN(o, ptr)              \
50         EVAS_SMART_SMSC_DATA_GET(o, ptr);                       \
51         if (!ptr) {                                             \
52                 fprintf(stderr, "No widget data for object %p (%s)!", \
53                                 o, evas_object_type_get(o));    \
54                 fflush(stderr);                                 \
55                 abort();                                        \
56                 return;                                         \
57         }
58
59 #define EVAS_SMART_SMSC_DATA_GET_OR_RETURN_VAL(o, ptr, val)     \
60         EVAS_SMART_SMSC_DATA_GET(o, ptr);                       \
61         if (!ptr) {                                             \
62                 fprintf(stderr, "No widget data for object %p (%s)!", \
63                                 o, evas_object_type_get(o));    \
64                 fflush(stderr);                                 \
65                 abort();                                        \
66                 return val;                                     \
67         }
68
69 EVAS_SMART_SUBCLASS_NEW(_evas_smart_smsc_type, _evas_smart_smsc,
70                 Evas_Smart_Class, Evas_Smart_Class,
71                 evas_object_smart_clipped_class_get, _smart_callbacks);
72
73
74 static void _evas_smart_smsc_smart_add(Evas_Object *o)
75 {
76         SMSC_TRACE_BEGIN;
77         EVAS_SMART_DATA_ALLOC(o, Evas_Smart_Smsc_Data);
78
79         /*priv->bg = evas_object_rectangle_add(evas_object_evas_get(o));
80         evas_object_color_set(priv->bg, 0, 255, 0, 255);
81         evas_object_smart_member_add(priv->bg, o);
82
83         priv->rect = evas_object_rectangle_add(evas_object_evas_get(o));
84         evas_object_color_set(priv->rect, 255, 0, 0, 255);
85         evas_object_smart_member_add(priv->rect, o);*/
86
87         init_smsc_widget(&(priv->widget), o);
88         priv->is_ready = 0;
89         memset(&(priv->widget_size), 0, sizeof(priv->widget_size));
90
91         priv->is_process_file = 0;
92         priv->fname = NULL;
93         priv->ppd = NULL;
94         memset(&(priv->paper_size), 0, sizeof(priv->paper_size));
95         priv->orientation = PAGE_ORIENTATION_PORTRAIT;
96         priv->n_up = 1;
97         memset(&(priv->scale), 0, sizeof(priv->scale));
98         priv->is_grayscale = 0;
99
100         _evas_smart_smsc_parent_sc->add(o);
101         SMSC_TRACE_END;
102 }
103
104
105 static void _evas_smart_smsc_smart_del(Evas_Object *o)
106 {
107         //EVAS_SMART_SMSC_DATA_GET(o, priv);
108
109         /* remove childrens */
110         /* TODO: destroy smsc_widget */
111
112         _evas_smart_smsc_parent_sc->del(o);
113 }
114
115
116 static void _evas_smart_smsc_smart_show(Evas_Object *o)
117 {
118         EVAS_SMART_SMSC_DATA_GET(o, priv);
119         /* show smsc_widget */
120         show_smsc_widget(&(priv->widget));
121         _evas_smart_smsc_parent_sc->show(o);
122 }
123
124
125 static void _evas_smart_smsc_smart_hide(Evas_Object *o)
126 {
127         EVAS_SMART_SMSC_DATA_GET(o, priv);
128         /* hide childrens */
129         /* TODO: save hide state for smsc_widget */
130         hide_smsc_widget(&(priv->widget));
131         _evas_smart_smsc_parent_sc->hide(o);
132 }
133
134
135 static void _evas_smart_smsc_smart_move(Evas_Object *o,
136                 Evas_Coord x, Evas_Coord y)
137 {
138         /* TODO: correct move event usage (provide picture moving animation) */
139         /*SMSC_TRACE_BEGIN;
140         SMSC_TRACE_END;*/
141 }
142
143
144 static void _evas_smart_smsc_smart_resize(Evas_Object *o,
145                 Evas_Coord w, Evas_Coord h)
146 {
147         SMSC_TRACE_BEGIN;
148         Evas_Coord ow, oh;
149         evas_object_geometry_get(o, NULL, NULL, &ow, &oh);
150         if ((ow == w) && (oh == h)) {
151                 SMSC_TRACE_END;
152                 return;
153         }
154
155         evas_object_smart_changed(o);
156         SMSC_TRACE_END;
157 }
158
159
160 void evas_smart_smsc_free_process_file_args(Evas_Smart_Smsc_Data *priv)
161 {
162         SMSC_RET_IF(NULL == priv, "priv is NULL");
163         SMSC_IF_FREE_MEM(priv->fname);
164         SMSC_IF_FREE_MEM(priv->ppd);
165         SMSC_IF_FREE_MEM(priv->paper_size.name);
166
167         priv->is_process_file = 0;
168 }
169
170
171 static void _evas_smart_smsc_smart_calculate(Evas_Object *o)
172 {
173         SMSC_TRACE_BEGIN;
174         Evas_Coord x, y, w, h;
175
176         EVAS_SMART_SMSC_DATA_GET_OR_RETURN(o, priv);
177         evas_object_geometry_get(o, &x, &y, &w, &h);
178         SMSC_DEBUG("Geometry: (%d, %d) : (%d, %d)",
179                         x, y, w, h);
180
181         /* change children sizes */
182         /*evas_object_resize(priv->rect, w - 10, h - 10);
183         evas_object_move(priv->rect, x + 5, y + 5);
184         evas_object_resize(priv->bg, w, h);
185         evas_object_move(priv->bg, 0, 0);*/
186
187         priv->widget_size.x = w;
188         priv->widget_size.y = h;
189         priv->is_ready = 1;
190
191         /* set widget offset */
192         priv->widget.off_x = x;
193         priv->widget.off_y = y;
194
195         clear_smsc_widget(&(priv->widget));
196
197         /* request to preview_engine for recalculation */
198         if (priv->is_process_file)
199                 process_preview_engine_file(&(priv->widget.engine), priv->fname,
200                                 priv->ppd, &(priv->paper_size),
201                                 &(priv->widget_size), priv->orientation,
202                                 priv->n_up, &(priv->scale), priv->is_grayscale);
203
204         SMSC_TRACE_END;
205 }
206
207
208 /* set smart interface */
209 static void _evas_smart_smsc_smart_set_user(Evas_Smart_Class *sc)
210 {
211         SMSC_TRACE_BEGIN;
212         sc->add = _evas_smart_smsc_smart_add;
213         sc->del = _evas_smart_smsc_smart_del;
214         sc->show = _evas_smart_smsc_smart_show;
215         sc->hide = _evas_smart_smsc_smart_hide;
216         sc->move = _evas_smart_smsc_smart_move;
217
218         sc->resize = _evas_smart_smsc_smart_resize;
219         sc->calculate = _evas_smart_smsc_smart_calculate;
220         SMSC_TRACE_END;
221 }
222
223
224 Evas_Object *evas_smart_smsc_add(Evas *evas)
225 {
226         Evas_Object *res;
227         SMSC_TRACE_BEGIN;
228         res = evas_object_smart_add(evas, _evas_smart_smsc_smart_class_new());
229         SMSC_TRACE_END;
230         return res;
231 }
232
233
234 int evas_smart_smsc_set_file(Evas_Object *o, const char *fname,
235                 const char *ppd, const struct paper_size_pts *paper_size,
236                 enum page_orientation orientation, int n_up,
237                 const struct page_scale *scale, int is_grayscale)
238 {
239         int res = 0;
240         SMSC_TRACE_BEGIN;
241         EVAS_SMART_SMSC_DATA_GET_OR_RETURN_VAL(o, priv, -1);
242
243         /* save configuration for future usage */
244         evas_smart_smsc_free_process_file_args(priv);
245
246         priv->fname = strdup(fname);
247         priv->ppd = strdup(ppd);
248         priv->paper_size = *paper_size;
249         priv->paper_size.name = strdup(paper_size->name);
250         priv->orientation = orientation;
251         priv->n_up = n_up;
252         priv->scale = *scale;
253         priv->is_grayscale = is_grayscale;
254
255         priv->is_process_file = 1;
256
257         /* TODO: clear widget */
258
259         /* request preview_engine for recalculation */
260         if (priv->is_ready) {
261                 clear_smsc_widget(&(priv->widget));
262                 res = process_preview_engine_file(&(priv->widget.engine),
263                                 priv->fname, priv->ppd, &(priv->paper_size),
264                                 &(priv->widget_size), priv->orientation,
265                                 priv->n_up, &(priv->scale), priv->is_grayscale);
266         }
267
268         SMSC_TRACE_END;
269         return res;
270 }
271
272
273 int evas_smart_smsc_set_layout(Evas_Object *o, Evas_Object *layout)
274 {
275         EVAS_SMART_SMSC_DATA_GET_OR_RETURN_VAL(o, priv, -1);
276         smsc_widget_set_layout(&(priv->widget), layout);
277         return 0;
278 }
279