Exemplo n.º 1
0
class MainWindow(ApplicationWindow):
    """ The main application window. """

    ###########################################################################
    # 'object' interface.
    ###########################################################################

    def __init__(self, **traits):
        """ Creates a new application window. """

        # Base class constructor.
        super(MainWindow, self).__init__(**traits)

        # Add a menu bar.
        self.menu_bar_manager = MenuBarManager(
            MenuManager(Action(name='&Open...', on_perform=self._open_file),
                        Action(name='&Save', on_perform=self._save_file),
                        Action(name='E&xit', on_perform=self.close),
                        name='&File'))

        return

    ###########################################################################
    # Protected 'IApplication' interface.
    ###########################################################################

    def _create_contents(self, parent):
        """ Create the editor. """

        self._editor = PythonEditor(parent)

        return self._editor.control

    ###########################################################################
    # Private interface.
    ###########################################################################

    def _open_file(self):
        """ Open a new file. """

        if self.control:
            dlg = FileDialog(parent=self.control, wildcard="*.py")

            if dlg.open() == OK:
                self._editor.path = dlg.path

    def _save_file(self):
        """ Save the file. """

        if self.control:
            try:
                self._editor.save()
            except IOError, e:
                # If you are trying to save to a file that doesn't exist,
                # open up a FileDialog with a 'save as' action.
                dlg = FileDialog(parent=self.control,
                                 action='save as',
                                 wildcard="*.py")
                if dlg.open() == OK:
                    self._editor.save(dlg.path)
Exemplo n.º 2
0
class MainWindow(ApplicationWindow):
    """ The main application window. """

    ###########################################################################
    # 'object' interface.
    ###########################################################################

    def __init__(self, **traits):
        """ Creates a new application window. """

        # Base class constructor.
        super(MainWindow, self).__init__(**traits)

        # Add a menu bar.
        self.menu_bar_manager = MenuBarManager(MenuManager(
                    Action(name='&Open...', on_perform=self._open_file),
                    Action(name='&Save', on_perform=self._save_file),
                    Action(name='E&xit', on_perform=self.close),
                name='&File'))

        return

    ###########################################################################
    # Protected 'IApplication' interface.
    ###########################################################################

    def _create_contents(self, parent):
        """ Create the editor. """

        self._editor = PythonEditor(parent)

        return self._editor.control

    ###########################################################################
    # Private interface.
    ###########################################################################

    def _open_file(self):
        """ Open a new file. """

        if self.control:
            dlg = FileDialog(parent=self.control, wildcard="*.py")

            if dlg.open() == OK:
                self._editor.path = dlg.path

    def _save_file(self):
        """ Save the file. """

        if self.control:
            try:
                self._editor.save()
            except IOError, e:
                # If you are trying to save to a file that doesn't exist,
                # open up a FileDialog with a 'save as' action.
                dlg = FileDialog(parent=self.control, action='save as', wildcard="*.py")
                if dlg.open() == OK:
                    self._editor.save(dlg.path)
Exemplo n.º 3
0
class PythonEditorPane(TaskPane):

    id = Str
    name = Str

    editor = Instance(PythonEditor)

    def create(self, parent):
        self.editor = PythonEditor(parent)
        self.control = self.editor.control

    def destroy(self):
        self.editor.destroy()
        self.control = self.editor = None
Exemplo n.º 4
0
class PythonEditorPane(TaskPane):

    id = 'example.python_editor_pane'
    name = 'Python Editor'

    editor = Instance(PythonEditor)

    def create(self, parent):
        self.editor = PythonEditor(parent)
        self.control = self.editor.control

    def destroy(self):
        self.editor.destroy()
        self.control = self.editor = None
