// Copyright 2012 Google Inc. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.google.collide.client.code.autocomplete.codegraph; import static com.google.collide.client.code.autocomplete.AutocompleteResult.PopupAction.CLOSE; import com.google.collide.client.code.autocomplete.AutocompleteProposal; import com.google.collide.client.code.autocomplete.AutocompleteResult; import com.google.collide.client.code.autocomplete.DefaultAutocompleteResult; import com.google.collide.shared.util.StringUtils; /** * Proposal that contains template and knows how to process it. * * <p>Template is a string which may contain the following wildcard symbols:<ul> * <li>%n - new line character with indentation to the level of * the inserting place; * <li>%i - additional indentation; * <li>%c - a point to place the cursor to after inserting. * </ul> */ public class TemplateProposal extends AutocompleteProposal { private final String template; public TemplateProposal(String name, String template) { super(name); this.template = template; } /** * Translates template to {@link AutocompleteResult}. */ public AutocompleteResult buildResult(String triggeringString, int indent) { String lineStart = "\n" + StringUtils.getSpaces(indent); String replaced = template .replace("%n", lineStart) .replace("%i", indent(lineStart)) .replace("%d", dedent(lineStart)); int pos = replaced.indexOf("%c"); pos = (pos == -1) ? replaced.length() : pos; String completion = replaced.replace("%c", ""); return new DefaultAutocompleteResult(completion, pos, 0, 0, 0, CLOSE, triggeringString); } /** * Adds an indentation to a given string. * * <p>We suppose extra indention to be double-space. */ private static String indent(String s) { return s + " "; } /** * Removes extra indention. * * <p>We suppose extra indention to be double-space. */ private static String dedent(String s) { if (s.endsWith(" ")) { return s.substring(0, s.length() - 2); } return s; } }