/*=============================================================================#
# Copyright (c) 2014-2016 Stephan Wahlbrink (WalWare.de) 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:
# Stephan Wahlbrink - initial API and implementation
#=============================================================================*/
package de.walware.docmlet.base.ui.sourceediting;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.text.DocumentEvent;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.contentassist.IContextInformation;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.statushandlers.StatusManager;
import org.eclipse.ui.texteditor.IEditorStatusLine;
import de.walware.ecommons.ltk.ui.sourceediting.ISourceEditor;
import de.walware.ecommons.ltk.ui.sourceediting.assist.AssistInvocationContext;
import de.walware.ecommons.ltk.ui.sourceediting.assist.AssistProposalCollector;
import de.walware.ecommons.ltk.ui.sourceediting.assist.IAssistCompletionProposal;
import de.walware.ecommons.ltk.ui.sourceediting.assist.IQuickAssistComputer;
import de.walware.ecommons.ui.util.UIAccess;
import de.walware.docmlet.base.ui.DocBaseUI;
import de.walware.docmlet.base.ui.DocBaseUIResources;
import de.walware.docmlet.base.ui.markuphelp.IMarkupHelpContextProvider;
import de.walware.docmlet.base.ui.markuphelp.IMarkupHelpView;
public class MarkupHelpComputer implements IQuickAssistComputer {
private static class ShowHelpProposal implements IAssistCompletionProposal {
private final ISourceEditor editor;
public ShowHelpProposal(final ISourceEditor editor) {
this.editor= editor;
}
@Override
public int getRelevance() {
return 50;
}
@Override
public Image getImage() {
return DocBaseUIResources.INSTANCE.getImage(DocBaseUIResources.VIEW_MARKUP_HELP_IMAGE_ID);
}
@Override
public String getDisplayString() {
return "Show Markup Cheat Sheet";
}
@Override
public String getSortingString() {
return getDisplayString();
}
@Override
public String getAdditionalProposalInfo() {
return null;
}
@Override
public void selected(final ITextViewer viewer, final boolean smartToggle) {
}
@Override
public void unselected(final ITextViewer viewer) {
}
@Override
public boolean validate(final IDocument document, final int offset, final DocumentEvent event) {
return true;
}
@Override
public void apply(final IDocument document) {
final IMarkupHelpContextProvider contextProvider= (IMarkupHelpContextProvider) this.editor.getAdapter(IMarkupHelpContextProvider.class);
final String contentId= contextProvider.getHelpContentId();
if (contentId != null) {
final IWorkbenchPage page= UIAccess.getActiveWorkbenchPage(true);
if (page != null) {
try {
final IMarkupHelpView view= (IMarkupHelpView) page.showView(IMarkupHelpView.VIEW_ID);
view.show(contentId);
}
catch (final PartInitException e) {
StatusManager.getManager().handle(new Status(IStatus.ERROR, DocBaseUI.PLUGIN_ID, 0,
"An error occurred while opening the Markup Help View to show a cheat sheet.",
e ));
}
}
}
else {
final IEditorStatusLine statusLine= (IEditorStatusLine) this.editor.getAdapter(IEditorStatusLine.class);
if (statusLine != null) {
statusLine.setMessage(true, "No cheat sheet available for the current markup language.", null);
}
}
}
@Override
public void apply(final ITextViewer viewer, final char trigger, final int stateMask, final int offset) {
apply(null);
}
@Override
public Point getSelection(final IDocument document) {
return null;
}
@Override
public IContextInformation getContextInformation() {
return null;
}
}
public MarkupHelpComputer() {
}
@Override
public IStatus computeAssistProposals(final AssistInvocationContext context,
final AssistProposalCollector proposals, final IProgressMonitor monitor) {
final IMarkupHelpContextProvider contextProvider= (IMarkupHelpContextProvider) context.getEditor().getAdapter(IMarkupHelpContextProvider.class);
if (contextProvider != null) {
proposals.add(new ShowHelpProposal(context.getEditor()));
}
return Status.OK_STATUS;
}
}