content: /*******************************************************************************
   * Copyright (c) 2000, 2008 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.wst.jsdt.internal.ui.javaeditor;
  
  import org.eclipse.core.resources.IStorage;
  import org.eclipse.core.runtime.Assert;
  import org.eclipse.jface.text.IRegion;
  import org.eclipse.jface.text.hyperlink.IHyperlink;
  import org.eclipse.swt.widgets.Display;
  import org.eclipse.ui.IEditorPart;
  import org.eclipse.ui.PartInitException;
  import org.eclipse.ui.texteditor.IEditorStatusLine;
  import org.eclipse.wst.jsdt.core.JavaScriptModelException;
  import org.eclipse.wst.jsdt.core.dom.ITypeBinding;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.nls.AccessorClassReference;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.nls.NLSHintHelper;
  import org.eclipse.wst.jsdt.internal.corext.util.Messages;
  
  
  /**
   * NLS key hyperlink.
   *
   * 
   */
  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.wst.jsdt.internal.ui.javaeditor.IHyperlink#getHyperlinkRegion()
  	 */
  	public IRegion getHyperlinkRegion() {
  		return fRegion;
  	}
  
  	/*
  	 * @see org.eclipse.wst.jsdt.internal.ui.javaeditor.IHyperlink#open()
  	 */
  	public void open() {
  		IStorage propertiesFile= null;
  		try {
  			ITypeBinding typeBinding= fAccessorClassReference.getBinding();
  			propertiesFile= NLSHintHelper.getResourceBundle(typeBinding.getJavaElement().getJavaScriptProject(), fAccessorClassReference);
  		} catch (JavaScriptModelException 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 (JavaScriptModelException 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();
  //				detector.setContext(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.wst.jsdt.internal.ui.javaeditor.IHyperlink#getTypeLabel()
  	 */
  	public String getTypeLabel() {
  		return null;
  	}
  
  	/*
  	 * @see org.eclipse.wst.jsdt.internal.ui.javaeditor.IHyperlink#getHyperlinkText()
  	 */
  	public String getHyperlinkText() {
  		return null;
  	}
  }
  