disable the unrecognized nls and x flags
[AROS-Contrib.git] / vpdf / pagenumberclass.c
blob449d8940ebc5e1f54452d51b0368637d745a7e9a
1 /// System includes
2 #include <proto/muimaster.h>
3 #include <libraries/mui.h>
4 #include <workbench/workbench.h>
5 #include <proto/exec.h>
6 #include <intuition/intuition.h>
7 #include <exec/libraries.h>
8 #include <proto/intuition.h>
9 #include <stdio.h>
10 #include <string.h>
12 #if defined(__AROS__)
13 #include <clib/arossupport_protos.h>
14 #endif
16 #include <proto/alib.h>
17 #include <proto/utility.h>
18 ////
20 #include <private/vapor/vapor.h>
21 #include "util.h"
22 #include "application.h"
23 #include "pagenumberclass.h"
24 #include "system/functions.h"
26 #define TYPE_END 0
27 #define TYPE_NUMBER 1
28 #define TYPE_RANGE 2
31 typedef struct
33 char type;
34 int min;
35 int max;
36 int page_number;
38 PageNumberItem;
41 struct Data
43 Object *str_pages;
44 char reverse;
45 int end;
46 int max;
47 int min;
48 int pos;
49 int sub_pos;
50 // int skip_mode;
51 PageNumberItem pages_bitmap[1024];
54 #define D(x) x
56 DEFNEW
58 Object *str_pages;
59 char initial_range[128];
61 if ((obj = (Object *) DoSuperNew(cl, obj,
63 Child, str_pages = StringObject,
64 MUIA_String_Accept, "0123456789-, ",
65 MUIA_Frame, MUIV_Frame_String,
66 End,
67 TAG_MORE, INITTAGS)))
69 GETDATA;
71 data->min = GetTagData(MUIA_VPDFNumberGeneratorPageStart, 1, INITTAGS);
72 data->max = GetTagData(MUIA_VPDFNumberGeneratorPageEnd, 999999999, INITTAGS);
73 data->reverse = FALSE;
74 data->str_pages = str_pages;
76 sprintf(initial_range, "1 - %d", data->end);
77 set(data->str_pages, MUIA_String_Contents, initial_range);
79 memset(data->pages_bitmap, 0, sizeof(data->pages_bitmap));
80 data->pos = 0;
81 data->sub_pos = -1; // position within range
84 return (IPTR)obj;
88 DEFDISP
90 GETDATA;
92 return DOSUPER;
95 DEFMMETHOD(VPDFNumberGeneratorFirst)
97 GETDATA;
98 char *str;
99 int total_pages = 0;
100 char *break_pos, *pch;
101 int current_pos = 0;
102 char buffer[1024];
103 data->pos = 0;
104 data->sub_pos = -1; // position within range
106 get(data->str_pages, MUIA_String_Contents, &str);
107 strcpy(buffer, str);
109 pch = strtok (buffer, ",");
111 while ((pch != NULL))
113 // checking if we have range here
114 if ((break_pos = (strchr(pch, '-'))))
117 data->pages_bitmap[current_pos].type = TYPE_RANGE;
118 data->pages_bitmap[current_pos].max = atoi(break_pos+1);
119 data->pages_bitmap[current_pos].min = atoi(pch);
121 if (data->pages_bitmap[current_pos].max<data->pages_bitmap[current_pos].min)
123 int tmp;
124 tmp = data->pages_bitmap[current_pos].min;
125 data->pages_bitmap[current_pos].min = data->pages_bitmap[current_pos].max;
126 data->pages_bitmap[current_pos].max = tmp;
130 if (data->pages_bitmap[current_pos].min==data->pages_bitmap[current_pos].max)
132 data->pages_bitmap[current_pos].type = TYPE_NUMBER;
133 data->pages_bitmap[current_pos].page_number = data->pages_bitmap[current_pos].max;
135 if (data->pages_bitmap[current_pos].page_number>data->max)
137 data->pages_bitmap[current_pos].page_number = data->max;
139 total_pages++;
141 else
143 if (data->pages_bitmap[current_pos].max>data->max)
145 data->pages_bitmap[current_pos].max = data->max;
147 total_pages += data->pages_bitmap[current_pos].max-data->pages_bitmap[current_pos].min+1;
150 D(kprintf("range [%d, %d]\n", data->pages_bitmap[current_pos].min, data->pages_bitmap[current_pos].max));
152 else // one page
154 data->pages_bitmap[current_pos].page_number = atoi(pch);
155 data->pages_bitmap[current_pos].type = TYPE_NUMBER;
157 if (data->pages_bitmap[current_pos].page_number>data->max)
159 data->pages_bitmap[current_pos].page_number = data->max;
161 total_pages++;
162 D(kprintf("number [%d]\n", data->pages_bitmap[current_pos].page_number));
164 current_pos++;
166 pch = strtok (NULL, ",");
169 data->pages_bitmap[current_pos].type = TYPE_END;
171 // if we have reverse mode turned on: start from end
172 if (msg->reverse == TRUE)
174 data->pos = current_pos-1;
175 data->reverse = TRUE;
177 else
179 data->reverse = FALSE;
183 return total_pages;
187 DEFMMETHOD(VPDFNumberGeneratorNext)
189 GETDATA;
191 if(!data->reverse)
193 switch(data->pages_bitmap[data->pos].type)
195 case TYPE_NUMBER:
196 data->pos++;
197 return data->pages_bitmap[data->pos - 1].page_number;
198 break;
199 case TYPE_RANGE:
200 if(data->sub_pos == -1) // start of range
202 data->sub_pos = data->pages_bitmap[data->pos].min;
203 return data->sub_pos;
205 else
207 data->sub_pos++;
209 if(data->sub_pos == data->pages_bitmap[data->pos].max)
211 data->pos++;
212 data->sub_pos = -1;
213 return data->pages_bitmap[data->pos - 1].max;
215 return data->sub_pos;
217 break;
218 default:
219 return MUIV_VPDFNumberGeneratorEndPos; // end of page list
220 break;
223 else // reverse mode
225 if (data->pos>=0)
227 switch(data->pages_bitmap[data->pos].type)
229 case TYPE_NUMBER:
230 data->pos--;
231 return data->pages_bitmap[data->pos + 1].page_number;
232 break;
233 case TYPE_RANGE:
234 if(data->sub_pos == -1) // start of range
236 data->sub_pos = data->pages_bitmap[data->pos].max;
237 return data->sub_pos;
239 else
241 data->sub_pos--;
243 if(data->sub_pos == data->pages_bitmap[data->pos].min)
245 data->pos--;
246 data->sub_pos = -1;
247 return data->pages_bitmap[data->pos + 1].min;
249 return data->sub_pos;
251 break;
254 else
255 return MUIV_VPDFNumberGeneratorEndPos;
257 return MUIV_VPDFNumberGeneratorEndPos;
261 DEFSET
263 char initial_range[128];
264 GETDATA;
266 FORTAG(INITTAGS)
268 /*case MUIA_VPDFNumberGeneratorPageSkip:
270 data->skip_mode = tag->ti_Data;
271 break;
275 case MUIA_VPDFNumberGeneratorPageStart:
276 data->min = tag->ti_Data;
277 sprintf(initial_range, "%d - %d", data->min, data->end);
278 set(data->str_pages, MUIA_String_Contents, initial_range);
279 break;
281 case MUIA_VPDFNumberGeneratorPageEnd:
282 data->end = tag->ti_Data;
283 sprintf(initial_range, "%d - %d", data->min, data->end);
284 set(data->str_pages, MUIA_String_Contents, initial_range);
285 break;
287 case MUIA_VPDFNumberGeneratorPageMax:
288 data->max = tag->ti_Data;
289 break;
292 NEXTTAG
294 return DOSUPER;
299 BEGINMTABLE
300 DECNEW
301 DECDISP
302 DECSET
303 DECMMETHOD(VPDFNumberGeneratorFirst)
304 DECMMETHOD(VPDFNumberGeneratorNext)
305 ENDMTABLE
307 DECSUBCLASS_NC(MUIC_Group, VPDFNumberGeneratorClass)