blob: 4cdb59b720ce8f9de0963bb2c0a8aed382be793a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.ui.javaeditor;
import org.eclipse.core.resources.IStorage;
import org.eclipse.swt.widgets.Display;
import org.eclipse.jface.text.Assert;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.BadPartitioningException;
import org.eclipse.jface.text.FindReplaceDocumentAdapter;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentExtension3;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.ITypedRegion;
import org.eclipse.jface.text.hyperlink.IHyperlink;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.texteditor.IEditorStatusLine;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.internal.corext.refactoring.nls.AccessorClassReference;
import org.eclipse.jdt.internal.corext.refactoring.nls.NLSHintHelper;
import org.eclipse.jdt.internal.corext.refactoring.nls.PropertyFileDocumentModel;
import org.eclipse.jdt.internal.corext.util.Messages;
import org.eclipse.jdt.internal.ui.propertiesfileeditor.IPropertiesFilePartitions;
import org.eclipse.jdt.internal.ui.propertiesfileeditor.PropertyKeyHyperlinkDetector;
/**
* NLS key hyperlink.
*
* @since 3.1
*/
public class NLSKeyHyperlink implements IHyperlink {
private IRegion fRegion;
private AccessorClassReference fAccessorClassReference;
private IEditorPart fEditor;
private final String fKeyName;
/**
* Creates a new NLS key hyperlink.
*
* @param region
* @param keyName
* @param ref
* @param editor the editor which contains the hyperlink
*/
public NLSKeyHyperlink(IRegion region, String keyName, AccessorClassReference ref, IEditorPart editor) {
Assert.isNotNull(region);
Assert.isNotNull(keyName);
Assert.isNotNull(ref);
Assert.isNotNull(editor);
fRegion= region;
fKeyName= keyName;
fAccessorClassReference= ref;
fEditor= editor;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.IHyperlink#getHyperlinkRegion()
*/
public IRegion getHyperlinkRegion() {
return fRegion;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.IHyperlink#open()
*/
public void open() {
IStorage propertiesFile= null;
try {
ITypeBinding typeBinding= fAccessorClassReference.getBinding();
propertiesFile= NLSHintHelper.getResourceBundle(typeBinding.getJavaElement().getJavaProject(), fAccessorClassReference);
} catch (JavaModelException e) {
// Don't open the file
}
if (propertiesFile == null) {
showErrorInStatusLine(fEditor, JavaEditorMessages.Editor_OpenPropertiesFile_error_fileNotFound_dialogMessage);
return;
}
IEditorPart editor;
try {
editor= EditorUtility.openInEditor(propertiesFile, true);
} catch (PartInitException e) {
handleOpenPropertiesFileFailed(propertiesFile);
return;
} catch (JavaModelException e) {
handleOpenPropertiesFileFailed(propertiesFile);
return;
}
// Reveal the key in the properties file
if (editor instanceof ITextEditor) {
IRegion region= null;
boolean found= false;
// Find key in document
IEditorInput editorInput= editor.getEditorInput();
IDocument document= ((ITextEditor)editor).getDocumentProvider().getDocument(editorInput);
if (document != null) {
FindReplaceDocumentAdapter finder= new FindReplaceDocumentAdapter(document);
PropertyKeyHyperlinkDetector detector= new PropertyKeyHyperlinkDetector((ITextEditor)editor);
String key= PropertyFileDocumentModel.unwindEscapeChars(fKeyName);
int offset= document.getLength() - 1;
try {
while (!found && offset >= 0) {
region= finder.find(offset, key, false, true, false, false);
if (region == null)
offset= -1;
else {
// test whether it's the key
IHyperlink[] hyperlinks= detector.detectHyperlinks(null, region, false);
if (hyperlinks != null) {
for (int i= 0; i < hyperlinks.length; i++) {
IRegion hyperlinkRegion= hyperlinks[i].getHyperlinkRegion();
found= key.equals(document.get(hyperlinkRegion.getOffset(), hyperlinkRegion.getLength()));
}
} else if (document instanceof IDocumentExtension3) {
// Fall back: test using properties file partitioning
ITypedRegion partition= null;
partition= ((IDocumentExtension3)document).getPartition(IPropertiesFilePartitions.PROPERTIES_FILE_PARTITIONING, region.getOffset(), false);
found= IDocument.DEFAULT_CONTENT_TYPE.equals(partition.getType())
&& key.equals(document.get(partition.getOffset(), partition.getLength()).trim());
}
// Prevent endless loop (panic code, shouldn't be needed)
if (offset == region.getOffset())
offset= -1;
else
offset= region.getOffset();
}
}
} catch (BadLocationException ex) {
found= false;
} catch (BadPartitioningException e1) {
found= false;
}
}
if (found)
EditorUtility.revealInEditor(editor, region);
else {
EditorUtility.revealInEditor(editor, 0, 0);
showErrorInStatusLine(editor, Messages.format(JavaEditorMessages.Editor_OpenPropertiesFile_error_keyNotFound, fKeyName));
}
}
}
private void showErrorInStatusLine(IEditorPart editor, final String message) {
final Display display= fEditor.getSite().getShell().getDisplay();
display.beep();
final IEditorStatusLine statusLine= (IEditorStatusLine)editor.getAdapter(IEditorStatusLine.class);
if (statusLine != null) {
display.asyncExec(new Runnable() {
/*
* @see java.lang.Runnable#run()
*/
public void run() {
statusLine.setMessage(true, message, null);
}
});
}
}
private void handleOpenPropertiesFileFailed(IStorage propertiesFile) {
showErrorInStatusLine(fEditor, Messages.format(JavaEditorMessages.Editor_OpenPropertiesFile_error_openEditor_dialogMessage, propertiesFile.getFullPath().toOSString()));
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.IHyperlink#getTypeLabel()
*/
public String getTypeLabel() {
return null;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.IHyperlink#getHyperlinkText()
*/
public String getHyperlinkText() {
return null;
}
}