Exemplo n.º 5
0
    def create_control(self, parent):
        """ Creates the toolkit-specific control that represents the
            editor. 'parent' is the toolkit-specific control that is
            the editor's parent.
        """
        ed = PythonEditor(parent, show_line_numbers=False)

        # FIXME: Implement toolkit specific Python editor subclass
        import wx
        styles = [
            wx.stc.STC_STYLE_DEFAULT,
            wx.stc.STC_STYLE_CONTROLCHAR,
            wx.stc.STC_STYLE_BRACELIGHT,
            wx.stc.STC_STYLE_BRACEBAD,
            wx.stc.STC_P_DEFAULT,
            wx.stc.STC_P_COMMENTLINE,
            wx.stc.STC_P_NUMBER,
            wx.stc.STC_P_STRING,
            wx.stc.STC_P_CHARACTER,
            wx.stc.STC_P_WORD,
            wx.stc.STC_P_TRIPLE,
            wx.stc.STC_P_TRIPLEDOUBLE,
            wx.stc.STC_P_CLASSNAME,
            wx.stc.STC_P_DEFNAME,
            wx.stc.STC_P_OPERATOR,
            wx.stc.STC_P_IDENTIFIER,
            wx.stc.STC_P_COMMENTBLOCK,
            wx.stc.STC_P_STRINGEOL
        ]

        for style in styles:
            ed.control.StyleSetFaceName(style, "monospace")
            ed.control.StyleSetSize(style, 10)

        path = self.obj.path
        if exists(path):
            ed.path = path
            ed.load()

        return ed.control
Exemplo n.º 6
0
class PythonEditorPane(TaskPane):
    """ A wrapper around the Pyface Python editor.
    """

    #### TaskPane interface ###################################################

    id = 'example.python_editor_pane'
    name = 'Python Editor'

    #### PythonEditorPane interface ###########################################

    editor = Instance(PythonEditor)

    ###########################################################################
    # 'ITaskPane' interface.
    ###########################################################################

    def create(self, parent):
        self.editor = PythonEditor(parent)
        self.control = self.editor.control

    def destroy(self):
        self.editor.destroy()
        self.control = self.editor = None
Exemplo n.º 7
0
class PythonEditorPane(TaskPane):
    """ A wrapper around the Pyface Python editor.
    """

    # TaskPane interface ---------------------------------------------------

    id = "example.python_editor_pane"
    name = "Python Editor"

    # PythonEditorPane interface -------------------------------------------

    editor = Instance(PythonEditor)

    # ------------------------------------------------------------------------
    # 'ITaskPane' interface.
    # ------------------------------------------------------------------------

    def create(self, parent):
        self.editor = PythonEditor(parent)
        self.control = self.editor.control

    def destroy(self):
        self.editor.destroy()
        self.control = self.editor = None
Exemplo n.º 8
0
 def create(self, parent):
     self.editor = PythonEditor(parent)
     self.control = self.editor.control
Exemplo n.º 9
0
    def _create_contents(self, parent):
        """ Create the editor. """

        self._editor = PythonEditor(parent)

        return self._editor.control
Exemplo n.º 10
0
class MainWindow(ApplicationWindow):
    """ The main application window. """

    ###########################################################################
    # 'object' interface.
    ###########################################################################

    def __init__(self, **traits):
        """ Creates a new application window. """

        # Base class constructor.
        super(MainWindow, self).__init__(**traits)

        # Add a menu bar.
        self.menu_bar_manager = MenuBarManager(
            MenuManager(Group(
                Action(name='&Open...',
                       accelerator='Ctrl+O',
                       on_perform=self.on_open_file),
                Action(name='&Save',
                       accelerator='Ctrl+S',
                       on_perform=self.on_save_file),
                id='document_group',
            ),
                        Action(name='&Close',
                               accelerator='Ctrl+W',
                               on_perform=self.close),
                        name='&File'))

        # Add a tool bar if we are using qt4 - wx has layout issues
        if toolkit_object.toolkit == 'qt4':
            from pygments.styles import STYLE_MAP
            styles = list(STYLE_MAP)

            self.tool_bar_manager = ToolBarManager(
                Group(
                    Action(name='Open...', on_perform=self.on_open_file),
                    Action(name='Save', on_perform=self.on_save_file),
                    Action(name='Close', on_perform=self.close),
                    id='document_group',
                ),
                Group(
                    Action(
                        name="Lines",
                        style='toggle',
                        on_perform=self.on_show_line_numbers,
                        checked=True,
                    ),
                    FieldAction(
                        name='Style',
                        field_type=ComboField,
                        field_defaults={
                            'values': styles,
                            'value': 'default',
                            'tooltip': 'Style',
                        },
                        on_perform=self.on_style_changed,
                    ),
                ))

    ###########################################################################
    # Protected 'IApplication' interface.
    ###########################################################################

    def _create_contents(self, parent):
        """ Create the editor. """

        self._editor = PythonEditor(parent)

        return self._editor.control

    ###########################################################################
    # Private interface.
    ###########################################################################

    def on_open_file(self):
        """ Open a new file. """

        if self.control:
            dlg = FileDialog(parent=self.control, wildcard='*.py')

            if dlg.open() == OK:
                self._editor.path = dlg.path

    def on_save_file(self):
        """ Save the file. """

        if self.control:
            try:
                self._editor.save()
            except IOError:
                # If you are trying to save to a file that doesn't exist,
                # open up a FileDialog with a 'save as' action.
                dlg = FileDialog(parent=self.control,
                                 action='save as',
                                 wildcard="*.py")
                if dlg.open() == OK:
                    self._editor.save(dlg.path)

    def on_show_line_numbers(self):
        self._editor.show_line_numbers = not self._editor.show_line_numbers

    def on_style_changed(self, value):
        from pygments.styles import get_style_by_name

        # XXX surface this to a proper API on the editor widget
        # XXX Qt backend only
        highlighter = self._editor.control.code.highlighter
        highlighter._style = get_style_by_name(value)
        highlighter._brushes = {}
        highlighter._formats = {}
        highlighter.rehighlight()
