don't crash when loading images > 65kB (fixes #13529)
[swfdec.git] / libswfdec / swfdec_text_field_movie_as.c
blob33578b3c8d8151276d1d1f72a050b03347642e5f
1 /* Swfdec
2 * Copyright (C) 2007 Benjamin Otte <otte@gnome.org>
3 * 2007 Pekka Lampila <pekka.lampila@iki.fi>
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 * Boston, MA 02110-1301 USA
21 #ifdef HAVE_CONFIG_H
22 #include "config.h"
23 #endif
25 #include <string.h>
26 #include <pango/pangocairo.h>
28 #include "swfdec_text_field.h"
29 #include "swfdec_text_field_movie.h"
30 #include "swfdec_as_strings.h"
31 #include "swfdec_debug.h"
32 #include "swfdec_as_native_function.h"
33 #include "swfdec_as_internal.h"
34 #include "swfdec_as_context.h"
35 #include "swfdec_as_object.h"
36 #include "swfdec_as_frame_internal.h"
37 #include "swfdec_internal.h"
38 #include "swfdec_player_internal.h"
40 static SwfdecColor
41 swfdec_text_field_movie_int_to_color (SwfdecAsContext *cx, int value)
43 if (value < 0) {
44 value = (0xffffff + 1) + value % (0xffffff + 1);
45 } else {
46 value = value % (0xffffff + 1);
49 return SWFDEC_COLOR_COMBINE (value >> 16 & 0xff, value >> 8 & 0xff,
50 value & 0xff, 0);
53 // does nothing but calls valueOf
54 static void
55 swfdec_text_field_movie_set_readonly (SwfdecAsContext *cx,
56 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
57 SwfdecAsValue *ret)
59 SwfdecTextFieldMovie *text;
61 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
63 if (argc > 0)
64 swfdec_as_value_to_number (cx, &argv[0]);
68 * Native properties: Text
70 static void
71 swfdec_text_field_movie_do_get_text (SwfdecAsContext *cx,
72 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
73 SwfdecAsValue *ret)
75 SwfdecTextFieldMovie *text;
77 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
79 SWFDEC_AS_VALUE_SET_STRING (ret, swfdec_text_field_movie_get_text (text));
82 static void
83 swfdec_text_field_movie_do_set_text (SwfdecAsContext *cx,
84 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
85 SwfdecAsValue *ret)
87 SwfdecTextFieldMovie *text;
88 const char *value;
90 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "s", &value);
92 swfdec_text_field_movie_set_text (text, value, FALSE);
94 if (text->variable != NULL) {
95 if (text->text->html) {
96 swfdec_text_field_movie_set_listen_variable_text (text,
97 swfdec_text_field_movie_get_html_text (text));
98 } else {
99 swfdec_text_field_movie_set_listen_variable_text (text,
100 swfdec_text_field_movie_get_text (text));
105 static void
106 swfdec_text_field_movie_get_html (SwfdecAsContext *cx, SwfdecAsObject *object,
107 guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret)
109 SwfdecTextFieldMovie *text;
111 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
113 SWFDEC_AS_VALUE_SET_BOOLEAN (ret, text->text->html);
116 static void
117 swfdec_text_field_movie_set_html (SwfdecAsContext *cx, SwfdecAsObject *object,
118 guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret)
120 SwfdecTextFieldMovie *text;
121 gboolean value;
123 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "b", &value);
125 swfdec_as_value_to_number (cx, &argv[0]);
127 text->text->html = value;
129 // FIXME: resize? invalidate?
132 static void
133 swfdec_text_field_movie_get_htmlText (SwfdecAsContext *cx,
134 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
135 SwfdecAsValue *ret)
137 SwfdecTextFieldMovie *text;
139 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
141 if (text->style_sheet_input) {
142 SWFDEC_AS_VALUE_SET_STRING (ret, text->style_sheet_input);
143 } else if (text->text->html) {
144 SWFDEC_AS_VALUE_SET_STRING (ret,
145 swfdec_text_field_movie_get_html_text (text));
146 } else {
147 SWFDEC_AS_VALUE_SET_STRING (ret,
148 swfdec_text_field_movie_get_text (text));
152 static void
153 swfdec_text_field_movie_set_htmlText (SwfdecAsContext *cx,
154 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
155 SwfdecAsValue *ret)
157 SwfdecTextFieldMovie *text;
158 const char *value;
160 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "s", &value);
162 swfdec_text_field_movie_set_text (text, value, text->text->html);
164 if (text->variable != NULL) {
165 if (text->text->html) {
166 swfdec_text_field_movie_set_listen_variable_text (text,
167 swfdec_text_field_movie_get_html_text (text));
168 } else {
169 swfdec_text_field_movie_set_listen_variable_text (text,
170 swfdec_text_field_movie_get_text (text));
175 static void
176 swfdec_text_field_movie_get_length (SwfdecAsContext *cx, SwfdecAsObject *object,
177 guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret)
179 SwfdecTextFieldMovie *text;
181 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
183 SWFDEC_AS_VALUE_SET_INT (ret, g_utf8_strlen (text->input->str, -1));
187 * Native properties: Input
189 static void
190 swfdec_text_field_movie_get_condenseWhite (SwfdecAsContext *cx,
191 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
192 SwfdecAsValue *ret)
194 SwfdecTextFieldMovie *text;
196 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
198 SWFDEC_AS_VALUE_SET_BOOLEAN (ret, text->condense_white);
201 static void
202 swfdec_text_field_movie_set_condenseWhite (SwfdecAsContext *cx,
203 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
204 SwfdecAsValue *ret)
206 SwfdecTextFieldMovie *text;
207 gboolean value;
209 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "b", &value);
211 swfdec_as_value_to_number (cx, &argv[0]);
213 text->condense_white = value;
216 static void
217 swfdec_text_field_movie_get_maxChars (SwfdecAsContext *cx,
218 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
219 SwfdecAsValue *ret)
221 SwfdecTextFieldMovie *text;
223 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
225 if (text->text->max_chars != 0) {
226 SWFDEC_AS_VALUE_SET_INT (ret, text->text->max_chars);
227 } else {
228 SWFDEC_AS_VALUE_SET_NULL (ret);
232 static void
233 swfdec_text_field_movie_set_maxChars (SwfdecAsContext *cx,
234 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
235 SwfdecAsValue *ret)
237 SwfdecTextFieldMovie *text;
239 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
241 if (argc < 1)
242 return;
244 swfdec_as_value_to_number (cx, &argv[0]);
245 text->text->max_chars = swfdec_as_value_to_integer (cx, &argv[0]);
248 static void
249 swfdec_text_field_movie_get_multiline (SwfdecAsContext *cx,
250 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
251 SwfdecAsValue *ret)
253 SwfdecTextFieldMovie *text;
255 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
257 SWFDEC_AS_VALUE_SET_BOOLEAN (ret, text->text->multiline);
260 static void
261 swfdec_text_field_movie_set_multiline (SwfdecAsContext *cx,
262 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
263 SwfdecAsValue *ret)
265 SwfdecTextFieldMovie *text;
266 gboolean value;
268 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "b", &value);
270 swfdec_as_value_to_number (cx, &argv[0]);
272 text->text->multiline = value;
275 static void
276 swfdec_text_field_movie_get_restrict (SwfdecAsContext *cx,
277 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
278 SwfdecAsValue *ret)
280 SwfdecTextFieldMovie *text;
282 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
284 if (text->restrict_ != NULL) {
285 SWFDEC_AS_VALUE_SET_STRING (ret, text->restrict_);
286 } else {
287 SWFDEC_AS_VALUE_SET_NULL (ret);
291 static void
292 swfdec_text_field_movie_set_restrict (SwfdecAsContext *cx,
293 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
294 SwfdecAsValue *ret)
296 SwfdecTextFieldMovie *text;
297 const char *value;
299 if (argc > 0)
300 swfdec_as_value_to_number (cx, &argv[0]);
302 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "s", &value);
304 if (SWFDEC_AS_VALUE_IS_UNDEFINED (&argv[0]) ||
305 SWFDEC_AS_VALUE_IS_NULL (&argv[0])) {
306 text->restrict_ = NULL;
307 } else {
308 text->restrict_ = value;
312 static void
313 swfdec_text_field_movie_get_selectable (SwfdecAsContext *cx,
314 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
315 SwfdecAsValue *ret)
317 SwfdecTextFieldMovie *text;
319 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
321 SWFDEC_AS_VALUE_SET_BOOLEAN (ret, text->text->selectable);
324 static void
325 swfdec_text_field_movie_set_selectable (SwfdecAsContext *cx,
326 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
327 SwfdecAsValue *ret)
329 SwfdecTextFieldMovie *text;
330 gboolean value;
332 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "b", &value);
334 swfdec_as_value_to_number (cx, &argv[0]);
336 text->text->selectable = value;
338 // FIXME: invalidate
341 static void
342 swfdec_text_field_movie_do_get_type (SwfdecAsContext *cx,
343 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
344 SwfdecAsValue *ret)
346 SwfdecTextFieldMovie *text;
348 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
350 if (text->text->editable) {
351 SWFDEC_AS_VALUE_SET_STRING (ret, SWFDEC_AS_STR_input);
352 } else {
353 SWFDEC_AS_VALUE_SET_STRING (ret, SWFDEC_AS_STR_dynamic);
357 static void
358 swfdec_text_field_movie_do_set_type (SwfdecAsContext *cx,
359 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
360 SwfdecAsValue *ret)
362 SwfdecTextFieldMovie *text;
363 const char *value;
365 if (argc > 0)
366 swfdec_as_value_to_number (cx, &argv[0]);
368 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "s", &value);
370 if (!g_strcasecmp (value, SWFDEC_AS_STR_input)) {
371 text->text->editable = TRUE;
372 } else if (!g_strcasecmp (value, SWFDEC_AS_STR_dynamic)) {
373 text->text->editable = FALSE;
376 // FIXME: invalidate
379 static void
380 swfdec_text_field_movie_do_get_variable (SwfdecAsContext *cx,
381 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
382 SwfdecAsValue *ret)
384 SwfdecTextFieldMovie *text;
386 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
388 if (text->variable) {
389 SWFDEC_AS_VALUE_SET_STRING (ret, text->variable);
390 } else {
391 SWFDEC_AS_VALUE_SET_NULL (ret);
395 static void
396 swfdec_text_field_movie_do_set_variable (SwfdecAsContext *cx,
397 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
398 SwfdecAsValue *ret)
400 SwfdecTextFieldMovie *text;
401 const char *value;
403 if (argc > 0)
404 swfdec_as_value_to_number (cx, &argv[0]);
406 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "s", &value);
408 if (SWFDEC_AS_VALUE_IS_UNDEFINED (&argv[0]) ||
409 SWFDEC_AS_VALUE_IS_NULL (&argv[0]) || value == SWFDEC_AS_STR_EMPTY) {
410 value = NULL;
413 swfdec_text_field_movie_set_listen_variable (text, value);
417 * Native properties: Info
419 static void
420 swfdec_text_field_movie_get_textHeight (SwfdecAsContext *cx,
421 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
422 SwfdecAsValue *ret)
424 SwfdecTextFieldMovie *text;
425 int height;
427 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
429 swfdec_text_field_movie_get_text_size (text, NULL, &height);
430 SWFDEC_AS_VALUE_SET_NUMBER (ret, SWFDEC_TWIPS_TO_DOUBLE (height));
433 static void
434 swfdec_text_field_movie_get_textWidth (SwfdecAsContext *cx,
435 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
436 SwfdecAsValue *ret)
438 SwfdecTextFieldMovie *text;
439 int width;
441 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
443 swfdec_text_field_movie_get_text_size (text, &width, NULL);
444 SWFDEC_AS_VALUE_SET_NUMBER (ret, SWFDEC_TWIPS_TO_DOUBLE (width));
448 * Native properties: Background & border
450 static void
451 swfdec_text_field_movie_get_background (SwfdecAsContext *cx,
452 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
453 SwfdecAsValue *ret)
455 SwfdecTextFieldMovie *text;
457 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
459 SWFDEC_AS_VALUE_SET_BOOLEAN (ret, text->text->background);
462 static void
463 swfdec_text_field_movie_set_background (SwfdecAsContext *cx,
464 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
465 SwfdecAsValue *ret)
467 SwfdecTextFieldMovie *text;
468 gboolean value;
470 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "b", &value);
472 swfdec_as_value_to_number (cx, &argv[0]);
474 if (text->text->background != value) {
475 text->text->background = value;
476 swfdec_movie_invalidate_last (SWFDEC_MOVIE (text));
480 static void
481 swfdec_text_field_movie_get_backgroundColor (SwfdecAsContext *cx,
482 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
483 SwfdecAsValue *ret)
485 SwfdecTextFieldMovie *text;
487 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
489 SWFDEC_AS_VALUE_SET_NUMBER (ret,
490 SWFDEC_COLOR_R (text->background_color) << 16 |
491 SWFDEC_COLOR_G (text->background_color) << 8 |
492 SWFDEC_COLOR_B (text->background_color));
495 static void
496 swfdec_text_field_movie_set_backgroundColor (SwfdecAsContext *cx,
497 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
498 SwfdecAsValue *ret)
500 SwfdecTextFieldMovie *text;
501 int value;
502 SwfdecColor color;
504 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "i", &value);
506 color = swfdec_text_field_movie_int_to_color (cx, value);
507 if (text->background_color != color) {
508 text->background_color = color;
509 swfdec_movie_invalidate_last (SWFDEC_MOVIE (text));
513 static void
514 swfdec_text_field_movie_get_border (SwfdecAsContext *cx,
515 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
516 SwfdecAsValue *ret)
518 SwfdecTextFieldMovie *text;
520 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
522 SWFDEC_AS_VALUE_SET_BOOLEAN (ret, text->text->border);
525 static void
526 swfdec_text_field_movie_set_border (SwfdecAsContext *cx,
527 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
528 SwfdecAsValue *ret)
530 SwfdecTextFieldMovie *text;
531 gboolean value;
533 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "b", &value);
535 swfdec_as_value_to_number (cx, &argv[0]);
537 if (text->text->border != value) {
538 text->text->border = value;
539 swfdec_movie_invalidate_last (SWFDEC_MOVIE (text));
543 static void
544 swfdec_text_field_movie_get_borderColor (SwfdecAsContext *cx,
545 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
546 SwfdecAsValue *ret)
548 SwfdecTextFieldMovie *text;
550 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
553 SWFDEC_AS_VALUE_SET_NUMBER (ret,
554 SWFDEC_COLOR_R (text->border_color) << 16 |
555 SWFDEC_COLOR_G (text->border_color) << 8 |
556 SWFDEC_COLOR_B (text->border_color));
559 static void
560 swfdec_text_field_movie_set_borderColor (SwfdecAsContext *cx,
561 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
562 SwfdecAsValue *ret)
564 SwfdecTextFieldMovie *text;
565 int value;
566 SwfdecColor color;
568 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "i", &value);
570 color = swfdec_text_field_movie_int_to_color (cx, value);
571 if (text->border_color != color) {
572 text->border_color = color;
573 swfdec_movie_invalidate_last (SWFDEC_MOVIE (text));
578 * Native properties: Scrolling
580 static void
581 swfdec_text_field_movie_get_bottomScroll (SwfdecAsContext *cx,
582 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
583 SwfdecAsValue *ret)
585 SwfdecTextFieldMovie *text;
587 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
589 SWFDEC_AS_VALUE_SET_NUMBER (ret, text->scroll_bottom);
592 static void
593 swfdec_text_field_movie_do_get_hscroll (SwfdecAsContext *cx,
594 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
595 SwfdecAsValue *ret)
597 SwfdecTextFieldMovie *text;
599 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
601 SWFDEC_AS_VALUE_SET_NUMBER (ret, text->hscroll);
604 static void
605 swfdec_text_field_movie_do_set_hscroll (SwfdecAsContext *cx,
606 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
607 SwfdecAsValue *ret)
609 SwfdecTextFieldMovie *text;
610 int value;
612 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "i", &value);
614 value = CLAMP (value, 0, text->hscroll_max);
615 if (value != text->hscroll) {
616 text->hscroll = value;
617 text->scroll_changed = TRUE;
618 swfdec_movie_invalidate_last (SWFDEC_MOVIE (text));
622 static void
623 swfdec_text_field_movie_get_maxhscroll (SwfdecAsContext *cx,
624 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
625 SwfdecAsValue *ret)
627 SwfdecTextFieldMovie *text;
629 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
631 if (!text->text->word_wrap) {
632 SWFDEC_AS_VALUE_SET_NUMBER (ret, text->hscroll_max);
633 } else {
634 SWFDEC_AS_VALUE_SET_NUMBER (ret, 0);
638 static void
639 swfdec_text_field_movie_get_maxscroll (SwfdecAsContext *cx,
640 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
641 SwfdecAsValue *ret)
643 SwfdecTextFieldMovie *text;
645 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
647 SWFDEC_AS_VALUE_SET_NUMBER (ret, text->scroll_max);
650 static void
651 swfdec_text_field_movie_get_mouseWheelEnabled (SwfdecAsContext *cx,
652 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
653 SwfdecAsValue *ret)
655 SwfdecTextFieldMovie *text;
657 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
659 SWFDEC_AS_VALUE_SET_BOOLEAN (ret, text->mouse_wheel_enabled);
662 static void
663 swfdec_text_field_movie_set_mouseWheelEnabled (SwfdecAsContext *cx,
664 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
665 SwfdecAsValue *ret)
667 SwfdecTextFieldMovie *text;
668 gboolean value;
670 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "b", &value);
672 swfdec_as_value_to_number (cx, &argv[0]);
674 text->mouse_wheel_enabled = value;
677 static void
678 swfdec_text_field_movie_do_get_scroll (SwfdecAsContext *cx,
679 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
680 SwfdecAsValue *ret)
682 SwfdecTextFieldMovie *text;
684 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
686 SWFDEC_AS_VALUE_SET_NUMBER (ret, text->scroll);
689 static void
690 swfdec_text_field_movie_do_set_scroll (SwfdecAsContext *cx,
691 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
692 SwfdecAsValue *ret)
694 SwfdecTextFieldMovie *text;
695 int value;
697 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "i", &value);
699 value = CLAMP (value, 1, text->scroll_max);
700 if (value != text->scroll) {
701 text->scroll_bottom += value - text->scroll;
702 text->scroll = value;
703 text->scroll_changed = TRUE;
704 swfdec_movie_invalidate_last (SWFDEC_MOVIE (text));
709 * Native properties: Display
711 static void
712 swfdec_text_field_movie_get_autoSize (SwfdecAsContext *cx,
713 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
714 SwfdecAsValue *ret)
716 SwfdecTextFieldMovie *text;
718 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
720 switch (text->text->auto_size) {
721 case SWFDEC_AUTO_SIZE_NONE:
722 SWFDEC_AS_VALUE_SET_STRING (ret, SWFDEC_AS_STR_none);
723 break;
724 case SWFDEC_AUTO_SIZE_LEFT:
725 SWFDEC_AS_VALUE_SET_STRING (ret, SWFDEC_AS_STR_left);
726 break;
727 case SWFDEC_AUTO_SIZE_RIGHT:
728 SWFDEC_AS_VALUE_SET_STRING (ret, SWFDEC_AS_STR_right);
729 break;
730 case SWFDEC_AUTO_SIZE_CENTER:
731 SWFDEC_AS_VALUE_SET_STRING (ret, SWFDEC_AS_STR_center);
732 break;
733 default:
734 g_assert_not_reached ();
738 static void
739 swfdec_text_field_movie_set_autoSize (SwfdecAsContext *cx,
740 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
741 SwfdecAsValue *ret)
743 SwfdecTextFieldMovie *text;
744 SwfdecAutoSize old;
745 const char *s;
747 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
749 if (argc < 1)
750 return;
752 if (SWFDEC_AS_VALUE_IS_BOOLEAN (&argv[0])) {
753 if (SWFDEC_AS_VALUE_GET_BOOLEAN (&argv[0])) {
754 text->text->auto_size = SWFDEC_AUTO_SIZE_LEFT;
755 } else {
756 text->text->auto_size = SWFDEC_AUTO_SIZE_NONE;
758 return;
761 swfdec_as_value_to_number (cx, &argv[0]);
762 s = swfdec_as_value_to_string (cx, &argv[0]);
764 old = text->text->auto_size;
765 if (!g_ascii_strcasecmp (s, "none")) {
766 text->text->auto_size = SWFDEC_AUTO_SIZE_NONE;
767 } else if (!g_ascii_strcasecmp (s, "left")) {
768 text->text->auto_size = SWFDEC_AUTO_SIZE_LEFT;
769 } else if (!g_ascii_strcasecmp (s, "right")) {
770 text->text->auto_size = SWFDEC_AUTO_SIZE_RIGHT;
771 } else if (!g_ascii_strcasecmp (s, "center")) {
772 text->text->auto_size = SWFDEC_AUTO_SIZE_CENTER;
775 if (text->text->auto_size != old) {
776 swfdec_text_field_movie_auto_size (text);
777 // FIXME: fix scrolling
781 static void
782 swfdec_text_field_movie_get_password (SwfdecAsContext *cx,
783 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
784 SwfdecAsValue *ret)
786 SwfdecTextFieldMovie *text;
788 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
790 SWFDEC_AS_VALUE_SET_BOOLEAN (ret, text->text->password);
793 static void
794 swfdec_text_field_movie_set_password (SwfdecAsContext *cx,
795 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
796 SwfdecAsValue *ret)
798 SwfdecTextFieldMovie *text;
799 gboolean value;
801 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "b", &value);
803 swfdec_as_value_to_number (cx, &argv[0]);
805 if (text->text->password != value) {
806 text->text->password = value;
807 if (!value && text->asterisks != NULL) {
808 g_free (text->asterisks);
809 text->asterisks = NULL;
810 text->asterisks_length = 0;
812 swfdec_movie_invalidate_last (SWFDEC_MOVIE (text));
816 static void
817 swfdec_text_field_movie_get_wordWrap (SwfdecAsContext *cx,
818 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
819 SwfdecAsValue *ret)
821 SwfdecTextFieldMovie *text;
823 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
825 SWFDEC_AS_VALUE_SET_BOOLEAN (ret, text->text->word_wrap);
828 static void
829 swfdec_text_field_movie_set_wordWrap (SwfdecAsContext *cx,
830 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
831 SwfdecAsValue *ret)
833 SwfdecTextFieldMovie *text;
834 gboolean value;
836 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "b", &value);
838 swfdec_as_value_to_number (cx, &argv[0]);
840 if (text->text->word_wrap != value) {
841 text->text->word_wrap = value;
842 swfdec_movie_invalidate_last (SWFDEC_MOVIE (text));
843 swfdec_text_field_movie_auto_size (text);
844 // special case: don't set scrolling
849 * Native properties: Format
851 static void
852 swfdec_text_field_movie_get_embedFonts (SwfdecAsContext *cx,
853 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
854 SwfdecAsValue *ret)
856 SwfdecTextFieldMovie *text;
858 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
860 SWFDEC_AS_VALUE_SET_BOOLEAN (ret, text->text->embed_fonts);
863 static void
864 swfdec_text_field_movie_set_embedFonts (SwfdecAsContext *cx,
865 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
866 SwfdecAsValue *ret)
868 SwfdecTextFieldMovie *text;
869 gboolean value;
871 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "b", &value);
873 swfdec_as_value_to_number (cx, &argv[0]);
875 if (!text->text->embed_fonts && value)
876 SWFDEC_FIXME ("Using embed fonts in TextField not supported");
878 text->text->embed_fonts = value;
880 // FIXME: resize
883 static void
884 swfdec_text_field_movie_get_styleSheet (SwfdecAsContext *cx,
885 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
886 SwfdecAsValue *ret)
888 SwfdecTextFieldMovie *text;
890 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
892 if (text->style_sheet != NULL) {
893 SWFDEC_AS_VALUE_SET_OBJECT (ret, SWFDEC_AS_OBJECT (text->style_sheet));
894 } else {
895 SWFDEC_AS_VALUE_SET_UNDEFINED (ret);
899 static void
900 swfdec_text_field_movie_set_styleSheet (SwfdecAsContext *cx,
901 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
902 SwfdecAsValue *ret)
904 SwfdecTextFieldMovie *text;
905 SwfdecAsObject *value;
907 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
909 if (argc < 1)
910 return;
912 swfdec_as_value_to_number (cx, &argv[0]);
914 if (SWFDEC_AS_VALUE_IS_OBJECT (&argv[0])) {
915 value = SWFDEC_AS_VALUE_GET_OBJECT (&argv[0]);
916 if (SWFDEC_IS_MOVIE (value))
917 value = NULL;
918 } else {
919 value = NULL;
922 if (text->style_sheet == value)
923 return;
925 if (text->style_sheet != NULL && SWFDEC_IS_STYLESHEET (text->style_sheet)) {
926 swfdec_style_sheet_remove_listener (SWFDEC_STYLESHEET (text->style_sheet),
927 object);
930 text->style_sheet = value;
932 if (value != NULL && SWFDEC_IS_STYLESHEET (value)) {
933 if (text->style_sheet_input)
934 swfdec_text_field_movie_set_text (text, text->style_sheet_input, TRUE);
936 swfdec_style_sheet_add_listener (SWFDEC_STYLESHEET (value), object);
940 static void
941 swfdec_text_field_movie_get_textColor (SwfdecAsContext *cx,
942 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
943 SwfdecAsValue *ret)
945 SwfdecTextFieldMovie *text;
947 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
949 SWFDEC_AS_VALUE_SET_NUMBER (ret, text->format_new->color);
952 // This doesn't work the same way as TextFormat's color setting
953 static void
954 swfdec_text_field_movie_set_textColor (SwfdecAsContext *cx,
955 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
956 SwfdecAsValue *ret)
958 SwfdecTextFieldMovie *text;
959 int value;
961 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "i", &value);
963 text->format_new->color = swfdec_text_field_movie_int_to_color (cx, value);
966 SWFDEC_AS_NATIVE (104, 300, swfdec_text_field_movie_get_gridFitType)
967 void
968 swfdec_text_field_movie_get_gridFitType (SwfdecAsContext *cx,
969 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
970 SwfdecAsValue *ret)
972 SWFDEC_STUB ("TextField.gridFitType (get)");
975 SWFDEC_AS_NATIVE (104, 301, swfdec_text_field_movie_set_gridFitType)
976 void
977 swfdec_text_field_movie_set_gridFitType (SwfdecAsContext *cx,
978 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
979 SwfdecAsValue *ret)
981 SWFDEC_STUB ("TextField.gridFitType (set)");
984 SWFDEC_AS_NATIVE (104, 302, swfdec_text_field_movie_get_antiAliasType)
985 void
986 swfdec_text_field_movie_get_antiAliasType (SwfdecAsContext *cx,
987 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
988 SwfdecAsValue *ret)
990 SWFDEC_STUB ("TextField.antiAliasType (get)");
993 SWFDEC_AS_NATIVE (104, 303, swfdec_text_field_movie_set_antiAliasType)
994 void
995 swfdec_text_field_movie_set_antiAliasType (SwfdecAsContext *cx,
996 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
997 SwfdecAsValue *ret)
999 SWFDEC_STUB ("TextField.antiAliasType (set)");
1002 SWFDEC_AS_NATIVE (104, 304, swfdec_text_field_movie_get_thickness)
1003 void
1004 swfdec_text_field_movie_get_thickness (SwfdecAsContext *cx,
1005 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
1006 SwfdecAsValue *ret)
1008 SWFDEC_STUB ("TextField.thickness (get)");
1011 SWFDEC_AS_NATIVE (104, 305, swfdec_text_field_movie_set_thickness)
1012 void
1013 swfdec_text_field_movie_set_thickness (SwfdecAsContext *cx,
1014 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
1015 SwfdecAsValue *ret)
1017 SWFDEC_STUB ("TextField.thickness (set)");
1020 SWFDEC_AS_NATIVE (104, 306, swfdec_text_field_movie_get_sharpness)
1021 void
1022 swfdec_text_field_movie_get_sharpness (SwfdecAsContext *cx,
1023 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
1024 SwfdecAsValue *ret)
1026 SWFDEC_STUB ("TextField.sharpness (get)");
1029 SWFDEC_AS_NATIVE (104, 307, swfdec_text_field_movie_set_sharpness)
1030 void
1031 swfdec_text_field_movie_set_sharpness (SwfdecAsContext *cx,
1032 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
1033 SwfdecAsValue *ret)
1035 SWFDEC_STUB ("TextField.sharpness (set)");
1038 SWFDEC_AS_NATIVE (104, 308, swfdec_text_field_movie_get_filters)
1039 void
1040 swfdec_text_field_movie_get_filters (SwfdecAsContext *cx,
1041 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
1042 SwfdecAsValue *ret)
1044 SWFDEC_STUB ("TextField.filters (get)");
1047 SWFDEC_AS_NATIVE (104, 309, swfdec_text_field_movie_set_filters)
1048 void
1049 swfdec_text_field_movie_set_filters (SwfdecAsContext *cx,
1050 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
1051 SwfdecAsValue *ret)
1053 SWFDEC_STUB ("TextField.filters (set)");
1057 * Native functions
1059 SWFDEC_AS_NATIVE (104, 104, swfdec_text_field_movie_getNewTextFormat)
1060 void
1061 swfdec_text_field_movie_getNewTextFormat (SwfdecAsContext *cx,
1062 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
1063 SwfdecAsValue *ret)
1065 SwfdecTextFieldMovie *text;
1067 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
1069 swfdec_text_format_init_properties (cx);
1071 SWFDEC_AS_VALUE_SET_OBJECT (ret,
1072 SWFDEC_AS_OBJECT (swfdec_text_format_copy (text->format_new)));
1075 SWFDEC_AS_NATIVE (104, 105, swfdec_text_field_movie_setNewTextFormat)
1076 void
1077 swfdec_text_field_movie_setNewTextFormat (SwfdecAsContext *cx,
1078 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
1079 SwfdecAsValue *ret)
1081 SwfdecTextFieldMovie *text;
1082 SwfdecAsObject *obj;
1084 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "o", &obj);
1086 if (!SWFDEC_IS_TEXT_FORMAT (obj))
1087 return;
1089 swfdec_text_format_add (text->format_new, SWFDEC_TEXT_FORMAT (obj));
1092 SWFDEC_AS_NATIVE (104, 102, swfdec_text_field_movie_setTextFormat)
1093 void
1094 swfdec_text_field_movie_setTextFormat (SwfdecAsContext *cx,
1095 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
1096 SwfdecAsValue *ret)
1098 SwfdecTextFieldMovie *text;
1099 SwfdecTextFormat *format;
1100 int val, start_index, end_index;
1101 guint i;
1103 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
1105 if (argc < 1)
1106 return;
1108 i = 0;
1109 if (argc <= i + 1) {
1110 start_index = 0;
1111 end_index = g_utf8_strlen (text->input->str, -1);
1112 } else {
1113 start_index = val = swfdec_as_value_to_integer (cx, &argv[i++]);
1114 start_index = CLAMP (start_index, 0, g_utf8_strlen (text->input->str, -1));
1115 if (argc <= i + 1) {
1116 if (val < 0) { // fail
1117 start_index = end_index = 0;
1118 } else{
1119 end_index = start_index + 1;
1121 } else {
1122 end_index = swfdec_as_value_to_integer (cx, &argv[i++]);
1124 end_index =
1125 CLAMP (end_index, start_index, g_utf8_strlen (text->input->str, -1));
1127 if (start_index == end_index)
1128 return;
1130 if (!SWFDEC_AS_VALUE_IS_OBJECT (&argv[i]))
1131 return;
1132 if (!SWFDEC_IS_TEXT_FORMAT (SWFDEC_AS_VALUE_GET_OBJECT (&argv[i])))
1133 return;
1135 format = SWFDEC_TEXT_FORMAT (SWFDEC_AS_VALUE_GET_OBJECT (&argv[i]));
1137 swfdec_text_field_movie_set_text_format (text, format,
1138 g_utf8_offset_to_pointer (text->input->str, start_index) -
1139 text->input->str,
1140 g_utf8_offset_to_pointer (text->input->str, end_index) -
1141 text->input->str);
1143 swfdec_movie_invalidate_last (SWFDEC_MOVIE (text));
1144 swfdec_text_field_movie_auto_size (text);
1145 // special case: update the max values, not the current values
1146 swfdec_text_field_movie_update_scroll (text, FALSE);
1149 SWFDEC_AS_NATIVE (104, 101, swfdec_text_field_movie_getTextFormat)
1150 void
1151 swfdec_text_field_movie_getTextFormat (SwfdecAsContext *cx,
1152 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
1153 SwfdecAsValue *ret)
1155 SwfdecTextFieldMovie *text;
1156 SwfdecTextFormat *format;
1157 int val, start_index, end_index;
1159 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
1161 if (argc == 0) {
1162 start_index = 0;
1163 end_index = g_utf8_strlen (text->input->str, -1);
1164 } else {
1165 start_index = val = swfdec_as_value_to_integer (cx, &argv[0]);
1166 start_index = CLAMP (start_index, 0, g_utf8_strlen (text->input->str, -1));
1167 if (argc == 1) {
1168 if (val < 0) { // fail
1169 start_index = end_index = 0;
1170 } else{
1171 end_index = start_index + 1;
1173 } else {
1174 end_index = swfdec_as_value_to_integer (cx, &argv[1]);
1176 end_index =
1177 CLAMP (end_index, start_index, g_utf8_strlen (text->input->str, -1));
1180 if (start_index == end_index) {
1181 format = SWFDEC_TEXT_FORMAT (swfdec_text_format_new (cx));
1182 } else {
1183 format = swfdec_text_field_movie_get_text_format (text,
1184 g_utf8_offset_to_pointer (text->input->str, start_index) -
1185 text->input->str,
1186 g_utf8_offset_to_pointer (text->input->str, end_index) -
1187 text->input->str);
1190 SWFDEC_AS_VALUE_SET_OBJECT (ret, SWFDEC_AS_OBJECT (format));
1193 SWFDEC_AS_NATIVE (104, 100, swfdec_text_field_movie_replaceSel)
1194 void
1195 swfdec_text_field_movie_replaceSel (SwfdecAsContext *cx,
1196 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
1197 SwfdecAsValue *ret)
1199 SWFDEC_STUB ("TextField.replaceSel");
1202 SWFDEC_AS_NATIVE (104, 107, swfdec_text_field_movie_replaceText)
1203 void
1204 swfdec_text_field_movie_replaceText (SwfdecAsContext *cx,
1205 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
1206 SwfdecAsValue *ret)
1208 SwfdecTextFieldMovie *text;
1209 int start_index, end_index;
1210 const char *str;
1213 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "iis", &start_index,
1214 &end_index, &str);
1216 if (start_index < 0)
1217 return;
1218 if (end_index < start_index)
1219 return;
1221 start_index = MIN (start_index, g_utf8_strlen (text->input->str, -1));
1222 end_index = MIN (end_index, g_utf8_strlen (text->input->str, -1));
1224 swfdec_text_field_movie_replace_text (text,
1225 g_utf8_offset_to_pointer (text->input->str, start_index) -
1226 text->input->str,
1227 g_utf8_offset_to_pointer (text->input->str, end_index) -
1228 text->input->str, str);
1231 // static
1232 SWFDEC_AS_NATIVE (104, 201, swfdec_text_field_movie_getFontList)
1233 void
1234 swfdec_text_field_movie_getFontList (SwfdecAsContext *cx,
1235 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
1236 SwfdecAsValue *ret)
1238 SwfdecAsArray *array;
1239 SwfdecAsValue val;
1240 PangoFontFamily **families;
1241 int i, n_families;
1243 pango_font_map_list_families (pango_cairo_font_map_get_default (),
1244 &families, &n_families);
1246 array = SWFDEC_AS_ARRAY (swfdec_as_array_new (cx));
1247 for (i = 0; i < n_families; i++) {
1248 SWFDEC_AS_VALUE_SET_STRING (&val, swfdec_as_context_get_string (cx,
1249 pango_font_family_get_name (families[i])));
1250 swfdec_as_array_push (array, &val);
1252 SWFDEC_AS_VALUE_SET_STRING (&val, SWFDEC_AS_STR_Sans);
1253 swfdec_as_array_push (array, &val);
1254 SWFDEC_AS_VALUE_SET_STRING (&val, SWFDEC_AS_STR_Serif);
1255 swfdec_as_array_push (array, &val);
1256 SWFDEC_AS_VALUE_SET_STRING (&val, SWFDEC_AS_STR_Monospace);
1257 swfdec_as_array_push (array, &val);
1259 g_free (families);
1261 SWFDEC_AS_VALUE_SET_OBJECT (ret, SWFDEC_AS_OBJECT (array));
1264 SWFDEC_AS_NATIVE (104, 106, swfdec_text_field_movie_getDepth)
1265 void
1266 swfdec_text_field_movie_getDepth (SwfdecAsContext *cx, SwfdecAsObject *object,
1267 guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval)
1269 SwfdecTextFieldMovie *text;
1271 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
1273 SWFDEC_AS_VALUE_SET_INT (rval, SWFDEC_MOVIE (text)->depth);
1276 SWFDEC_AS_NATIVE (104, 103, swfdec_text_field_movie_removeTextField)
1277 void
1278 swfdec_text_field_movie_removeTextField (SwfdecAsContext *cx,
1279 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
1280 SwfdecAsValue *rval)
1282 SwfdecTextFieldMovie *text;
1283 SwfdecMovie *movie;
1285 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
1287 movie = SWFDEC_MOVIE (text);
1288 if (swfdec_depth_classify (movie->depth) == SWFDEC_DEPTH_CLASS_DYNAMIC)
1289 swfdec_movie_remove (movie);
1293 * Creating TextFields
1295 SWFDEC_AS_NATIVE (104, 200, swfdec_text_field_movie_createTextField)
1296 void
1297 swfdec_text_field_movie_createTextField (SwfdecAsContext *cx,
1298 SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
1299 SwfdecAsValue *rval)
1301 SwfdecMovie *movie, *parent;
1302 SwfdecTextField *edittext;
1303 int depth, x, y, width, height;
1304 const char *name;
1305 SwfdecAsFunction *fun;
1306 SwfdecAsValue val;
1308 SWFDEC_AS_CHECK (SWFDEC_TYPE_MOVIE, &parent, "siiiii", &name, &depth, &x, &y, &width, &height);
1310 edittext = g_object_new (SWFDEC_TYPE_TEXT_FIELD, NULL);
1311 edittext->html = FALSE;
1312 edittext->editable = FALSE;
1313 edittext->password = FALSE;
1314 edittext->selectable = TRUE;
1315 edittext->font = NULL; // FIXME
1316 edittext->word_wrap = FALSE;
1317 edittext->multiline = FALSE;
1318 edittext->auto_size = SWFDEC_AUTO_SIZE_NONE;
1319 edittext->border = FALSE;
1320 edittext->size = 240; // FIXME: Correct?
1322 edittext->input = NULL;
1323 edittext->variable = NULL;
1324 edittext->color = 0;
1325 edittext->align = SWFDEC_TEXT_ALIGN_LEFT;
1326 edittext->left_margin = 0;
1327 edittext->right_margin = 0;
1328 edittext->indent = 0;
1329 edittext->leading = 0;
1331 SWFDEC_GRAPHIC (edittext)->extents.x0 = SWFDEC_DOUBLE_TO_TWIPS (x);
1332 SWFDEC_GRAPHIC (edittext)->extents.x1 =
1333 SWFDEC_GRAPHIC (edittext)->extents.x0 + SWFDEC_DOUBLE_TO_TWIPS (width);
1334 SWFDEC_GRAPHIC (edittext)->extents.y0 = SWFDEC_DOUBLE_TO_TWIPS (y);
1335 SWFDEC_GRAPHIC (edittext)->extents.y1 =
1336 SWFDEC_GRAPHIC (edittext)->extents.y0 + SWFDEC_DOUBLE_TO_TWIPS (height);
1338 movie = swfdec_movie_find (parent, depth);
1339 if (movie)
1340 swfdec_movie_remove (movie);
1342 movie = swfdec_movie_new (SWFDEC_PLAYER (cx), depth, parent, parent->resource,
1343 SWFDEC_GRAPHIC (edittext), name);
1344 g_assert (SWFDEC_IS_TEXT_FIELD_MOVIE (movie));
1345 g_object_unref (edittext);
1346 swfdec_movie_initialize (movie);
1347 swfdec_movie_update (movie);
1349 swfdec_as_object_get_variable (cx->global, SWFDEC_AS_STR_TextField, &val);
1350 if (!SWFDEC_AS_VALUE_IS_OBJECT (&val))
1351 return;
1352 fun = (SwfdecAsFunction *) SWFDEC_AS_VALUE_GET_OBJECT (&val);
1353 if (!SWFDEC_IS_AS_FUNCTION (fun))
1354 return;
1356 /* set initial variables */
1357 if (swfdec_as_object_get_variable (SWFDEC_AS_OBJECT (fun),
1358 SWFDEC_AS_STR_prototype, &val)) {
1359 swfdec_as_object_set_variable_and_flags (SWFDEC_AS_OBJECT (movie),
1360 SWFDEC_AS_STR___proto__, &val,
1361 SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT);
1363 SWFDEC_AS_VALUE_SET_OBJECT (&val, SWFDEC_AS_OBJECT (fun));
1364 if (cx->version < 7) {
1365 swfdec_as_object_set_variable_and_flags (SWFDEC_AS_OBJECT (movie),
1366 SWFDEC_AS_STR_constructor, &val, SWFDEC_AS_VARIABLE_HIDDEN);
1368 swfdec_as_object_set_variable_and_flags (SWFDEC_AS_OBJECT (movie),
1369 SWFDEC_AS_STR___constructor__, &val,
1370 SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_VERSION_6_UP);
1372 swfdec_as_function_call (fun, SWFDEC_AS_OBJECT (movie), 0, NULL, rval);
1373 cx->frame->construct = TRUE;
1374 swfdec_as_context_run (cx);
1377 void
1378 swfdec_text_field_movie_init_properties (SwfdecAsContext *cx)
1380 SwfdecAsValue val;
1381 SwfdecAsObject *object, *proto;
1383 // FIXME: We should only initialize if the prototype Object has not been
1384 // initialized by any object's constructor with native properties
1385 // (TextField, TextFormat, XML, XMLNode at least)
1387 g_return_if_fail (SWFDEC_IS_AS_CONTEXT (cx));
1389 swfdec_as_object_get_variable (cx->global, SWFDEC_AS_STR_TextField, &val);
1390 if (!SWFDEC_AS_VALUE_IS_OBJECT (&val))
1391 return;
1392 object = SWFDEC_AS_VALUE_GET_OBJECT (&val);
1393 swfdec_as_object_get_variable (object, SWFDEC_AS_STR_prototype, &val);
1394 if (!SWFDEC_AS_VALUE_IS_OBJECT (&val))
1395 return;
1396 proto = SWFDEC_AS_VALUE_GET_OBJECT (&val);
1398 // text
1399 swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_text,
1400 swfdec_text_field_movie_do_get_text,
1401 swfdec_text_field_movie_do_set_text);
1402 swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_html,
1403 swfdec_text_field_movie_get_html, swfdec_text_field_movie_set_html);
1404 swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_htmlText,
1405 swfdec_text_field_movie_get_htmlText,
1406 swfdec_text_field_movie_set_htmlText);
1407 swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_length,
1408 swfdec_text_field_movie_get_length,
1409 swfdec_text_field_movie_set_readonly);
1411 // input
1412 swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_condenseWhite,
1413 swfdec_text_field_movie_get_condenseWhite,
1414 swfdec_text_field_movie_set_condenseWhite);
1415 swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_maxChars,
1416 swfdec_text_field_movie_get_maxChars,
1417 swfdec_text_field_movie_set_maxChars);
1418 swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_multiline,
1419 swfdec_text_field_movie_get_multiline,
1420 swfdec_text_field_movie_set_multiline);
1421 swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_restrict,
1422 swfdec_text_field_movie_get_restrict,
1423 swfdec_text_field_movie_set_restrict);
1424 swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_selectable,
1425 swfdec_text_field_movie_get_selectable,
1426 swfdec_text_field_movie_set_selectable);
1427 swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_type,
1428 swfdec_text_field_movie_do_get_type,
1429 swfdec_text_field_movie_do_set_type);
1430 swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_variable,
1431 swfdec_text_field_movie_do_get_variable,
1432 swfdec_text_field_movie_do_set_variable);
1434 // info
1435 swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_textHeight,
1436 swfdec_text_field_movie_get_textHeight,
1437 swfdec_text_field_movie_set_readonly);
1438 swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_textWidth,
1439 swfdec_text_field_movie_get_textWidth,
1440 swfdec_text_field_movie_set_readonly);
1442 // border & background
1443 swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_background,
1444 swfdec_text_field_movie_get_background,
1445 swfdec_text_field_movie_set_background);
1446 swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_backgroundColor,
1447 swfdec_text_field_movie_get_backgroundColor,
1448 swfdec_text_field_movie_set_backgroundColor);
1449 swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_border,
1450 swfdec_text_field_movie_get_border, swfdec_text_field_movie_set_border);
1451 swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_borderColor,
1452 swfdec_text_field_movie_get_borderColor,
1453 swfdec_text_field_movie_set_borderColor);
1455 // scrolling
1456 swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_bottomScroll,
1457 swfdec_text_field_movie_get_bottomScroll,
1458 swfdec_text_field_movie_set_readonly);
1459 swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_hscroll,
1460 swfdec_text_field_movie_do_get_hscroll,
1461 swfdec_text_field_movie_do_set_hscroll);
1462 swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_maxhscroll,
1463 swfdec_text_field_movie_get_maxhscroll,
1464 swfdec_text_field_movie_set_readonly);
1465 swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_maxscroll,
1466 swfdec_text_field_movie_get_maxscroll,
1467 swfdec_text_field_movie_set_readonly);
1468 swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_mouseWheelEnabled,
1469 swfdec_text_field_movie_get_mouseWheelEnabled,
1470 swfdec_text_field_movie_set_mouseWheelEnabled);
1471 swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_scroll,
1472 swfdec_text_field_movie_do_get_scroll,
1473 swfdec_text_field_movie_do_set_scroll);
1475 // display
1476 swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_autoSize,
1477 swfdec_text_field_movie_get_autoSize,
1478 swfdec_text_field_movie_set_autoSize);
1479 swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_password,
1480 swfdec_text_field_movie_get_password,
1481 swfdec_text_field_movie_set_password);
1482 swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_wordWrap,
1483 swfdec_text_field_movie_get_wordWrap,
1484 swfdec_text_field_movie_set_wordWrap);
1486 // format
1487 swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_embedFonts,
1488 swfdec_text_field_movie_get_embedFonts,
1489 swfdec_text_field_movie_set_embedFonts);
1490 swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_styleSheet,
1491 swfdec_text_field_movie_get_styleSheet,
1492 swfdec_text_field_movie_set_styleSheet);
1493 swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_textColor,
1494 swfdec_text_field_movie_get_textColor,
1495 swfdec_text_field_movie_set_textColor);
1497 // TODO: menu, tabEnabled, tabIndex
1499 // Version 8 properties have ASnative numbers:
1500 // gridFitType, antiAliasType, thickness, sharpness and filters
1503 SWFDEC_AS_NATIVE (104, 0, swfdec_text_field_movie_construct)
1504 void
1505 swfdec_text_field_movie_construct (SwfdecAsContext *cx, SwfdecAsObject *object,
1506 guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret)
1508 if (!cx->frame->construct) {
1509 SwfdecAsValue val;
1510 if (!swfdec_as_context_use_mem (cx, sizeof (SwfdecAsObject)))
1511 return;
1512 object = g_object_new (SWFDEC_TYPE_AS_OBJECT, NULL);
1513 swfdec_as_object_add (object, cx, sizeof (SwfdecAsObject));
1514 swfdec_as_object_get_variable (cx->global, SWFDEC_AS_STR_TextField, &val);
1515 if (SWFDEC_AS_VALUE_IS_OBJECT (&val)) {
1516 swfdec_as_object_set_constructor (object,
1517 SWFDEC_AS_VALUE_GET_OBJECT (&val));
1518 } else {
1519 SWFDEC_INFO ("\"TextField\" is not an object");
1523 swfdec_text_field_movie_init_properties (cx);
1525 // FIXME: do object.addListener (object);
1527 SWFDEC_AS_VALUE_SET_OBJECT (ret, object);