package jetbrains.mps.ide.refactoring; /*Generated by MPS */ import jetbrains.mps.ide.platform.refactoring.RefactoringViewItem; import jetbrains.mps.project.Project; import jetbrains.mps.ide.platform.refactoring.RefactoringViewAction; import jetbrains.mps.ide.findusages.model.SearchResults; import jetbrains.mps.ide.findusages.view.UsagesView; import javax.swing.JPanel; import javax.swing.JButton; import org.jetbrains.annotations.Nullable; import jetbrains.mps.refactoring.framework.RefactoringContext; import org.jetbrains.annotations.NotNull; import jetbrains.mps.ide.findusages.model.SearchTask; import java.awt.BorderLayout; import jetbrains.mps.ide.findusages.view.treeholder.treeview.ViewOptions; import java.util.List; import com.intellij.openapi.actionSystem.AnAction; import jetbrains.mps.internal.collections.runtime.ListSequence; import java.util.ArrayList; import com.intellij.icons.AllIcons; import com.intellij.openapi.actionSystem.AnActionEvent; import java.awt.FlowLayout; import javax.swing.AbstractAction; import java.awt.event.ActionEvent; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.FocusTraversalPolicy; import javax.swing.JComponent; import com.intellij.openapi.application.ApplicationManager; import java.awt.Component; import java.awt.Container; import org.jetbrains.mps.openapi.model.SNodeReference; public abstract class RefactoringViewItemImpl implements RefactoringViewItem.RefactoringViewItemEx { private final Project myProject; private RefactoringViewAction myRefactoringViewAction; private SearchResults mySearchResults; private UsagesView myUsagesView; private JPanel myPanel; private JPanel myButtonsPanel; private JButton myDoRefactorButton; private JButton myCancelButton; @Nullable private RefactoringContext myRefactoringContext = null; public RefactoringViewItemImpl(@NotNull RefactoringContext refactoringContext, @NotNull RefactoringViewAction refactoringViewAction, SearchResults searchResults, SearchTask searchTask) { myRefactoringContext = refactoringContext; myProject = refactoringContext.getSelectedProject(); init(refactoringViewAction, searchResults, searchTask); } public RefactoringViewItemImpl(Project p, RefactoringViewAction refactoringViewAction, SearchResults searchResults, SearchTask searchTask) { myProject = p; init(refactoringViewAction, searchResults, searchTask); } private void init(RefactoringViewAction refactoringViewAction, SearchResults searchResults, SearchTask searchTask) { myRefactoringViewAction = refactoringViewAction; mySearchResults = searchResults; if (mySearchResults == null) { throw new IllegalArgumentException("search result is null"); } myPanel = new JPanel(new BorderLayout()); myUsagesView = new UsagesView(myProject, new ViewOptions()); List<AnAction> actions = ListSequence.fromList(new ArrayList<AnAction>()); if (searchTask != null) { UsagesView.RerunAction rerunAction = new UsagesView.RerunAction(myUsagesView, "Run search again"); rerunAction.setRunOptions(searchTask); ListSequence.fromList(actions).addElement(rerunAction); } ListSequence.fromList(actions).addElement(new AnAction("Close", "", AllIcons.Actions.Cancel) { public void actionPerformed(@NotNull AnActionEvent p0) { RefactoringViewItemImpl.this.close(); } }); myUsagesView.setActions(actions); myUsagesView.setContents(searchResults); myButtonsPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); myDoRefactorButton = new JButton(new AbstractAction("Do Refactor") { @Override public void actionPerformed(ActionEvent e) { doRefactor(); } }); myDoRefactorButton.addKeyListener(new KeyAdapter() { @Override public void keyTyped(KeyEvent e) { if (e.getKeyChar() == '\n') { doRefactor(); } } }); myButtonsPanel.add(myDoRefactorButton); myCancelButton = new JButton(new AbstractAction("Cancel") { @Override public void actionPerformed(ActionEvent e) { close(); } }); myButtonsPanel.add(myCancelButton); myPanel.add(myUsagesView.getComponent(), BorderLayout.CENTER); myPanel.add(myButtonsPanel, BorderLayout.SOUTH); final FocusTraversalPolicy ftp = myPanel.getFocusTraversalPolicy(); myPanel.setFocusTraversalPolicy(new RefactoringViewItemImpl.MyFocusTraversalPolicy(ftp)); } public JComponent getComponent() { return myPanel; } public JButton getOkButton() { return myDoRefactorButton; } public UsagesView getUsagesView() { return myUsagesView; } private void doRefactor() { myRefactoringViewAction.performAction(this); } @Override public abstract void close(); public void dispose() { myUsagesView.dispose(); } public void requestFocus() { // TODO: why does it invokes later? ApplicationManager.getApplication().invokeLater(new Runnable() { @Override public void run() { myDoRefactorButton.requestFocus(); } }); } private class MyFocusTraversalPolicy extends FocusTraversalPolicy { private final FocusTraversalPolicy myFtp; public MyFocusTraversalPolicy(FocusTraversalPolicy ftp) { myFtp = ftp; } @Override public Component getComponentAfter(Container aContainer, Component aComponent) { return myFtp.getComponentAfter(aContainer, aComponent); } @Override public Component getComponentBefore(Container aContainer, Component aComponent) { return myFtp.getComponentBefore(aContainer, aComponent); } @Override public Component getFirstComponent(Container aContainer) { return myFtp.getFirstComponent(aContainer); } @Override public Component getLastComponent(Container aContainer) { return myFtp.getLastComponent(aContainer); } @Override public Component getDefaultComponent(Container aContainer) { return myDoRefactorButton; } } public List<SNodeReference> getIncludedResultNodes() { return getUsagesView().getIncludedResultNodes(); } }