Exemplo n.º 11
0
    def init(self, parent):
        """ Finishes initializing the editor by creating the underlying toolkit
            widget.
        """
        factory = self.factory
        self._editor = editor = PythonEditor(
            parent, show_line_numbers=factory.show_line_numbers)
        self.control = control = editor.control

        # There are a number of events which aren't well documented that look
        # to be useful in future implmentations, below are a subset of the
        # events that look interesting:
        #    EVT_STC_AUTOCOMP_SELECTION
        #    EVT_STC_HOTSPOT_CLICK
        #    EVT_STC_HOTSPOT_DCLICK
        #    EVT_STC_DOUBLECLICK
        #    EVT_STC_MARGINCLICK

        control.SetSize(wx.Size(300, 124))

        # Clear out the goofy hotkeys for zooming text
        control.CmdKeyClear(ord('B'), stc.STC_SCMOD_CTRL)
        control.CmdKeyClear(ord('N'), stc.STC_SCMOD_CTRL)

        # Set up the events
        wx.EVT_KILL_FOCUS(control, self.wx_update_object)
        stc.EVT_STC_CALLTIP_CLICK(control, control.GetId(),
                                  self._calltip_clicked)

        if factory.auto_scroll and (factory.selected_line != ''):
            wx.EVT_SIZE(control, self._update_selected_line)

        if factory.auto_set:
            editor.on_trait_change(self.update_object,
                                   'changed',
                                   dispatch='ui')

        if factory.key_bindings is not None:
            editor.on_trait_change(self.key_pressed,
                                   'key_pressed',
                                   dispatch='ui')

        if self.readonly:
            control.SetReadOnly(True)

        # Set up the lexer
        control.SetLexer(stc.STC_LEX_CONTAINER)
        control.Bind(stc.EVT_STC_STYLENEEDED, self._style_needed)
        try:
            self.lexer = getattr(stc, 'STC_LEX_' + self.factory.lexer.upper())
        except AttributeError:
            self.lexer = stc.STC_LEX_NULL

        # Define the markers we use:
        control.MarkerDefine(MARK_MARKER,
                             stc.STC_MARK_BACKGROUND,
                             background=factory.mark_color_)
        control.MarkerDefine(SEARCH_MARKER,
                             stc.STC_MARK_BACKGROUND,
                             background=factory.search_color_)
        control.MarkerDefine(SELECTED_MARKER,
                             stc.STC_MARK_BACKGROUND,
                             background=factory.selected_color_)

        # Make sure the editor has been initialized:
        self.update_editor()

        # Set up any event listeners:
        self.sync_value(factory.mark_lines, 'mark_lines', 'from', is_list=True)
        self.sync_value(factory.selected_line, 'selected_line', 'from')
        self.sync_value(factory.selected_text, 'selected_text', 'to')
        self.sync_value(factory.line, 'line')
        self.sync_value(factory.column, 'column')
        self.sync_value(factory.calltip_clicked, 'calltip_clicked')

        self.sync_value(factory.dim_lines, 'dim_lines', 'from', is_list=True)
        if self.factory.dim_color == '':
            self.dim_color = 'dark grey'
        else:
            self.sync_value(factory.dim_color, 'dim_color', 'from')

        self.sync_value(factory.squiggle_lines,
                        'squiggle_lines',
                        'from',
                        is_list=True)
        if factory.squiggle_color == '':
            self.squiggle_color = 'red'
        else:
            self.sync_value(factory.squiggle_color, 'squiggle_color', 'from')

        # Check if we need to monitor the line or column position being
        # changed:
        if (factory.line != '') or (factory.column != '') or \
                (factory.selected_text != ''):
            stc.EVT_STC_UPDATEUI(control, control.GetId(),
                                 self._position_changed)
        self.set_tooltip()
