blob: 02f40b0770f29cedf7ec9aa29333c713a932af97 [file] [log] [blame]
/*****************************************************************************
* Copyright (c) 2004 IBM Corporation and others. All rights reserved. This
* program and the accompanying materials are made available under the terms
* of the Eclipse Public License v1.0 which accompanies this distribution, and
* is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors: IBM Corporation - initial API and implementation
****************************************************************************/
package org.eclipse.wst.css.ui.internal.contentassist;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.wst.css.core.internal.CSSCorePlugin;
import org.eclipse.wst.css.core.internal.metamodel.CSSMMNode;
import org.eclipse.wst.css.core.internal.metamodel.util.CSSMetaModelUtil;
import org.eclipse.wst.css.core.internal.parserz.CSSRegionContexts;
import org.eclipse.wst.css.core.internal.preferences.CSSCorePreferenceNames;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSNode;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleDeclItem;
import org.eclipse.wst.css.ui.internal.image.CSSImageType;
class CSSProposalGeneratorForDeclarationName extends CSSProposalGenerator {
/**
* CSSProposalGeneratorForDeclaration constructor comment.
*
*/
CSSProposalGeneratorForDeclarationName(CSSContentAssistContext context) {
super(context);
}
/**
* getCandidates method comment.
*/
protected Iterator getCandidates() {
List candidates = new ArrayList();
Preferences preferences = CSSCorePlugin.getDefault().getPluginPreferences();
String preDelim = "";//$NON-NLS-1$
for (int i = 0; i < preferences.getInt(CSSCorePreferenceNames.FORMAT_PROP_PRE_DELIM); i++) {
preDelim += ' ';//$NON-NLS-1$
}
String postDelim = "";//$NON-NLS-1$
for (int i = 0; i < preferences.getInt(CSSCorePreferenceNames.FORMAT_PROP_POST_DELIM); i++) {
postDelim += ' ';//$NON-NLS-1$
}
ICSSNode targetNode = fContext.getTargetNode();
boolean bFontRule = false;
for (ICSSNode node = targetNode; node != null; node = node.getParentNode()) {
if (node instanceof org.w3c.dom.css.CSSFontFaceRule) {
bFontRule = true;
break;
}
}
List names = new ArrayList();
CSSMetaModelUtil util = new CSSMetaModelUtil(fContext.getMetaModel());
Iterator iNames = util.collectNodesByType((bFontRule) ? CSSMMNode.TYPE_DESCRIPTOR : CSSMMNode.TYPE_PROPERTY);
while (iNames.hasNext()) {
CSSMMNode node = (CSSMMNode) iNames.next();
names.add(node);
}
sortNames(names);
// Collections.sort(names);
boolean bAddColon = true;
if (targetNode instanceof ICSSStyleDeclItem && fContext.targetHas(CSSRegionContexts.CSS_DECLARATION_SEPARATOR)) {
bAddColon = false;
}
Iterator i = names.iterator();
while (i.hasNext()) {
CSSMMNode node = (CSSMMNode) i.next();
String text = node.getName();
text = (preferences.getInt(CSSCorePreferenceNames.CASE_PROPERTY_NAME) == CSSCorePreferenceNames.UPPER) ? text.toUpperCase() : text.toLowerCase();
if (!isMatch(text)) {
continue;
}
int cursorPos = 0;
StringBuffer buf = new StringBuffer();
buf.append(text);
buf.append(preDelim);
cursorPos = buf.length();
if (bAddColon) {
buf.append(':');//$NON-NLS-1$
buf.append(postDelim);
cursorPos += 1 + postDelim.length();
}
// if (! (targetNode instanceof ICSSStyleDeclItem)) {
// buf.append(';');//$NON-NLS-1$
// }
CSSCACandidate item = new CSSCACandidate();
item.setReplacementString(buf.toString());
item.setCursorPosition(cursorPos);
item.setDisplayString(text);
item.setImageType(getCategoryImageType(node));
candidates.add(item);
}
return candidates.iterator();
}
void sortNames(List names) {
Collections.sort(names, new Comparator() {
public int compare(Object o1, Object o2) {
CSSMMNode node1 = (CSSMMNode) o1;
CSSMMNode node2 = (CSSMMNode) o2;
if (node1 == null) {
return 1;
} else if (node2 == null) {
return -1;
}
int diff = 0;
String category1 = node1.getAttribute("category"); //$NON-NLS-1$
String category2 = node2.getAttribute("category"); //$NON-NLS-1$
if (category1 == null) {
if (category2 == null) {
diff = 0;
} else {
return 1;
}
} else if (category2 == null) {
return -1;
} else {
diff = category1.compareTo(category2);
}
if (diff == 0) {
String name = node1.getName();
if (name == null) {
return 1;
} else {
return name.compareTo(node2.getName());
}
} else {
return diff;
}
}
});
}
/*
* retrieve default category icon name TODO: if node has "icon"(?), use
* it.
*/
CSSImageType getCategoryImageType(CSSMMNode node) {
CSSImageType imageType = null;
if (node != null) {
String category = node.getAttribute("category"); //$NON-NLS-1$
if (category != null) {
imageType = CSSImageType.getImageType(category);
}
}
return (imageType == null) ? CSSImageType.CATEGORY_DEFAULT : imageType;
}
}