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();
}
}