diff options
author | Tom Schindl | 2014-11-04 10:54:08 +0000 |
---|---|---|
committer | Tom Schindl | 2014-11-04 10:54:08 +0000 |
commit | 4b12172c0bef77174e68a89fa3798876e0ea60d8 (patch) | |
tree | a5fe4a00b0547f15f95be56ef582dd04985fa9ce | |
parent | 98e95a1c0a1e8ade9501e7c2d847ab8b1505dbe6 (diff) | |
download | org.eclipse.efxclipse-4b12172c0bef77174e68a89fa3798876e0ea60d8.tar.gz org.eclipse.efxclipse-4b12172c0bef77174e68a89fa3798876e0ea60d8.tar.xz org.eclipse.efxclipse-4b12172c0bef77174e68a89fa3798876e0ea60d8.zip |
Bug 446116 - [css] Editor does not recognize @font-face
-rwxr-xr-x | bundles/tooling/org.eclipse.fx.ide.css.ui/src/org/eclipse/fx/ide/css/ui/contentassist/CssDslProposalProvider.java | 116 | ||||
-rwxr-xr-x | bundles/tooling/org.eclipse.fx.ide.css/META-INF/MANIFEST.MF | 26 |
2 files changed, 94 insertions, 48 deletions
diff --git a/bundles/tooling/org.eclipse.fx.ide.css.ui/src/org/eclipse/fx/ide/css/ui/contentassist/CssDslProposalProvider.java b/bundles/tooling/org.eclipse.fx.ide.css.ui/src/org/eclipse/fx/ide/css/ui/contentassist/CssDslProposalProvider.java index d765fc828..3a4bc1914 100755 --- a/bundles/tooling/org.eclipse.fx.ide.css.ui/src/org/eclipse/fx/ide/css/ui/contentassist/CssDslProposalProvider.java +++ b/bundles/tooling/org.eclipse.fx.ide.css.ui/src/org/eclipse/fx/ide/css/ui/contentassist/CssDslProposalProvider.java @@ -16,9 +16,11 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; +import java.util.function.Function; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.eclipse.emf.ecore.EObject; import org.eclipse.fx.ide.css.ui.extapi.UIProposal; import org.eclipse.fx.ide.css.util.Utils; import org.eclipse.jface.text.BadLocationException; @@ -37,12 +39,14 @@ import org.eclipse.xtext.ui.editor.hover.DispatchingEObjectTextHover; import org.eclipse.fx.ide.css.cssDsl.CssDslFactory; import org.eclipse.fx.ide.css.cssDsl.CssTok; import org.eclipse.fx.ide.css.cssDsl.css_declaration; +import org.eclipse.fx.ide.css.cssDsl.font_face; import org.eclipse.fx.ide.css.cssDsl.ruleset; import org.eclipse.fx.ide.css.cssDsl.selector; import org.eclipse.fx.ide.css.cssDsl.stylesheet; import org.eclipse.fx.ide.css.extapi.CssExt; import org.eclipse.fx.ide.css.extapi.Proposal; import org.eclipse.fx.ide.css.extapi.Proposal.Type; +import org.eclipse.fx.ide.css.extapi.SimpleProposal; import com.google.inject.Inject; @@ -55,23 +59,23 @@ public class CssDslProposalProvider extends AbstractCssDslProposalProvider { @Inject private CssExt cssExt; - + @Inject private DispatchingEObjectTextHover hoverDispatcher; - + @Inject private ILabelProvider labelProvider; - - + + private void acceptProposals(List<Proposal> proposals, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { for (Proposal p : proposals) { - + final Image img = labelProvider.getImage(CssDslFactory.eINSTANCE.createcss_property()); - + if (p instanceof UIProposal) { ConfigurableCompletionProposal cp = (ConfigurableCompletionProposal) createCompletionProposal(p.getLabel(), p.getLabel(), img, context); final UIProposal uiP = (UIProposal)p; - + if (cp != null) { cp.setTextApplier(new ReplacementTextApplier() { //@Override @@ -87,18 +91,18 @@ public class CssDslProposalProvider extends AbstractCssDslProposalProvider { } } else { - + ConfigurableCompletionProposal cp = (ConfigurableCompletionProposal) createCompletionProposal(p.getProposal(), p.getLabel(), img, context); if (cp != null) { cp.setAdditionalProposalInfo(p.getAdditionalInfo()); cp.setHover(hoverDispatcher); - + cp.setTriggerCharacters(new char[] { ' ' }); - + if (p.getType() == Type.Property) { // add ": " to proposal cp.setTextApplier(new IReplacementTextApplier() { - + @Override public void apply(IDocument document, ConfigurableCompletionProposal proposal) throws BadLocationException { document.replace(proposal.getReplacementOffset(), proposal.getReplacementLength(), proposal.getReplacementString() + ": "); @@ -108,11 +112,11 @@ public class CssDslProposalProvider extends AbstractCssDslProposalProvider { } if (p.getType() == Type.Value) { cp.setTextApplier(new IReplacementTextApplier() { - + private int findWSCountBeforeProposal(IDocument document, ConfigurableCompletionProposal proposal) throws BadLocationException { // remove spaces " " before proposal int offset = 0; - + int amount = 10; if (proposal.getReplacementOffset() - amount < 0) { amount = proposal.getReplacementOffset(); @@ -126,18 +130,18 @@ public class CssDslProposalProvider extends AbstractCssDslProposalProvider { } return offset; } - + @Override public void apply(IDocument document, ConfigurableCompletionProposal proposal) throws BadLocationException { if (proposal.getReplacementString().equals(";")) { int wsCount = findWSCountBeforeProposal(document, proposal); - + document.replace(proposal.getReplacementOffset()-wsCount, proposal.getReplacementLength()+wsCount, proposal.getReplacementString()); proposal.setCursorPosition(proposal.getCursorPosition()-wsCount); } else if (proposal.getReplacementString().equals(",")) { int wsCount = findWSCountBeforeProposal(document, proposal); - + document.replace(proposal.getReplacementOffset()-wsCount, proposal.getReplacementLength()+wsCount, proposal.getReplacementString() + " "); proposal.setCursorPosition(proposal.getCursorPosition()+1-wsCount); } @@ -150,7 +154,7 @@ public class CssDslProposalProvider extends AbstractCssDslProposalProvider { }); } cp.setPriority(p.getPriority()); - + acceptor.accept(cp); } else { @@ -159,9 +163,9 @@ public class CssDslProposalProvider extends AbstractCssDslProposalProvider { } } } - - - + + + private List<CssTok> findPrefixTokens(ContentAssistContext context) { List<CssTok> prefixToks = new ArrayList<CssTok>(); if (context.getLastCompleteNode().getSemanticElement() instanceof CssTok) { @@ -170,27 +174,29 @@ public class CssDslProposalProvider extends AbstractCssDslProposalProvider { if (tok == currentTok) break; prefixToks.add(tok); } - - // TEST + + // TEST prefixToks.add(currentTok); } return prefixToks; } - + private List<selector> findSelectors(css_declaration decl) { if (decl.eContainer() instanceof ruleset) { return ((ruleset)decl.eContainer()).getSelectors(); } return Collections.emptyList(); } - - + public void complete_CssTok(css_declaration model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { - System.err.println("complete_CssTok prefixTok=" + findPrefixTokens(context) + "prefixString=" + context.getPrefix()); + System.err.println("A DECLARATION!!!!"); + if( model.eContainer() instanceof font_face ) { + return; + } + +// System.err.println("complete_CssTok prefixTok=" + findPrefixTokens(context) + "prefixString=" + context.getPrefix()); final List<Proposal> proposals = cssExt.getValueProposalsForProperty(Utils.getFile(model.eResource()),model,findSelectors(model), model.getProperty(), findPrefixTokens(context), context.getPrefix()); - - - + acceptProposals(proposals, context, acceptor); } @@ -207,20 +213,60 @@ public class CssDslProposalProvider extends AbstractCssDslProposalProvider { } } } - + + static class FontPropertyProposal extends SimpleProposal { + + public FontPropertyProposal(String proposal) { + super(proposal); + } + + @Override + public Type getType() { + return Type.Property; + } + } + + private static <O extends EObject> void filterDuplicates(O model, Function<O, List<css_declaration>> f, List<Proposal> proposals) { + final Set<String> defined = new HashSet<>(); + for (css_declaration d : f.apply(model)) { + defined.add(d.getProperty().getName()); + } + final Iterator<Proposal> filterIterator = proposals.iterator(); + while (filterIterator.hasNext()) { + Proposal curr = filterIterator.next(); + if (defined.contains(curr.getProposal())) { + filterIterator.remove(); + } + } + } + + @Override + public void completeFont_face_Declarations(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { + List<Proposal> proposals = new ArrayList<>(); + proposals.add(new FontPropertyProposal("font-family")); //$NON-NLS-1$ + proposals.add(new FontPropertyProposal("src")); //$NON-NLS-1$ + proposals.add(new FontPropertyProposal("font-stretch")); //$NON-NLS-1$ + proposals.add(new FontPropertyProposal("font-style")); //$NON-NLS-1$ + proposals.add(new FontPropertyProposal("font-weight")); //$NON-NLS-1$ + proposals.add(new FontPropertyProposal("unicode-range")); //$NON-NLS-1$ + filterDuplicates((font_face)model, (o) -> o.getDeclarations(), proposals); + acceptProposals(proposals, context, acceptor); + + super.completeFont_face_Declarations(model, assignment, context, acceptor); + } + public void completeRuleset_Declarations(ruleset model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { final List<Proposal> proposals = cssExt.getPropertyProposalsForSelector(Utils.getFile(model.eResource()),model,model.getSelectors()); filterDuplicates(model, proposals); acceptProposals(proposals, context, acceptor); } - + // known issue // for some reason autocompletion for the last property in a ruleset ends up here // for now i try to get the current model, but in case we fail i return the full list public void completeRuleset_Declarations(stylesheet model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { - if (context.getPreviousModel() instanceof ruleset) { ruleset ruleset = (ruleset) context.getPreviousModel(); final List<Proposal> proposals = cssExt.getPropertyProposalsForSelector(Utils.getFile(model.eResource()),model,ruleset.getSelectors()); @@ -232,13 +278,13 @@ public class CssDslProposalProvider extends AbstractCssDslProposalProvider { acceptProposals(proposals, context, acceptor); } } - - + + @Override public void completeKeyword(Keyword keyword, ContentAssistContext contentAssistContext, ICompletionProposalAcceptor acceptor) { return; } - + } diff --git a/bundles/tooling/org.eclipse.fx.ide.css/META-INF/MANIFEST.MF b/bundles/tooling/org.eclipse.fx.ide.css/META-INF/MANIFEST.MF index 40108e7d1..8a15491ac 100755 --- a/bundles/tooling/org.eclipse.fx.ide.css/META-INF/MANIFEST.MF +++ b/bundles/tooling/org.eclipse.fx.ide.css/META-INF/MANIFEST.MF @@ -28,17 +28,17 @@ Import-Package: org.apache.commons.logging, org.apache.log4j,
org.eclipse.xtext.xbase.lib
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
-Export-Package: org.eclipse.fx.ide.css;x-internal:=true,
- org.eclipse.fx.ide.css.cssDsl;x-internal:=true,
- org.eclipse.fx.ide.css.cssDsl.impl;x-internal:=true,
- org.eclipse.fx.ide.css.cssDsl.util;x-internal:=true,
- org.eclipse.fx.ide.css.extapi;x-internal:=true,
- org.eclipse.fx.ide.css.formatting;x-internal:=true,
- org.eclipse.fx.ide.css.parser.antlr;x-internal:=true,
- org.eclipse.fx.ide.css.parser.antlr.internal;x-internal:=true,
- org.eclipse.fx.ide.css.scoping;x-internal:=true,
- org.eclipse.fx.ide.css.serializer;x-internal:=true,
- org.eclipse.fx.ide.css.services;x-internal:=true,
- org.eclipse.fx.ide.css.util;x-internal:=true,
- org.eclipse.fx.ide.css.validation;x-internal:=true
+Export-Package: org.eclipse.fx.ide.css;x-friends:="org.eclipse.fx.ide.css.ui",
+ org.eclipse.fx.ide.css.cssDsl;x-friends:="org.eclipse.fx.ide.css.ui",
+ org.eclipse.fx.ide.css.cssDsl.impl;x-friends:="org.eclipse.fx.ide.css.ui",
+ org.eclipse.fx.ide.css.cssDsl.util;x-friends:="org.eclipse.fx.ide.css.ui",
+ org.eclipse.fx.ide.css.extapi;x-friends:="org.eclipse.fx.ide.css.ui",
+ org.eclipse.fx.ide.css.formatting;x-friends:="org.eclipse.fx.ide.css.ui",
+ org.eclipse.fx.ide.css.parser.antlr;x-friends:="org.eclipse.fx.ide.css.ui",
+ org.eclipse.fx.ide.css.parser.antlr.internal;x-friends:="org.eclipse.fx.ide.css.ui",
+ org.eclipse.fx.ide.css.scoping;x-friends:="org.eclipse.fx.ide.css.ui",
+ org.eclipse.fx.ide.css.serializer;x-friends:="org.eclipse.fx.ide.css.ui",
+ org.eclipse.fx.ide.css.services;x-friends:="org.eclipse.fx.ide.css.ui",
+ org.eclipse.fx.ide.css.util;x-friends:="org.eclipse.fx.ide.css.ui",
+ org.eclipse.fx.ide.css.validation;x-friends:="org.eclipse.fx.ide.css.ui"
|