def __init__(self, transform_presenter=None):
        super(TransformPane, self).__init__("Transformers && CodeGenerators")
        self.transform_presenter = transform_presenter

        self.last_used_directory = None
        self.current_editor_item = None

        settings = QtCore.QSettings()
        settings.beginGroup("transforms")
        self.last_used_directory = settings.value("load_directory", ".")
        self.last_package_name = settings.value("load_package", "")
        settings.endGroup()

        layout = QtGui.QVBoxLayout()

        button_box = QtGui.QGroupBox()
        button_box.setMaximumHeight(40)
        button_layout = QtGui.QHBoxLayout()
        go_button = QtGui.QPushButton("Apply")
        go_button.clicked.connect(
            self.transform_presenter.apply_current_transform)

        open_button = QtGui.QPushButton("Load File")
        open_button.clicked.connect(self.load)

        package_button = QtGui.QPushButton("Load Package")
        package_button.clicked.connect(self.load_package)

        reload_button = QtGui.QPushButton("Reload")
        reload_button.clicked.connect(
            self.transform_presenter.reload_transforms)

        button_layout.addWidget(package_button)
        button_layout.addWidget(open_button)
        button_layout.addWidget(go_button)
        button_layout.addWidget(reload_button)

        button_box.setLayout(button_layout)

        layout.addWidget(button_box)

        self.main_splitter = QtGui.QSplitter(self,
                                             orientation=QtCore.Qt.Vertical)

        self.transform_tree_widget = TransformTreeWidget(
            self.transform_presenter, self)
        # self.transform_tree_widget.setMaximumHeight(200)
        self.main_splitter.addWidget(self.transform_tree_widget)

        # self.editor = EditorPane()
        # self.main_splitter.addWidget(self.editor)

        self.editor_panel = EditorPanel(transform_pane=self)
        self.editor = self.editor_panel.editor
        self.main_splitter.addWidget(self.editor_panel)

        self.main_splitter.setSizes([300, 700])

        layout.addWidget(self.main_splitter)
        self.setLayout(layout)
    def __init__(self, transform_presenter=None):
        super(TransformPane, self).__init__("Transformers && CodeGenerators")
        self.transform_presenter = transform_presenter

        self.last_used_directory = None
        self.current_editor_item = None

        settings = QtCore.QSettings()
        settings.beginGroup("transforms")
        self.last_used_directory = settings.value("load_directory", ".")
        self.last_package_name = settings.value("load_package", "")
        settings.endGroup()

        layout = QtGui.QVBoxLayout()

        button_box = QtGui.QGroupBox()
        #button_box.setMaximumHeight(40)
        button_layout = QtGui.QHBoxLayout()
        go_button = QtGui.QPushButton("Apply")
        go_button.clicked.connect(self.transform_presenter.apply_current_transform)

        open_button = QtGui.QPushButton("Load File")
        open_button.clicked.connect(self.load)

        package_button = QtGui.QPushButton("Load Package")
        package_button.clicked.connect(self.load_package)

        reload_button = QtGui.QPushButton("Reload")
        reload_button.clicked.connect(self.transform_presenter.reload_transforms)

        button_layout.addWidget(package_button)
        button_layout.addWidget(open_button)
        button_layout.addWidget(go_button)
        button_layout.addWidget(reload_button)

        button_box.setLayout(button_layout)

        layout.addWidget(button_box)

        self.main_splitter = QtGui.QSplitter(self, orientation=QtCore.Qt.Vertical)

        self.transform_tree_widget = TransformTreeWidget(self.transform_presenter, self)
        # self.transform_tree_widget.setMaximumHeight(200)
        self.main_splitter.addWidget(self.transform_tree_widget)

        # self.editor = EditorPane()
        # self.main_splitter.addWidget(self.editor)

        self.editor_panel = EditorPanel(transform_pane=self)
        self.editor = self.editor_panel.editor
        self.main_splitter.addWidget(self.editor_panel)

        self.main_splitter.setSizes([300, 700])

        layout.addWidget(self.main_splitter)
        self.setLayout(layout)
