Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

IntelliJ Idea Plugin Cannot Undo on document.setText

I am working on a plugin for IntelliJ Idea 13. I do some changes in beforeDocumentSaving and I use document.setText:

public class AppendAction implements ApplicationComponent
{
    @Override public void initComponent()
    {
        MessageBus bus = ApplicationManager.getApplication().getMessageBus();
        MessageBusConnection connection = bus.connect();

        connection.subscribe(AppTopics.FILE_DOCUMENT_SYNC, new FileDocumentManagerAdapter()
            {
                @Override public void beforeDocumentSaving(Document document)
                {
                    document.setText(appendSomething(document.getText()));                        
                }
            });
    }
}

This works great, my only problem is that when this plugin is run, and I want to undo the changes, I get to following error message:

Cannot Undo
Following files have changes that cannot be undone:

Any Idea? :-)

like image 564
kavai77 Avatar asked Nov 03 '25 12:11

kavai77


1 Answers

The answer is wrapping the document.setText into ApplicationManager.getApplication().runWriteAction and CommandProcessor.getInstance().runUndoTransparentAction.

I found an example TrailingSpacesStripper among intellij-community sources on githib: https://github.com/JetBrains/intellij-community/blob/master/platform/platform-impl/src/com/intellij/openapi/editor/impl/TrailingSpacesStripper.java

public class AppendAction implements ApplicationComponent
{
    @Override public void initComponent()
    {
        MessageBus bus = ApplicationManager.getApplication().getMessageBus();
        MessageBusConnection connection = bus.connect();

        connection.subscribe(AppTopics.FILE_DOCUMENT_SYNC, new FileDocumentManagerAdapter()
            {
                @Override public void beforeDocumentSaving(final Document document)
                {
                    ApplicationManager.getApplication().runWriteAction(new DocumentRunnable(document, null)
                        {
                            @Override public void run()
                            {
                                CommandProcessor.getInstance().runUndoTransparentAction(new Runnable()
                                    {
                                        @Override public void run()
                                        {
                                            document.setText(appendSomething(document.getText()));
                                        }
                                    });
                            }
                        });
                }
            });
    }
}
like image 55
kavai77 Avatar answered Nov 05 '25 02:11

kavai77



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!