/*******************************************************************************
* Copyright (c) 2012-2016 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.ext.java.client.refactoring.rename;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.google.web.bindery.event.shared.EventBus;
import org.eclipse.che.ide.MimeType;
import org.eclipse.che.ide.api.action.Action;
import org.eclipse.che.ide.api.action.ActionEvent;
import org.eclipse.che.ide.api.app.AppContext;
import org.eclipse.che.ide.api.app.CurrentProject;
import org.eclipse.che.ide.api.editor.EditorAgent;
import org.eclipse.che.ide.api.editor.EditorPartPresenter;
import org.eclipse.che.ide.api.event.ActivePartChangedEvent;
import org.eclipse.che.ide.api.event.ActivePartChangedHandler;
import org.eclipse.che.ide.api.project.node.HasStorablePath;
import org.eclipse.che.ide.api.project.tree.VirtualFile;
import org.eclipse.che.ide.api.selection.Selection;
import org.eclipse.che.ide.api.selection.SelectionAgent;
import org.eclipse.che.ide.ext.java.client.JavaLocalizationConstant;
import org.eclipse.che.ide.ext.java.client.project.node.JavaFileNode;
import org.eclipse.che.ide.ext.java.client.project.node.PackageNode;
import org.eclipse.che.ide.ext.java.client.refactoring.RefactorInfo;
import org.eclipse.che.ide.ext.java.client.refactoring.move.RefactoredItemType;
import org.eclipse.che.ide.ext.java.client.refactoring.rename.wizard.RenamePresenter;
import org.eclipse.che.ide.jseditor.client.texteditor.TextEditor;
import org.eclipse.che.ide.util.loging.Log;
import java.util.List;
import static org.eclipse.che.ide.ext.java.client.refactoring.move.RefactoredItemType.COMPILATION_UNIT;
import static org.eclipse.che.ide.ext.java.client.refactoring.move.RefactoredItemType.PACKAGE;
/**
* Action for launch rename refactoring of java files
*
* @author Alexander Andrienko
* @author Valeriy Svydenko
*/
@Singleton
public class RenameRefactoringAction extends Action implements ActivePartChangedHandler {
private final EditorAgent editorAgent;
private final RenamePresenter renamePresenter;
private final SelectionAgent selectionAgent;
private final JavaRefactoringRename javaRefactoringRename;
private final AppContext appContext;
private RefactoredItemType renamedItemType;
private List<?> selectedItems;
private boolean isEditorPartActive;
@Inject
public RenameRefactoringAction(EditorAgent editorAgent,
RenamePresenter renamePresenter,
EventBus eventBus,
JavaLocalizationConstant locale,
SelectionAgent selectionAgent,
JavaRefactoringRename javaRefactoringRename,
AppContext appContext) {
super(locale.renameRefactoringActionName(), locale.renameRefactoringActionDescription());
this.editorAgent = editorAgent;
this.renamePresenter = renamePresenter;
this.selectionAgent = selectionAgent;
this.javaRefactoringRename = javaRefactoringRename;
this.appContext = appContext;
this.isEditorPartActive = false;
eventBus.addHandler(ActivePartChangedEvent.TYPE, this);
}
@Override
public void actionPerformed(ActionEvent event) {
if (selectedItems != null) {
RefactorInfo refactorInfo = RefactorInfo.of(renamedItemType, selectedItems);
renamePresenter.show(refactorInfo);
return;
}
final EditorPartPresenter editorPart = editorAgent.getActiveEditor();
final TextEditor textEditorPresenter;
if (editorPart instanceof TextEditor) {
textEditorPresenter = (TextEditor)editorPart;
} else {
return;
}
javaRefactoringRename.refactor(textEditorPresenter);
}
@Override
public void update(ActionEvent event) {
Selection<?> selections = selectionAgent.getSelection();
if (selections != null & !isEditorPartActive) {
List<?> selectedItems = selections.getAllElements();
this.selectedItems = selectedItems;
if (selectedItems.size() != 1) {
event.getPresentation().setEnabled(false);
return;
}
Object selectedItem = selectedItems.get(0);
if (!(selectedItem instanceof HasStorablePath)) {
event.getPresentation().setEnabled(false);
return;
}
HasStorablePath item = (HasStorablePath)selectedItem;
boolean isSourceFileNode = item instanceof JavaFileNode;
boolean isPackageNode = item instanceof PackageNode;
if (isSourceFileNode) {
renamedItemType = COMPILATION_UNIT;
event.getPresentation().setEnabled(true);
return;
}
if (isPackageNode) {
renamedItemType = PACKAGE;
event.getPresentation().setEnabled(true);
return;
}
}
selectedItems = null;
CurrentProject currentProject = appContext.getCurrentProject();
if (currentProject == null) {
event.getPresentation().setEnabled(false);
return;
}
//todo Warning:we need improve this code for multi-module projects
final List<String> language = currentProject.getRootProject().getAttributes().get("language");
if (language == null || !language.contains("java")) {
event.getPresentation().setEnabled(false);
return;
}
EditorPartPresenter editorPart = editorAgent.getActiveEditor();
if (editorPart != null && editorPart instanceof TextEditor) {
VirtualFile virtualFile = editorPart.getEditorInput().getFile();
String mediaType = virtualFile.getMediaType();
if (mediaType != null && ((mediaType.equals(MimeType.TEXT_X_JAVA) ||
mediaType.equals(MimeType.TEXT_X_JAVA_SOURCE) ||
mediaType.equals(MimeType.APPLICATION_JAVA_CLASS)))) {
event.getPresentation().setEnabled(true);
} else {
event.getPresentation().setEnabled(false);
}
} else {
event.getPresentation().setEnabled(false);
}
}
@Override
public void onActivePartChanged(ActivePartChangedEvent event) {
isEditorPartActive = event.getActivePart() instanceof EditorPartPresenter;
}
}