blob: 056c89021ded1fb92877f733b928fc00e6db9f0e [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.Iterator;
import java.util.List;
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.ICSSCharsetRule;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSDocument;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSImportRule;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSModel;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSNode;
import org.eclipse.wst.css.core.internal.util.SelectionCollector;
import org.eclipse.wst.css.ui.internal.image.CSSImageType;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
class CSSProposalGeneratorForAtmarkRule extends CSSProposalGenerator {
private boolean fUseUpperCase = false;
private static final String CHARSET = "@charset";//$NON-NLS-1$
private static final String FONT_FACE = "@font-face";//$NON-NLS-1$
private static final String IMPORT = "@import";//$NON-NLS-1$
private static final String MEDIA = "@media";//$NON-NLS-1$
private static final String PAGE = "@page";//$NON-NLS-1$
/**
* CSSAtmarkRuleProposalGenerator constructor comment.
*
*/
CSSProposalGeneratorForAtmarkRule(CSSContentAssistContext context) {
super(context);
fUseUpperCase = CSSCorePlugin.getDefault().getPluginPreferences().getInt(CSSCorePreferenceNames.CASE_IDENTIFIER) == CSSCorePreferenceNames.UPPER;
}
/**
*
*/
private CSSCACandidate getCandidateCharsetRule() {
// check content model
CSSMetaModelUtil util = new CSSMetaModelUtil(fContext.getMetaModel());
if (!util.collectNodesByType(CSSMMNode.TYPE_CHARSET_RULE).hasNext()) {
return null;
}
// check if embedded or not
if (fContext.getModel().getStyleSheetType() == ICSSModel.EMBEDDED) {
return null;
}
// check if caret precede all other rules.
int offset = fContext.getCursorPos();
if (0 < offset) {
SelectionCollector trav = new SelectionCollector();
trav.setRegion(0, offset - 1);
trav.apply(fContext.getModel().getDocument());
Iterator i = trav.getSelectedNodes().iterator();
while (i.hasNext()) {
Object obj = i.next();
if (obj instanceof ICSSNode && !(obj instanceof ICSSDocument)) {
return null;
}
}
}
int cursorPos = 0;
String ident = (fUseUpperCase) ? CHARSET.toUpperCase() : CHARSET.toLowerCase();
StringBuffer buf = new StringBuffer();
buf.append(ident);
buf.append(" ");//$NON-NLS-1$
cursorPos = buf.length();
StringAndOffset sao;
sao = generateQuotes();
buf.append(sao.fString);
cursorPos += sao.fOffset;
sao = generateSemicolon();
buf.append(sao.fString);
String text = buf.toString();
if (isMatch(text)) {
CSSCACandidate item = new CSSCACandidate();
item.setReplacementString(text);
item.setCursorPosition(cursorPos);
item.setDisplayString(ident);
item.setImageType(CSSImageType.RULE_CHARSET);
return item;
} else {
return null;
}
}
/**
*
*/
private CSSCACandidate getCandidateFontFaceRule() {
CSSMetaModelUtil util = new CSSMetaModelUtil(fContext.getMetaModel());
if (!util.collectNodesByType(CSSMMNode.TYPE_FONT_FACE_RULE).hasNext()) {
return null;
}
int cursorPos = 0;
String ident = (fUseUpperCase) ? FONT_FACE.toUpperCase() : FONT_FACE.toLowerCase();
StringBuffer buf = new StringBuffer();
buf.append(ident);
buf.append(" ");//$NON-NLS-1$
cursorPos = buf.length();
StringAndOffset sao;
sao = generateBraces();
buf.append(sao.fString);
cursorPos += sao.fOffset;
String text = buf.toString();
if (isMatch(text)) {
CSSCACandidate item = new CSSCACandidate();
item.setReplacementString(buf.toString());
item.setCursorPosition(cursorPos);
item.setDisplayString(ident);
item.setImageType(CSSImageType.RULE_FONTFACE);
return item;
} else {
return null;
}
}
/**
*
*/
private CSSCACandidate getCandidateImportRule() {
// check content model
CSSMetaModelUtil util = new CSSMetaModelUtil(fContext.getMetaModel());
if (!util.collectNodesByType(CSSMMNode.TYPE_IMPORT_RULE).hasNext()) {
return null;
}
// charset and import can precede import rule.
int offset = fContext.getCursorPos();
if (0 < offset) {
SelectionCollector trav = new SelectionCollector();
trav.setRegion(0, offset - 1);
trav.apply(fContext.getModel().getDocument());
Iterator i = trav.getSelectedNodes().iterator();
while (i.hasNext()) {
Object obj = i.next();
if (obj instanceof ICSSNode && !(obj instanceof ICSSDocument || obj instanceof ICSSCharsetRule || obj instanceof ICSSImportRule)) {
return null;
}
}
}
int cursorPos = 0;
String ident = (fUseUpperCase) ? IMPORT.toUpperCase() : IMPORT.toLowerCase();
StringBuffer buf = new StringBuffer();
buf.append(ident);
buf.append(" ");//$NON-NLS-1$
cursorPos = buf.length();
StringAndOffset sao;
sao = generateURI();
buf.append(sao.fString);
cursorPos += sao.fOffset;
sao = generateSemicolon();
buf.append(sao.fString);
String text = buf.toString();
if (isMatch(text)) {
CSSCACandidate item = new CSSCACandidate();
item.setReplacementString(buf.toString());
item.setCursorPosition(cursorPos);
item.setDisplayString(ident);
item.setImageType(CSSImageType.RULE_IMPORT);
return item;
} else {
return null;
}
}
/**
*
*/
private CSSCACandidate getCandidateMediaRule() {
CSSMetaModelUtil util = new CSSMetaModelUtil(fContext.getMetaModel());
if (!util.collectNodesByType(CSSMMNode.TYPE_MEDIA_RULE).hasNext()) {
return null;
}
int cursorPos = 0;
String ident = (fUseUpperCase) ? MEDIA.toUpperCase() : MEDIA.toLowerCase();
StringBuffer buf = new StringBuffer();
buf.append(ident);
buf.append(" ");//$NON-NLS-1$
cursorPos = buf.length() - 1;
StringAndOffset sao;
sao = generateBraces();
buf.append(sao.fString);
String text = buf.toString();
if (isMatch(text)) {
CSSCACandidate item = new CSSCACandidate();
item.setReplacementString(buf.toString());
item.setCursorPosition(cursorPos);
item.setDisplayString(ident);
item.setImageType(CSSImageType.RULE_MEDIA);
return item;
} else {
return null;
}
}
/**
*
*/
private CSSCACandidate getCandidatePageRule() {
CSSMetaModelUtil util = new CSSMetaModelUtil(fContext.getMetaModel());
if (!util.collectNodesByType(CSSMMNode.TYPE_PAGE_RULE).hasNext()) {
return null;
}
int cursorPos = 0;
String ident = (fUseUpperCase) ? PAGE.toUpperCase() : PAGE.toLowerCase();
StringBuffer buf = new StringBuffer();
buf.append(ident);
buf.append(" ");//$NON-NLS-1$
cursorPos = buf.length();
StringAndOffset sao;
sao = generateBraces();
buf.append(sao.fString);
cursorPos += sao.fOffset;
String text = buf.toString();
if (isMatch(text)) {
CSSCACandidate item = new CSSCACandidate();
item.setReplacementString(buf.toString());
item.setCursorPosition(cursorPos);
item.setDisplayString(ident);
item.setImageType(CSSImageType.RULE_PAGE);
return item;
} else {
return null;
}
}
/**
* getCandidates method comment.
*/
protected Iterator getCandidates() {
List candidates = new ArrayList();
ITextRegion region = fContext.getTargetRegionPrevious();
// ITextRegion region = fContext.getSignificantTargetRegion();
if (region != null) {
String type = region.getType();
if (type != CSSRegionContexts.CSS_RBRACE && type != CSSRegionContexts.CSS_DELIMITER) {
return candidates.iterator();
}
}
CSSCACandidate item;
if ((item = getCandidateImportRule()) != null) {
candidates.add(item);
}
if ((item = getCandidateCharsetRule()) != null) {
candidates.add(item);
}
if ((item = getCandidateMediaRule()) != null) {
candidates.add(item);
}
if ((item = getCandidatePageRule()) != null) {
candidates.add(item);
}
if ((item = getCandidateFontFaceRule()) != null) {
candidates.add(item);
}
return candidates.iterator();
}
}