Package org.jetbrains.plugins.cucumber.psi.refactoring.rename

Source Code of org.jetbrains.plugins.cucumber.psi.refactoring.rename.CucumberStepRenameDialog

package org.jetbrains.plugins.cucumber.psi.refactoring.rename;

import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.ReadOnlyFragmentModificationException;
import com.intellij.openapi.editor.actionSystem.EditorActionManager;
import com.intellij.openapi.editor.actionSystem.ReadonlyFragmentModificationHandler;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.refactoring.rename.RenameDialog;
import com.intellij.refactoring.rename.RenameProcessor;
import org.intellij.lang.regexp.RegExpCapability;
import org.intellij.lang.regexp.RegExpLexer;
import org.intellij.lang.regexp.RegExpTT;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.cucumber.CucumberBundle;
import org.jetbrains.plugins.cucumber.steps.AbstractStepDefinition;
import org.jetbrains.plugins.cucumber.steps.reference.CucumberStepReference;

import javax.swing.*;
import java.awt.*;
import java.util.EnumSet;

/**
* User: avokin
* Date: 20/06/14
*/
public class CucumberStepRenameDialog extends RenameDialog {
  private AbstractStepDefinition myStepDefinition;

  public CucumberStepRenameDialog(@NotNull Project project,
                                  @NotNull PsiElement psiElement,
                                  @Nullable PsiElement nameSuggestionContext, Editor editor) {
    super(project, psiElement, nameSuggestionContext, editor);
  }

  @Override
  protected RenameProcessor createRenameProcessor(String newName) {
    return new RenameProcessor(getProject(), getPsiElement(), newName, isSearchInComments(),
                                                          isSearchInNonJavaFiles());
  }

  @Override
  protected String getFullName() {
    return CucumberBundle.message("cucumber.step");
  }

  @Override
  protected void createNewNameComponent() {
    super.createNewNameComponent();

    final Runnable guardRunnable = new Runnable() {
      @Override
      public void run() {
        final Editor editor = getNameSuggestionsField().getEditor();
        if (editor != null) {
          editor.getSelectionModel().removeSelection();
          editor.getCaretModel().moveToOffset(0);
          final Document document = editor.getDocument();
          EditorActionManager.getInstance().setReadonlyFragmentModificationHandler(document, new ReadonlyFragmentModificationHandler() {
              @Override
              public void handle(final ReadOnlyFragmentModificationException e) {
                //do nothing
              }
            });

          guardRegexpSpecialSymbols(editor);
        }
      }
    };

    SwingUtilities.invokeLater(guardRunnable);
  }

  private AbstractStepDefinition getStepDefinition() {
    if (myStepDefinition == null) {
      final CucumberStepReference ref = CucumberStepRenameProcessor.getCucumberStepReference(getPsiElement());
      if (ref != null) {
        myStepDefinition = ref.resolveToDefinition();
      }
    }
    return myStepDefinition;
  }

  private static void guardRegexpSpecialSymbols(@NotNull final Editor editor) {
    final String text = editor.getDocument().getText();
    final RegExpLexer lexer = new RegExpLexer(EnumSet.noneOf(RegExpCapability.class));

    lexer.start(text);
    while (lexer.getTokenType() != null) {
      if (lexer.getTokenType() != RegExpTT.CHARACTER) {
        editor.getDocument().createGuardedBlock(lexer.getTokenStart(), lexer.getTokenEnd());
      }
      lexer.advance();
    }
  }

  @Override
  public String[] getSuggestedNames() {
    AbstractStepDefinition stepDefinition = getStepDefinition();
    if (stepDefinition != null) {
      String result = stepDefinition.getCucumberRegex();
      if (result != null) {
        if (result.startsWith("^")) {
          result = result.substring(1);
        }
        if (result.endsWith("$")) {
          result = result.substring(0, result.length() - 1);
        }

        return new String[] {result};
      }
    }

    return super.getSuggestedNames();
  }

  protected void processNewNameChanged() {
    getPreviewAction().setEnabled(true);
    getRefactorAction().setEnabled(true);
  }

  @Override
  protected void createCheckboxes(JPanel panel, GridBagConstraints gbConstraints) {
    super.createCheckboxes(panel, gbConstraints);
    getCbSearchInComments().setVisible(false);
  }
}
TOP

Related Classes of org.jetbrains.plugins.cucumber.psi.refactoring.rename.CucumberStepRenameDialog

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.