def fill_param_box(self, widget, data=None):
        self.task_param_hbox.hide_all()
        taskname = self.task_combobox.get_active_text()

        for c in self.task_param_hbox.get_children():
            self.task_param_hbox.remove(c)

        selected_task = None
        for t in tasks.get_all_tasks():
            if t.__name__ == taskname:
                selected_task = t
        
        args = inspect.getargspec(selected_task.__init__)[0]
        defaults = inspect.getargspec(selected_task.__init__)[3]
        self.task_param_hbox.pack_start(self.task_combobox, False, False, 3)
        #reslist = []
        for i in range(len(args)):
            a = args[i]
            if a != 'self' and a != 'drone' and a != 'callback' and a != 'context':
                l = gtk.Label(a)
                e = gtk.Entry(10)
                e.set_width_chars(10)
                if defaults is not None and len(defaults) > 0 and i >= (len(args) - len(defaults)):
                    e.set_text(str(defaults[i - (len(args)-len(defaults))]))
                e.set_visibility(True)
                #reslist.append((a, e))
                self.task_param_hbox.pack_start(l, False, False, 3)
                self.task_param_hbox.pack_start(e, False, False, 3)

        
        self.task_param_hbox.resize_children()
        self.task_param_hbox.show_all()
        self.task_param_hbox.show()
    def build_gui(self):
        self.colormap = gtk.gdk.colormap_get_system()
        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        window.set_title("Task Creator 1.0")
        window.connect("destroy", self.stop)
        window.set_size_request(800, 600)
        
        import tabbed
        self.tabs = tabbed.Tabs()
        self.tabs.connect("switch-page", self.set_mode, 'set mode')
        
        # Layout boxes
        self.master_vbox = gtk.VBox(False, 2)
        self.master_vbox.set_border_width( 5 )

        self.task_vbox = gtk.VBox(False, 2)
        self.task_vbox.set_border_width( 5 )

        self.task_action_hbox = gtk.HBox(True, 2)
        self.task_action_hbox.set_border_width( 5 )
        
        self.task_param_hbox = gtk.HBox(False, 2)
        self.task_param_hbox.set_border_width( 5 )

        self.task_vbox.add(self.task_action_hbox)
        self.task_vbox.add(self.task_param_hbox)
        
        # Action buttons - task edit
        self.task_combobox = gtk.combo_box_new_text()
        for t in tasks.get_all_tasks():
            self.task_combobox.append_text(str(t.__name__))
        self.task_combobox.set_active(0)
        self.task_combobox.connect("changed", self.fill_param_box)
        
        self.task_add_button = gtk.Button("Add task")
        self.task_add_button.connect("clicked", self.pushed_action, 'add task')

        self.task_exe_button = gtk.Button("Execute task")
        self.task_exe_button.connect("clicked", self.pushed_action, 'exe task')
        
        self.task_del_task_button = gtk.Button("Delete task")
        self.task_del_task_button.connect("clicked", self.pushed_action, 'del task')

        self.task_kill_button = gtk.Button("Stop task")
        self.task_kill_button.connect("clicked", self.pushed_action, 'kill task')

        self.task_kill_all_button = gtk.Button("Stop all tasks")
        self.task_kill_all_button.connect("clicked", self.pushed_action, 'kill all')

        #self.task_action_hbox.add(self.task_combobox)
        self.task_action_hbox.add(self.task_add_button)
        self.task_action_hbox.add(self.task_del_task_button)
        self.task_action_hbox.add(self.task_exe_button)
        self.task_action_hbox.add(self.task_kill_button)
        self.task_action_hbox.add(self.task_kill_all_button)

        self.fill_param_box(None, None)
        
        self.area = gtk.DrawingArea()
        self.area.set_size_request(800, 600)
        self.pixmap = None
       
        self.pangolayout = self.area.create_pango_layout("")
        self.sw = gtk.ScrolledWindow()
        self.sw.add_with_viewport(self.area)
        self.table = gtk.Table(2,2)
        self.hruler = gtk.HRuler()
        self.vruler = gtk.VRuler()
        self.hruler.set_range(0, 400, 0, 400)
        self.vruler.set_range(0, 300, 0, 300)
        self.table.attach(self.hruler, 1, 2, 0, 1, yoptions=0)
        self.table.attach(self.vruler, 0, 1, 1, 2, xoptions=0)
        self.table.attach(self.sw, 1, 2, 1, 2)

        self.area.set_events(gtk.gdk.EXPOSURE_MASK | gtk.gdk.LEAVE_NOTIFY_MASK | gtk.gdk.BUTTON_PRESS_MASK
                             | gtk.gdk.BUTTON_RELEASE_MASK | gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.POINTER_MOTION_HINT_MASK)
        
       
        self.master_vbox.pack_start(self.tabs, False, False, 2)
        self.master_vbox.pack_start(self.table, True, True)        
        self.master_vbox.show_all()

        self.tabs.create_tab('Edit Tasks', self.task_vbox)
        window.add(self.master_vbox)

        def motion_notify(ruler, event):
            return ruler.emit("motion_notify_event", event)
        
        self.area.connect_object("motion_notify_event", motion_notify,
                                 self.hruler)
        
        self.area.connect_object("motion_notify_event", motion_notify,
                                 self.vruler)

        self.area.connect("configure_event", self.configure_event)
        self.area.connect("expose-event", self.area_expose_cb)
        self.area.connect("button_press_event", self.pushed)
        self.area.connect("button_release_event", self.released)
        self.area.connect("motion_notify_event", self.motion)

        self.hadj = self.sw.get_hadjustment()
        self.vadj = self.sw.get_vadjustment()

        def val_cb(adj, ruler, horiz):
            if horiz:
                span = self.sw.get_allocation()[3]
            else:
                span = self.sw.get_allocation()[2]
            l,u,p,m = ruler.get_range()
            v = adj.value
            ruler.set_range(v, v+span, p, m)
            while gtk.events_pending():
                gtk.main_iteration()

        self.hadj.connect('value-changed', val_cb, self.hruler, True)
        self.vadj.connect('value-changed', val_cb, self.vruler, False)

        def size_allocate_cb(wid, allocation):
            x, y, w, h = allocation
            l,u,p,m = self.hruler.get_range()
            m = max(m, w)
            self.hruler.set_range(l, l+w, p, m)
            l,u,p,m = self.vruler.get_range()
            m = max(m, h)
            self.vruler.set_range(l, l+h, p, m)

        self.sw.connect('size-allocate', size_allocate_cb)
        self.area.show()
        self.hruler.show()
        self.vruler.show()
        self.sw.show()
        self.table.show()
        window.show()
    def pushed_action(self, widget, data):
        self.clear()

        if isinstance(widget, gtk.ToggleButton) and not widget.get_active():
            return

        if data == 'add task':
            params = [self.drone, None, None]
            for c in self.task_param_hbox.get_children():
                if type(c) is gtk.Entry:
                    text = c.get_text()
                    if text == 'None':
                        val = None
                    else:
                        val = self.parseStr(text)
                    params.append(val)
            print params, '\r'
            taskname = self.task_combobox.get_active_text()
            selected_task = None
            for t in tasks.get_all_tasks():
                if t.__name__ == taskname:
                    selected_task = t
       
            inst = selected_task(*params)
            x = 200+random.randint(-50, 50)
            y = 100+random.randint(-50, 50)

            #tasks.append(t)
            self.selected_task = self.add_task(inst, x, y)

        elif data == 'exe task':
            if self.selected_task is not None:
                exe = self.selected_task
                task_manager = self.drone.get_task_manager()#.get_controller(settings.AUTOCONTROL)
                
                # def cb(caller):
                #     task_manager.task_done(caller)
                    #self.toggle_video_window(None, None)
                    
                exe[2].callback = task_manager.task_done
                # if not self.video_window.get_visible():
                #     self.toggle_video_window(None, None)
                handle = task_manager.start_task(exe[2])

        elif data == 'del task':
           if self.selected_task is not None:
               for t in self.tasks:
                   if issubclass(t[2].__class__, tasks.CompoundTask):
                       if self.selected_task[2] in t[2].subtasks:
                           t[2].remove_subtask(self.selected_task[2])

               self.tasks.remove(self.selected_task)
       
        elif data == 'kill task':
           t = self.selected_task 
           if t is not None:
               t[2].stop()
                           
        elif data == 'kill all':
            task_manager = self.drone.get_task_manager()#.get_controller(settings.AUTOCONTROL)
            task_manager.kill_tasks()
       
        self.area.queue_draw()