Ejemplo n.º 1
0
    def __init__(self, toolbar):
        super(Debugger_Panel, self).__init__()

        self.toolbar = toolbar

        self.info_panel = Debugger_Info()

        topleft = QtWidgets.QFrame()
        topleft.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.editor = CodeEditor(self)
        self.editor_layout = QtWidgets.QVBoxLayout()
        self.editor_layout.setContentsMargins(0, 0, 0, 0)

        self.link = LinkPathLabel(self)

        self.editor_layout.addWidget(self.link)
        self.editor_layout.addWidget(self.editor)
        topleft.setLayout(self.editor_layout)

        self.splitter = QtWidgets.QSplitter(QtCore.Qt.Horizontal)
        self.splitter.addWidget(topleft)
        self.splitter.addWidget(self.info_panel)

        layout = QtWidgets.QHBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.addWidget(self.splitter)
        self.setLayout(layout)
Ejemplo n.º 2
0
    def on_mouse_press(self, x, y, button, modifiers):
        if self.menu.click(x, y):
            return

        x, y = x_y_pan_scale(x, y, self.pan_scale, self.get_size())

        if button == 1:
            if self.field:
                self.pop_handlers()
                self.push_handlers()
                self.field = None
            if self.code_editor:
                if self.code_editor.intersect_point((x, y)):
                    return
                else:
                    if self.code_editor.hover:
                        self.pop_handlers()
                        self.push_handlers()
                    self.code_editor = None
            for node in self.nodes:
                if node.intersect_point((x, y)):
                    if (node in self.selected_nodes
                            and len(self.selected_nodes) > 1):
                        self.node_drag = True
                        return
                    else:
                        si = node.selectedInput['name'] != 'none'
                        so = node.selectedOutput['name'] != 'none'
                        if si or so:
                            self.pointer = (x, y)
                            self.connection = True
                            if si:
                                self.disconnect_node(node)
                            elif so:
                                self.connecting_node = \
                                    {'node': node,
                                     'put': node.selectedOutput,
                                     'mode': 'output'}
                            return
                        if isinstance(node, Node):
                            self.code_editor = CodeEditor(node)
                        elif isinstance(node, Field) and not self.field:
                            self.push_handlers(node)
                            self.field = node
                        self.selected_nodes = [node]
                        self.node_drag = True
                        return
            self.select = True
            self.selectPoint = (x, y)
Ejemplo n.º 3
0
    def __init__(self):
        # make a window
        self.w = Window((400, 400), "DrawBot", minSize=(200, 200), textured=False)
        # setting previously stored frames, if any
        self.w.getNSWindow().setFrameUsingName_(self.windowAutoSaveName)
        try:
            # on 10.7+ full screen support
            self.w.getNSWindow().setCollectionBehavior_(128) #NSWindowCollectionBehaviorFullScreenPrimary
        except:
            pass

        # the code editor
        self.codeView = CodeEditor((0, 0, -0, -0))
        # the output view (will catch all stdout and stderr)
        self.outPutView = OutPutEditor((0, 0, -0, -0), readOnly=True)
        # the view to draw in
        self.drawView = DrawView((0, 0, -0, -0))
        # the view with all thumbnails
        self.thumbnails = ThumbnailView((0, 0, -0, -0))
        # connect the thumbnail view with the draw view
        self.thumbnails.setDrawView(self.drawView)

        # collect all code text view in a splitview
        paneDescriptors = [
            dict(view=self.codeView, identifier="codeView", minSize=50, canCollapse=False),
            dict(view=self.outPutView, identifier="outPutView", size=100, minSize=50, canCollapse=False),
        ]
        self.codeSplit = SplitView((0, 0, -0, -0), paneDescriptors, isVertical=False)
        
        # collect the draw scroll view and the code split view in a splitview
        paneDescriptors = [
            dict(view=self.thumbnails, identifier="thumbnails", minSize=100, size=100, maxSize=100),
            dict(view=self.drawView, identifier="drawView", minSize=50),
            dict(view=self.codeSplit, identifier="codeSplit", minSize=50, canCollapse=False),
        ]
        self.w.split = SplitView((0, 0, -0, -0), paneDescriptors)
        
        # setup BaseWindowController base behavoir
        self.setUpBaseWindowBehavior()

        # get the real size of the window
        windowX, windowY, windowWidth, windowHeight = self.w.getPosSize()
        # set the split view dividers at a specific position based on the window size
        self.w.split.setDividerPosition(0, 0)
        self.w.split.setDividerPosition(1, windowWidth * .6)
        self.codeSplit.setDividerPosition(0, windowHeight * .7)
