blob: cd7b4409e618cabc1a4bf067291392c3bb766853 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2010 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.jface.text.contentassist.ICompletionProposal;
import org.eclipse.wst.css.core.internal.parserz.CSSRegionContexts;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSMediaRule;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSNode;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSPageRule;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSPrimitiveValue;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleDeclItem;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleDeclaration;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleRule;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleSheet;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
import org.w3c.dom.css.CSSFontFaceRule;
class CSSProposalArranger {
private List fProposals = new ArrayList();
private CSSContentAssistContext fContext = null;
/**
* CSSProposalArranger constructor comment.
*/
private CSSProposalArranger() {
super();
}
/**
* CSSProposalArranger constructor comment.
*/
CSSProposalArranger(int documentPosition, ICSSNode node, int documentOffset, char quote) {
this();
fContext = new CSSContentAssistContext(documentPosition, node, documentOffset, quote);
}
CSSProposalArranger(int documentPosition, ICSSNode node, int documentOffset, int length, char quote) {
this();
fContext = new CSSContentAssistContext(documentPosition, node, documentOffset, length, quote);
}
CSSProposalArranger(int documentPosition, ICSSNode node, int documentOffset, char quote, boolean selected) {
this();
fContext = new CSSContentAssistContext(documentPosition, node, documentOffset, quote, selected);
}
/**
*
*/
void buildProposals() {
fProposals.clear();
/*
* String text; ICompletionProposal item; text = "---- Test
* Information ----"; item = new CompletionProposal("",
* fContext.getReplaceBegin(), 0, 0, null, text, null, null);
* fProposals.add(item);
*
* text = "Target: \"" + fContext.getRegionText() + "\"";
*
* item = new CompletionProposal("", fContext.getReplaceBegin(), 0, 0,
* null, text, null, null); fProposals.add(item);
*
* text = fContext.getTargetNode().getClass().toString(); int
* lastPeriodPos = text.lastIndexOf('.'); text = "Node: " +
* text.substring(lastPeriodPos + 1); item = new
* CompletionProposal("", fContext.getReplaceBegin(), 0, 0, null,
* text, null, null); fProposals.add(item);
*/
ICSSNode targetNode = fContext.getTargetNode();
//int targetPos = fContext.getTargetPos();
if (targetNode instanceof ICSSStyleSheet) {
buildProposalsForAnyRule();
} else if ((targetNode instanceof ICSSMediaRule && fContext.isTargetPosAfterOf(CSSRegionContexts.CSS_LBRACE)) || (targetNode instanceof ICSSStyleRule && fContext.isTargetPosBeforeOf(CSSRegionContexts.CSS_LBRACE))) {
buildProposalsForAnyRule();
// buildProposalsForStyleRule();
} else if ((targetNode instanceof ICSSPageRule && fContext.isTargetPosBeforeOf(CSSRegionContexts.CSS_LBRACE))) {
buildProposalsForPageRulePseudoClass();
} else if ((targetNode instanceof ICSSStyleRule || targetNode instanceof CSSFontFaceRule || targetNode instanceof ICSSPageRule || targetNode instanceof ICSSStyleDeclaration) && (targetNode.getOwnerDocument() instanceof ICSSStyleDeclaration || fContext.targetFollows(CSSRegionContexts.CSS_DECLARATION_DELIMITER) || fContext.targetFollows(CSSRegionContexts.CSS_LBRACE))) {
buildProposalsForDeclarationName();
} else if (targetNode instanceof ICSSStyleDeclItem) {
if (fContext.isTargetPosAfterOf(CSSRegionContexts.CSS_DECLARATION_SEPARATOR)) {
buildProposalsForDeclarationValue();
} else {
buildProposalsForDeclarationName();
}
} else if (targetNode instanceof ICSSPrimitiveValue) {
buildProposalsForDeclarationValue();
}
/*
* else if (targetNode instanceof ICSSPrimitiveValue || ((targetNode
* instanceof ICSSStyleRule || targetNode instanceof CSSFontFaceRule ||
* targetNode instanceof ICSSStyleDeclaration || targetNode instanceof
* ICSSStyleDeclItem) &&
* fContext.isTargetPosAfterOf(CSSRegionContexts.COLON))) {
* buildProposalsForDeclarationValue(); }
*/
// for Test
}
/**
*
*/
void buildProposalsForAnyRule() {
CSSProposalGenerator generator;
if (isFirstRegion()){
generator = new CSSProposalGeneratorForAtmarkRule(fContext);
fProposals.addAll(generator.getProposals());
}
generator = new CSSProposalGeneratorForHTMLTag(fContext);
fProposals.addAll(generator.getProposals());
generator = new CSSProposalGeneratorForPseudoSelector(fContext);
fProposals.addAll(generator.getProposals());
}
private boolean isFirstRegion(){
if (fContext.getCursorPos() == 0)
return true;
ITextRegion region = fContext.getTargetRegion();
ITextRegion currRegion = fContext.getRegionByOffset(fContext.getCursorPos());
String type = null;
String crType = null;
if(region != null) {
type = region.getType();
}
if(currRegion != null) {
crType = currRegion.getType();
}
if (type == null || crType == null || (crType == type))
return true;
else
return false;
}
/**
*
*/
void buildProposalsForDeclarationName() {
CSSProposalGenerator generator;
generator = new CSSProposalGeneratorForDeclarationName(fContext);
fProposals.addAll(generator.getProposals());
}
/**
*
*/
void buildProposalsForDeclarationValue() {
CSSProposalGenerator generator;
generator = new CSSProposalGeneratorForDeclarationValue(fContext);
fProposals.addAll(generator.getProposals());
}
/**
*
*/
void buildProposalsForPageRulePseudoClass() {
CSSProposalGenerator generator;
generator = new CSSProposalGeneratorForPseudoSelector(fContext);
fProposals.addAll(generator.getProposals());
}
/**
*
*/
void buildProposalsForStyleRule() {
CSSProposalGenerator generator;
generator = new CSSProposalGeneratorForHTMLTag(fContext);
fProposals.addAll(generator.getProposals());
generator = new CSSProposalGeneratorForPseudoSelector(fContext);
fProposals.addAll(generator.getProposals());
}
/**
*
*/
ICompletionProposal[] getProposals() {
buildProposals();
ICompletionProposal[] proposalArray = new ICompletionProposal[fProposals.size()];
Iterator iItem = fProposals.iterator();
for (int i = 0; iItem.hasNext(); i++) {
proposalArray[i] = (ICompletionProposal) iItem.next();
}
return proposalArray;
}
}