class DocumentController():
    """
    The document controller. Hooks high level (read file/write file, add
    submodel, etc) UI elements to their corresponding actions in the model
    """

    def __init__(self, firstuse):         
        app().documentControllers.add(self)
        self.doc = Document()
        self.idbank = IdBank()
        self.undoStack = QUndoStack()
        app().undoGroup.addStack(self.undoStack)
        self.win = DocumentWindow(docCtrlr=self)
        self.win.show()
        self.stdwin = StdWindow()
        self.webwin = WebWindow()
        self._filename = "untitled.cadnano"
        self.treeController = TreeController(self.win.treeview)
        self.createConnections()
        
        self.recentButton = None
        
        self.win.sliceGraphicsView.mouseMoveEvent = self.sliceViewMouseMove

        if firstuse == True:
            self.win.helplabel.setText(QString("It appears as though this is your first time using CaDNAno 2, would you like to view a tutorial?"))
        else:
            self.win.ignoreButton.hide()
            self.win.showHelpButton.hide()
            self.win.helplabel.hide()

    def sliceViewMouseMove(self, event):
        
        print "hello"
    """
    Roger Additions
    """
    """
    def helpwindow(self):
        #file = open("usagetracker.txt", 'w')
        filename = "C:/Users/Roger Conturie/workspace/Final Cadnano/cadnano2/ui/usagetracker.txt"
        file = open(filename, 'r')
        timesopened = file.readline()
        file.close()
        if timesopened == '0':
            self.webwin.show()
        file = open(filename, 'w')
        file.write(str(int(timesopened) + 1))
        file.close()
    """

    def standardHelpClicked(self):
        self.stdwin.show()
    
    def networkHelpClicked(self):
        import os
        if os.system("ping google.com -n 1") == 1:
            print "no connection"
        else:
            self.webwin.show()
    
    def ignoreClicked(self):
        self.win.ignoreButton.hide()
        self.win.showHelpButton.hide()
        self.win.helplabel.hide()
        
    def showHelpClicked(self):
        self.stdwin.show()
    """
    End Roger Additions
    """
    
    def filename(self):
        return self._filename

    def setFilename(self, proposedFName):
        if self._filename == proposedFName:
            return True
        self._filename = proposedFName
        self.setDirty(True)
        return True

    def createConnections(self):
        """
        Organizational method to collect signal/slot connectors.
        """
        self.win.actionNewHoneycombPart.triggered.connect(self.hcombClicked)

        self.win.actionNewSquarePart.triggered.connect(self.squareClicked)
        self.win.actionNew.triggered.connect(app().newDocument)
        self.win.actionOpen.triggered.connect(self.openClicked)
        self.win.actionClose.triggered.connect(self.closeClicked)
        self.win.actionSave.triggered.connect(self.saveClicked)
        self.win.actionSVG.triggered.connect(self.svgClicked)
        
        self.win.actionStandard_Help.triggered.connect(self.standardHelpClicked)
        self.win.actionNetwork_Help.triggered.connect(self.networkHelpClicked)
        self.win.ignoreButton.pressed.connect(self.ignoreClicked)
        self.win.showHelpButton.pressed.connect(self.showHelpClicked)
        # self.win.actionSave_As.triggered.connect(self.saveAsClicked)
        # self.win.actionQuit.triggered.connect(self.closeClicked)
        # self.win.actionAdd.triggered.connect(self.addClicked)
        # self.win.actionDelete.triggered.connect(self.deleteClicked)
        # self.win.actionCut.triggered.connect(self.cutClicked)
        # self.win.actionPaste.triggered.connect(self.pasteClicked)
        # self.win.actionMoveUp.triggered.connect(self.moveUpClicked)
        # self.win.actionMoveDown.triggered.connect(self.moveDownClicked)
        # self.win.actionPromote.triggered.connect(self.promoteClicked)
        # self.win.actionDemote.triggered.connect(self.demoteClicked)
    # end def

        
    def setDirty(self, dirty=True):
        self.win.setWindowModified(dirty)
    #end def

    def newClicked(self):
        """docstring for newClicked"""
        print "new clicked"
        self.recentButton = "new"
    # end def
    def openClicked(self):
        """docstring for openClicked"""
        print "open clicked"
        self.recentButton = "open"
    # end def        
    def closeClicked(self):
        """docstring for closeClicked"""
        print "close clicked"
        self.recentButton = "close"
    # end def

    def saveClicked(self):
        """docstring for saveClicked"""
        try:
            f = open(self.filename())
            f.write(encode(self.doc))
            f.close()
        except Exception:
            print "Save "
        return True
        self.recentButton = "save"
        
    def saveAsClicked():
        filename = self.filename()
        if filename == None:
            directory = "."
        else:
            directory = QFileInfo(filename).path()
        filename = QFileDialog.getSaveFileName(self.win,\
                            "%s - Save As" % QApplication.applicationName(),\
                            directory,\
                            "%s (*.cadnano)" % QApplication.applicationName())
        if filename.isEmpty():
            return False
        if not filename.toLower().endswith(".cadnano"):
            filename += ".cadnano"
        self.setFilename(filename)
        self.recentButton = "saveAs"
        return self.saveClicked()

    def svgClicked(self):
        """docstring for svgClicked"""
        print "svg clicked"
        self.recentButton = "svg"

    # end def

    def hcombClicked(self):
        """docstring for hcombClicked"""
        print "+honeycomb clicked"
        self.addHoneycombHelixGroup()
        self.recentButton = "hcomb"

    # end def

    def squareClicked(self):
        """docstring for squareClicked"""
        print "+square clicked"
        self.recentButton = "square"
    # end def

    def addHoneycombHelixGroup(self, nrows=20, ncolumns=20):
        """docstring for addHoneycombHelixGroup"""
        # Create a new DNA part
        objId = self.idbank.get()
        instId = objId#self.idbank.get()
        dnaPartInst = self.doc.addDnaPart(objId, instId,\
                                          crossSectionType='honeycomb')
        # Add the part to the Tree view
        name = "Part.%d" % objId 
        self.treeController.addPartNode(name, dnaPartInst)

        # Create a Slice view of part
        shg = SliceHelixGroup(dnaPartInst, nrows, ncolumns,\
                              scene=self.win.slicescene,\
                              controller=self.win.sliceController)
        self.win.slicescene.addItem(shg)

        # Create a Path view of the part
        phg = PathHelixGroup(dnaPartInst, scene=self.win.pathscene,\
                             controller=self.win.pathController)
        self.win.pathscene.addItem(phg)

        # Connect the slice
        shg.helixAdded.connect(phg.handleHelixAdded)
        shg.sliceHelixClicked.connect(phg.handleSliceHelixClick)
        dnaPartInst.partselected.connect(shg.bringToFront)
        dnaPartInst.partselected.connect(phg.bringToFront)
        self.recentButton = "addHoneycombHelixGroup"

    # end def

    def deleteClicked(self):
        index = self.win.treeview.currentIndex()
        if not index.isValid():
            return
        name = self.treemodel.data(index).toString()
        rows = self.treemodel.rowCount(index)
        if rows == 0:
            message = "<p>Delete '%s'" % name
        # end if
        elif rows == 1:
            message = "<p>Delete '%s' and its child (and " +\
                         "grandchildren etc.)" % name
        # end elif
        elif rows > 1:
            message = "<p>Delete '%s' and its %d children (and " +\
                         "grandchildren etc.)" % (name, rows)

        # end elif
        if not self.okToDelete(this, QString("Delete"), QString(message)):
            return
        self.treemodel.removeRow(index.row(), index.parent())
        self.setDirty(True)
        self.updateUi()
        self.recentButton = "addHoneycombHelixGroup"

    # end def

    def okToDelete(self, parent, title, text, detailedText):
        """
        """
        messageBox = QMessageBox(parent)
        if parent:
            messageBox.setWindowModality(Qt.WindowModal)
        # end if
        messageBox.setIcon(QMessageBox.Question)
        messageBox.setWindowTitle(\
            QString("%1 - %2").arg(QApplication.applicationName()).arg(title))
        messageBox.setText(text)
        if not detailedText.isEmpty():
            messageBox.setInformativeText(detailedText)
        # end if
        deleteButton = messageBox.addButton(QString("&Delete"),\
                                            QMessageBox.AcceptRole)
        messageBox.addButton(QString("Do &Not Delete"),\
                             QMessageBox.RejectRole)
        messageBox.setDefaultButton(deleteButton)
        messageBox.exec_()
        return messageBox.clickedButton() == deleteButton
    # end def

    def okToClear(self, savedata, parent, title, text, detailedText):
        """
        savedata is a function pointer
        """
        assert savedata and parent
        messageBox = QMessageBox(parent)
        if parent:
            messageBox.setWindowModality(Qt.WindowModal)
        # end if
        messageBox.setIcon(QMessageBox.Question)
        messageBox.setWindowTitle(\
          QString("%1 - %2").arg(QApplication.applicationName()).arg(title))
        messageBox.setText(text)
        if not detailedText.isEmpty():
            messageBox.setInformativeText(detailedText)
        # end if

        saveButton = messageBox.addButton(QMessageBox.Save)
        messageBox.addButton(QMessageBox.Save)
        messageBox.addButton(QMessageBox.Discard)
        messageBox.addButton(QMessageBox.Cancel)
        messageBox.setDefaultButton(saveButton)
        messageBox.exec_()
        if messageBox.clickedButton() == messageBox.button(QMessageBox.Cancel):
            return False
        if messageBox.clickedButton() == messageBox.button(QMessageBox.Save):
            return parent.savedata()  # how to return the function (lambda?)
        return True
    # end def

    def createAction(self, icon, text, parent, shortcutkey):
        """
        returns a QAction object
        """
        action = QAction(QIcon(icon), text, parent)
        if not shorcutkey.isEmpty():
            action.setShortcut(shortcutkey)
        # end if
        return action
    # end def

    def updateUi(self):
        """
        """
        #self.win.actionSave.setEnabled(self.win.isWindowModified())

        rows = self.treemodel.rowCount()

        #self.win.actionSave_As.setEnabled(self.win.isWindowModified() or rows)
        #self.win.actionHideOrShowItems.setEnabled(rows)
        enable = self.win.treeview.currentIndex().isValid()

        # actions = [self.win.actionDelete,\
        #            self.win.actionMoveUp,\
        #            self.win.actionMoveDown,\
        #            self.win.actionCut,\
        #            self.win.actionPromote,\
        #            self.win.actionDemote]
        # for action in actions:
        #     action.setEnabled(enable)
        # # end for
        # self.win.actionStartOrStop.setEnabled(rows);
        # self.win.actionPaste.setEnabled(self.treemodel.hasCutItem())
    #end def

    def cutClicked(self):
        """"""
        self.win.actionPaste.setEnabled(self.treeController.cut())
    # end def

    def pasteClicked(self):
        """"""
        self.treeController.paste()
    # end def

    def moveUpClicked(self):
        """"""
        self.treeController.moveUp()
    # end def

    def moveDownClicked(self):
        """"""
        self.treeController.moveDown()
    # end def

    def promoteClicked(self):
        """"""
        self.treeController.promote()
    #end def

    def demoteClicked(self):
        """"""
        self.treeController.demote()
    #end def

    def hideOrShowNode(self, hide, index):
        """"""
        self.treeController.hideOrShowNode()