Ejemplo n.º 4
0
    def on_mouse_press(self, x, y, button, modifiers):
        if self.menu.click(x, y):
            return

        x, y = x_y_pan_scale(x, y, self.pan_scale, self.get_size())

        if button == 1:
            if self.field:
                self.pop_handlers()
                self.push_handlers()
                self.field = None
            if self.code_editor:
                if self.code_editor.intersect_point((x, y)):
                    return
                else:
                    if self.code_editor.hover:
                        self.pop_handlers()
                        self.push_handlers()
                    self.code_editor = None
            for node in self.nodes:
                if node.intersect_point((x, y)):
                    if (node in self.selected_nodes
                            and len(self.selected_nodes) > 1):
                        self.node_drag = True
                        return
                    else:
                        if (node.selectedInput['name'] != 'none'
                                or node.selectedOutput['name'] != 'none'):
                            self.pointer = (x, y)
                            self.connection = True
                            if node.selectedInput['name'] != 'none':
                                for c in node.connected_to:
                                    a = c['output']
                                    if (c['input']['put']['name'] ==
                                            node.selectedInput['name']):
                                        self.connecting_node = {
                                            'node': a['node'],
                                            'put': {
                                                'name': a['put']['name']
                                            },
                                            'mode': 'output'
                                        }
                                        n = node.connected_to
                                        del n[n.index(c)]
                                        for line in node.graphics[
                                                'connections']:
                                            for segment in line:
                                                segment.delete()
                                        node.graphics['connections'] = list()
                                        return
                                self.connecting_node = {
                                    'node': node,
                                    'put': node.selectedInput,
                                    'mode': 'input'
                                }
                                return
                            elif node.selectedOutput['name'] != 'none':
                                self.connecting_node = {
                                    'node': node,
                                    'put': node.selectedOutput,
                                    'mode': 'output'
                                }
                            return
                        if isinstance(node, Node):
                            self.code_editor = CodeEditor(node)
                        elif isinstance(node, Field) and not self.field:
                            self.push_handlers(node)
                            self.field = node
                        self.selected_nodes = [node]
                        self.node_drag = True
                        return
            self.select = True
            self.selectPoint = (x, y)