class TransformPane(QtGui.QGroupBox):
    """
    Show a list of transformers
    ast_transformers create a new tree from an existing tree
    code generators generate some language text from a tree
    transformers can be applied to nodes other than the root
    """
    def __init__(self, transform_presenter=None):
        super(TransformPane, self).__init__("Transformers && CodeGenerators")
        self.transform_presenter = transform_presenter

        self.last_used_directory = None
        self.current_editor_item = None

        settings = QtCore.QSettings()
        settings.beginGroup("transforms")
        self.last_used_directory = settings.value("load_directory", ".")
        self.last_package_name = settings.value("load_package", "")
        settings.endGroup()

        layout = QtGui.QVBoxLayout()

        button_box = QtGui.QGroupBox()
        button_box.setMaximumHeight(40)
        button_layout = QtGui.QHBoxLayout()
        go_button = QtGui.QPushButton("Apply")
        go_button.clicked.connect(
            self.transform_presenter.apply_current_transform)

        open_button = QtGui.QPushButton("Load File")
        open_button.clicked.connect(self.load)

        package_button = QtGui.QPushButton("Load Package")
        package_button.clicked.connect(self.load_package)

        reload_button = QtGui.QPushButton("Reload")
        reload_button.clicked.connect(
            self.transform_presenter.reload_transforms)

        button_layout.addWidget(package_button)
        button_layout.addWidget(open_button)
        button_layout.addWidget(go_button)
        button_layout.addWidget(reload_button)

        button_box.setLayout(button_layout)

        layout.addWidget(button_box)

        self.main_splitter = QtGui.QSplitter(self,
                                             orientation=QtCore.Qt.Vertical)

        self.transform_tree_widget = TransformTreeWidget(
            self.transform_presenter, self)
        # self.transform_tree_widget.setMaximumHeight(200)
        self.main_splitter.addWidget(self.transform_tree_widget)

        # self.editor = EditorPane()
        # self.main_splitter.addWidget(self.editor)

        self.editor_panel = EditorPanel(transform_pane=self)
        self.editor = self.editor_panel.editor
        self.main_splitter.addWidget(self.editor_panel)

        self.main_splitter.setSizes([300, 700])

        layout.addWidget(self.main_splitter)
        self.setLayout(layout)

    @QtCore.Slot(QtGui.QListWidgetItem)
    def load_editor_from(self, widget_item):
        """
        When a transform is clicked in the list, we put the cursor on that line in
        the file. Don't redraw or reload if cursor is already there.  If there is
        no file level source try and load from the inspect.getsource text from
        loading transform
        """
        file_name = ''
        source_text = ''
        line_number = 0
        column_number = 0
        read_only = False

        transform_item = widget_item.source
        file_item = None
        if isinstance(transform_item, TransformThing):
            if transform_item.transform_file:
                file_item = transform_item.transform_file
                print("file_item set to %s" % file_item)
                file_name = file_item.file_name
                if not file_item.source_text:
                    source_text = transform_item.source_text
                    read_only = True
                else:
                    source_text = file_item.source_text
                    if widget_item.name() in file_item.class_def_nodes:
                        node = file_item.class_def_nodes[widget_item.name()]
                        if hasattr(node, 'lineno'):
                            line_number = node.lineno
                            column_number = node.col_offset
            else:
                file_name = transform_item.name()
                source_text = transform_item.source_text
                read_only = True
        elif isinstance(transform_item, TransformFile):
            file_name = transform_item.file_name
            source_text = transform_item.source_text
            if transform_item.load_error_line_number:
                line_number = transform_item.load_error_line_number
            read_only = False
        else:
            print("skipping editor set on click of non file or thing")
            return

        print("setting file_name %s vs %s" %
              (file_name, self.current_editor_item))
        if file_name and file_name != self.current_editor_item:
            self.current_editor_item = transform_item.file_name
            self.editor.setPlainText(source_text)
            self.editor.set_file_name(widget_item.source.file_name)
            self.editor.set_read_only(read_only)
            self.editor_panel.disable_buttons()
            title = "Edit: %s" % widget_item.source.file_name
            if read_only:
                title += " READ ONLY"
            self.editor_panel.setTitle(title)

        if file_item:
            print("set editor from has a file_item %s" % file_item)
            self.editor_panel.transform_collection = file_item
        else:
            print("set_editor_from does not have a file_item")

        self.editor.setCenterOnScroll(True)
        text_cursor = self.editor.textCursor()
        text_block = self.editor.document().findBlockByLineNumber(line_number -
                                                                  1)
        pos = text_block.position() + column_number
        text_cursor.setPosition(pos)
        self.editor.setTextCursor(text_cursor)
        self.editor.setCenterOnScroll(False)

    def update_view(self):
        self.transform_tree_widget.build(
            self.transform_presenter.transform_collections)

    def current_item(self):
        return self.transform_tree_widget.currentItem()

    @staticmethod
    def show_error(message):
        message_box = QtGui.QMessageBox()
        message_box.setText("Error:\n%s" % message)
        message_box.exec_()

    def load(self):
        file_name, _ = QtGui.QFileDialog.getOpenFileName(
            self,
            caption="Select a file containing Node Transformers",
            dir=self.last_used_directory,
            filter="Python Files (*.py);;All Files (*);;")
        if file_name:
            settings = QtCore.QSettings()
            settings.beginGroup("transforms")
            settings.setValue("load_directory", os.path.dirname(file_name))
            settings.setValue("load_package", self.last_package_name)
            settings.endGroup()

            print("got file_name %s" % file_name)
            self.transform_presenter.load_files([file_name])
            self.update_view()

    def load_package(self):
        package_name, ok = QtGui.QInputDialog.getText(
            self,
            "Load additional tranformers",
            "package name or path to file",
            QtGui.QLineEdit.Normal,
            self.last_package_name,
        )
        if ok and package_name != '':
            self.last_package_name = package_name

            settings = QtCore.QSettings()
            settings.beginGroup("transforms")
            settings.setValue("load_directory", self.last_used_directory)
            settings.setValue("load_package", self.last_package_name)
            settings.endGroup()

            print("Got package name %s" % package_name)
            self.transform_presenter.load_transforms(package_name)
            self.update_view()

    def contextMenuEvent(self, event):
        menu = QtGui.QMenu(self)
        menu.addAction(QtGui.QAction("Show source_text", self))
        menu.addAction(QtGui.QAction("Apply to current tree", self))
        menu.addAction(
            QtGui.QAction("Apply to current node of current tree", self))
        menu.exec_(event.globalPos())
