/* * Copyright 2016 Nokia Solutions and Networks * Licensed under the Apache License, Version 2.0, * see license.txt file for details. */ package org.robotframework.ide.eclipse.main.plugin.tableeditor.source.assist; import java.util.ArrayList; import java.util.Collection; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.DefaultInformationControl; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IInformationControl; import org.eclipse.jface.text.IInformationControlCreator; import org.eclipse.jface.text.Position; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.jface.text.contentassist.ICompletionProposalExtension3; import org.eclipse.jface.text.contentassist.ICompletionProposalExtension6; import org.eclipse.jface.text.contentassist.IContextInformation; import org.eclipse.jface.viewers.StyledString; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Shell; import org.robotframework.ide.eclipse.main.plugin.assist.AssistProposal; import org.robotframework.red.graphics.ImagesManager; public class RedCompletionProposalAdapter implements Comparable<RedCompletionProposalAdapter>, ICompletionProposal, ICompletionProposalExtension3, ICompletionProposalExtension6 { private final AssistProposal adaptedProposal; private final DocumentationModification modification; private final IContextInformation contextInformation; public RedCompletionProposalAdapter(final AssistProposal proposal, final DocumentationModification modification) { this(proposal, modification, null); } public RedCompletionProposalAdapter(final AssistProposal proposal, final DocumentationModification modification, final IContextInformation contextInformation) { this.adaptedProposal = proposal; this.modification = modification; this.contextInformation = contextInformation; } @Override public StyledString getStyledDisplayString() { return adaptedProposal.getStyledLabel(); } @Override public CharSequence getPrefixCompletionText(final IDocument document, final int completionOffset) { return adaptedProposal.getContent() + modification.contentSuffix; } @Override public int getPrefixCompletionStart(final IDocument document, final int completionOffset) { return modification.toReplace.getOffset(); } @Override public void apply(final IDocument document) { try { document.replace(modification.toReplace.getOffset(), modification.toReplace.getLength(), adaptedProposal.getContent() + modification.contentSuffix); } catch (final BadLocationException x) { // ignore } } @Override public Point getSelection(final IDocument document) { if (modification.toSelect != null) { return new Point(modification.toSelect.getOffset(), modification.toSelect.getLength()); } final int x = modification.toReplace.offset + adaptedProposal.getContent().length() + modification.contentSuffix.length(); return new Point(x, 0); } @Override public String getAdditionalProposalInfo() { if (adaptedProposal.hasDescription()) { return adaptedProposal.getDescription(); } return null; } @Override public String getDisplayString() { return getStyledDisplayString().getString(); } @Override public Image getImage() { return ImagesManager.getImage(adaptedProposal.getImage()); } @Override public IInformationControlCreator getInformationControlCreator() { return new IInformationControlCreator() { @Override public IInformationControl createInformationControl(final Shell parent) { return new DefaultInformationControl(parent); } }; } @Override public IContextInformation getContextInformation() { return contextInformation; } @Override public int compareTo(final RedCompletionProposalAdapter that) { return this.getDisplayString().compareTo(that.getDisplayString()); } public boolean shouldActivateAssitantAfterAccepting() { return modification.activateAssistant; } public Collection<Runnable> operationsToPerformAfterAccepting() { return modification.operationsAfterAccepting; } static class DocumentationModification { private final String contentSuffix; private final Position toReplace; public boolean activateAssistant; private final Position toSelect; public Collection<Runnable> operationsAfterAccepting; public DocumentationModification(final String contentSuffix, final Position toReplace) { this(contentSuffix, toReplace, null, false, new ArrayList<Runnable>()); } public DocumentationModification(final String contentSuffix, final Position toReplace, final boolean shouldActivate) { this(contentSuffix, toReplace, null, shouldActivate, new ArrayList<Runnable>()); } public DocumentationModification(final String contentSuffix, final Position toReplace, final Position toSelect) { this(contentSuffix, toReplace, toSelect, false, new ArrayList<Runnable>()); } public DocumentationModification(final String contentSuffix, final Position toReplace, final Position toSelect, final Collection<Runnable> operationsAfterAccepting) { this(contentSuffix, toReplace, toSelect, false, operationsAfterAccepting); } public DocumentationModification(final String contentSuffix, final Position toReplace, final Collection<Runnable> operationsAfterAccepting) { this(contentSuffix, toReplace, null, false, operationsAfterAccepting); } public DocumentationModification(final String contentSuffix, final Position toReplace, final Position toSelect, final boolean activateAssistant, final Collection<Runnable> operationsAfterAccepting) { this.contentSuffix = contentSuffix; this.toReplace = toReplace; this.toSelect = toSelect; this.activateAssistant = activateAssistant; this.operationsAfterAccepting = operationsAfterAccepting; } } }