Ejemplo n.º 5
0
class DrawBotController(BaseWindowController):

    """
    The controller for a DrawBot window.
    """

    windowAutoSaveName = "DrawBotController"

    def __init__(self):
        # make a window
        self.w = Window((400, 400), "DrawBot", minSize=(200, 200), textured=False)
        # setting previously stored frames, if any
        self.w.getNSWindow().setFrameUsingName_(self.windowAutoSaveName)
        try:
            # on 10.7+ full screen support
            self.w.getNSWindow().setCollectionBehavior_(128) #NSWindowCollectionBehaviorFullScreenPrimary
        except:
            pass

        # the code editor
        self.codeView = CodeEditor((0, 0, -0, -0))
        # the output view (will catch all stdout and stderr)
        self.outPutView = OutPutEditor((0, 0, -0, -0), readOnly=True)
        # the view to draw in
        self.drawView = DrawView((0, 0, -0, -0))
        # the view with all thumbnails
        self.thumbnails = ThumbnailView((0, 0, -0, -0))
        # connect the thumbnail view with the draw view
        self.thumbnails.setDrawView(self.drawView)

        # collect all code text view in a splitview
        paneDescriptors = [
            dict(view=self.codeView, identifier="codeView", minSize=50, canCollapse=False),
            dict(view=self.outPutView, identifier="outPutView", size=100, minSize=50, canCollapse=False),
        ]
        self.codeSplit = SplitView((0, 0, -0, -0), paneDescriptors, isVertical=False)
        
        # collect the draw scroll view and the code split view in a splitview
        paneDescriptors = [
            dict(view=self.thumbnails, identifier="thumbnails", minSize=100, size=100, maxSize=100),
            dict(view=self.drawView, identifier="drawView", minSize=50),
            dict(view=self.codeSplit, identifier="codeSplit", minSize=50, canCollapse=False),
        ]
        self.w.split = SplitView((0, 0, -0, -0), paneDescriptors)
        
        # setup BaseWindowController base behavoir
        self.setUpBaseWindowBehavior()

        # get the real size of the window
        windowX, windowY, windowWidth, windowHeight = self.w.getPosSize()
        # set the split view dividers at a specific position based on the window size
        self.w.split.setDividerPosition(0, 0)
        self.w.split.setDividerPosition(1, windowWidth * .6)
        self.codeSplit.setDividerPosition(0, windowHeight * .7)
            
    def runCode(self, liveCoding=False):
        # get the code
        code = self.code()
        # save the code in the defaults, if something goes wrong
        setDefault("DrawBotCodeBackup", code)
        # get te path of the document (will be None for an untitled document)
        path = self.path()
        # reset the internal warning system
        warnings.resetWarnings()
        # reset the drawing tool
        _drawBotDrawingTool._reset()
        # create a namespace
        namespace = DrawBotNamespace(_drawBotDrawingTool, _drawBotDrawingTool._magicVariables)
        # add the tool callbacks in the name space
        _drawBotDrawingTool._addToNamespace(namespace)
        # when enabled clear the output text view
        if getDefault("DrawBotClearOutput", True):
            self.outPutView.clear()
        # create a new std output, catching all print statements and tracebacks
        self.output = []
        self.stdout = StdOutput(self.output)
        self.stderr = StdOutput(self.output, True)
        # warnings should show the warnings
        warnings.shouldShowWarnings = True
        # run the code
        ScriptRunner(code, path, namespace=namespace, stdout=self.stdout, stderr=self.stderr)
        # warnings should stop posting them
        warnings.shouldShowWarnings = False
        # set context, only when the panes are visible
        if self.w.split.isPaneVisible("drawView") or self.w.split.isPaneVisible("thumbnails"):
            def createContext(context):
                # draw the tool in to the context
                _drawBotDrawingTool._drawInContext(context)
            # create a context to draw in
            context = DrawBotContext()
            # savely run the callback and track all traceback back the the output
            CallbackRunner(createContext, stdout=self.stdout, stderr=self.stderr, args=[context])
            # get the pdf document and set in the draw view
            pdfDocument = context.getNSPDFDocument()
            if not liveCoding or (pdfDocument and pdfDocument.pageCount()):
                self.drawView.setPDFDocument(pdfDocument)
            # scroll down
            self.drawView.scrollDown()
        else:
            # if the panes are not visible, clear the draw view
            self.drawView.setPDFDocument(None)

        # set the catched print statements and tracebacks in the the output text view
        for text, isError in self.output:
            if liveCoding and isError:
                continue
            self.outPutView.append(text, isError)

        # reset the code backup if the script runs with any crashes
        setDefault("DrawBotCodeBackup", None)
        # clean up
        
        self.output = None
        self.stdout = None
        self.stderr = None
    
    def checkSyntax(self, sender=None):
        # get the code
        code = self.code()
        # get te path of the document (will be None for an untitled document)
        path = self.path()
        # when enabled clear the output text view
        if getDefault("DrawBotClearOutput", True):
            self.outPutView.set("")
        # create a new std output, catching all print statements and tracebacks
        self.output = []
        self.stdout = StdOutput(self.output)
        self.stderr = StdOutput(self.output, True)
        # run the code, but with the optional flag checkSyntaxOnly so it will just compile the code
        ScriptRunner(code, path, stdout=self.stdout, stderr=self.stderr, checkSyntaxOnly=True)
        # set the catched print statements and tracebacks in the the output text view
        for text, isError in self.output:
            self.outPutView.append(text, isError)
        # clean up
        self.output = None
        self.stdout = None
        self.stderr = None

    def _savePDF(self, path):
        # get the pdf date from the draw view
        data = self.drawView.get()
        if data:
            # if there is date save it
            data.writeToFile_atomically_(path , False)
        
    def savePDF(self, sender=None):
        """
        Save the content as a pdf.
        """
        # pop up a show put file sheet
        self.showPutFile(["pdf"], callback=self._savePDF)
        
    def setPath(self, path):
        """
        Sets the content of a file into the code view.
        """
        # open a file
        f = open(path)
        # read the content
        code = f.read().decode("utf-8")
        # close the file
        f.close()
        # set the content into the code view
        self.codeView.set(code)
    
    def path(self):
        """
        Returns the path of the document, 
        return None if the document is never saved before.
        """
        # get the docuemnt
        document = self.document()
        # check if it is not None
        if document is None:
            return None
        # get the url of the document
        url = document.fileURL()
        if url is None:
            return None
        # return the path as a string
        return url.path()

    def code(self):
        """
        Returns the content of the code view as a string.
        """
        return self.codeView.get()
    
    def setCode(self, code):
        """
        Sets code in to the code view.
        """
        self.codeView.set(code)

    def pdfData(self):
        """
        Returns the pdf data from the draw view
        """
        return self.drawView.get()

    # UI 

    def open(self):
        # open the window
        self.w.open()
        # set the code view as first responder
        self.w.getNSWindow().makeFirstResponder_(self.codeView.getNSTextView())

    def assignToDocument(self, nsDocument):
        # assing the window to the document 
        self.w.assignToDocument(nsDocument)
    
    def document(self):
        """
        Returns the document.
        """
        return self.w.getNSWindow().document()

    def setUpBaseWindowBehavior(self):
        # bind whenever a user moves or resizes a window
        self.w.bind("move", self.windowMoveCallback)
        self.w.bind("resize", self.windowResizeCallback)
        super(DrawBotController, self).setUpBaseWindowBehavior()

    def windowMoveCallback(self, sender):
        # save the frame in the defaults
        self.w.getNSWindow().saveFrameUsingName_(self.windowAutoSaveName)    
        
    def windowResizeCallback(self, sender):
        # save the frame in the defaults
        self.w.getNSWindow().saveFrameUsingName_(self.windowAutoSaveName)
    
    def windowCloseCallback(self, sender):
        # unbind on window close
        self.w.unbind("move", self.windowMoveCallback)
        self.w.unbind("resize", self.windowResizeCallback)
        super(DrawBotController, self).windowCloseCallback(sender)