Exemplo n.º 12
0
    def init(self, parent):
        """ Finishes initializing the editor by creating the underlying toolkit
            widget.
        """
        factory = self.factory
        self._editor = editor = PythonEditor(
            parent, show_line_numbers=factory.show_line_numbers)
        self.control = control = editor.control

        # There are a number of events which aren't well documented that look
        # to be useful in future implmentations, below are a subset of the
        # events that look interesting:
        #    EVT_STC_AUTOCOMP_SELECTION
        #    EVT_STC_HOTSPOT_CLICK
        #    EVT_STC_HOTSPOT_DCLICK
        #    EVT_STC_DOUBLECLICK
        #    EVT_STC_MARGINCLICK

        control.SetSize(wx.Size(300, 124))

        # Clear out the goofy hotkeys for zooming text
        control.CmdKeyClear(ord("B"), stc.STC_SCMOD_CTRL)
        control.CmdKeyClear(ord("N"), stc.STC_SCMOD_CTRL)

        # Set up the events
        control.Bind(wx.EVT_KILL_FOCUS, self.wx_update_object)
        control.Bind(stc.EVT_STC_CALLTIP_CLICK, self._calltip_clicked)

        if factory.auto_scroll and (factory.selected_line != ""):
            control.Bind(wx.EVT_SIZE, self._update_selected_line)

        if factory.auto_set:
            editor.on_trait_change(self.update_object,
                                   "changed",
                                   dispatch="ui")

        if factory.key_bindings is not None:
            editor.on_trait_change(self.key_pressed,
                                   "key_pressed",
                                   dispatch="ui")

        if self.readonly:
            control.SetReadOnly(True)

        # Set up the lexer
        control.SetLexer(stc.STC_LEX_CONTAINER)
        control.Bind(stc.EVT_STC_STYLENEEDED, self._style_needed)
        try:
            self.lexer = getattr(stc, "STC_LEX_" + self.factory.lexer.upper())
        except AttributeError:
            self.lexer = stc.STC_LEX_NULL

        # Define the markers we use:
        control.MarkerDefine(
            MARK_MARKER,
            stc.STC_MARK_BACKGROUND,
            background=wx.Colour(factory.mark_color_),
        )
        control.MarkerDefine(
            SEARCH_MARKER,
            stc.STC_MARK_BACKGROUND,
            background=wx.Colour(factory.search_color_),
        )
        control.MarkerDefine(
            SELECTED_MARKER,
            stc.STC_MARK_BACKGROUND,
            background=wx.Colour(factory.selected_color_),
        )

        # Make sure the editor has been initialized:
        self.update_editor()

        # Set up any event listeners:
        self.sync_value(factory.mark_lines, "mark_lines", "from", is_list=True)
        self.sync_value(factory.selected_line, "selected_line", "from")
        self.sync_value(factory.selected_text, "selected_text", "to")
        self.sync_value(factory.line, "line")
        self.sync_value(factory.column, "column")
        self.sync_value(factory.calltip_clicked, "calltip_clicked")

        self.sync_value(factory.dim_lines, "dim_lines", "from", is_list=True)
        if self.factory.dim_color == "":
            self.dim_color = "dark grey"
        else:
            self.sync_value(factory.dim_color, "dim_color", "from")

        self.sync_value(factory.squiggle_lines,
                        "squiggle_lines",
                        "from",
                        is_list=True)
        if factory.squiggle_color == "":
            self.squiggle_color = "red"
        else:
            self.sync_value(factory.squiggle_color, "squiggle_color", "from")

        # Check if we need to monitor the line or column position being
        # changed:
        if ((factory.line != "") or (factory.column != "")
                or (factory.selected_text != "")):
            control.Bind(stc.EVT_STC_UPDATEUI, self._position_changed)
        self.set_tooltip()
Exemplo n.º 13
0
    def _create_contents(self, parent):
        """ Create the editor. """

        self._editor = PythonEditor(parent)

        return self._editor.control