def __init__(self, parent_window):
        super(MainProjectWidget, self).__init__(parent_window)
        self.layout = QHBoxLayout()
        self.proj_win = parent_window
        self.fileshown = None
        self.current_file_view = None

        self.contentbox = QWidget()
        self.contentbox.setLayout(QVBoxLayout())
        
        self.tabs = FileViewTabNotebook(self.proj_win)
        self.tabs.currentChanged.connect(
            self.active_tab_changed)
        self.layout.addWidget(self.tabs, 1)

        self.add_dock("filelist",
            ProjectFileListWidget(self, self.proj_win.project,
            self.open_and_show_file_through_filelist,
            self.dock_closed_or_opened))
        self.layout.setContentsMargins(0, 0, 0, 0)

        centralwidget = QWidget()
        
        centralwidget.setLayout(self.layout)
        super(MainProjectWidget, self).setCentralWidget(centralwidget)
class MainProjectWidget(QMainWindow):
    """ This is the main content area widget of the ProjectWindow if a project
        is loaded. (Otherwise, the welcome widget would be shown)
        
        This is NOT intended as a standalone main window as the parent class
        QMainWindow might suggest. The owning window would typically be a
        project window.
        
        It contains the whole content area consisting of a central tabbed file
        view, and all the dockables around it (e.g. project file list).
    """
    dockables = []
    tabs = []
    def __init__(self, parent_window):
        super(MainProjectWidget, self).__init__(parent_window)
        self.layout = QHBoxLayout()
        self.proj_win = parent_window
        self.fileshown = None
        self.current_file_view = None

        self.contentbox = QWidget()
        self.contentbox.setLayout(QVBoxLayout())
        
        self.tabs = FileViewTabNotebook(self.proj_win)
        self.tabs.currentChanged.connect(
            self.active_tab_changed)
        self.layout.addWidget(self.tabs, 1)

        self.add_dock("filelist",
            ProjectFileListWidget(self, self.proj_win.project,
            self.open_and_show_file_through_filelist,
            self.dock_closed_or_opened))
        self.layout.setContentsMargins(0, 0, 0, 0)

        centralwidget = QWidget()
        
        centralwidget.setLayout(self.layout)
        super(MainProjectWidget, self).setCentralWidget(centralwidget)

    def active_tab_changed(self, index):
        active_tab = self.tabs.get_active_tab()
        if not active_tab is None:
            self.current_file_view = active_tab.view()
            self.fileshown = active_tab.view().filename
            self.proj_win.project_change_notify()
            return
        self.current_file_view = None
        self.fileshown = None
        self.proj_win.project_change_notify()

    def default_file_view_category(self, filename):
        return "all"
        
    def open_and_show_file(self, file):
        self.open_and_show_file_with_category(\
            self.default_file_view_category(), file)

    def dock_closed_or_opened(self):
        """ Inform main window that a dock closed or opened """
        self.proj_win.update_window_menu()

    def open_and_show_file_through_filelist(self, filelist, file):
        category = self.default_file_view_category(file)
        self.open_and_show_file_with_view_category(category, file)
        
    def open_and_show_file_with_view_category(self, category, file):
        if category == "all":
            self.add_file_with_view(file, "properties",
                GenericInfoView(self.proj_win.project, file))
        else:
            return
        self.proj_win.project_change_notify()
    
    def add_dock(self, name, widget, default_dir="right"):
        self.dockables.append((name, widget))
        if default_dir == "right":
            self.addDockWidget(Qt.RightDockWidgetArea, widget)

    def update_file_list(self):
        for dockable in self.dockables:
            if dockable[0] == "filelist":
                dockable[1].update_file_list()

    def isFileShown(self):
        return (self.fileshown != None)

    def add_file_with_view(self, filename, view_type, view):
        self.current_file_view = view
        view.active_widget_changed = lambda widget: self.\
            proj_win.copy_paste_widget_focus(widget)
        self.fileshown = filename
        tabindex = None
        if view_type != "properties":
            tabindex = self.tabs.add_as_tab(filename, view)
        else:
            tabindex = self.tabs.add_as_tab(filename, view, \
                "fileview_properties_title")
        self.tabs.update_tab_titles()
        self.active_tab_changed(tabindex)

    def update_language(self):
        for dockable in self.dockables:
            if hasattr(dockable[1], "update_language"):
                dockable[1].update_language()
        self.tabs.update_language()

    def toggle_dock_visible(self, dock_name):
        if self.is_dock_visible(dock_name):
            self.set_dock_visible(dock_name, False)
        else:
            self.set_dock_visible(dock_name, True)

    def is_dock_visible(self, dock_name):
        for dockable in self.dockables:
            if dockable[0] == dock_name:
                is_visible = dockable[1].isVisible()
                return is_visible
        return False
    
    def set_dock_visible(self, dock_name, visible):
        for dockable in self.dockables:
            if dockable[0] == dock_name:
                dockable[1].setVisible(visible)