Ejemplo n.º 6
0
class Debugger_Panel(QtWidgets.QWidget):

    windowName = "MPDB_Panel_UI"

    def __init__(self, toolbar):
        super(Debugger_Panel, self).__init__()

        self.toolbar = toolbar

        self.info_panel = Debugger_Info()

        topleft = QtWidgets.QFrame()
        topleft.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.editor = CodeEditor(self)
        self.editor_layout = QtWidgets.QVBoxLayout()
        self.editor_layout.setContentsMargins(0, 0, 0, 0)

        self.link = LinkPathLabel(self)

        self.editor_layout.addWidget(self.link)
        self.editor_layout.addWidget(self.editor)
        topleft.setLayout(self.editor_layout)

        self.splitter = QtWidgets.QSplitter(QtCore.Qt.Horizontal)
        self.splitter.addWidget(topleft)
        self.splitter.addWidget(self.info_panel)

        layout = QtWidgets.QHBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.addWidget(self.splitter)
        self.setLayout(layout)

    def initialize(self):
        self.setWindowTitle(self.windowName)
        self.info_panel.initialize()
        self.editor.initialize()
        self.link.initialize()

    def mayaShow(self):
        ptr = mayaShow(self, self.windowName)
        self.show()
        ptr.destroyed.connect(self.__close)
        return ptr

    def __close(self):
        # NOTE 确保不会被 垃圾回收
        try:
            self.setParent(self.toolbar)
            self.hide()
        except:
            self.setParent(None)


