def __init__(self, parent):
        QtGui.QWidget.__init__(self, parent)
        fn = os.path.join(os.path.dirname(__file__),'ReportWidget.ui')
        uic.loadUi(fn, self)
        self.reportBrowser = WebView(self)
        self.stackedWidget.addWidget(self.reportBrowser)
        self._roleReporter = Reporting.RoleReporter()
        self._eventReporter = Reporting.EventReporter()
        self._personReporter = Reporting.PersonReporter()

        self._roles_Item = self._add_parent(self.treeWidget, 0, 'roles')
        self._roles_Item.reportTupple = None

        self._people_item = self._add_parent(self.treeWidget, 0, 'People')
        self._people_item.reportTupple = None

        self._events_Item = self._add_parent(self.treeWidget, 0, 'events')
        self._events_Item.reportTupple = None

        self._refresh_roles_children()
        GlobalRoleList.rolesChanged.connect(self._refresh_roles_children)

        self.treeWidget.collapseAll()
        self.treeWidget.expandToDepth(0)
class ReportWidget(QtGui.QWidget):
    def __init__(self, parent):
        QtGui.QWidget.__init__(self, parent)
        fn = os.path.join(os.path.dirname(__file__),'ReportWidget.ui')
        uic.loadUi(fn, self)
        self.reportBrowser = WebView(self)
        self.stackedWidget.addWidget(self.reportBrowser)
        self._roleReporter = Reporting.RoleReporter()
        self._eventReporter = Reporting.EventReporter()
        self._personReporter = Reporting.PersonReporter()

        self._roles_Item = self._add_parent(self.treeWidget, 0, 'roles')
        self._roles_Item.reportTupple = None

        self._people_item = self._add_parent(self.treeWidget, 0, 'People')
        self._people_item.reportTupple = None

        self._events_Item = self._add_parent(self.treeWidget, 0, 'events')
        self._events_Item.reportTupple = None

        self._refresh_roles_children()
        GlobalRoleList.rolesChanged.connect(self._refresh_roles_children)

        self.treeWidget.collapseAll()
        self.treeWidget.expandToDepth(0)

    def _refresh_roles_children(self):

        li = []
        self._collect_checked_items(self._roles_Item, li)
        enabled = map(lambda i: i.reportable[0], li)
        self._roles_Item.takeChildren()
        for role in sorted(GlobalRoleList.roles, key=lambda r: r.priority, reverse=True):
            item = self._add_child(self._roles_Item, 0, str(role))

            if role in enabled:
                checked = QtCore.Qt.Checked
            else:
                checked = QtCore.Qt.Unchecked

            item.setCheckState(0, checked)
            item.reportTupple = role, self._roleReporter

    def _refresh_people_children(self):

        li = []
        self._collect_checked_items(self._people_item, li)
        enabled = map(lambda item: item.reportable[0], li)
        self._people_item.takeChildren()
        for person in sorted(self._people, key=lambda w: w.name):
            item = self._add_child(self._people_item, 0, person.name)

            if person in enabled:
                checked = QtCore.Qt.Checked
            else:
                checked = QtCore.Qt.Unchecked

            item.setCheckState(0, checked)
            item.reportTupple = person, self._personReporter

    def _refresh_events_children(self):

        li = []
        self._collect_checked_items(self._events_Item, li)
        enabled = map(lambda i: i.reportable[0], li)
        self._events_Item.takeChildren()
        date = None
        date_item = None
        for event in sorted(self._events, key=lambda w: w.datetime):

            if not event.date == date:
                date = event.date
                date_item = self._add_child(self._events_Item, 0, date_string(date))
                date_item.reportTupple = None

            item = self._add_child(date_item, 0, event.name)

            if event in enabled:
                checked = QtCore.Qt.Checked
            else:
                checked = QtCore.Qt.Unchecked

            item.setCheckState(0, checked)
            item.reportTupple = event, self._eventReporter

    def selectedTreeItem(self, tree_widget_item, i):
        if tree_widget_item.reportTupple != None:
            reportTupple = tree_widget_item.reportTupple
            html = reportTupple[1].report_about(reportTupple[0])
            self.reportBrowser.setHtml(html)

    def treeItemChanged(self, item):
        rowCount = item.childCount()
        for i in range(0, rowCount):
            item.child(i).setCheckState(0, item.checkState(0))

    def setPopulationModel(self, population_model):
        self._people = population_model.population
        self._institution = population_model.institution
        self._refresh_people_children()
        population_model.dataChanged.connect(self._refresh_people_children)
        population_model.rowsInserted.connect(self._refresh_people_children)
        population_model.rowsRemoved.connect(self._refresh_people_children)

    def setEventsModel(self, event_model):
        self._events = event_model.events
        self._roleReporter.events(event_model.events)
        self._personReporter.events(event_model.events)
        self._refresh_events_children()
        self._duration = event_model.duration
        event_model.dataChanged.connect(self._refresh_events_children)
        event_model.rowsInserted.connect(self._refresh_events_children)
        event_model.rowsRemoved.connect(self._refresh_events_children)

    def _add_parent(self, parent, column, title):
        item = QtGui.QTreeWidgetItem(parent, [title])
        item.setChildIndicatorPolicy(QtGui.QTreeWidgetItem.ShowIndicator)
        item.setCheckState(column, QtCore.Qt.Unchecked)
        item.setExpanded(True)
        return item

    def _add_child(self, parent, column, title):
        item = QtGui.QTreeWidgetItem(parent, [title])
        item.setCheckState(column, QtCore.Qt.Unchecked)
        return item

    @QtCore.pyqtSlot()
    def produceReports(self):
        folder = QtGui.QFileDialog.getExistingDirectory(self, 'Choose output folder')
        DurationReporter().write_reports_about(self._institution, self._duration, str(folder))

    @QtCore.pyqtSlot()
    def produceSelectedReports(self):
        items = self._all_checked_tree_reports()
        if len(items) == 0: return None
        folder = QtGui.QFileDialog.getExistingDirectory(self, 'Choose output folder')
        for i in items:
            if i.reportable != None:
                i.reportable.outputHTMLToFolder(folder)

    def _all_checked_tree_reports(self):
        li = []
        self._collect_checked_items(self.treeWidget.invisibleRootItem(), li)
        return li

    def _collect_checked_items(self, item, li):
        if item.checkState(0):
            li.append(item)
        for i in range(item.childCount()):
            self._collect_checked_items(item.child(i), li)