def __init__(self, proj, applet=None, parent=None):
        QtGui.QWidget.__init__(self, parent)

        assert isinstance(applet, (types.NoneType, AbstractApplet))
        self.__applet  = applet
        if applet is None:
            restToApp = False
        self.__restrictedToApplet = restToApp

        self.__project   = proj
        self.__widgetMap = {} #weakref.WeakKeyDictionary()
        self.__projToWidgets = weakref.WeakKeyDictionary()
        self.setContentsMargins(0,0,0,0)
        self.__lay     = QtGui.QVBoxLayout(self)
        self.__lay.setContentsMargins(0,0,0,0)
        self.__lay.setSpacing(0)
        self.__toolbar = QtGui.QToolBar()
        self.__stack   = QtGui.QStackedWidget()


        self.__newDataBut    = QtGui.QPushButton("+")
        self.__browseDataBut = ComboBox()
        self.__browseDataBut.setIconSize(QtCore.QSize(16,16))
        self.__menubar = QtGui.QMenuBar()
        self.__menubar.setDefaultUp(True)

        # -- configure the layout --
        self.__lay.addWidget(self.__stack)
        self.__lay.addWidget(self.__toolbar)
        self.__newDataBut.setFixedSize(QtCore.QSize(40, self.__hh__))
        self.__browseDataBut.setFixedSize(QtCore.QSize(150, self.__hh__))
        self.__menubar.setFixedHeight(self.__hh__)

        # -- an empty widget for the bkgd --
        self.__bkgd = EmptyAppletBackground(applet, self, restToApp=restToApp)
        self.__stack.addWidget(self.__bkgd)
        self.__bkgd.show()

        # -- configure the toolbar --
        self.__toolbar.setStyleSheet("QToolBar{background-color: " +\
                                     "qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, "+\
                                     "stop:0 rgba(135,135,135,255), " +\
                                     "stop:0.1 rgba(175,175,175,255), " +\
                                     "stop:1 rgba(200, 200, 200, 255));}")
        self.__toolbar.setFloatable(False)
        self.__toolbar.setMovable(False)
        self.__toolbar.addWidget(self.__newDataBut)
        self.__toolbar.addWidget(self.__browseDataBut)
        self.__toolbar.addWidget(self.__menubar)

        # -- connect relevant stuff --
        self.__newDataBut.pressed.connect(self.update_dataFac_menu)
        self.__browseDataBut.activated[int].connect(self.show_data_at_index)

        self.update_dataFac_menu()

        data = self.update_combo_list()

        if not restToApp:
            self.__stack.setCurrentWidget(self.__bkgd)
        else:
            if self.__browseDataBut.count() >= 1:
                self.__browseDataBut.setCurrentIndex(0)

        # -- if there is only one data that is global data
        # and no space toolbar or menu hide the header --
        if len(data)==1 and isinstance(data[0][0], GlobalData) and \
           len(self.__toolbar.actions()) == 2 and self.__restrictedToApplet:
            self.__toolbar.hide()

        AppletFactoryManager().applet_created.emit(self)
