--- old/modules/graphics/src/main/java/com/sun/javafx/css/Rule.java 2015-09-03 15:31:56.420607600 -0700 +++ /dev/null 2015-09-03 15:31:57.000000000 -0700 @@ -1,385 +0,0 @@ -/* - * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.javafx.css; - -import com.sun.javafx.collections.TrackableObservableList; -import javafx.collections.ListChangeListener.Change; -import javafx.collections.ObservableList; -import javafx.css.PseudoClass; -import javafx.css.StyleOrigin; -import javafx.scene.Node; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; - -/* - * A selector is a collection of selectors and declarations. - */ -final public class Rule { - - private List selectors = null; - - /** - * The list returned from this method should be treated as unmodifiable. - * Tools should use {@link #getSelectors()} which tracks adds and removes. - */ - public List getUnobservedSelectorList() { - if (selectors == null) { - selectors = new ArrayList(); - } - return selectors; - } - - private List declarations = null; - /** - * The list returned from this method should be treated as unmodifiable. - * Tools should use {@link #getDeclarations()} which tracks adds and removes. - */ - public List getUnobservedDeclarationList() { - - if (declarations == null && serializedDecls != null) { - - try { - ByteArrayInputStream bis = new ByteArrayInputStream(serializedDecls); - DataInputStream dis = new DataInputStream(bis); - - short nDeclarations = dis.readShort(); - declarations = new ArrayList(nDeclarations); - for (int i = 0; i < nDeclarations; i++) { - - Declaration decl = Declaration.readBinary(bssVersion, dis, stylesheet.getStringStore()); - decl.rule = Rule.this; - - if (stylesheet != null && stylesheet.getUrl() != null) { - String stylesheetUrl = stylesheet.getUrl(); - decl.fixUrl(stylesheetUrl); - } - - declarations.add(decl); - } - - } catch (IOException ioe) { - declarations = new ArrayList<>(); - assert false; ioe.getMessage(); - - } finally { - serializedDecls = null; - } - - } - - return declarations; - } - - private Observables observables = null; - - /** - * This method is to support tooling that may want to add declarations to - * or remove declarations from a Rule. Changes to the list are tracked - * so that added declarations are tagged as belonging to this rule, and - * the rule for removed declarations is nulled out. - * If the list is not going to be modified, then it is more efficient to - * call {@link #getUnobservedDeclarationList()}, but the returned list - * must be treated as unmodifiable. - * @return - */ - public final ObservableList getDeclarations() { - - if (observables == null) { - observables = new Observables(this); - } - - return observables.getDeclarations(); - } - - /** - * This method is to support tooling that may want to add selectors to - * or remove selectors from a Rule. Changes to the list are tracked - * so that added selectors are tagged as belonging to this rule, and - * the rule for removed selectors is nulled out. - * If the list is not going to be modified, then it is more efficient to - * call {@link #getUnobservedSelectorList()}, but the returned list - * must be treated as unmodifiable. - * @return - */ - public final ObservableList getSelectors() { - - if (observables == null) { - observables = new Observables(this); - } - - return observables.getSelectors(); - } - - /** The stylesheet this selector belongs to */ - private Stylesheet stylesheet; - public Stylesheet getStylesheet() { - return stylesheet; - } - - /* package */ - void setStylesheet(Stylesheet stylesheet) { - - this.stylesheet = stylesheet; - - if (stylesheet != null && stylesheet.getUrl() != null) { - final String stylesheetUrl = stylesheet.getUrl(); - - int nDeclarations = declarations != null ? declarations.size() : 0; - for (int d=0; d selectors, List declarations) { - - this.selectors = selectors; - this.declarations = declarations; - serializedDecls = null; - this.bssVersion = Stylesheet.BINARY_CSS_VERSION; - - int sMax = selectors != null ? selectors.size() : 0; - for(int i = 0; i < sMax; i++) { - Selector sel = selectors.get(i); - sel.setRule(Rule.this); - } - - int dMax = declarations != null ? declarations.size() : 0; - for (int d=0; d selectors, byte[] buf, int bssVersion) { - - this.selectors = selectors; - this.declarations = null; - this.serializedDecls = buf; - this.bssVersion = bssVersion; - - int sMax = selectors != null ? selectors.size() : 0; - for(int i = 0; i < sMax; i++) { - Selector sel = selectors.get(i); - sel.setRule(Rule.this); - } - - } - - // Return mask of selectors that match - long applies(Node node, Set[] triggerStates) { - long mask = 0; - for (int i = 0; i < selectors.size(); i++) { - Selector sel = selectors.get(i); - if (sel.applies(node, triggerStates, 0)) { - mask |= 1l << i; - } - } - return mask; - } - - /** Converts this object to a string. */ - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - if (selectors.size()>0) { - sb.append(selectors.get(0)); - } - for (int n=1; n(rule.getUnobservedSelectorList()) { - @Override protected void onChanged(Change c) { - while (c.next()) { - if (c.wasAdded()) { - List added = c.getAddedSubList(); - for(int i = 0, max = added.size(); i < max; i++) { - Selector sel = added.get(i); - sel.setRule(Observables.this.rule); - } - } - - if (c.wasRemoved()) { - List removed = c.getAddedSubList(); - for(int i = 0, max = removed.size(); i < max; i++) { - Selector sel = removed.get(i); - if (sel.getRule() == Observables.this.rule) { - sel.setRule(null); - } - } - } - } - } - }; - - declarationObservableList = new TrackableObservableList(rule.getUnobservedDeclarationList()) { - @Override protected void onChanged(Change c) { - while (c.next()) { - if (c.wasAdded()) { - List added = c.getAddedSubList(); - for(int i = 0, max = added.size(); i < max; i++) { - Declaration decl = added.get(i); - decl.rule = Observables.this.rule; - - Stylesheet stylesheet = Observables.this.rule.stylesheet; - if (stylesheet != null && stylesheet.getUrl() != null) { - final String stylesheetUrl = stylesheet.getUrl(); - decl.fixUrl(stylesheetUrl); - } - } - } - - if (c.wasRemoved()) { - List removed = c.getRemoved(); - for(int i = 0, max = removed.size(); i < max; i++) { - Declaration decl = removed.get(i); - if (decl.rule == Observables.this.rule) { - decl.rule = null; - } - } - } - } - } - }; - - } - - private ObservableList getSelectors() { - return selectorObservableList; - } - - private ObservableList getDeclarations() { - return declarationObservableList; - } - - private final Rule rule; - private final ObservableList selectorObservableList; - private final ObservableList declarationObservableList; - - } - - final void writeBinary(DataOutputStream os, StringStore stringStore) - throws IOException { - - final int nSelectors = this.selectors != null ? this.selectors.size() : 0; - os.writeShort(nSelectors); - for (int i = 0; i < nSelectors; i++) { - Selector sel = this.selectors.get(i); - sel.writeBinary(os, stringStore); - } - - List decls = getUnobservedDeclarationList(); - if (decls != null) { - - ByteArrayOutputStream bos = new ByteArrayOutputStream(5192); - DataOutputStream dos = new DataOutputStream(bos); - - int nDeclarations = decls.size(); - dos.writeShort(nDeclarations); - - for (int i = 0; i < nDeclarations; i++) { - Declaration decl = declarations.get(i); - decl.writeBinary(dos, stringStore); - } - - os.writeInt(bos.size()); - os.write(bos.toByteArray()); - - } else { - // no declarations! - os.writeShort(0); - } - } - - static Rule readBinary(int bssVersion, DataInputStream is, String[] strings) - throws IOException - { - short nSelectors = is.readShort(); - List selectors = new ArrayList(nSelectors); - for (int i = 0; i < nSelectors; i++) { - Selector s = Selector.readBinary(bssVersion, is, strings); - selectors.add(s); - } - - if (bssVersion < 4) { - short nDeclarations = is.readShort(); - List declarations = new ArrayList(nDeclarations); - for (int i = 0; i < nDeclarations; i++) { - Declaration d = Declaration.readBinary(bssVersion, is, strings); - declarations.add(d); - } - - return new Rule(selectors, declarations); - } - - // de-serialize decls into byte array - int nBytes = is.readInt(); - byte[] buf = new byte[nBytes]; - - if (nBytes > 0) { - is.readFully(buf); - } - return new Rule(selectors, buf, bssVersion); - } -} --- /dev/null 2015-09-03 15:31:57.000000000 -0700 +++ new/modules/graphics/src/main/java/javafx/css/Rule.java 2015-09-03 15:31:55.676565000 -0700 @@ -0,0 +1,385 @@ +/* + * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package javafx.css; + +import javafx.collections.ListChangeListener.Change; +import javafx.collections.ObservableList; +import javafx.scene.Node; + +import com.sun.javafx.collections.TrackableObservableList; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +/* + * A selector is a collection of selectors and declarations. + * + * @since 9 + */ +final public class Rule { + + private List selectors = null; + + /** + * The list returned from this method should be treated as unmodifiable. + * Tools should use {@link #getSelectors()} which tracks adds and removes. + */ + List getUnobservedSelectorList() { + if (selectors == null) { + selectors = new ArrayList(); + } + return selectors; + } + + private List declarations = null; + /** + * The list returned from this method should be treated as unmodifiable. + * Tools should use {@link #getDeclarations()} which tracks adds and removes. + */ + List getUnobservedDeclarationList() { + + if (declarations == null && serializedDecls != null) { + + try { + ByteArrayInputStream bis = new ByteArrayInputStream(serializedDecls); + DataInputStream dis = new DataInputStream(bis); + + short nDeclarations = dis.readShort(); + declarations = new ArrayList(nDeclarations); + for (int i = 0; i < nDeclarations; i++) { + + Declaration decl = Declaration.readBinary(bssVersion, dis, stylesheet.getStringStore()); + decl.rule = Rule.this; + + if (stylesheet != null && stylesheet.getUrl() != null) { + String stylesheetUrl = stylesheet.getUrl(); + decl.fixUrl(stylesheetUrl); + } + + declarations.add(decl); + } + + } catch (IOException ioe) { + declarations = new ArrayList<>(); + assert false; ioe.getMessage(); + + } finally { + serializedDecls = null; + } + + } + + return declarations; + } + + private Observables observables = null; + + /** + * This method is to support tooling that may want to add declarations to + * or remove declarations from a Rule. Changes to the list are tracked + * so that added declarations are tagged as belonging to this rule, and + * the rule for removed declarations is nulled out. + * If the list is not going to be modified, then it is more efficient to + * call {@link #getUnobservedDeclarationList()}, but the returned list + * must be treated as unmodifiable. + * @return + */ + public final ObservableList getDeclarations() { + + if (observables == null) { + observables = new Observables(this); + } + + return observables.getDeclarations(); + } + + /** + * This method is to support tooling that may want to add selectors to + * or remove selectors from a Rule. Changes to the list are tracked + * so that added selectors are tagged as belonging to this rule, and + * the rule for removed selectors is nulled out. + * If the list is not going to be modified, then it is more efficient to + * call {@link #getUnobservedSelectorList()}, but the returned list + * must be treated as unmodifiable. + * @return + */ + public final ObservableList getSelectors() { + + if (observables == null) { + observables = new Observables(this); + } + + return observables.getSelectors(); + } + + /** The stylesheet this selector belongs to */ + private Stylesheet stylesheet; + public Stylesheet getStylesheet() { + return stylesheet; + } + + /* package */ + void setStylesheet(Stylesheet stylesheet) { + + this.stylesheet = stylesheet; + + if (stylesheet != null && stylesheet.getUrl() != null) { + final String stylesheetUrl = stylesheet.getUrl(); + + int nDeclarations = declarations != null ? declarations.size() : 0; + for (int d=0; d selectors, List declarations) { + + this.selectors = selectors; + this.declarations = declarations; + serializedDecls = null; + this.bssVersion = Stylesheet.BINARY_CSS_VERSION; + + int sMax = selectors != null ? selectors.size() : 0; + for(int i = 0; i < sMax; i++) { + Selector sel = selectors.get(i); + sel.setRule(Rule.this); + } + + int dMax = declarations != null ? declarations.size() : 0; + for (int d=0; d selectors, byte[] buf, int bssVersion) { + + this.selectors = selectors; + this.declarations = null; + this.serializedDecls = buf; + this.bssVersion = bssVersion; + + int sMax = selectors != null ? selectors.size() : 0; + for(int i = 0; i < sMax; i++) { + Selector sel = selectors.get(i); + sel.setRule(Rule.this); + } + + } + + // Return mask of selectors that match + long applies(Node node, Set[] triggerStates) { + long mask = 0; + for (int i = 0; i < selectors.size(); i++) { + Selector sel = selectors.get(i); + if (sel.applies(node, triggerStates, 0)) { + mask |= 1l << i; + } + } + return mask; + } + + /** Converts this object to a string. */ + @Override public String toString() { + StringBuilder sb = new StringBuilder(); + if (selectors.size()>0) { + sb.append(selectors.get(0)); + } + for (int n=1; n(rule.getUnobservedSelectorList()) { + @Override protected void onChanged(Change c) { + while (c.next()) { + if (c.wasAdded()) { + List added = c.getAddedSubList(); + for(int i = 0, max = added.size(); i < max; i++) { + Selector sel = added.get(i); + sel.setRule(Observables.this.rule); + } + } + + if (c.wasRemoved()) { + List removed = c.getAddedSubList(); + for(int i = 0, max = removed.size(); i < max; i++) { + Selector sel = removed.get(i); + if (sel.getRule() == Observables.this.rule) { + sel.setRule(null); + } + } + } + } + } + }; + + declarationObservableList = new TrackableObservableList(rule.getUnobservedDeclarationList()) { + @Override protected void onChanged(Change c) { + while (c.next()) { + if (c.wasAdded()) { + List added = c.getAddedSubList(); + for(int i = 0, max = added.size(); i < max; i++) { + Declaration decl = added.get(i); + decl.rule = Observables.this.rule; + + Stylesheet stylesheet = Observables.this.rule.stylesheet; + if (stylesheet != null && stylesheet.getUrl() != null) { + final String stylesheetUrl = stylesheet.getUrl(); + decl.fixUrl(stylesheetUrl); + } + } + } + + if (c.wasRemoved()) { + List removed = c.getRemoved(); + for(int i = 0, max = removed.size(); i < max; i++) { + Declaration decl = removed.get(i); + if (decl.rule == Observables.this.rule) { + decl.rule = null; + } + } + } + } + } + }; + + } + + private ObservableList getSelectors() { + return selectorObservableList; + } + + private ObservableList getDeclarations() { + return declarationObservableList; + } + + private final Rule rule; + private final ObservableList selectorObservableList; + private final ObservableList declarationObservableList; + + } + + final void writeBinary(DataOutputStream os, StyleConverter.StringStore stringStore) + throws IOException { + + final int nSelectors = this.selectors != null ? this.selectors.size() : 0; + os.writeShort(nSelectors); + for (int i = 0; i < nSelectors; i++) { + Selector sel = this.selectors.get(i); + sel.writeBinary(os, stringStore); + } + + List decls = getUnobservedDeclarationList(); + if (decls != null) { + + ByteArrayOutputStream bos = new ByteArrayOutputStream(5192); + DataOutputStream dos = new DataOutputStream(bos); + + int nDeclarations = decls.size(); + dos.writeShort(nDeclarations); + + for (int i = 0; i < nDeclarations; i++) { + Declaration decl = declarations.get(i); + decl.writeBinary(dos, stringStore); + } + + os.writeInt(bos.size()); + os.write(bos.toByteArray()); + + } else { + // no declarations! + os.writeShort(0); + } + } + + static Rule readBinary(int bssVersion, DataInputStream is, String[] strings) + throws IOException + { + short nSelectors = is.readShort(); + List selectors = new ArrayList(nSelectors); + for (int i = 0; i < nSelectors; i++) { + Selector s = Selector.readBinary(bssVersion, is, strings); + selectors.add(s); + } + + if (bssVersion < 4) { + short nDeclarations = is.readShort(); + List declarations = new ArrayList(nDeclarations); + for (int i = 0; i < nDeclarations; i++) { + Declaration d = Declaration.readBinary(bssVersion, is, strings); + declarations.add(d); + } + + return new Rule(selectors, declarations); + } + + // de-serialize decls into byte array + int nBytes = is.readInt(); + byte[] buf = new byte[nBytes]; + + if (nBytes > 0) { + is.readFully(buf); + } + return new Rule(selectors, buf, bssVersion); + } +}