# import sys
# MODULE = r"F:\repo\mpdb\scripts"
# if MODULE not in sys.path:
#     sys.path.append(MODULE)

# try:

#     import mpdb
#     reload(mpdb)

#     debugger_ui = mpdb.Debugger_Panel().mayaShow()
# except:
#     import traceback
#     traceback.print_exc()
Ejemplo n.º 7
0
    def __init__(self):
        # make a window
        self.w = Window((400, 400),
                        "DrawBot",
                        minSize=(200, 200),
                        textured=False)
        # setting previously stored frames, if any
        self.w.getNSWindow().setFrameUsingName_(self.windowAutoSaveName)
        try:
            # on 10.7+ full screen support
            self.w.getNSWindow().setCollectionBehavior_(
                128)  #NSWindowCollectionBehaviorFullScreenPrimary
        except:
            pass

        # the code editor
        self.codeView = CodeEditor((0, 0, -0, -0))
        # the output view (will catch all stdout and stderr)
        self.outPutView = OutPutEditor((0, 0, -0, -0), readOnly=True)
        # the view to draw in
        self.drawView = DrawView((0, 0, -0, -0))
        # the view with all thumbnails
        self.thumbnails = ThumbnailView((0, 0, -0, -0))
        # connect the thumbnail view with the draw view
        self.thumbnails.setDrawView(self.drawView)

        # collect all code text view in a splitview
        paneDescriptors = [
            dict(view=self.codeView,
                 identifier="codeView",
                 minSize=50,
                 canCollapse=False),
            dict(view=self.outPutView,
                 identifier="outPutView",
                 size=100,
                 minSize=50,
                 canCollapse=False),
        ]
        self.codeSplit = SplitView((0, 0, -0, -0),
                                   paneDescriptors,
                                   isVertical=False)

        # collect the draw scroll view and the code split view in a splitview
        paneDescriptors = [
            dict(view=self.thumbnails,
                 identifier="thumbnails",
                 minSize=100,
                 size=100,
                 maxSize=100),
            dict(view=self.drawView, identifier="drawView", minSize=50),
            dict(view=self.codeSplit,
                 identifier="codeSplit",
                 minSize=50,
                 canCollapse=False),
        ]
        self.w.split = SplitView((0, 0, -0, -0), paneDescriptors)

        # setup BaseWindowController base behavoir
        self.setUpBaseWindowBehavior()

        # get the real size of the window
        windowX, windowY, windowWidth, windowHeight = self.w.getPosSize()
        # set the split view dividers at a specific position based on the window size
        self.w.split.setDividerPosition(0, 0)
        self.w.split.setDividerPosition(1, windowWidth * .6)
        self.codeSplit.setDividerPosition(0, windowHeight * .7)
