From 5de0a8dc5b20579130d86e9f07ce9edaa6815078 Mon Sep 17 00:00:00 2001 From: miettinen Date: Thu, 27 Feb 2014 13:40:54 +0000 Subject: [PATCH] Multi-part variable support for Sysdyn text feed assistant (refs #4701), fixes also (refs #4698). Fixed Tourists sample model (refs #4733). git-svn-id: https://www.simantics.org/svn/simantics/sysdyn/trunk@29001 ac1ea38d-2e2b-0410-8846-a27921b304fc --- ...rists Environments And Hotel Facilities.tg | Bin 75605 -> 74820 bytes .../expressions/CompletionProcessor.java | 145 +++++++++++++----- 2 files changed, 110 insertions(+), 35 deletions(-) diff --git a/org.simantics.sysdyn.feature/rootfiles/sampleModels/Tourists Environments And Hotel Facilities.tg b/org.simantics.sysdyn.feature/rootfiles/sampleModels/Tourists Environments And Hotel Facilities.tg index 496ef1cbb5bee631991f939ee2a619f899b84eae..d82832a45ed6d7e8445ba8c4c5aa7c1ef7eb7507 100644 GIT binary patch literal 74820 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 l ALLOW_ALL_COMPLETIONS_LIST = new ArrayList(); + static { + ALLOW_ALL_COMPLETIONS_LIST.add(""); + } public CompletionProcessor(Table allowedVariables, boolean allowFunctions, ExpressionWidgetInput input) { this.allowedVariables = allowedVariables; @@ -121,7 +127,7 @@ public class CompletionProcessor implements IContentAssistProcessor { } /** - * Create CompletionProposals of the variables and add them to array. + * Create CompletionProposals of the variables and add them to array. Do not allow duplicates. * @param array result array of CompletionProposals * @param token current token * @param offset an offset within the document for which completions should be computed @@ -131,8 +137,9 @@ public class CompletionProcessor implements IContentAssistProcessor { Image imageVariableGray = resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/variableGray.png"))); for (String variable : variables) { - if (token.length() == 0 || variable.toUpperCase().startsWith(token.toUpperCase())) { - array.add(new CompletionProposal(variable, + if ((token.length() == 0 || variable.toUpperCase().startsWith(token.toUpperCase())) + && !listContainsVariable(array, variable)) { + array.add(new CompletionProposal(variable, offset - token.length(), token.length(), variable.length(), @@ -143,7 +150,8 @@ public class CompletionProcessor implements IContentAssistProcessor { } } for (String variable : timeAndSelfVariables) { - if (token.length() == 0 || variable.toUpperCase().startsWith(token.toUpperCase())) { + if ((token.length() == 0 || variable.toUpperCase().startsWith(token.toUpperCase())) + && !listContainsVariable(array, variable)) { array.add(new CompletionProposal(variable, offset - token.length(), token.length(), @@ -156,6 +164,15 @@ public class CompletionProcessor implements IContentAssistProcessor { } } + private boolean listContainsVariable(ArrayList array, + String variable) { + for (ICompletionProposal proposal : array) { + if (proposal.getDisplayString().equals(variable)) + return true; + } + return false; + } + /** * Create CompletionProposals of the functions and add them to array. * @param array result array of CompletionProposals @@ -186,20 +203,38 @@ public class CompletionProcessor implements IContentAssistProcessor { } /** - * Collect all matching proposals - * @param token current token + * Collect all matching proposals. Duplicates are removed; the one with the longest token stays. + * @param possibleLabelBeginnings sets of whitespace delimited tokens (as Strings) * @param offset an offset within the document for which completions should be computed * @return Array of matching proposals */ - private ICompletionProposal[] collectProposals(String token, int offset) { + private ICompletionProposal[] collectProposals(ArrayList possibleLabelBeginnings, int offset) { ArrayList resultArray = new ArrayList(); // Find variables and functions and create CompletionProposals out of them. findVariables(); - addVariables(resultArray, token, offset); - addFunctions(resultArray, token, offset); + + // Sort the list based on the length of the tokens (descending) to get "" to end. + Collections.sort(possibleLabelBeginnings, new Comparator(){ + @Override + public int compare(String o1, String o2) { + if (o1.length() > o2.length()) { + return -1; + } else if (o1.length() < o2.length()) { + return 1; + } + return 0; + } + }); + + for (String possibleLabelBeginning : possibleLabelBeginnings) { + addVariables(resultArray, possibleLabelBeginning, offset); + } - ICompletionProposal[] result = new ICompletionProposal[resultArray.size()]; + // No support for whitespace in function names; get shortest beginning + addFunctions(resultArray, possibleLabelBeginnings.get(possibleLabelBeginnings.size() - 1), offset); + + ICompletionProposal[] result = new ICompletionProposal[resultArray.size()]; for (int i = 0; i < result.length; ++i) { result[i] = resultArray.get(i); } @@ -213,35 +248,75 @@ public class CompletionProcessor implements IContentAssistProcessor { Control control = viewer.getTextWidget(); this.resourceManager = new LocalResourceManager(JFaceResources.getResources(), control); - if (equation.length() == 0 - || offset == 0 - || Character.isWhitespace(equation.charAt(offset - 1))) { - return collectProposals("", offset); + if (equation.length() == 0 || offset == 0) { + return collectProposals(ALLOW_ALL_COMPLETIONS_LIST, offset); } equation = equation.substring(0, offset); - // Split into tokens on whitespace characters - String[] tokens = equation.split("[\\s]"); - if (tokens.length == 0) { - return collectProposals("", offset); + // Split the equation on '+', '-', etc. characters + String stringsBetweenConnectedCharacters[] = equation.split(ALLOWED_CONNECTED_CHARACTERS_REG_EXP); + if (stringsBetweenConnectedCharacters.length == 0) { + return collectProposals(ALLOW_ALL_COMPLETIONS_LIST, offset); } - String token = tokens[tokens.length - 1]; + String stringAfterLastConnectedCharacter = stringsBetweenConnectedCharacters[stringsBetweenConnectedCharacters.length - 1]; + String stringAfterWhitespaceAfterLastConnectedCharacter = removeLeadingWhitespace(stringAfterLastConnectedCharacter); + + // Split into tokens on whitespace characters, include also the trailing empty strings + String[] tokens = stringAfterWhitespaceAfterLastConnectedCharacter.split("[\\s]", -42); - // If a '+', '-', etc. character is in the end, return all. - if (allowedConnectedCharactersRegExp.indexOf(token.charAt(token.length() - 1)) != -1) { - return collectProposals("", offset); - } - - // Split the last token on '+', '-', etc. characters - String tokensOfLastToken[] = token.split(allowedConnectedCharactersRegExp); - if (tokensOfLastToken.length == 0) { - return collectProposals("", offset); + // Only whitespace after the last connection character + if (allTokensAreEmpty(tokens)) + return collectProposals(ALLOW_ALL_COMPLETIONS_LIST, offset); + + return collectProposals(getPossibleLabelBeginnings(tokens), offset); + } + + /** + * Collect all possible strings (with each whitespace replaced by a space character) + * which may be a beginning of a variable. + * Create the beginnings by adding whitespace between. E.g.: + * {"multi", "part", "variab"} + * -> { "multi part variab", + * "part variab", + * "variab" } + * @param tokens list of tokens + * @return all possible label beginnings + */ + private ArrayList getPossibleLabelBeginnings(String[] tokens) { + ArrayList possibleLabelBeginnings = new ArrayList(); + for (int i = 0; i < tokens.length; ++i) { + String token = new String(); + for (int j = i; j < tokens.length; ++j) { + token += " " + tokens[j]; + } + // Remove the excess space character from the beginning + token = token.substring(1); + + possibleLabelBeginnings.add(token); } - token = tokensOfLastToken[tokensOfLastToken.length - 1]; - //System.out.println(token + "\noffset = " + offset); + return possibleLabelBeginnings; + } + + /** + * Remove leading whitespace + * @param input + * @return + */ + private String removeLeadingWhitespace(String input) { + for (int i = 0; i < input.length(); ++i) { + if (!Character.isWhitespace(input.charAt(i))) { + return input.substring(i); + } + } + return ""; + } - return collectProposals(token, offset); + private boolean allTokensAreEmpty(String[] tokens) { + for (String token : tokens) + if (!token.equals("")) + return false; + return true; } @Override @@ -252,7 +327,7 @@ public class CompletionProcessor implements IContentAssistProcessor { @Override public char[] getCompletionProposalAutoActivationCharacters() { - return allowedCharacters; + return ALLOWED_CHARACTERS; } @Override -- 2.47.1