class AppletSpace(QtGui.QWidget):

    # -- PROPERTIES --
    name    = property(lambda x:x.__applet.name if x.__applet else "uknown")
    project = property(lambda x:x.__project)

    # -- NONE API ATTRIBUTES --
    __hh__ = 22  # header content height

    def __init__(self, proj, applet=None, parent=None):
        QtGui.QWidget.__init__(self, parent)

        assert isinstance(applet, (types.NoneType, AbstractApplet))
        self.__applet  = applet
        if applet is None:
            restToApp = False
        self.__restrictedToApplet = restToApp

        self.__project   = proj
        self.__widgetMap = {} #weakref.WeakKeyDictionary()
        self.__projToWidgets = weakref.WeakKeyDictionary()
        self.setContentsMargins(0,0,0,0)
        self.__lay     = QtGui.QVBoxLayout(self)
        self.__lay.setContentsMargins(0,0,0,0)
        self.__lay.setSpacing(0)
        self.__toolbar = QtGui.QToolBar()
        self.__stack   = QtGui.QStackedWidget()


        self.__newDataBut    = QtGui.QPushButton("+")
        self.__browseDataBut = ComboBox()
        self.__browseDataBut.setIconSize(QtCore.QSize(16,16))
        self.__menubar = QtGui.QMenuBar()
        self.__menubar.setDefaultUp(True)

        # -- configure the layout --
        self.__lay.addWidget(self.__stack)
        self.__lay.addWidget(self.__toolbar)
        self.__newDataBut.setFixedSize(QtCore.QSize(40, self.__hh__))
        self.__browseDataBut.setFixedSize(QtCore.QSize(150, self.__hh__))
        self.__menubar.setFixedHeight(self.__hh__)

        # -- an empty widget for the bkgd --
        self.__bkgd = EmptyAppletBackground(applet, self, restToApp=restToApp)
        self.__stack.addWidget(self.__bkgd)
        self.__bkgd.show()

        # -- configure the toolbar --
        self.__toolbar.setStyleSheet("QToolBar{background-color: " +\
                                     "qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, "+\
                                     "stop:0 rgba(135,135,135,255), " +\
                                     "stop:0.1 rgba(175,175,175,255), " +\
                                     "stop:1 rgba(200, 200, 200, 255));}")
        self.__toolbar.setFloatable(False)
        self.__toolbar.setMovable(False)
        self.__toolbar.addWidget(self.__newDataBut)
        self.__toolbar.addWidget(self.__browseDataBut)
        self.__toolbar.addWidget(self.__menubar)

        # -- connect relevant stuff --
        self.__newDataBut.pressed.connect(self.update_dataFac_menu)
        self.__browseDataBut.activated[int].connect(self.show_data_at_index)

        self.update_dataFac_menu()

        data = self.update_combo_list()

        if not restToApp:
            self.__stack.setCurrentWidget(self.__bkgd)
        else:
            if self.__browseDataBut.count() >= 1:
                self.__browseDataBut.setCurrentIndex(0)

        # -- if there is only one data that is global data
        # and no space toolbar or menu hide the header --
        if len(data)==1 and isinstance(data[0][0], GlobalData) and \
           len(self.__toolbar.actions()) == 2 and self.__restrictedToApplet:
            self.__toolbar.hide()

        AppletFactoryManager().applet_created.emit(self)

    @project.setter
    def project(self, proj):
        assert isinstance(proj, Project)

        projWidgets = self.__projToWidgets.get(self.__project, [])
        for w in projWidgets:
            self.__stack.removeWidget(w)

        self.__project = proj
        self.__menubar.clear()
        self.__widgetMap.clear()
        self.__projToWidgets.clear()
        self.update_combo_list()


    def supports(self, data):
        if not self.__restrictedToApplet:
            return True
        else:
            return data.mimetype in self.__applet.mimetypes

    def add_content(self, data, content):
        content = content.widget
        self.__stack.addWidget(content)
        index = self.__browseDataBut.findText(data.name)
        self.__browseDataBut.setCurrentIndex(index)
        self.__stack.setCurrentWidget(content)

    def update_dataFac_menu(self):
        menu = QtGui.QMenu(self.__newDataBut)
        if not self.__restrictedToApplet:
            dataFacs = [f for f in DataFactoryManager().gather_items().itervalues() \
                        if not f.singleton]
        else:
            dataFacs = self.__applet.get_data_types()
        dataFacs.sort(cmp = lambda x,y:cmp(x.name, y.name))
        for dt in dataFacs:
            action = menu.addAction(dt.icon, dt.name)
            action.setIconVisibleInMenu(True)
            func = self.__make_dataFac_handler(dt)
            action.triggered.connect(func)
        self.__newDataBut.setMenu(menu)

    def update_combo_list(self):
        proj = self.__project
        self.__browseDataBut.blockSignals(True)
        currentText = self.__browseDataBut.currentText()
        self.__browseDataBut.clear()

        if not self.__restrictedToApplet:
            mimetypes = [f.created_mimetype for f in \
                         DataFactoryManager().gather_items().itervalues()]
        else:
            mimetypes = self.__applet.get_mimetypes()

        data = [(datum,proj) for k, datum in proj if datum.mimetype in mimetypes]

        for dp in data:
            if dp[0].hidden:
                continue
            self.__browseDataBut.addItem(dp[0].icon, dp[0].name,
                                         to_qvariant(dp))

        self.__browseDataBut.insertSeparator(self.__browseDataBut.count())

        globalProj = GlobalDataManager()
        globalData = [(datum, globalProj) for k, datum in globalProj \
                     if datum.mimetype in mimetypes]

        for dp in globalData:
            if dp[0].hidden:
                continue
            self.__browseDataBut.addItem(dp[0].icon, dp[0].name,
                                         to_qvariant(dp))

        index = self.__browseDataBut.findText(currentText)
        self.__browseDataBut.setCurrentIndex(index)
        self.__browseDataBut.blockSignals(False)
        return data

    def __make_dataFac_handler(self, dataFac):
        def on_dataFac_chosen(checked):
            data    = dataFac._new_0()
            self.show_data(data)
        return on_dataFac_chosen

    def show_data(self, data):
        self.update_combo_list()
        index = self.__browseDataBut.findText(data.name)
        if index > -1: #-1 is not found
            # : calls show_data_at_index by the signals
            self.__browseDataBut.setCurrentIndex(index)

    def show_data_at_index(self, index):
        itemData = self.__browseDataBut.itemData(index)
        if not itemData:
            return
        data, proj =  itemData
        # NO_SPACE_CONTENT_TRACKING
        # content = proj.get_data_property(data, "spaceContent")
        content = self.__widgetMap.get(data)
        if not content:
            if not self.__restrictedToApplet:
                appFac  = DataEditorSelector.mime_type_handler([data.mimetype])
                content = appFac._create_space_content_0(data)
            else:
                content = self.__applet._create_space_content_0(data)
            self.__widgetMap[data]=content
        if content is None:
            print "Applet", self.name, "returned None content"

        widget = content.widget
        self.__projToWidgets.setdefault( proj, set() ).add(widget)
        self.__menubar.clear()
        for menu in content.menus:
            self.__menubar.addMenu(menu)
        if not self.__stack.indexOf(widget)>-1:
            self.__stack.addWidget(widget)
        self.__stack.setCurrentWidget(widget)