Ejemplo n.º 8
0
class DrawBotController(BaseWindowController):
    """
    The controller for a DrawBot window.
    """

    windowAutoSaveName = "DrawBotController"

    def __init__(self):
        # make a window
        self.w = Window((400, 400),
                        "DrawBot",
                        minSize=(200, 200),
                        textured=False)
        # setting previously stored frames, if any
        self.w.getNSWindow().setFrameUsingName_(self.windowAutoSaveName)
        try:
            # on 10.7+ full screen support
            self.w.getNSWindow().setCollectionBehavior_(
                128)  #NSWindowCollectionBehaviorFullScreenPrimary
        except:
            pass

        # the code editor
        self.codeView = CodeEditor((0, 0, -0, -0))
        # the output view (will catch all stdout and stderr)
        self.outPutView = OutPutEditor((0, 0, -0, -0), readOnly=True)
        # the view to draw in
        self.drawView = DrawView((0, 0, -0, -0))
        # the view with all thumbnails
        self.thumbnails = ThumbnailView((0, 0, -0, -0))
        # connect the thumbnail view with the draw view
        self.thumbnails.setDrawView(self.drawView)

        # collect all code text view in a splitview
        paneDescriptors = [
            dict(view=self.codeView,
                 identifier="codeView",
                 minSize=50,
                 canCollapse=False),
            dict(view=self.outPutView,
                 identifier="outPutView",
                 size=100,
                 minSize=50,
                 canCollapse=False),
        ]
        self.codeSplit = SplitView((0, 0, -0, -0),
                                   paneDescriptors,
                                   isVertical=False)

        # collect the draw scroll view and the code split view in a splitview
        paneDescriptors = [
            dict(view=self.thumbnails,
                 identifier="thumbnails",
                 minSize=100,
                 size=100,
                 maxSize=100),
            dict(view=self.drawView, identifier="drawView", minSize=50),
            dict(view=self.codeSplit,
                 identifier="codeSplit",
                 minSize=50,
                 canCollapse=False),
        ]
        self.w.split = SplitView((0, 0, -0, -0), paneDescriptors)

        # setup BaseWindowController base behavoir
        self.setUpBaseWindowBehavior()

        # get the real size of the window
        windowX, windowY, windowWidth, windowHeight = self.w.getPosSize()
        # set the split view dividers at a specific position based on the window size
        self.w.split.setDividerPosition(0, 0)
        self.w.split.setDividerPosition(1, windowWidth * .6)
        self.codeSplit.setDividerPosition(0, windowHeight * .7)

    def runCode(self, liveCoding=False):
        # get the code
        code = self.code()
        # save the code in the defaults, if something goes wrong
        setDefault("DrawBotCodeBackup", code)
        # get te path of the document (will be None for an untitled document)
        path = self.path()
        # reset the internal warning system
        warnings.resetWarnings()
        # reset the drawing tool
        _drawBotDrawingTool._reset()
        # create a namespace
        namespace = DrawBotNamespace(_drawBotDrawingTool,
                                     _drawBotDrawingTool._magicVariables)
        # add the tool callbacks in the name space
        _drawBotDrawingTool._addToNamespace(namespace)
        # when enabled clear the output text view
        if getDefault("DrawBotClearOutput", True):
            self.outPutView.clear()
        # create a new std output, catching all print statements and tracebacks
        self.output = []

        liveOutput = None
        if getDefault("DrawButLiveUpdateStdoutStderr", False):
            liveOutput = self.outPutView

        self.stdout = StdOutput(self.output, outputView=liveOutput)
        self.stderr = StdOutput(self.output,
                                isError=True,
                                outputView=liveOutput)
        # warnings should show the warnings
        warnings.shouldShowWarnings = True
        # run the code
        ScriptRunner(code,
                     path,
                     namespace=namespace,
                     stdout=self.stdout,
                     stderr=self.stderr)
        # warnings should stop posting them
        warnings.shouldShowWarnings = False
        # set context, only when the panes are visible
        if self.w.split.isPaneVisible(
                "drawView") or self.w.split.isPaneVisible("thumbnails"):

            def createContext(context):
                # draw the tool in to the context
                _drawBotDrawingTool._drawInContext(context)

            # create a context to draw in
            context = DrawBotContext()
            # savely run the callback and track all traceback back the the output
            CallbackRunner(createContext,
                           stdout=self.stdout,
                           stderr=self.stderr,
                           args=[context])
            # get the pdf document and set in the draw view
            pdfDocument = context.getNSPDFDocument()
            if not liveCoding or (pdfDocument and pdfDocument.pageCount()):
                self.drawView.setPDFDocument(pdfDocument)
            # scroll down
            self.drawView.scrollDown()
        else:
            # if the panes are not visible, clear the draw view
            self.drawView.setPDFDocument(None)

        # set the catched print statements and tracebacks in the the output text view
        for text, isError in self.output:
            if liveCoding and isError:
                continue
            self.outPutView.append(text, isError)

        # reset the code backup if the script runs with any crashes
        setDefault("DrawBotCodeBackup", None)
        # clean up

        self.output = None
        self.stdout = None
        self.stderr = None

    def checkSyntax(self, sender=None):
        # get the code
        code = self.code()
        # get te path of the document (will be None for an untitled document)
        path = self.path()
        # when enabled clear the output text view
        if getDefault("DrawBotClearOutput", True):
            self.outPutView.set("")
        # create a new std output, catching all print statements and tracebacks
        self.output = []
        self.stdout = StdOutput(self.output)
        self.stderr = StdOutput(self.output, True)
        # run the code, but with the optional flag checkSyntaxOnly so it will just compile the code
        ScriptRunner(code,
                     path,
                     stdout=self.stdout,
                     stderr=self.stderr,
                     checkSyntaxOnly=True)
        # set the catched print statements and tracebacks in the the output text view
        for text, isError in self.output:
            self.outPutView.append(text, isError)
        # clean up
        self.output = None
        self.stdout = None
        self.stderr = None

    def _savePDF(self, path):
        # get the pdf date from the draw view
        data = self.drawView.get()
        if data:
            # if there is date save it
            data.writeToFile_atomically_(path, False)

    def savePDF(self, sender=None):
        """
        Save the content as a pdf.
        """
        # pop up a show put file sheet
        self.showPutFile(["pdf"], callback=self._savePDF)

    def setPath(self, path):
        """
        Sets the content of a file into the code view.
        """
        # open a file
        f = open(path)
        # read the content
        code = f.read().decode("utf-8")
        # close the file
        f.close()
        # set the content into the code view
        self.codeView.set(code)

    def path(self):
        """
        Returns the path of the document, 
        return None if the document is never saved before.
        """
        # get the docuemnt
        document = self.document()
        # check if it is not None
        if document is None:
            return None
        # get the url of the document
        url = document.fileURL()
        if url is None:
            return None
        # return the path as a string
        return url.path()

    def code(self):
        """
        Returns the content of the code view as a string.
        """
        return self.codeView.get()

    def setCode(self, code):
        """
        Sets code in to the code view.
        """
        self.codeView.set(code)

    def pdfData(self):
        """
        Returns the pdf data from the draw view
        """
        return self.drawView.get()

    # UI

    def open(self):
        # open the window
        self.w.open()
        # set the code view as first responder
        self.w.getNSWindow().makeFirstResponder_(self.codeView.getNSTextView())

    def assignToDocument(self, nsDocument):
        # assing the window to the document
        self.w.assignToDocument(nsDocument)

    def document(self):
        """
        Returns the document.
        """
        return self.w.getNSWindow().document()

    def setUpBaseWindowBehavior(self):
        # bind whenever a user moves or resizes a window
        self.w.bind("move", self.windowMoveCallback)
        self.w.bind("resize", self.windowResizeCallback)
        super(DrawBotController, self).setUpBaseWindowBehavior()

    def windowMoveCallback(self, sender):
        # save the frame in the defaults
        self.w.getNSWindow().saveFrameUsingName_(self.windowAutoSaveName)

    def windowResizeCallback(self, sender):
        # save the frame in the defaults
        self.w.getNSWindow().saveFrameUsingName_(self.windowAutoSaveName)

    def windowCloseCallback(self, sender):
        # unbind on window close
        self.w.unbind("move", self.windowMoveCallback)
        self.w.unbind("resize", self.windowResizeCallback)
        super(DrawBotController, self).windowCloseCallback(sender)