1 /*	Public domain	*/
2 
3 #ifndef _AGAR_GUI_TEXTBOX_H_
4 #define _AGAR_GUI_TEXTBOX_H_
5 
6 #include <agar/gui/widget.h>
7 #include <agar/gui/editable.h>
8 #include <agar/gui/label.h>
9 #include <agar/gui/scrollbar.h>
10 
11 #include <agar/gui/begin.h>
12 
13 typedef struct ag_textbox {
14 	struct ag_widget _inherit;
15 	struct ag_editable *ed;
16 
17 	AG_Label *lbl;			/* Textbox label */
18 	Uint flags;
19 #define AG_TEXTBOX_MULTILINE     0x000001 /* Enable multiline edition */
20 #define AG_TEXTBOX_PASSWORD      0x000004 /* Hide buffer contents */
21 #define AG_TEXTBOX_ABANDON_FOCUS 0x000008 /* Lose focus on return */
22 #define AG_TEXTBOX_COMBO         0x000010 /* Used by AG_Combo */
23 #define AG_TEXTBOX_HFILL         0x000020
24 #define AG_TEXTBOX_VFILL         0x000040
25 #define AG_TEXTBOX_EXPAND        (AG_TEXTBOX_HFILL|AG_TEXTBOX_VFILL)
26 #define AG_TEXTBOX_READONLY      0x000100 /* Disable user input */
27 #define AG_TEXTBOX_INT_ONLY      0x000200 /* Accepts only valid strtol() input */
28 #define AG_TEXTBOX_FLT_ONLY      0x000400 /* Accepts only valid strtof() input */
29 #define AG_TEXTBOX_CATCH_TAB     0x000800 /* Enter literal tabs into text
30 					    instead of cycling focus */
31 #define AG_TEXTBOX_CURSOR_MOVING 0x001000 /* Cursor is being moved */
32 #define AG_TEXTBOX_EXCL          0x004000 /* Exclusive access to buffer */
33 #define AG_TEXTBOX_NOEMACS       0x008000 /* Disable emacs-style fn keys */
34 #define AG_TEXTBOX_NOLATIN1      0x020000 /* Disable LATIN-1 combinations */
35 #define AG_TEXTBOX_WORDWRAP	 0x040000 /* Enable word wrapping */
36 #define AG_TEXTBOX_NOPOPUP	 0x080000 /* Disable popup menu */
37 #define AG_TEXTBOX_MULTILINGUAL	 0x100000 /* Enable multilingual edition */
38 
39 	int boxPadX, boxPadY;		/* Padding around textbox */
40 	AG_Scrollbar *hBar, *vBar;	/* Scrollbars for MULTILINE */
41 	AG_Rect r;			/* View area */
42 	AG_Text *text;			/* Pointer to default binding */
43 } AG_Textbox;
44 
45 #define AGTEXTBOX(p) ((AG_Textbox *)(p))
46 #ifdef _AGAR_INTERNAL
47 #define TEXTBOX(p) AGTEXTBOX(p)
48 #endif
49 
50 __BEGIN_DECLS
51 extern AG_WidgetClass agTextboxClass;
52 
53 AG_Textbox *AG_TextboxNew(void *, Uint, const char *, ...)
54                           FORMAT_ATTRIBUTE(printf,3,4);
55 AG_Textbox *AG_TextboxNewS(void *, Uint, const char *);
56 #define     AG_TextboxSizeHint(tb,text) AG_EditableSizeHint((tb)->ed,(text))
57 #define     AG_TextboxSizeHintPixels(tb,w,h) \
58             AG_EditableSizeHintPixels((tb)->ed,(w),(h))
59 #define     AG_TextboxSizeHintLines(tb,l) \
60             AG_EditableSizeHintLines((tb)->ed,(l))
61 void        AG_TextboxSetLabel(AG_Textbox *, const char *, ...)
62                                FORMAT_ATTRIBUTE(printf,2,3)
63 			       NONNULL_ATTRIBUTE(2);
64 void        AG_TextboxSetLabelS(AG_Textbox *, const char *);
65 void        AG_TextboxSetWordWrap(AG_Textbox *, int);
66 void        AG_TextboxPrintf(AG_Textbox *, const char *, ...);
67 
68 #define     AG_TextboxSetPassword(tb,flag) AG_EditableSetPassword((tb)->ed,(flag))
69 #define     AG_TextboxSetExcl(tb,flag) AG_EditableSetExcl((tb)->ed,(flag))
70 #define     AG_TextboxSetFltOnly(tb,flag) AG_EditableSetFltOnly((tb)->ed,(flag))
71 #define     AG_TextboxSetIntOnly(tb,flag) AG_EditableSetIntOnly((tb)->ed,(flag))
72 #define     AG_TextboxSetLang(tb,lang) AG_EditableSetLang((tb)->ed,(lang))
73 
74 int         AG_TextboxMapPosition(AG_Textbox *, int, int, int *);
75 void        AG_TextboxMoveCursor(AG_Textbox *, int, int);
76 void        AG_TextboxSetCursorPos(AG_Textbox *, int);
77 #define     AG_TextboxGetCursorPos(tb) AG_EditableGetCursorPos((tb)->ed)
78 
79 #define AG_TextboxBindUTF8(tb,p,sz)        AG_EditableBindUTF8((tb)->ed,(p),(sz))
80 #define AG_TextboxBindASCII(tb,p,sz)       AG_EditableBindASCII((tb)->ed,(p),(sz))
81 #define AG_TextboxBindEncoded(tb,enc,p,sz) AG_EditableBindEncoded((tb)->ed,(enc),(p),(sz))
82 #define AG_TextboxBindText(tb,txt)         AG_EditableBindText((tb)->ed,(txt))
83 
84 #define AG_TextboxSetString(tb,s) AG_EditableSetString((tb)->ed,(s))
85 #define	AG_TextboxClearString(tb) AG_EditableSetString((tb)->ed,NULL)
86 #define AG_TextboxDupString(tb) AG_EditableDupString((tb)->ed)
87 #define AG_TextboxCopyString(tb,p,len) AG_EditableCopyString((tb)->ed,(p),(len))
88 
89 #define AG_TextboxInt(tb) AG_EditableInt((tb)->ed)
90 #define AG_TextboxFlt(tb) AG_EditableFlt((tb)->ed)
91 #define AG_TextboxDbl(tb) AG_EditableDbl((tb)->ed)
92 
93 #ifdef AG_LEGACY
94 # define AG_TEXTBOX_NOWORDSEEK 0
95 # define AG_TEXTBOX_STATIC AG_TEXTBOX_EXCL
96 # define AG_TextboxSetStatic AG_TextboxSetExcl
97 # define AG_TextboxPrescale AG_TextboxSizeHint
98 # define AG_TextboxSetWriteable(tb,flag) do {	\
99 	if (flag) {				\
100 	 	AG_WidgetEnable(tb);		\
101 	} else {				\
102 		AG_WidgetDisable(tb);		\
103 	}					\
104 } while (0)
105 #endif /* AG_LEGACY */
106 
107 __END_DECLS
108 
109 #include <agar/gui/close.h>
110 #endif /* _AGAR_GUI_TEXTBOX_H_ */
111