package com.redhat.ceylon.eclipse.code.hover; import static com.redhat.ceylon.eclipse.code.editor.Navigation.gotoDeclaration; import static org.eclipse.jdt.ui.PreferenceConstants.APPEARANCE_JAVADOC_FONT; import static com.redhat.ceylon.eclipse.java2ceylon.Java2CeylonProxies.hoverJ2C; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.ToolBarManager; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.text.AbstractReusableInformationControlCreator; import org.eclipse.jface.text.IInformationControl; import org.eclipse.jface.text.IInputChangedListener; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Shell; import com.redhat.ceylon.eclipse.code.browser.BrowserInformationControl; import com.redhat.ceylon.eclipse.code.editor.CeylonEditor; import com.redhat.ceylon.eclipse.code.hover.DocumentationHover.BackAction; import com.redhat.ceylon.eclipse.code.hover.DocumentationHover.ForwardAction; import com.redhat.ceylon.eclipse.ui.CeylonPlugin; import com.redhat.ceylon.eclipse.ui.CeylonResources; final class CeylonEnrichedInformationControlCreator extends AbstractReusableInformationControlCreator { private final CeylonEditor editor; public CeylonEnrichedInformationControlCreator(CeylonEditor editor) { this.editor = editor; } @Override public IInformationControl doCreateInformationControl(Shell parent) { ToolBarManager tbm = new ToolBarManager(SWT.FLAT); BrowserInformationControl control = new BrowserInformationControl(parent, APPEARANCE_JAVADOC_FONT, tbm); final BackAction backAction = new DocumentationHover.BackAction(control); backAction.setEnabled(false); tbm.add(backAction); final ForwardAction forwardAction = new DocumentationHover.ForwardAction(control); tbm.add(forwardAction); forwardAction.setEnabled(false); final OpenDeclarationAction openDeclarationAction = new OpenDeclarationAction(control); tbm.add(openDeclarationAction); IInputChangedListener inputChangeListener = new IInputChangedListener() { public void inputChanged(Object newInput) { backAction.update(); forwardAction.update(); boolean isDeclaration = false; if (newInput instanceof CeylonBrowserInput) { CeylonBrowserInput input = (CeylonBrowserInput) newInput; isDeclaration = input.getAddress()!=null; } openDeclarationAction.setEnabled(isDeclaration); } }; control.addInputChangeListener(inputChangeListener); tbm.update(true); control.addLocationListener(new CeylonLocationListener(editor, control)); return control; } /** * Action that opens the current hover input element. */ final class OpenDeclarationAction extends Action { private final BrowserInformationControl fInfoControl; public OpenDeclarationAction( BrowserInformationControl infoControl) { fInfoControl = infoControl; setText("Open Declaration"); setToolTipText("Open Declaration"); ImageDescriptor descriptor = CeylonPlugin.imageRegistry() .getDescriptor(CeylonResources.GOTO); setImageDescriptor(descriptor); } @Override public void run() { DocumentationHover.close(fInfoControl); //FIXME: should have protocol to hide, rather than dispose CeylonBrowserInput input = (CeylonBrowserInput) fInfoControl.getInput(); gotoDeclaration(hoverJ2C().getDocGenerator().getLinkedModel( new ceylon.language.String(input.getAddress()), editor.getParseController())); } } }