/*
* Copyright 2015 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.IRegion;
import org.eclipse.swt.graphics.Image;
/**
* @author Michal Anglart
*
*/
@SuppressWarnings("PMD.TooManyMethods")
public class RedCompletionBuilder {
public static interface ProposalContentStep {
LocationStep willPut(String string);
}
public static interface LocationStep {
OptionalSettingsStep byInsertingAt(int offset);
OptionalSettingsStep byReplacingRegion(IRegion region);
OptionalSettingsStep byReplacingRegion(int offset, int length);
}
public static interface OptionalSettingsStep {
OptionalSettingsStep secondaryPopupShouldBeDisplayedUsingHtml(String additionalInfo);
OptionalSettingsStep activateAssistantAfterAccepting(boolean activate);
OptionalSettingsStep performAfterAccepting(Collection<Runnable> operations);
DecorationsStep thenCursorWillStopAt(int position);
DecorationsStep thenCursorWillStopAtTheEndOfInsertion();
DecorationsStep thenCursorWillStopBeforeEnd(int shift);
}
public static interface DecorationsStep {
DecorationsStep displayedLabelShouldBe(String label);
DecorationsStep proposalsShouldHaveIcon(Image image);
RedCompletionProposal create();
}
private static class BuildingSteps
implements ProposalContentStep, LocationStep, OptionalSettingsStep, DecorationsStep {
private String contentToInsert;
private int offset;
private int length;
private String additionalInfo;
private int cursorPosition;
private int cursorBackShift;
private int selectionLength;
private String labelToDisplay;
private Image image;
private boolean additionalInfoAsHtml;
private boolean activateAssitant;
private final Collection<Runnable> operationsAfterAccept = new ArrayList<>();
@Override
public LocationStep willPut(final String contentToInsert) {
this.contentToInsert = contentToInsert;
this.labelToDisplay = contentToInsert;
return this;
}
@Override
public OptionalSettingsStep byInsertingAt(final int offset) {
return byReplacingRegion(offset, 0);
}
@Override
public OptionalSettingsStep byReplacingRegion(final IRegion region) {
return byReplacingRegion(region.getOffset(), region.getLength());
}
@Override
public OptionalSettingsStep byReplacingRegion(final int offset, final int length) {
this.offset = offset;
this.length = length;
return this;
}
@Override
public OptionalSettingsStep secondaryPopupShouldBeDisplayedUsingHtml(final String additionalInfo) {
this.additionalInfo = additionalInfo;
this.additionalInfoAsHtml = true;
return this;
}
@Override
public OptionalSettingsStep activateAssistantAfterAccepting(final boolean activate) {
this.activateAssitant = activate;
return this;
}
@Override
public OptionalSettingsStep performAfterAccepting(final Collection<Runnable> operations) {
this.operationsAfterAccept.addAll(operations);
return this;
}
@Override
public DecorationsStep thenCursorWillStopAt(final int position) {
this.cursorPosition = position;
this.selectionLength = 0;
return this;
}
@Override
public DecorationsStep thenCursorWillStopAtTheEndOfInsertion() {
this.cursorPosition = -1;
this.selectionLength = 0;
return this;
}
@Override
public DecorationsStep thenCursorWillStopBeforeEnd(final int shift) {
this.cursorPosition = -1;
this.selectionLength = 0;
this.cursorBackShift = shift;
return this;
}
@Override
public DecorationsStep displayedLabelShouldBe(final String label) {
this.labelToDisplay = label;
return this;
}
@Override
public DecorationsStep proposalsShouldHaveIcon(final Image image) {
this.image = image;
return this;
}
@Override
public RedCompletionProposal create() {
final int cursorPos = cursorPosition == -1 ? (contentToInsert.length() - cursorBackShift) : cursorPosition;
return new RedCompletionProposal(contentToInsert, offset, length, 0, cursorPos, selectionLength, image,
false, labelToDisplay, activateAssitant, operationsAfterAccept, additionalInfo,
additionalInfoAsHtml);
}
}
public static ProposalContentStep newProposal() {
return new BuildingSteps();
}
}