1 /* File : Fl_Menu_.i */
2 //%module Fl_Menu_
3 
4 %feature("docstring") ::Fl_Menu_
5 """
6 All widgets that have a menu in FLTK are subclassed off of this class.
7 Currently FLTK provides you with Fl_Menu_Button, Fl_Menu_Bar, and Fl_Choice .
8 
9 The class contains a pointer to an array of structures of type Fl_Menu_Item.
10 The array may either be supplied directly by the user program, or it may be
11 'private': a dynamically allocated array managed by the Fl_Menu_.
12 """ ;
13 
14 %{
15 #include "FL/Fl_Menu_.H"
16 #include <menu_item.h>
17 %}
18 
19 %include "macros.i"
20 
21 CHANGE_OWNERSHIP(Fl_Menu_)
22 
23 
24 %ignore Fl_Menu_::global();
25 %ignore Fl_Menu_::menu(const Fl_Menu_Item *m);
26 //%ignore Fl_Menu_::menu();
27 %ignore Fl_Menu_::add(const char* label, const char* shortcut, Fl_Callback*, void *user_data, int flags);
28 %ignore Fl_Menu_::menu(const Fl_Menu_Item*);
29 %ignore Fl_Menu_::copy(const Fl_Menu_Item*);
30 %ignore Fl_Menu_::value(const Fl_Menu_Item*);
31 
32 
33 %include "FL/Fl_Menu_.H"
34 
35 
36 %extend Fl_Menu_ {
37 
38 	void copy(PyObject *args, PyObject *user_data = 0) {
39 		PyObject *menuList;
40 		if (!PyTuple_Check(args))
41 		{
42 			printf("Fl_Menu_.menu: not a tuple\n");
43 			return;
44 		}
45 
46 		menuList = args;
47 		Fl_Menu_Item *theMenuItems = createFl_Menu_Item_Array( NULL, menuList);
48 
49 		// call the C++ object to add the menu
50 		self->copy(theMenuItems, user_data);
51 
52 		delete [] theMenuItems;
53 
54 	}
55 
menu(PyObject * args)56 	void menu(PyObject *args) {
57 		PyObject *menuList;
58 		if (!PyTuple_Check(args))
59 		{
60 			printf("Fl_Menu_.menu: not a tuple\n");
61 			return;
62 		}
63 
64 		menuList = args;
65 		Fl_Menu_Item *theMenuItems = createFl_Menu_Item_Array( NULL, menuList);
66 
67 		// call the C++ object to add the menu
68 		self->copy(theMenuItems);
69 
70 		delete [] theMenuItems;
71 
72 	}
73 
74 	int add(PyObject *lObj, PyObject *sObj, PyObject *cObj, PyObject* uObj=0, PyObject* fObj=0) {
75 
76 		//char *pyLabel=PyString_AsString(lObj);
77 		char* pyLabel = SWIG_Python_str_AsChar(lObj);
78 
79 		int shortcut=PyInt_AsLong(sObj);
80 		PyObject *callback=cObj;
81 		PyObject *userData=uObj;
82 		int flags=0;
83 		if (fObj)
84 		   flags=PyInt_AsLong(fObj);
85 		Fl_Callback *callback_=(Fl_Callback*)0;
86 		void *user_data_=0;
87 
88 
89 		// got all the values
90 		if (callback && PyCallable_Check(callback))
91 		{
92 			CallbackStruct *cb = new CallbackStruct( callback, userData, SWIGTYPE_p_Fl_Menu_Item  );
93 			Py_INCREF(callback);
94 			//self->callback(PythonCallBack, (void *)cb);
95 			callback_ = (Fl_Callback *)PythonCallBack;
96 			user_data_ = (void *)cb;
97 		}
98 
99 		return self->add(pyLabel, shortcut, callback_, user_data_, flags);
100 	}
101 
menu()102 	PyObject* menu() {
103 	    // returns the Fl_Menu_Item structure of the menu
104 	    // as a Python list
105 	    const Fl_Menu_Item* items = self->menu();
106 	    int length = self->size();
107 	    PyObject *result = PyList_New(length);
108 	    for (int i = 0; i < length; i++) {
109 		PyObject *o = Py_None;
110 		if (items[i].text != NULL) {
111 		    if (items[i].callback_) {
112 			// registered callback,
113 			// caution, callback information is in user_data
114 			CallbackStruct *cb = (CallbackStruct*)items[i].user_data_;
115 			o = Py_BuildValue("zlOOl", items[i].text, items[i].shortcut_, cb->func, cb->data, items[i].flags);
116 		    }
117 		    else {
118 			// no callback, return Py_None
119 			o = Py_BuildValue("zlOOl", items[i].text, items[i].shortcut_, Py_None, Py_None, items[i].flags);
120 		    }
121 		}
122 		else {
123 		    // empty item
124 		    o = Py_BuildValue("OOOOO", Py_None, Py_None, Py_None, Py_None, Py_None);
125 		}
126 		PyList_SetItem(result, i, o);
127 	    }
128 	    return result;
129 	}
130 }
131 
132 
133 
134 
135 
136