package org.maziarz.yiiclipse.completion; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.eclipse.dltk.core.CompletionRequestor; import org.eclipse.dltk.core.ISourceModule; import org.eclipse.jface.text.BadLocationException; import org.eclipse.php.core.codeassist.ICompletionContext; import org.eclipse.php.internal.core.codeassist.contexts.AbstractCompletionContext; import org.eclipse.php.internal.core.util.text.TextSequence; public class WidgetConfigArrayContext extends AbstractCompletionContext implements ICompletionContext { private String widgetAlias; private String configArray; private String prefix; public Pattern p = Pattern.compile("\\$this->widget\\((.+),(.+)"); public String getWidgetAlias() { return widgetAlias; } public String getConfigArray() { return configArray; } public String getPrefixValue() { return prefix; } @Override public boolean isValid(ISourceModule sourceModule, int offset, CompletionRequestor requestor) { if (!super.isValid(sourceModule, offset, requestor)) { return false; } TextSequence statementText = getStatementText(); String stmt = statementText.toString(); Matcher m = Pattern.compile("\\$this->widget\\(([^,]+), (.+)").matcher(stmt.replace('\n', ' ')); if (m.matches()) { widgetAlias = m.group(1); configArray = m.group(2).trim(); if (!configArray.startsWith("array")) { return false; } } else { return false; } int isInString = -1; int isKey = -1; for (int i = configArray.length() - 1; i > 0; i--) { char ch = configArray.charAt(i); if (ch == '\'' || ch == '"') { // context is in string isInString = i; for (int ii = i-1; ii > 0; ii--) { if(Character.isWhitespace(configArray.charAt(ii))) { continue; } char iiChar = configArray.charAt(ii); if (iiChar == ',' || iiChar == '('){ isKey = ii; break; } else { return false; } } String keyArray = configArray.substring(0, isKey); if (keyArray.lastIndexOf("array") > 0){ return false; } prefix = getPrefixWithoutProcessing(); // System.out.println("Prefix: "+prefix); return true; } } return false; } protected static int eatString(String document, int offset) throws BadLocationException { Character inString = null; Character ch = null; while ((ch = document.charAt(--offset)) != null) { if (ch == '"' || ch == '\'') { if (inString == null) { inString = ch; } else { if (ch == inString) { if (offset > 0) { if (document.charAt(offset - 1) != '\\') { return offset; } } else { return offset; } } } } } return 0; } protected static int eatWhitespaces(String document, int offset) { Character ch = null; while ((ch = document.charAt(--offset)) != null) { if (!Character.isWhitespace(ch)) { break; } } return offset + 1; } protected static boolean isTopLevelKey(String str, int length) { return false; } }