// Copyright (c) 2005 by Leif Frenzel. All rights reserved.
// See http://leiffrenzel.de
// modified for phpeclipse.de project by axelcl
package net.sourceforge.phpdt.ltk.ui.actions;
import net.sourceforge.phpdt.internal.ui.util.PHPFileUtil;
import net.sourceforge.phpdt.ltk.core.RenameIdentifierDelegate;
import net.sourceforge.phpdt.ltk.core.RenameIdentifierInfo;
import net.sourceforge.phpdt.ltk.core.RenameIdentifierRefactoring;
import net.sourceforge.phpdt.ltk.core.RenamePHPProcessor;
import net.sourceforge.phpdt.ltk.ui.UITexts;
import net.sourceforge.phpdt.ltk.ui.wizards.RenameIdentifierWizard;
import net.sourceforge.phpeclipse.phpeditor.PHPEditor;
import net.sourceforge.phpeclipse.phpeditor.php.PHPWordExtractor;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor;
import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorActionDelegate;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.texteditor.ITextEditor;
/**
*
* action that is triggered from the editor context menu.
*
*
*
* This action is declared in the plugin.xml
.
*
*
*/
public class RenamePHPIdentifier implements IEditorActionDelegate {
private ISelection selection;
private IEditorPart targetEditor;
private boolean onPHPFile;
private RenameIdentifierInfo info = new RenameIdentifierInfo();
// interface methods of IEditorActionDelegate
// ///////////////////////////////////////////
public void setActiveEditor(final IAction action,
final IEditorPart targetEditor) {
this.targetEditor = targetEditor;
onPHPFile = false;
IFile file = getFile();
if (file != null && PHPFileUtil.isPHPFile(file)) {
onPHPFile = true;
}
}
public void run(final IAction action) {
if (!onPHPFile) {
refuse();
} else {
if (selection != null && selection instanceof ITextSelection) {
String word = null;
Point point = null;
if (targetEditor != null && (targetEditor instanceof PHPEditor)) {
PHPEditor editor = (PHPEditor) targetEditor;
if (editor != null) {
ITextSelection textSelection = (ITextSelection) editor
.getSelectionProvider().getSelection();
IDocument doc = editor.getDocumentProvider()
.getDocument(editor.getEditorInput());
int pos = textSelection.getOffset();
point = PHPWordExtractor.findWord(doc, pos);
if (point != null) {
try {
word = doc.get(point.x, point.y);
} catch (BadLocationException e) {
}
}
}
}
applySelection((ITextSelection) selection, word, point);
if (saveAll()) {
openWizard();
}
}
}
}
public void selectionChanged(final IAction action,
final ISelection selection) {
this.selection = selection;
}
// helping methods
// ////////////////
private void applySelection(final ITextSelection textSelection,
String word, Point point) {
if (word != null) {
info.setOldName(word);
info.setNewName(word);
info.setOffset(point.x);
} else {
info.setOldName(textSelection.getText());
info.setNewName(textSelection.getText());
info.setOffset(textSelection.getOffset());
}
info.setSourceFile(getFile());
}
private void refuse() {
String title = UITexts.renameProperty_refuseDlg_title;
String message = UITexts.renameProperty_refuseDlg_message;
MessageDialog.openInformation(getShell(), title, message);
}
private static boolean saveAll() {
IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
return IDE.saveAllEditors(new IResource[] { workspaceRoot }, false);
}
private void openWizard() {
RenameIdentifierDelegate delegate = new RenameIdentifierDelegate(info);
RefactoringProcessor processor = new RenamePHPProcessor(info, delegate);
RenameIdentifierRefactoring ref = new RenameIdentifierRefactoring(
processor);
RenameIdentifierWizard wizard = new RenameIdentifierWizard(ref, info);
RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(
wizard);
try {
String titleForFailedChecks = ""; //$NON-NLS-1$
op.run(getShell(), titleForFailedChecks);
} catch (final InterruptedException irex) {
// operation was cancelled
}
}
private Shell getShell() {
Shell result = null;
if (targetEditor != null) {
result = targetEditor.getSite().getShell();
} else {
result = PlatformUI.getWorkbench().getActiveWorkbenchWindow()
.getShell();
}
return result;
}
private final IFile getFile() {
IFile result = null;
if (targetEditor instanceof ITextEditor) {
ITextEditor editor = (ITextEditor) targetEditor;
IEditorInput input = editor.getEditorInput();
if (input instanceof IFileEditorInput) {
result = ((IFileEditorInput) input).getFile();
}
}
return result;
}
}