class TransformPane(QtGui.QGroupBox):
    """
    Show a list of transformers
    ast_transformers create a new tree from an existing tree
    code generators generate some language text from a tree
    transformers can be applied to nodes other than the root
    """
    def __init__(self, transform_presenter=None):
        super(TransformPane, self).__init__("Transformers && CodeGenerators")
        self.transform_presenter = transform_presenter

        self.last_used_directory = None
        self.current_editor_item = None

        settings = QtCore.QSettings()
        settings.beginGroup("transforms")
        self.last_used_directory = settings.value("load_directory", ".")
        self.last_package_name = settings.value("load_package", "")
        settings.endGroup()

        layout = QtGui.QVBoxLayout()

        button_box = QtGui.QGroupBox()
        #button_box.setMaximumHeight(40)
        button_layout = QtGui.QHBoxLayout()
        go_button = QtGui.QPushButton("Apply")
        go_button.clicked.connect(self.transform_presenter.apply_current_transform)

        open_button = QtGui.QPushButton("Load File")
        open_button.clicked.connect(self.load)

        package_button = QtGui.QPushButton("Load Package")
        package_button.clicked.connect(self.load_package)

        reload_button = QtGui.QPushButton("Reload")
        reload_button.clicked.connect(self.transform_presenter.reload_transforms)

        button_layout.addWidget(package_button)
        button_layout.addWidget(open_button)
        button_layout.addWidget(go_button)
        button_layout.addWidget(reload_button)

        button_box.setLayout(button_layout)

        layout.addWidget(button_box)

        self.main_splitter = QtGui.QSplitter(self, orientation=QtCore.Qt.Vertical)

        self.transform_tree_widget = TransformTreeWidget(self.transform_presenter, self)
        # self.transform_tree_widget.setMaximumHeight(200)
        self.main_splitter.addWidget(self.transform_tree_widget)

        # self.editor = EditorPane()
        # self.main_splitter.addWidget(self.editor)

        self.editor_panel = EditorPanel(transform_pane=self)
        self.editor = self.editor_panel.editor
        self.main_splitter.addWidget(self.editor_panel)

        self.main_splitter.setSizes([300, 700])

        layout.addWidget(self.main_splitter)
        self.setLayout(layout)

    @QtCore.Slot(QtGui.QListWidgetItem)
    def load_editor_from(self, widget_item):
        """
        When a transform is clicked in the list, we put the cursor on that line in
        the file. Don't redraw or reload if cursor is already there.  If there is
        no file level source try and load from the inspect.getsource text from
        loading transform
        """
        file_name = ''
        source_text = ''
        line_number = 0
        column_number = 0
        read_only = False

        transform_item = widget_item.source
        file_item = None
        if isinstance(transform_item, TransformThing):
            if transform_item.transform_file:
                file_item = transform_item.transform_file
                print("file_item set to %s" % file_item)
                file_name = file_item.file_name
                if not file_item.source_text:
                    source_text = transform_item.source_text
                    read_only = True
                else:
                    source_text = file_item.source_text
                    if widget_item.name() in file_item.class_def_nodes:
                        node = file_item.class_def_nodes[widget_item.name()]
                        if hasattr(node, 'lineno'):
                            line_number = node.lineno
                            column_number = node.col_offset
            else:
                file_name = transform_item.name()
                source_text = transform_item.source_text
                read_only = True
        elif isinstance(transform_item, TransformFile):
            file_name = transform_item.file_name
            source_text = transform_item.source_text
            if transform_item.load_error_line_number:
                line_number = transform_item.load_error_line_number
            read_only = False
        else:
            print("skipping editor set on click of non file or thing")
            return

        print("setting file_name %s vs %s" % (file_name, self.current_editor_item))
        if transform_item and transform_item != self.current_editor_item:
            self.current_editor_item = transform_item
            self.editor.setPlainText(source_text)
            self.editor.set_file_name(widget_item.source.file_name)
            self.editor.set_read_only(read_only)
            self.editor_panel.disable_buttons()
            title = "Edit: %s" % widget_item.source.file_name
            if read_only:
                title += " READ ONLY"
            self.editor_panel.setTitle(title)

        if file_item:
            print("set editor from has a file_item %s" % file_item)
            self.editor_panel.transform_collection = file_item
        else:
            print("set_editor_from does not have a file_item")

        self.editor.setCenterOnScroll(True)
        text_cursor = self.editor.textCursor()
        text_block = self.editor.document().findBlockByLineNumber(line_number - 1)
        pos = text_block.position() + column_number
        text_cursor.setPosition(pos)
        self.editor.setTextCursor(text_cursor)
        self.editor.setCenterOnScroll(False)

    def update_view(self):
        self.transform_tree_widget.build(self.transform_presenter.transform_collections)

    def current_item(self):
        return self.transform_tree_widget.currentItem()

    @staticmethod
    def show_error(message):
        message_box = QtGui.QMessageBox()
        message_box.setText("Error:\n%s" % message)
        message_box.exec_()

    def load(self):
        file_name, _ = QtGui.QFileDialog.getOpenFileName(
            self,
            caption="Select a file containing Node Transformers",
            dir=self.last_used_directory,
            filter="Python Files (*.py);;All Files (*);;"
        )
        if file_name:
            settings = QtCore.QSettings()
            settings.beginGroup("transforms")
            settings.setValue("load_directory", os.path.dirname(file_name))
            settings.setValue("load_package", self.last_package_name)
            settings.endGroup()

            print("got file_name %s" % file_name)
            self.transform_presenter.load_files([file_name])
            self.update_view()

    def load_package(self):
        package_name, ok = QtGui.QInputDialog.getText(
            self,
            "Load additional tranformers",
            "package name or path to file",
            QtGui.QLineEdit.Normal,
            self.last_package_name,
        )
        if ok and package_name != '':
            self.last_package_name = package_name

            settings = QtCore.QSettings()
            settings.beginGroup("transforms")
            settings.setValue("load_directory", self.last_used_directory)
            settings.setValue("load_package", self.last_package_name)
            settings.endGroup()

            print("Got package name %s" % package_name)
            self.transform_presenter.load_files([package_name])
            self.update_view()

    def contextMenuEvent(self, event):
        menu = QtGui.QMenu(self)
        menu.addAction(
            QtGui.QAction("Show source_text", self)
        )
        menu.addAction(
            QtGui.QAction("Apply to current tree", self)
        )
        menu.addAction(
            QtGui.QAction("Apply to current node of current tree", self)
        )
        menu.exec_(event.globalPos())