diff options
author | Artur Signell <artur@vaadin.com> | 2013-02-22 16:23:49 +0200 |
---|---|---|
committer | Artur Signell <artur@vaadin.com> | 2013-02-22 16:24:06 +0200 |
commit | fbdc52551e258d938db2e230366ca0e21d35c5bc (patch) | |
tree | 640740bcb63c2757facc9f19748a65eb46b50174 | |
parent | d9a8a21a62b977e32b65bcf436bbd229c9b798f4 (diff) | |
parent | 7af5b3fceb75b6f505a9a6d0a843b788bb06d9a7 (diff) | |
download | vaadin-framework-fbdc52551e258d938db2e230366ca0e21d35c5bc.tar.gz vaadin-framework-fbdc52551e258d938db2e230366ca0e21d35c5bc.zip |
Merge remote-tracking branch 'origin/7.0'
Change-Id: Id48ccb3c400a78cddb8bb5c7bbcf2d65174e59d0
63 files changed, 2914 insertions, 2272 deletions
diff --git a/WebContent/release-notes.html b/WebContent/release-notes.html index d5c1109068..39b6652532 100644 --- a/WebContent/release-notes.html +++ b/WebContent/release-notes.html @@ -37,10 +37,12 @@ <h2 id="tableofcontents">Release Notes for Vaadin Framework @version@</h2> <ul> - <li><a href="#overview">Overview</a></li> - <li><a href="#enhancements">Enhancements in Vaadin @version-minor@</a></li> - <li><a href="#limitations">Limitations in @version@</a></li> + <li><a href="#overview">Overview of Vaadin @version@ Release</a></li> <li><a href="#changelog">Complete change log for Vaadin @version@</a></li> + <li><a href="#enhancements">Enhancements in Vaadin @version-minor@</a></li> + <li><a href="#limitations">Limitations in @version-minor@</a></li> + <li><a href="#vaadin">Vaadin Installation</a></li> + <li><a href="#package">Package Contents</a></li> <li><a href="#migrating">Migrating from Vaadin 6 to Vaadin 7</a></li> <li><a href="#dependencies">Vaadin @version@ dependencies</a></li> <li><a href="#upgrading">Upgrading to Vaadin @version-minor@</a></li> @@ -48,74 +50,44 @@ <li><a href="#vaadinontheweb">Vaadin on the Web</a></li> </ul> - <h2 id="overview">Overview</h2> + <h2 id="overview">Overview of Vaadin @version@ Release</h2> <p> - <b>Vaadin</b> is a Java framework for building modern web applications that look - great, perform well and make you and your users happy. <b>Vaadin</b> is - available under the Apache License, Version 2.0 (see the <tt>license.html</tt> in - the Vaadin ZIP or JAR package). + Vaadin @version@ is a maintenance release that includes a number of important bug + fixes, as listed in the <a href="#changelog">change log</a> below. You can also + view the <a + href="http://dev.vaadin.com/query?status=closed&resolution=fixed&milestone=Vaadin+@version@&order=priority">list + of the closed issues</a> at the Vaadin developer's site. </p> - + <p> - The easiest ways to install <b>Vaadin</b> are: + For a list of enhancements in the last feature release, see <a + href="#enhancements">Enhancements in Vaadin @version-minor@</a> and the <a + href="http://vaadin.com/download/release/@version-minor@/@version-minor@.0/release-notes.html">Release + Notes for Vaadin @version-minor@.0</a>. </p> - <ul> - <li>If using Maven, define it as a dependency or use any of the available - archetypes (only <tt>vaadin-application</tt> is available for Vaadin 7 at the time - of this release) to create a new project</li> - - <li>If using Eclipse, use the Vaadin Plugin for Eclipse, which automatically - downloads the Vaadin libraries</li> - </ul> + <h3 id="changelog">ChangeLog</h3> <p> - It is also available as a ZIP package downloadable from <a href="http://vaadin.com/download">Vaadin Download page</a>. + This release includes the following closed issues: </p> - <h3 id="package">Package Contents</h3> - - <p>Inside the ZIP installation package you will find:</p> - <ul> - <li>Separate server-side (<tt>vaadin-server</tt>) and client-side (<tt>vaadin-client</tt>, <tt>vaadin-client-compiler</tt>) development libraries</li> - <li>Precompiled widget set (<tt>vaadin-client-compiled</tt>) for server-side development</li> - <li>Shared library (<tt>vaadin-shared</tt>) for both server- and client-side libraries</li> - <li>Built-in themes (<tt>vaadin-themes</tt>) and the theme compiler (<tt>vaadin-theme-compiler</tt>)</li> - <li>Dependency libraries provided under the <tt>lib/</tt> folder</li> +@release-notes-tickets@ </ul> <p> - See the <tt>README.TXT</tt> in the installation package for detailed information - about the package contents. <a href="http://vaadin.com/book">Book of Vaadin</a> - (for Vaadin 7) gives more detailed instructions. - </p> - - <p> - For server-side development, copy the <tt>vaadin-server</tt>, - <tt>vaadin-client-compiled</tt>, <tt>vaadin-shared</tt>, - <tt>vaadin-theme-compiler</tt>, and <tt>vaadin-themes</tt> from the main - folder and the dependencies from the <tt>lib</tt> folder to the - <tt>WEB-INF/lib</tt> folder of your Vaadin project. (The - <tt>vaadin-client-compiled</tt> is necessary if you do not wish to compile the - widget set by your own, which you need to do if you use almost any add-on - components.) - </p> - - <p> - For pure client-side development, you only need the <tt>vaadin-client</tt> and - <tt>vaadin-client-compiler</tt> JARs, which should be put to a non-deployed - project library folder, such as <tt>lib</tt>. You also need them if you compile - the widget set for any reason, such as using Vaadin add-ons, or create new - server-side components integrated with client-side widgets. + The <a + href="http://dev.vaadin.com/query?status=closed&resolution=fixed&milestone=Vaadin+@version@&order=priority">full + list of the closed issues</a> can also be found at <tt>dev.vaadin.com</tt>. </p> - <h2 id="enhancements">Enhancements in Vaadin @version@</h2> + <h2 id="enhancements">Enhancements in Vaadin @version-minor@</h2> <p> - The @version@ includes many major and minor enhancements and changes. Below is a - list of the most notable changes: + The @version-minor@ includes many major and minor enhancements and changes first + introduced in Vaadin @version-minor@.0. Below is a list of the most notable changes: </p> <ul> @@ -375,7 +347,9 @@ the <a href="https://vaadin.com/wiki/-/wiki/Main/Vaadin+7">mini-tutorials</a> in the Vaadin Wiki. Also see the <a href="https://vaadin.com/wiki/-/wiki/Main/Migrating+from+Vaadin+6+to+Vaadin+7">Vaadin - 6 to 7 Migration Guide</a>. + 6 to 7 Migration Guide</a>. See also the <a + href="http://vaadin.com/download/release/@version-minor@/@version-minor@.0/release-notes.html">Release + Notes for Vaadin @version-minor@.0</a>. </p> <h3 id="limitations">Limitations</h3> @@ -386,902 +360,69 @@ href="http://dev.vaadin.com/ticket/10634">#10634</a>)</li> </ul> - <h3 id="changelog">ChangeLog</h3> + <h2 id="vaadin">Vaadin Installation</h2> <p> - Below is the complete list of closed tickets in Vaadin 7. You can also query the tickets by <a href="http://dev.vaadin.com/query?status=closed&group=resolution&milestone=Vaadin+7.0.0.alpha1&milestone=Vaadin+7.0.0.alpha2&milestone=Vaadin+7.0.0.alpha3&milestone=Vaadin+7.0.0.beta1&milestone=Vaadin+7.0.0.beta2&milestone=Vaadin+7.0.0.beta3&milestone=Vaadin+7.0.0.beta4&milestone=Vaadin+7.0.0.beta5&milestone=Vaadin+7.0.0.beta6&milestone=Vaadin+7.0.0.beta7&milestone=Vaadin+7.0.0.beta8&milestone=Vaadin+7.0.0.beta9&milestone=Vaadin+7.0.0.beta10&milestone=Vaadin+7.0.0.beta11&milestone=Vaadin+7.0.0.rc1&milestone=Vaadin+7.0.0.rc2&milestone=Vaadin+7.0.0">all the milestones</a> and filter out the defects and tasks from the query to list only actual enhancements. + <b>Vaadin</b> is a Java framework for building modern web applications that look + great, perform well and make you and your users happy. <b>Vaadin</b> is + available under the Apache License, Version 2.0 (see the <tt>license.html</tt> in + the Vaadin ZIP or JAR package). + </p> + + <p> + The easiest ways to install <b>Vaadin</b> are: + </p> + + <ul> + <li>If using Maven, define it as a dependency or use any of the available + archetypes (only <tt>vaadin-application</tt> is available for Vaadin 7 at the time + of this release) to create a new project</li> + + <li>If using Eclipse, use the Vaadin Plugin for Eclipse, which automatically + downloads the Vaadin libraries</li> + </ul> + + <p> + It is also available as a ZIP package downloadable from <a href="http://vaadin.com/download">Vaadin Download page</a>. </p> - <p>The features voted at the Vaadin <a href="https://vaadin.com/pro">Pro Account</a> are marked in the list.</p> + <h3 id="package">Package Contents</h3> -<!-- Voted features: #6093 #9733 #6790 #8579 #8983 --> + <p>Inside the ZIP installation package you will find:</p> <ul> - <li><a href="http://dev.vaadin.com/ticket/1472">#1472</a>: Window.open() should be re-thought/documented</li> - <li><a href="http://dev.vaadin.com/ticket/2490">#2490</a>: Deprecate reflect listeners</li> - <li><a href="http://dev.vaadin.com/ticket/2527">#2527</a>: Component.getParent should return ComponentContainer instead of Component</li> - <li><a href="http://dev.vaadin.com/ticket/2869">#2869</a>: Deprecate Select class</li> - <li><a href="http://dev.vaadin.com/ticket/2924">#2924</a>: Panel/UI/Window child component hierarchy is invalid</li> - <li><a href="http://dev.vaadin.com/ticket/3021">#3021</a>: Property.toString should not be used to convert property value</li> - <li><a href="http://dev.vaadin.com/ticket/3067">#3067</a>: Split subwindow from Window</li> - <li><a href="http://dev.vaadin.com/ticket/3168">#3168</a>: Getting the production mode status</li> - <li><a href="http://dev.vaadin.com/ticket/3196">#3196</a>: Improvement ideas for theme development</li> - <li><a href="http://dev.vaadin.com/ticket/3214">#3214</a>: Spacing is rendered for invisible components</li> - <li><a href="http://dev.vaadin.com/ticket/3255">#3255</a>: Layout margins cascade too easily</li> - <li><a href="http://dev.vaadin.com/ticket/3557">#3557</a>: AbstractComponentContainer should implement Iterable</li> - <li><a href="http://dev.vaadin.com/ticket/3667">#3667</a>: Remove deprecated API from MenuBar (setSubMenuIcon & setCollapse)</li> - <li><a href="http://dev.vaadin.com/ticket/3700">#3700</a>: Rename setDebugId to setId</li> - <li><a href="http://dev.vaadin.com/ticket/3718">#3718</a>: CustomField component</li> - <li><a href="http://dev.vaadin.com/ticket/3765">#3765</a>: Change client-server communication protocol to be JSON based</li> - <li><a href="http://dev.vaadin.com/ticket/3851">#3851</a>: AbstractField should run validators for empty fields</li> - <li><a href="http://dev.vaadin.com/ticket/3861">#3861</a>: Application.handleURI should not return null if resource is found but does not produce a stream</li> - <li><a href="http://dev.vaadin.com/ticket/3950">#3950</a>: Change default Tree container to HierarchicalContainer</li> - <li><a href="http://dev.vaadin.com/ticket/4127">#4127</a>: Allow custom system messages and locale specific messages</li> - <li><a href="http://dev.vaadin.com/ticket/4131">#4131</a>: Make Vaadin compatible with Apache ProxyPass</li> - <li><a href="http://dev.vaadin.com/ticket/4203">#4203</a>: Exception from one widget should not prevent updating other widgets</li> - <li><a href="http://dev.vaadin.com/ticket/4294">#4294</a>: Decide the proper package name for utils/tools and move the utils/tools there</li> - <li><a href="http://dev.vaadin.com/ticket/4355">#4355</a>: Consider removing Terminal.getDefaultTheme</li> - <li><a href="http://dev.vaadin.com/ticket/4617">#4617</a>: Split Vaadin version handling to a separate class</li> - <li><a href="http://dev.vaadin.com/ticket/4991">#4991</a>: com.vaadin.ui.Window javadoc</li> - <li><a href="http://dev.vaadin.com/ticket/5381">#5381</a>: Select should have getter and setter methods for pageLength</li> - <li><a href="http://dev.vaadin.com/ticket/5391">#5391</a>: CustomComponent JavaDoc should be improved</li> - <li><a href="http://dev.vaadin.com/ticket/5422">#5422</a>: Add addComponents(Component..) to common layouts</li> - <li><a href="http://dev.vaadin.com/ticket/5483">#5483</a>: Browser tabs recognition for subwindows</li> - <li><a href="http://dev.vaadin.com/ticket/5494">#5494</a>: GridLayout/VerticalLayout/HorizontalLayout with undefined width should handle captions in the same way</li> - <li><a href="http://dev.vaadin.com/ticket/5541">#5541</a>: Create build configurations for Vaadin 7</li> - <li><a href="http://dev.vaadin.com/ticket/5750">#5750</a>: FormLayout should not extend deprecated OrderedLayout</li> - <li><a href="http://dev.vaadin.com/ticket/5814">#5814</a>: Deprecate setColumns from NativeSelect/ListSelect/TwincolSelect</li> - <li><a href="http://dev.vaadin.com/ticket/5822">#5822</a>: ItemStyleGenerator.getStyle should include Component</li> - <li><a href="http://dev.vaadin.com/ticket/5855">#5855</a>: Inner event classes should be converted to static nested classes</li> - <li><a href="http://dev.vaadin.com/ticket/5856">#5856</a>: Table formatter</li> - <li><a href="http://dev.vaadin.com/ticket/5890">#5890</a>: ComponentContainer interface should have method getComponentCount()</li> - <li><a href="http://dev.vaadin.com/ticket/5956">#5956</a>: ClassPathExplorer.tryToAdd should read the ".class" file instead of loading the class</li> - <li><a href="http://dev.vaadin.com/ticket/6010">#6010</a>: Remove Table.setLazyLoading and Tree.setLazyLoading</li> - <li><a href="http://dev.vaadin.com/ticket/6093">#6093</a>: Add a way to revoke session - <b>VOTED FEATURE</b></li> - <li><a href="http://dev.vaadin.com/ticket/6341">#6341</a>: Add methods for getting computed style from the browser</li> - <li><a href="http://dev.vaadin.com/ticket/6342">#6342</a>: Support using border/padding/margin in core layouts</li> - <li><a href="http://dev.vaadin.com/ticket/6366">#6366</a>: Add possibility to add all children directly in the constructor of most common component containers</li> - <li><a href="http://dev.vaadin.com/ticket/6446">#6446</a>: Should we deprecate Label.CONTENT_XML?</li> - <li><a href="http://dev.vaadin.com/ticket/6617">#6617</a>: Form.setLayout(Layout newLayout) may set parent with incompatible class</li> - <li><a href="http://dev.vaadin.com/ticket/6619">#6619</a>: AbstractApplicationServlet.init: parameters reading order is strange</li> - <li><a href="http://dev.vaadin.com/ticket/6690">#6690</a>: Plug-in support for Roots (aka components without a UI)</li> - <li><a href="http://dev.vaadin.com/ticket/6696">#6696</a>: Check if VPanel Firefox2 (isGecko) workaround can be removed</li> - <li><a href="http://dev.vaadin.com/ticket/6702">#6702</a>: Requesting a removed resource should give an error</li> - <li><a href="http://dev.vaadin.com/ticket/6714">#6714</a>: Allow using multiple themes on the same page</li> - <li><a href="http://dev.vaadin.com/ticket/6730">#6730</a>: JavaScript callback to server-side</li> - <li><a href="http://dev.vaadin.com/ticket/6750">#6750</a>: ClassPathExplorer logs on error when using maven gwt plugin (compile)</li> - <li><a href="http://dev.vaadin.com/ticket/6771">#6771</a>: Application url and static file location (VAADIN directory) should be expressed relatively to the host page</li> - <li><a href="http://dev.vaadin.com/ticket/6790">#6790</a>: PopupDateField should allow disabling text input - <b>VOTED FEATURE</b></li> - <li><a href="http://dev.vaadin.com/ticket/6887">#6887</a>: Conveniency method to add all nested bean properties</li> - <li><a href="http://dev.vaadin.com/ticket/6977">#6977</a>: Adding a Vaadin portlet to Liferay causes the whole page to go blank</li> - <li><a href="http://dev.vaadin.com/ticket/7045">#7045</a>: It should be simpler to find the window where a Terminal.ErrorEvent has occurred</li> - <li><a href="http://dev.vaadin.com/ticket/7260">#7260</a>: VerticalLayout width calculations are not refreshed in Webkit when hiding component inside it</li> - <li><a href="http://dev.vaadin.com/ticket/7285">#7285</a>: Simplify DOM structure for VL/HL</li> - <li><a href="http://dev.vaadin.com/ticket/7456">#7456</a>: Create a Maven archetype for application projects</li> - <li><a href="http://dev.vaadin.com/ticket/7480">#7480</a>: Vaadin ColorPicker is not compatible with GAE</li> - <li><a href="http://dev.vaadin.com/ticket/7562">#7562</a>: random path in URL should give 404 or redirect to context root</li> - <li><a href="http://dev.vaadin.com/ticket/7847">#7847</a>: Use ClientWidget.loadStyle by default</li> - <li><a href="http://dev.vaadin.com/ticket/7880">#7880</a>: Review methods in Root</li> - <li><a href="http://dev.vaadin.com/ticket/7882">#7882</a>: Implement dynamic Root creation</li> - <li><a href="http://dev.vaadin.com/ticket/7883">#7883</a>: Implement late Root creation</li> - <li><a href="http://dev.vaadin.com/ticket/7884">#7884</a>: Implement late Root initialization</li> - <li><a href="http://dev.vaadin.com/ticket/7885">#7885</a>: Define theme and widgetset for each Root</li> - <li><a href="http://dev.vaadin.com/ticket/7886">#7886</a>: Add generic support for RequestHandlers in Application</li> - <li><a href="http://dev.vaadin.com/ticket/7887">#7887</a>: Serve ApplicationResource using a RequestHandler</li> - <li><a href="http://dev.vaadin.com/ticket/7888">#7888</a>: Serve the html host page using a RequestHandler</li> - <li><a href="http://dev.vaadin.com/ticket/7889">#7889</a>: Refactor LoginForm to use RequestHandler</li> - <li><a href="http://dev.vaadin.com/ticket/7894">#7894</a>: Support multiple tabs by default</li> - <li><a href="http://dev.vaadin.com/ticket/7895">#7895</a>: Provide ThreadLocal for the current Root</li> - <li><a href="http://dev.vaadin.com/ticket/7896">#7896</a>: Provide ThreadLocal for the current Application</li> - <li><a href="http://dev.vaadin.com/ticket/7897">#7897</a>: Ensure Portal actions and events doesn't cause the Root to be cleaned up</li> - <li><a href="http://dev.vaadin.com/ticket/7898">#7898</a>: Migrate all tests to use Root instead of Window for top level windows</li> - <li><a href="http://dev.vaadin.com/ticket/7899">#7899</a>: Multilevel Map</li> - <li><a href="http://dev.vaadin.com/ticket/7912">#7912</a>: Remove support for IE6</li> - <li><a href="http://dev.vaadin.com/ticket/7913">#7913</a>: Remove support for IE7</li> - <li><a href="http://dev.vaadin.com/ticket/7917">#7917</a>: Conveniency method in BeanItem to add all nested properties of a property</li> - <li><a href="http://dev.vaadin.com/ticket/7930">#7930</a>: Eliminate Validator.isValid()</li> - <li><a href="http://dev.vaadin.com/ticket/7956">#7956</a>: Validators should support locales</li> - <li><a href="http://dev.vaadin.com/ticket/7963">#7963</a>: Button should not be a field</li> - <li><a href="http://dev.vaadin.com/ticket/7964">#7964</a>: CheckBox should not extend Button</li> - <li><a href="http://dev.vaadin.com/ticket/7981">#7981</a>: Drop workarounds for Firefox 2</li> - <li><a href="http://dev.vaadin.com/ticket/7984">#7984</a>: Drop workarounds for Firefox 3/4</li> - <li><a href="http://dev.vaadin.com/ticket/7985">#7985</a>: Show informative message for users with an old browser version</li> - <li><a href="http://dev.vaadin.com/ticket/7998">#7998</a>: Remove dependency jars from the project</li> - <li><a href="http://dev.vaadin.com/ticket/8019">#8019</a>: Change existing constants from integers to enums</li> - <li><a href="http://dev.vaadin.com/ticket/8024">#8024</a>: Add a notification for not supported browsers</li> - <li><a href="http://dev.vaadin.com/ticket/8026">#8026</a>: Remove API deprecated in Vaadin 6 or earlier</li> - <li><a href="http://dev.vaadin.com/ticket/8027">#8027</a>: Remove abstractions for non-web terminals</li> - <li><a href="http://dev.vaadin.com/ticket/8028">#8028</a>: Extend Container.Indexed to provide a method for retrieving a range of item ids</li> - <li><a href="http://dev.vaadin.com/ticket/8030">#8030</a>: Add a (Component... children) constructor to all component containers that accept more than one child</li> - <li><a href="http://dev.vaadin.com/ticket/8048">#8048</a>: Include support for URI fragments in Root</li> - <li><a href="http://dev.vaadin.com/ticket/8049">#8049</a>: Include initial UIDL in the first response</li> - <li><a href="http://dev.vaadin.com/ticket/8052">#8052</a>: Restore Portlet support</li> - <li><a href="http://dev.vaadin.com/ticket/8053">#8053</a>: Add new base classes for testing that doesn't use LegacyApplication</li> - <li><a href="http://dev.vaadin.com/ticket/8061">#8061</a>: Remove Button(String caption, Object target, String methodName) constructor</li> - <li><a href="http://dev.vaadin.com/ticket/8062">#8062</a>: Git repository problem</li> - <li><a href="http://dev.vaadin.com/ticket/8068">#8068</a>: Provide an option for preserving Root state on browser refresh</li> - <li><a href="http://dev.vaadin.com/ticket/8073">#8073</a>: Slider.setValue(Double value, boolean repaintIsNotNeeded) should be protected, not public</li> - <li><a href="http://dev.vaadin.com/ticket/8074">#8074</a>: Slider accepts values out of range</li> - <li><a href="http://dev.vaadin.com/ticket/8093">#8093</a>: Include Bean Validation</li> - <li><a href="http://dev.vaadin.com/ticket/8094">#8094</a>: Implement two phase commit for FieldBinder</li> - <li><a href="http://dev.vaadin.com/ticket/8095">#8095</a>: Implement FieldGroup</li> - <li><a href="http://dev.vaadin.com/ticket/8097">#8097</a>: Root does not send resize events</li> - <li><a href="http://dev.vaadin.com/ticket/8098">#8098</a>: Make WebBrowser details available in Root init when using delayed initialization</li> - <li><a href="http://dev.vaadin.com/ticket/8101">#8101</a>: Implement generic converters that convert from one type to another</li> - <li><a href="http://dev.vaadin.com/ticket/8102">#8102</a>: Fields should use a Converter to convert to and from data model type</li> - <li><a href="http://dev.vaadin.com/ticket/8103">#8103</a>: Provide a ConverterFactory for default converters</li> - <li><a href="http://dev.vaadin.com/ticket/8110">#8110</a>: Validation should be done on the converted value</li> - <li><a href="http://dev.vaadin.com/ticket/8111">#8111</a>: Default field caption should not include dotted path of nested properties</li> - <li><a href="http://dev.vaadin.com/ticket/8117">#8117</a>: DateField resolution default should be day</li> - <li><a href="http://dev.vaadin.com/ticket/8118">#8118</a>: Remove support for millisecond resolution</li> - <li><a href="http://dev.vaadin.com/ticket/8125">#8125</a>: Remove MethodProperty.convertValue and similar methods to avoid confusion</li> - <li><a href="http://dev.vaadin.com/ticket/8127">#8127</a>: Add setBuffered to ease use of read through and write through modes</li> - <li><a href="http://dev.vaadin.com/ticket/8142">#8142</a>: Label overrides setReadOnly and works differently from all other components</li> - <li><a href="http://dev.vaadin.com/ticket/8151">#8151</a>: Root does not send click events</li> - <li><a href="http://dev.vaadin.com/ticket/8153">#8153</a>: Add BeanItem.addNestedProperty</li> - <li><a href="http://dev.vaadin.com/ticket/8154">#8154</a>: public methods in AbstractComponent should be declared in Component interface</li> - <li><a href="http://dev.vaadin.com/ticket/8159">#8159</a>: Extract UI class selection logic to UIProviders</li> - <li><a href="http://dev.vaadin.com/ticket/8163">#8163</a>: Print an error message if vaadinBootstap.js cannot be loaded</li> - <li><a href="http://dev.vaadin.com/ticket/8164">#8164</a>: Make WrappedHttpServletRequest inherit from javax.servlet.http.HttpServletRequestWrapper</li> - <li><a href="http://dev.vaadin.com/ticket/8165">#8165</a>: BrowserDetails, VBrowserDetails and WebBrowser 'mess' should be simplified</li> - <li><a href="http://dev.vaadin.com/ticket/8167">#8167</a>: Verify contributor agreement for Bean Validation</li> - <li><a href="http://dev.vaadin.com/ticket/8169">#8169</a>: Remove API deprecated in Vaadin 6 or earlier</li> - <li><a href="http://dev.vaadin.com/ticket/8172">#8172</a>: WrappedResponse is missing javadoc</li> - <li><a href="http://dev.vaadin.com/ticket/8173">#8173</a>: Depercate separate read through and write through modes in favor of buffered</li> - <li><a href="http://dev.vaadin.com/ticket/8175">#8175</a>: Test using Firefox 9</li> - <li><a href="http://dev.vaadin.com/ticket/8178">#8178</a>: Test using Chrome 16</li> - <li><a href="http://dev.vaadin.com/ticket/8180">#8180</a>: Remove separate read through and write through modes in favor of buffered</li> - <li><a href="http://dev.vaadin.com/ticket/8182">#8182</a>: A helper method for finding the first parent component of a given type</li> - <li><a href="http://dev.vaadin.com/ticket/8190">#8190</a>: Recorder no longer waits for Vaadin application to load</li> - <li><a href="http://dev.vaadin.com/ticket/8191">#8191</a>: AbstractField does take into account that field value can be modified by the converter</li> - <li><a href="http://dev.vaadin.com/ticket/8192">#8192</a>: Wrong locale might be used if value is set before field is attached to the application</li> - <li><a href="http://dev.vaadin.com/ticket/8226">#8226</a>: Don't throw exception from bootstrap if defaults have already been defined</li> - <li><a href="http://dev.vaadin.com/ticket/8232">#8232</a>: Cached html pages cause problem with browser details request</li> - <li><a href="http://dev.vaadin.com/ticket/8243">#8243</a>: Exception thrown in Root.init is swallowed</li> - <li><a href="http://dev.vaadin.com/ticket/8274">#8274</a>: Communicating back to the server doesn't work</li> - <li><a href="http://dev.vaadin.com/ticket/8277">#8277</a>: Convert low-level communication from client to server to support RPC</li> - <li><a href="http://dev.vaadin.com/ticket/8278">#8278</a>: Support RPC for communication from client to server</li> - <li><a href="http://dev.vaadin.com/ticket/8279">#8279</a>: Use JSON as the low level format of client to server RPC calls</li> - <li><a href="http://dev.vaadin.com/ticket/8292">#8292</a>: Margin API should be cleaned up</li> - <li><a href="http://dev.vaadin.com/ticket/8294">#8294</a>: Use HTML5 doctype</li> - <li><a href="http://dev.vaadin.com/ticket/8304">#8304</a>: Support simple shared state for server to client communication</li> - <li><a href="http://dev.vaadin.com/ticket/8312">#8312</a>: Remove client side conversion from percent size to pixel size</li> - <li><a href="http://dev.vaadin.com/ticket/8313">#8313</a>: Provide a way of measuring in batches to reduce reflows</li> - <li><a href="http://dev.vaadin.com/ticket/8323">#8323</a>: Create a client side paintable hierarchy</li> - <li><a href="http://dev.vaadin.com/ticket/8324">#8324</a>: Split core components into a widget and a paintable class</li> - <li><a href="http://dev.vaadin.com/ticket/8325">#8325</a>: Move ApplicationConnection.updateComponent to VAbstractPaintableWidget.updateFromUIDL</li> - <li><a href="http://dev.vaadin.com/ticket/8326">#8326</a>: Remove support for changing widget class on the client side depending on variables set on the server side</li> - <li><a href="http://dev.vaadin.com/ticket/8405">#8405</a>: Deprecate LoginForm as it does not save password in all browsers</li> - <li><a href="http://dev.vaadin.com/ticket/8419">#8419</a>: Initially only send the part of a state which has non-default values</li> - <li><a href="http://dev.vaadin.com/ticket/8420">#8420</a>: Support for listening to state changes on client side</li> - <li><a href="http://dev.vaadin.com/ticket/8421">#8421</a>: Add support for @Delayed RPC methods</li> - <li><a href="http://dev.vaadin.com/ticket/8422">#8422</a>: Debug console should show shared state updates</li> - <li><a href="http://dev.vaadin.com/ticket/8425">#8425</a>: Move Tooltip handling from ApplicationConnection to AbstractComponentConnector</li> - <li><a href="http://dev.vaadin.com/ticket/8426">#8426</a>: Implement server to client RPC</li> - <li><a href="http://dev.vaadin.com/ticket/8429">#8429</a>: button.setClickShortcut(KeyCode.ENTER) does not work on child windows</li> - <li><a href="http://dev.vaadin.com/ticket/8434">#8434</a>: Rename Paintable on client side to Connector</li> - <li><a href="http://dev.vaadin.com/ticket/8435">#8435</a>: Refactor caption handling so it is not based on UIDL</li> - <li><a href="http://dev.vaadin.com/ticket/8436">#8436</a>: Move code from AbstractComponentConnector.updateFromUIDL</li> - <li><a href="http://dev.vaadin.com/ticket/8437">#8437</a>: Refactor Error communication and error handling on client side so it is not based on UIDL</li> - <li><a href="http://dev.vaadin.com/ticket/8438">#8438</a>: Refactor event handler registration on client side so it is not based on UIDL</li> - <li><a href="http://dev.vaadin.com/ticket/8439">#8439</a>: Deprecate ApplicationConnection.getPaintable(UIDL)</li> - <li><a href="http://dev.vaadin.com/ticket/8440">#8440</a>: Rename @ClientWidget to @Component and move to client side</li> - <li><a href="http://dev.vaadin.com/ticket/8441">#8441</a>: Shared state class can't be a nested static class</li> - <li><a href="http://dev.vaadin.com/ticket/8442">#8442</a>: Generate and use JSON serializers for all classes referenced from other serializable classes</li> - <li><a href="http://dev.vaadin.com/ticket/8443">#8443</a>: Automatically generate serializers for server to client RPC call parameter classes</li> - <li><a href="http://dev.vaadin.com/ticket/8444">#8444</a>: Automatically generate serializers for client to server RPC call parameter classes</li> - <li><a href="http://dev.vaadin.com/ticket/8448">#8448</a>: Replace Connector setId and setConnection with init method parameters</li> - <li><a href="http://dev.vaadin.com/ticket/8455">#8455</a>: Root.getCurrentRoot returns null in Root.init</li> - <li><a href="http://dev.vaadin.com/ticket/8462">#8462</a>: Moving component doesn't update its caption</li> - <li><a href="http://dev.vaadin.com/ticket/8469">#8469</a>: Make it possible to create test Connectors/Widgets</li> - <li><a href="http://dev.vaadin.com/ticket/8471">#8471</a>: Create test for serialization of bean inside bean</li> - <li><a href="http://dev.vaadin.com/ticket/8478">#8478</a>: Don't use overflow: hidden by default</li> - <li><a href="http://dev.vaadin.com/ticket/8500">#8500</a>: Component/Connector hierarchy information should be automatically sent to the client side</li> - <li><a href="http://dev.vaadin.com/ticket/8501">#8501</a>: Client to server RPC calls for disabled/invisible components should be ignored</li> - <li><a href="http://dev.vaadin.com/ticket/8502">#8502</a>: Remove Connector.setState</li> - <li><a href="http://dev.vaadin.com/ticket/8504">#8504</a>: Support passing Connector references through the shared state</li> - <li><a href="http://dev.vaadin.com/ticket/8507">#8507</a>: Handle cascading disabling of components on the client side</li> - <li><a href="http://dev.vaadin.com/ticket/8510">#8510</a>: Support passing Resource references through the shared state</li> - <li><a href="http://dev.vaadin.com/ticket/8515">#8515</a>: Component state does not support Collections</li> - <li><a href="http://dev.vaadin.com/ticket/8522">#8522</a>: NPE on Root.getCurrentRoot() in LoginListener.onLogin()</li> - <li><a href="http://dev.vaadin.com/ticket/8529">#8529</a>: Send an event when the parent is changed</li> - <li><a href="http://dev.vaadin.com/ticket/8534">#8534</a>: JsonCodec breaks down when handling nulls</li> - <li><a href="http://dev.vaadin.com/ticket/8540">#8540</a>: Infinite layout loop in EmbeddedFormExample</li> - <li><a href="http://dev.vaadin.com/ticket/8542">#8542</a>: Not possible to use custom class loader in Application class</li> - <li><a href="http://dev.vaadin.com/ticket/8544">#8544</a>: Remove error reporting as error notifications</li> - <li><a href="http://dev.vaadin.com/ticket/8555">#8555</a>: Provide a listener method where components can modify their state before it is sent to the client</li> - <li><a href="http://dev.vaadin.com/ticket/8574">#8574</a>: Support custom ClassLoader for Portlets</li> - <li><a href="http://dev.vaadin.com/ticket/8579">#8579</a>: Components should send events on attach and detach - <b>VOTED FEATURE</b></li> - <li><a href="http://dev.vaadin.com/ticket/8581">#8581</a>: Too many layout passes for SubWindowOrder test</li> - <li><a href="http://dev.vaadin.com/ticket/8590">#8590</a>: Calls to server side RPC methods should not cause internal error if no receiver has been declared</li> - <li><a href="http://dev.vaadin.com/ticket/8591">#8591</a>: Make server side rpc registration easier</li> - <li><a href="http://dev.vaadin.com/ticket/8598">#8598</a>: Support for listening to given changes on client side</li> - <li><a href="http://dev.vaadin.com/ticket/8599">#8599</a>: InitializableClientToServerRpc should not be an inner class of ServerRpc</li> - <li><a href="http://dev.vaadin.com/ticket/8602">#8602</a>: Support arbitrary types for map keys</li> - <li><a href="http://dev.vaadin.com/ticket/8615">#8615</a>: Redesign WebkitOverflowAutoFix</li> - <li><a href="http://dev.vaadin.com/ticket/8618">#8618</a>: Infinite loop in AbstractErrorMessage.getErrorMessageForException</li> - <li><a href="http://dev.vaadin.com/ticket/8636">#8636</a>: Code splitting not working as expected</li> - <li><a href="http://dev.vaadin.com/ticket/8641">#8641</a>: Move @AcceptCriteria annotation to client side</li> - <li><a href="http://dev.vaadin.com/ticket/8642">#8642</a>: Components have no way of knowing when a "full repaint" is needed.</li> - <li><a href="http://dev.vaadin.com/ticket/8644">#8644</a>: Application is not serializable because of Application.classloader</li> - <li><a href="http://dev.vaadin.com/ticket/8651">#8651</a>: UnknownComponent is not rendered</li> - <li><a href="http://dev.vaadin.com/ticket/8652">#8652</a>: v-paintable should be v-connector</li> - <li><a href="http://dev.vaadin.com/ticket/8655">#8655</a>: float[] and other array types do not work</li> - <li><a href="http://dev.vaadin.com/ticket/8657">#8657</a>: double is encoded as float</li> - <li><a href="http://dev.vaadin.com/ticket/8664">#8664</a>: AbstractComponentConnector removes non-primary css class names</li> - <li><a href="http://dev.vaadin.com/ticket/8666">#8666</a>: RPC from server to client doesn't support Resources properly</li> - <li><a href="http://dev.vaadin.com/ticket/8667">#8667</a>: Server should use types from RPC interface when deserializing</li> - <li><a href="http://dev.vaadin.com/ticket/8668">#8668</a>: Server should not allow custom types to be used with changeVariables</li> - <li><a href="http://dev.vaadin.com/ticket/8669">#8669</a>: State cannot include a "value" field</li> - <li><a href="http://dev.vaadin.com/ticket/8670">#8670</a>: GateIn/eXo/Liferay 5 portlet support broken</li> - <li><a href="http://dev.vaadin.com/ticket/8671">#8671</a>: Height incorrectly measured for Label with <hr></li> - <li><a href="http://dev.vaadin.com/ticket/8672">#8672</a>: Remove API deprecated in Vaadin 6 or earlier</li> - <li><a href="http://dev.vaadin.com/ticket/8673">#8673</a>: Field named zIndex does not work in shared state</li> - <li><a href="http://dev.vaadin.com/ticket/8674">#8674</a>: Horizontal/vertical layout that does minimal calculations</li> - <li><a href="http://dev.vaadin.com/ticket/8675">#8675</a>: Support enums in shared state and as RPC parameters</li> - <li><a href="http://dev.vaadin.com/ticket/8677">#8677</a>: Shared state should be encoded as the declared type</li> - <li><a href="http://dev.vaadin.com/ticket/8682">#8682</a>: Fix box-sizing styling</li> - <li><a href="http://dev.vaadin.com/ticket/8683">#8683</a>: Preserve package name for state serializers</li> - <li><a href="http://dev.vaadin.com/ticket/8684">#8684</a>: Missing state serializer not gracefully handled</li> - <li><a href="http://dev.vaadin.com/ticket/8685">#8685</a>: References to connectors that are not visible should not be sent to the client</li> - <li><a href="http://dev.vaadin.com/ticket/8688">#8688</a>: CustomLayout stopped working</li> - <li><a href="http://dev.vaadin.com/ticket/8698">#8698</a>: Component managed captions do not work with Vaadin 6 legacy components</li> - <li><a href="http://dev.vaadin.com/ticket/8700">#8700</a>: Panel is empty in Liferay theme test</li> - <li><a href="http://dev.vaadin.com/ticket/8708">#8708</a>: TextArea inside a component that becomes disabled looks enabled in IE8</li> - <li><a href="http://dev.vaadin.com/ticket/8710">#8710</a>: Ensure that shared state types and RPC parameter types are Serializable</li> - <li><a href="http://dev.vaadin.com/ticket/8711">#8711</a>: Ensure Vaadin build fails but not all widgetset compilations if shared classes are not serializable</li> - <li><a href="http://dev.vaadin.com/ticket/8714">#8714</a>: Table throws NPE when selecting a tab containing a Table</li> - <li><a href="http://dev.vaadin.com/ticket/8717">#8717</a>: Really bad layout performance in IE8</li> - <li><a href="http://dev.vaadin.com/ticket/8719">#8719</a>: A component inside a disabled parent has v-disabled class name after parent has been enabled</li> - <li><a href="http://dev.vaadin.com/ticket/8729">#8729</a>: Root.getComponentIterator returns an iterator with a null component during init</li> - <li><a href="http://dev.vaadin.com/ticket/8735">#8735</a>: Panel setContent doesn't update client after initial rendering</li> - <li><a href="http://dev.vaadin.com/ticket/8778">#8778</a>: Notification added from Application.terminalError not displayed</li> - <li><a href="http://dev.vaadin.com/ticket/8784">#8784</a>: Class level javadoc of com.vaadin.ui.Window is incorrect for Vaadin 7</li> - <li><a href="http://dev.vaadin.com/ticket/8785">#8785</a>: Rendering an Upload component in the initial layout fails in Liferay</li> - <li><a href="http://dev.vaadin.com/ticket/8791">#8791</a>: Missing genericization for Property class as method parameter</li> - <li><a href="http://dev.vaadin.com/ticket/8794">#8794</a>: FormLayout: Uncaught client side exception</li> - <li><a href="http://dev.vaadin.com/ticket/8796">#8796</a>: Hierarchy problem with CustomFieldConnector</li> - <li><a href="http://dev.vaadin.com/ticket/8797">#8797</a>: Hierarchy problem with CustomFieldConnector</li> - <li><a href="http://dev.vaadin.com/ticket/8804">#8804</a>: Component hierarchy broken in reopened PopupView</li> - <li><a href="http://dev.vaadin.com/ticket/8819">#8819</a>: VScrollTable: Uncaught client side exceptions</li> - <li><a href="http://dev.vaadin.com/ticket/8829">#8829</a>: AbstractInMemoryContainer should create a UnmodifieableList rather than an unmodifiableCollection</li> - <li><a href="http://dev.vaadin.com/ticket/8832">#8832</a>: setContent() does not request paint</li> - <li><a href="http://dev.vaadin.com/ticket/8845">#8845</a>: Label implements Comparable but cannot be compared to another Label</li> - <li><a href="http://dev.vaadin.com/ticket/8859">#8859</a>: Implement view and navigation framework</li> - <li><a href="http://dev.vaadin.com/ticket/8879">#8879</a>: Send type info only for legacy messages</li> - <li><a href="http://dev.vaadin.com/ticket/8888">#8888</a>: Support wrapping javascript widgets</li> - <li><a href="http://dev.vaadin.com/ticket/8889">#8889</a>: AbstractField.setPropertyDataSource silently ignores throwables</li> - <li><a href="http://dev.vaadin.com/ticket/8891">#8891</a>: Transient red "Communication Problem" error appears when clicking on a Link</li> - <li><a href="http://dev.vaadin.com/ticket/8907">#8907</a>: Split Root/Region and Page (browser window/tab)</li> - <li><a href="http://dev.vaadin.com/ticket/8908">#8908</a>: Rename Root to UI</li> - <li><a href="http://dev.vaadin.com/ticket/8934">#8934</a>: There should be a "shared" package for classes common to client and server</li> - <li><a href="http://dev.vaadin.com/ticket/8943">#8943</a>: Components that are detached and attached cannot receive RPC calls</li> - <li><a href="http://dev.vaadin.com/ticket/8955">#8955</a>: Replace @VaadinApache2LicenseForJavaFiles@ with actual apache 2 license</li> - <li><a href="http://dev.vaadin.com/ticket/8967">#8967</a>: Broken reference images: LayoutTesterApplication</li> - <li><a href="http://dev.vaadin.com/ticket/8977">#8977</a>: Update mini tutorials to use Notification.show</li> - <li><a href="http://dev.vaadin.com/ticket/8980">#8980</a>: Make executeJavascript use new Function(code) instead of eval(code)</li> - <li><a href="http://dev.vaadin.com/ticket/8983">#8983</a>: Include SuperDevMode support when GWT 2.5+ is used - <b>VOTED FEATURE</b></li> - <li><a href="http://dev.vaadin.com/ticket/8985">#8985</a>: Properly support setWidgetEnabled for ListSelectConnector</li> - <li><a href="http://dev.vaadin.com/ticket/8986">#8986</a>: Properly support setWidgetEnabled for NativeSelectConnector</li> - <li><a href="http://dev.vaadin.com/ticket/8987">#8987</a>: Properly support setWidgetEnabled for OptionGroupConnector</li> - <li><a href="http://dev.vaadin.com/ticket/8988">#8988</a>: Properly support setWidgetEnabled for OptionGroupConnector</li> - <li><a href="http://dev.vaadin.com/ticket/8989">#8989</a>: Properly support setWidgetEnabled for TwinColSelectConnector</li> - <li><a href="http://dev.vaadin.com/ticket/8990">#8990</a>: Label.setValue should not update the data source</li> - <li><a href="http://dev.vaadin.com/ticket/8991">#8991</a>: Label does not support converters</li> - <li><a href="http://dev.vaadin.com/ticket/8992">#8992</a>: ConverterFactory is always retrieved from Application.getCurrentApplication</li> - <li><a href="http://dev.vaadin.com/ticket/9004">#9004</a>: Extra scrollbar in Liferay theme demo in IE8/IE9</li> - <li><a href="http://dev.vaadin.com/ticket/9005">#9005</a>: CustomField calls attach for its content multiple times</li> - <li><a href="http://dev.vaadin.com/ticket/9006">#9006</a>: Form calls attach for its content multiple times</li> - <li><a href="http://dev.vaadin.com/ticket/9007">#9007</a>: Broken reference images: TabKeyboardNavigation</li> - <li><a href="http://dev.vaadin.com/ticket/9011">#9011</a>: Extra attach/detach calls to sub window</li> - <li><a href="http://dev.vaadin.com/ticket/9017">#9017</a>: Browser window size is not reported to Page unless browser is resized</li> - <li><a href="http://dev.vaadin.com/ticket/9018">#9018</a>: Exceptions in RPC handler causes Internal Error</li> - <li><a href="http://dev.vaadin.com/ticket/9021">#9021</a>: Change name & logic of Table.setSortDisabled() to ".setSortEnabled"</li> - <li><a href="http://dev.vaadin.com/ticket/9022">#9022</a>: NativeButton/Button setTabIndex does not work</li> - <li><a href="http://dev.vaadin.com/ticket/9026">#9026</a>: Only send the part of a connector state that has changed</li> - <li><a href="http://dev.vaadin.com/ticket/9029">#9029</a>: Change Foo.getCurrentFoo() to Foo.getCurrent()</li> - <li><a href="http://dev.vaadin.com/ticket/9031">#9031</a>: Don't use Root.getCaption() for bootstrap HTML title tag</li> - <li><a href="http://dev.vaadin.com/ticket/9032">#9032</a>: ComponentState should be AbstractComponentState</li> - <li><a href="http://dev.vaadin.com/ticket/9034">#9034</a>: Upload throws NPE because of missing connector</li> - <li><a href="http://dev.vaadin.com/ticket/9044">#9044</a>: Allow defining that a Connector type depends on external javascript or CSS</li> - <li><a href="http://dev.vaadin.com/ticket/9048">#9048</a>: @Javascript should work for portlets and independent of deployment configuration</li> - <li><a href="http://dev.vaadin.com/ticket/9051">#9051</a>: AbsoluteLayout should add child component style names to wrapper div</li> - <li><a href="http://dev.vaadin.com/ticket/9053">#9053</a>: AbstractMedia is not abstract</li> - <li><a href="http://dev.vaadin.com/ticket/9054">#9054</a>: AbstractJavascriptComponent is not abstract</li> - <li><a href="http://dev.vaadin.com/ticket/9055">#9055</a>: Hard to get Navigator from View</li> - <li><a href="http://dev.vaadin.com/ticket/9056">#9056</a>: Meaning of navigateTo() differs in Navigator and View</li> - <li><a href="http://dev.vaadin.com/ticket/9059">#9059</a>: Support relative @JavaScript paths in portlets</li> - <li><a href="http://dev.vaadin.com/ticket/9060">#9060</a>: Navigator needs a way to handle missing Views</li> - <li><a href="http://dev.vaadin.com/ticket/9065">#9065</a>: Integrate checkstyle into framework build</li> - <li><a href="http://dev.vaadin.com/ticket/9066">#9066</a>: Change Notifcations to not use HTML by default.</li> - <li><a href="http://dev.vaadin.com/ticket/9067">#9067</a>: Table row sizing broken after 6.8 mass merge</li> - <li><a href="http://dev.vaadin.com/ticket/9071">#9071</a>: Remove API deprecated in Vaadin 6 or earlier</li> - <li><a href="http://dev.vaadin.com/ticket/9072">#9072</a>: Change existing constants from integers to enums</li> - <li><a href="http://dev.vaadin.com/ticket/9073">#9073</a>: Browser window size shouls be included in browser details request</li> - <li><a href="http://dev.vaadin.com/ticket/9074">#9074</a>: Field value is not sent to server when navigating with browser</li> - <li><a href="http://dev.vaadin.com/ticket/9076">#9076</a>: FieldGroup.bindMemberFields(..) ignores configuration on fields</li> - <li><a href="http://dev.vaadin.com/ticket/9077">#9077</a>: TabSheet tab scrolls on mousemove</li> - <li><a href="http://dev.vaadin.com/ticket/9078">#9078</a>: Provide com.vaadin.Vaadin.gwt.xml for use in client side projects</li> - <li><a href="http://dev.vaadin.com/ticket/9081">#9081</a>: VConsole.log() throws NPE when used from a client side module</li> - <li><a href="http://dev.vaadin.com/ticket/9083">#9083</a>: Build a minimal vaadin jar</li> - <li><a href="http://dev.vaadin.com/ticket/9084">#9084</a>: Merge GWT related changes to Vaadin 7 git repository</li> - <li><a href="http://dev.vaadin.com/ticket/9085">#9085</a>: Add @Override for interface implementations</li> - <li><a href="http://dev.vaadin.com/ticket/9086">#9086</a>: Update getting started to Java6</li> - <li><a href="http://dev.vaadin.com/ticket/9087">#9087</a>: Split Embedded into several components</li> - <li><a href="http://dev.vaadin.com/ticket/9088">#9088</a>: Table cell tooltip only shown for cell element</li> - <li><a href="http://dev.vaadin.com/ticket/9089">#9089</a>: The v-connector class name should not be used in themes</li> - <li><a href="http://dev.vaadin.com/ticket/9096">#9096</a>: Run JavaScript RPC callbacks with this pointing to the connector wrapper object</li> - <li><a href="http://dev.vaadin.com/ticket/9102">#9102</a>: Vaadin 7.0.0.alpha3 contains GWT (and libraries) without sources</li> - <li><a href="http://dev.vaadin.com/ticket/9106">#9106</a>: SerializerMapGenerator.findTypesWithExistingSerializers checks for wrong method signature</li> - <li><a href="http://dev.vaadin.com/ticket/9121">#9121</a>: Vaadin 7 as OSGI in Glassfish 3.1.2 fails after restart</li> - <li><a href="http://dev.vaadin.com/ticket/9122">#9122</a>: Decide whether to officially support Firefox ESR in Vaadin 7</li> - <li><a href="http://dev.vaadin.com/ticket/9156">#9156</a>: Communication synchronization should be on a dedicated lock object not the Application monitor</li> - <li><a href="http://dev.vaadin.com/ticket/9168">#9168</a>: Redesign Portlet url handling</li> - <li><a href="http://dev.vaadin.com/ticket/9172">#9172</a>: Tooltip not working in Window</li> - <li><a href="http://dev.vaadin.com/ticket/9173">#9173</a>: Form validation error is used as tooltip for all fields in the form</li> - <li><a href="http://dev.vaadin.com/ticket/9175">#9175</a>: Label.toString throws UnsupportedOperationException</li> - <li><a href="http://dev.vaadin.com/ticket/9179">#9179</a>: Getting file name as Null from Upload component of Vaadin 7.0.0.alpha* version</li> - <li><a href="http://dev.vaadin.com/ticket/9182">#9182</a>: Split Panel: Strange order of sub-components in DOM resulting in wrong order for screenreader users</li> - <li><a href="http://dev.vaadin.com/ticket/9196">#9196</a>: CustomLayout does not show its content until addComponent</li> - <li><a href="http://dev.vaadin.com/ticket/9201">#9201</a>: Vaadin 7 compatible ColorPicker</li> - <li><a href="http://dev.vaadin.com/ticket/9205">#9205</a>: Warning for duplicate connector resource if opening multiple tabs</li> - <li><a href="http://dev.vaadin.com/ticket/9209">#9209</a>: JavaScript connector can't translate vaadin urls</li> - <li><a href="http://dev.vaadin.com/ticket/9211">#9211</a>: Make it easier to use ResourceReference</li> - <li><a href="http://dev.vaadin.com/ticket/9212">#9212</a>: Duplicated code for getting URL for Resource</li> - <li><a href="http://dev.vaadin.com/ticket/9217">#9217</a>: Add support for detecting IE10</li> - <li><a href="http://dev.vaadin.com/ticket/9218">#9218</a>: Install test machines for running tests on IE 10</li> - <li><a href="http://dev.vaadin.com/ticket/9220">#9220</a>: Add a container element for all overlays</li> - <li><a href="http://dev.vaadin.com/ticket/9222">#9222</a>: Provide a servlet which compiles SCSS -> CSS on the fly</li> - <li><a href="http://dev.vaadin.com/ticket/9223">#9223</a>: Integrate SASS compiler into Vaadin</li> - <li><a href="http://dev.vaadin.com/ticket/9228">#9228</a>: Replace updateState by beforeSendState(boolean initial)</li> - <li><a href="http://dev.vaadin.com/ticket/9249">#9249</a>: Add getLocation to Page</li> - <li><a href="http://dev.vaadin.com/ticket/9254">#9254</a>: Exception: Type null is not a supported internal type in JsonCodec</li> - <li><a href="http://dev.vaadin.com/ticket/9265">#9265</a>: Implement basic heartbeat</li> - <li><a href="http://dev.vaadin.com/ticket/9266">#9266</a>: Add support for heartbeat not extending session</li> - <li><a href="http://dev.vaadin.com/ticket/9268">#9268</a>: Decide on default URI format for navigation</li> - <li><a href="http://dev.vaadin.com/ticket/9273">#9273</a>: Allow add-ons to integrate with servlet/portlet functions without sublcassing the servlet/portlet</li> - <li><a href="http://dev.vaadin.com/ticket/9274">#9274</a>: Let add-ons modify the bootstrap page</li> - <li><a href="http://dev.vaadin.com/ticket/9278">#9278</a>: Fix dependencies from shared to server/client code</li> - <li><a href="http://dev.vaadin.com/ticket/9279">#9279</a>: Fix dependencies from server to client code</li> - <li><a href="http://dev.vaadin.com/ticket/9280">#9280</a>: Preserve this reference when calling RPC methods.</li> - <li><a href="http://dev.vaadin.com/ticket/9282">#9282</a>: Removing extension throws client-side exception</li> - <li><a href="http://dev.vaadin.com/ticket/9283">#9283</a>: Compile SASS parser using JavaCC during build</li> - <li><a href="http://dev.vaadin.com/ticket/9285">#9285</a>: Replace overloaded addListener with more specific addClickListener etc</li> - <li><a href="http://dev.vaadin.com/ticket/9292">#9292</a>: Allow JavaScriptConnectors to get unRegister events</li> - <li><a href="http://dev.vaadin.com/ticket/9293">#9293</a>: Rename the JavaScript callback concept to function instead</li> - <li><a href="http://dev.vaadin.com/ticket/9294">#9294</a>: Nested TabSheets and hideTabs(true)</li> - <li><a href="http://dev.vaadin.com/ticket/9295">#9295</a>: Review assorted Vaadin 7 patches not yet committed</li> - <li><a href="http://dev.vaadin.com/ticket/9296">#9296</a>: Review Vaadin 7 tickets and wiki plans that require API changes</li> - <li><a href="http://dev.vaadin.com/ticket/9297">#9297</a>: Make it possible to delegate state changes to widget automatically</li> - <li><a href="http://dev.vaadin.com/ticket/9298">#9298</a>: AbstractComponentContainerConnector should not implement onConnectorHierarchyChange</li> - <li><a href="http://dev.vaadin.com/ticket/9299">#9299</a>: Package Vaadin as many jars</li> - <li><a href="http://dev.vaadin.com/ticket/9302">#9302</a>: Update Vaadin IPC for Liferay to support Vaadin 7</li> - <li><a href="http://dev.vaadin.com/ticket/9304">#9304</a>: Migrate Slider to Vaadin 7</li> - <li><a href="http://dev.vaadin.com/ticket/9312">#9312</a>: Make getRpcProxy protected</li> - <li><a href="http://dev.vaadin.com/ticket/9315">#9315</a>: Make the getState method protected</li> - <li><a href="http://dev.vaadin.com/ticket/9317">#9317</a>: Review SASS compiler API</li> - <li><a href="http://dev.vaadin.com/ticket/9318">#9318</a>: Reindeer cannot be compiled on Windows</li> - <li><a href="http://dev.vaadin.com/ticket/9322">#9322</a>: ApplicationConnection should have a method to suspend "rendering" for a short period of time</li> - <li><a href="http://dev.vaadin.com/ticket/9324">#9324</a>: Support using public fields in state classes</li> - <li><a href="http://dev.vaadin.com/ticket/9325">#9325</a>: Handle requestRepaint automatically</li> - <li><a href="http://dev.vaadin.com/ticket/9327">#9327</a>: ApplicationConnection needs to have API "communication activity listeners"</li> - <li><a href="http://dev.vaadin.com/ticket/9333">#9333</a>: Server-side enum decode throws ClassCastException</li> - <li><a href="http://dev.vaadin.com/ticket/9334">#9334</a>: Update wiki tutorials once beta1 is out</li> - <li><a href="http://dev.vaadin.com/ticket/9337">#9337</a>: Remove PortalDefaultWidgetSet</li> - <li><a href="http://dev.vaadin.com/ticket/9340">#9340</a>: Add accessors for servlet init parameters to DeploymentConfiguration</li> - <li><a href="http://dev.vaadin.com/ticket/9341">#9341</a>: Pass DeploymentConfiguration to Application</li> - <li><a href="http://dev.vaadin.com/ticket/9342">#9342</a>: Add EventRouter support to AbstractExtension</li> - <li><a href="http://dev.vaadin.com/ticket/9343">#9343</a>: Abort widgetset compile for conflicting @Connect mappings</li> - <li><a href="http://dev.vaadin.com/ticket/9346">#9346</a>: SASS compiler should look for themes in the vaadin.jar</li> - <li><a href="http://dev.vaadin.com/ticket/9347">#9347</a>: SASS compiler fails when mixin w/ args has nested blocks</li> - <li><a href="http://dev.vaadin.com/ticket/9357">#9357</a>: Simplify CSSLayout</li> - <li><a href="http://dev.vaadin.com/ticket/9367">#9367</a>: Remove all references to fragment from Navigator API</li> - <li><a href="http://dev.vaadin.com/ticket/9371">#9371</a>: Unify GWT code generators</li> - <li><a href="http://dev.vaadin.com/ticket/9372">#9372</a>: Root.getCurrent() returns null in LoginForm LoginListener</li> - <li><a href="http://dev.vaadin.com/ticket/9378">#9378</a>: Rename requestRepaint to markAsDirty</li> - <li><a href="http://dev.vaadin.com/ticket/9380">#9380</a>: SASSCompiler should support custom list functions</li> - <li><a href="http://dev.vaadin.com/ticket/9382">#9382</a>: DeploymentConfiguration should not be part of Application</li> - <li><a href="http://dev.vaadin.com/ticket/9392">#9392</a>: Move widget classes from c.v.c.ui.<component> to c.v.c.ui</li> - <li><a href="http://dev.vaadin.com/ticket/9399">#9399</a>: Remove custom source file checkers</li> - <li><a href="http://dev.vaadin.com/ticket/9400">#9400</a>: TabSheet broken</li> - <li><a href="http://dev.vaadin.com/ticket/9402">#9402</a>: Remove Application</li> - <li><a href="http://dev.vaadin.com/ticket/9406">#9406</a>: Client NullPointerException on Image shared state update</li> - <li><a href="http://dev.vaadin.com/ticket/9407">#9407</a>: Using a variable color as a parameter for the lighten function alters the parameter as well</li> - <li><a href="http://dev.vaadin.com/ticket/9408">#9408</a>: Referencing and setting the same SASS variable on the same line causes a StackOverflowException</li> - <li><a href="http://dev.vaadin.com/ticket/9409">#9409</a>: If a temporary variable is used in SASS compile another variable, it needs to be used in the output in order for both to be compiled</li> - <li><a href="http://dev.vaadin.com/ticket/9410">#9410</a>: Interpolation doesn't work in property name</li> - <li><a href="http://dev.vaadin.com/ticket/9411">#9411</a>: Mixin parameters don't support values with spaces in them</li> - <li><a href="http://dev.vaadin.com/ticket/9413">#9413</a>: Version is wrong in latest nightly</li> - <li><a href="http://dev.vaadin.com/ticket/9414">#9414</a>: Mixin name can't be followed by a whitespace before the parameter braces</li> - <li><a href="http://dev.vaadin.com/ticket/9416">#9416</a>: Rename Navigator.[un]registerProvider()</li> - <li><a href="http://dev.vaadin.com/ticket/9419">#9419</a>: Replace ApplicationResource with ConnectorResource</li> - <li><a href="http://dev.vaadin.com/ticket/9420">#9420</a>: Container.Indexed.getIdByIndex error behavior</li> - <li><a href="http://dev.vaadin.com/ticket/9422">#9422</a>: State change event for fields with default value is never sent</li> - <li><a href="http://dev.vaadin.com/ticket/9423">#9423</a>: Don't show unsupported browser message for supported Android versions</li> - <li><a href="http://dev.vaadin.com/ticket/9431">#9431</a>: Merge com.vaadin.terminal and com.vaadin.terminal.gwt into com.vaadin.server</li> - <li><a href="http://dev.vaadin.com/ticket/9432">#9432</a>: Rename com.vaadin.terminal.gwt.client to com.vaadin.client</li> - <li><a href="http://dev.vaadin.com/ticket/9434">#9434</a>: Vaadin6Component should be renamed for consistency</li> - <li><a href="http://dev.vaadin.com/ticket/9436">#9436</a>: Merge gwt-maven-plugin and vaadin-maven-plugin</li> - <li><a href="http://dev.vaadin.com/ticket/9437">#9437</a>: Vaadin Maven Plug-in should use Vaadin dependencies instead of GWT dependencies</li> - <li><a href="http://dev.vaadin.com/ticket/9438">#9438</a>: Package a zip containing all Vaadin jars and dependencies</li> - <li><a href="http://dev.vaadin.com/ticket/9441">#9441</a>: Empty string should be used instead of null to denote "no fragment parameters" in Navigator</li> - <li><a href="http://dev.vaadin.com/ticket/9442">#9442</a>: Navigator should have a method to navigate to the current location</li> - <li><a href="http://dev.vaadin.com/ticket/9443">#9443</a>: Refactor UI bootstrap</li> - <li><a href="http://dev.vaadin.com/ticket/9444">#9444</a>: LegacyPaint.paint causes component to be marked dirty again</li> - <li><a href="http://dev.vaadin.com/ticket/9445">#9445</a>: Remove @EagerInit</li> - <li><a href="http://dev.vaadin.com/ticket/9450">#9450</a>: Run server-side tests with assertions enabled</li> - <li><a href="http://dev.vaadin.com/ticket/9452">#9452</a>: AbstractCommunicationManager.getDirtyVisibleConnectors() throws ConcurrentModificationException in some cases</li> - <li><a href="http://dev.vaadin.com/ticket/9460">#9460</a>: Rename servlet and portlet to VaadinServlet and VaadinPortlet</li> - <li><a href="http://dev.vaadin.com/ticket/9461">#9461</a>: Generated project should be Vaadin 7 beta 1 compatible</li> - <li><a href="http://dev.vaadin.com/ticket/9466">#9466</a>: Use jetty-runner instead of DemoLauncher to launch test server</li> - <li><a href="http://dev.vaadin.com/ticket/9469">#9469</a>: Unify ThreadLocal handling</li> - <li><a href="http://dev.vaadin.com/ticket/9471">#9471</a>: SASS compiler should support the @each directive</li> - <li><a href="http://dev.vaadin.com/ticket/9472">#9472</a>: SQLContainer.getIdByIndex broken</li> - <li><a href="http://dev.vaadin.com/ticket/9474">#9474</a>: A "ui" init parameter should work aswell as "UI"</li> - <li><a href="http://dev.vaadin.com/ticket/9475">#9475</a>: problems with components in accordion</li> - <li><a href="http://dev.vaadin.com/ticket/9481">#9481</a>: Calling AbstractField.toString keeps creating warning log messages</li> - <li><a href="http://dev.vaadin.com/ticket/9482">#9482</a>: SASS compiler should support the @if directive</li> - <li><a href="http://dev.vaadin.com/ticket/9485">#9485</a>: SplitPanel reverse split position is broken</li> - <li><a href="http://dev.vaadin.com/ticket/9489">#9489</a>: SassCompiler @each should be able to iterate over $list</li> - <li><a href="http://dev.vaadin.com/ticket/9492">#9492</a>: Mixin parameters not available for interpolation</li> - <li><a href="http://dev.vaadin.com/ticket/9494">#9494</a>: Write "Creating a custom (application) theme using SASS" tutorial</li> - <li><a href="http://dev.vaadin.com/ticket/9495">#9495</a>: Write "Compiling SASS to CSS manually" tutorial</li> - <li><a href="http://dev.vaadin.com/ticket/9497">#9497</a>: Write "Automatically compiling SASS during development" tutorial</li> - <li><a href="http://dev.vaadin.com/ticket/9498">#9498</a>: Write "Reducing server round trips for components" tutorial</li> - <li><a href="http://dev.vaadin.com/ticket/9499">#9499</a>: Write "Dynamically updating state before sending changes to client" tutorial</li> - <li><a href="http://dev.vaadin.com/ticket/9500">#9500</a>: Write "Modifying the startup page in an add-on" tutorial</li> - <li><a href="http://dev.vaadin.com/ticket/9501">#9501</a>: Write "Modifying the startup page in an application" tutorial</li> - <li><a href="http://dev.vaadin.com/ticket/9503">#9503</a>: Write "Cleaning up resources in a UI" tutorial</li> - <li><a href="http://dev.vaadin.com/ticket/9505">#9505</a>: Add getCurrent() for servlet, portlet, service, request and response.</li> - <li><a href="http://dev.vaadin.com/ticket/9509">#9509</a>: TreeTable renders wrong items</li> - <li><a href="http://dev.vaadin.com/ticket/9511">#9511</a>: Rename ViewChangeListener methods</li> - <li><a href="http://dev.vaadin.com/ticket/9513">#9513</a>: Create UIProvider for easily opening popups.</li> - <li><a href="http://dev.vaadin.com/ticket/9514">#9514</a>: Allow storing values in VaadinSession</li> - <li><a href="http://dev.vaadin.com/ticket/9520">#9520</a>: vaadin-application-archetype uses deprecated API</li> - <li><a href="http://dev.vaadin.com/ticket/9522">#9522</a>: Don't use Resource with the Page.open API</li> - <li><a href="http://dev.vaadin.com/ticket/9524">#9524</a>: FileDownloadExtension which avoids problems with file downloads</li> - <li><a href="http://dev.vaadin.com/ticket/9528">#9528</a>: Precompiled theme is version 9.9.9</li> - <li><a href="http://dev.vaadin.com/ticket/9536">#9536</a>: Vaadin6Connector should be renamed for consistency</li> - <li><a href="http://dev.vaadin.com/ticket/9539">#9539</a>: Use org.json instead of com.vaadin.external.json</li> - <li><a href="http://dev.vaadin.com/ticket/9542">#9542</a>: Add removeAllValidators() to Field or Validatable</li> - <li><a href="http://dev.vaadin.com/ticket/9543">#9543</a>: Components that wrap a single other component should not implement ComponentContainer</li> - <li><a href="http://dev.vaadin.com/ticket/9544">#9544</a>: New theme should create a SASS theme</li> - <li><a href="http://dev.vaadin.com/ticket/9545">#9545</a>: SASS mixin nesting bugs with mixin</li> - <li><a href="http://dev.vaadin.com/ticket/9546">#9546</a>: SASS should support @include $var</li> - <li><a href="http://dev.vaadin.com/ticket/9549">#9549</a>: Investigate whether the initial Navigator.navigate() call could be automated</li> - <li><a href="http://dev.vaadin.com/ticket/9550">#9550</a>: Bind a Navigator instance to a UI instance.</li> - <li><a href="http://dev.vaadin.com/ticket/9551">#9551</a>: Vaadin-maven-plugin does not add validation API to compile path</li> - <li><a href="http://dev.vaadin.com/ticket/9552">#9552</a>: Extra scrollbars for Accordion in SplitPanel in IE8</li> - <li><a href="http://dev.vaadin.com/ticket/9553">#9553</a>: /APP should not use UIProviders</li> - <li><a href="http://dev.vaadin.com/ticket/9555">#9555</a>: Icons do not work in Vertical/HorizontalLayout</li> - <li><a href="http://dev.vaadin.com/ticket/9556">#9556</a>: Portal support broken</li> - <li><a href="http://dev.vaadin.com/ticket/9557">#9557</a>: Vaadin jars do not contain Import-Package in MANIFEST.MF</li> - <li><a href="http://dev.vaadin.com/ticket/9559">#9559</a>: Spacing broken in GridLayout</li> - <li><a href="http://dev.vaadin.com/ticket/9561">#9561</a>: @DelegateToWidget not always working if createWidget is overridden</li> - <li><a href="http://dev.vaadin.com/ticket/9565">#9565</a>: Window themes are broken in Vaadin 7</li> - <li><a href="http://dev.vaadin.com/ticket/9572">#9572</a>: Extra scrollbars in TabSheet and Accordion in IE8</li> - <li><a href="http://dev.vaadin.com/ticket/9576">#9576</a>: Vertical/HorizontalLayout slot should get style name from child</li> - <li><a href="http://dev.vaadin.com/ticket/9577">#9577</a>: DateFieldExtendedRange test fails</li> - <li><a href="http://dev.vaadin.com/ticket/9578">#9578</a>: Extra scrollbars in PopupViewOffScreen in IE8</li> - <li><a href="http://dev.vaadin.com/ticket/9579">#9579</a>: RichTextAreaScrolling throws client side exception in Chrome/Safari/Opera</li> - <li><a href="http://dev.vaadin.com/ticket/9580">#9580</a>: VaadinServlet should not send a redirect on failed heartbeat request</li> - <li><a href="http://dev.vaadin.com/ticket/9581">#9581</a>: Infinite recursion in LegacyApplication.terminalError</li> - <li><a href="http://dev.vaadin.com/ticket/9582">#9582</a>: TabsheetScrolling test broken</li> - <li><a href="http://dev.vaadin.com/ticket/9586">#9586</a>: Servlet integration tests broken</li> - <li><a href="http://dev.vaadin.com/ticket/9588">#9588</a>: Vaadin-client-compiler jar is missing CodeServer classes</li> - <li><a href="http://dev.vaadin.com/ticket/9589">#9589</a>: SassCompiler should support microsoft extensions etc</li> - <li><a href="http://dev.vaadin.com/ticket/9591">#9591</a>: Rename onVaadinSessionStarted() in VaadinServlet and VaadinPortlet</li> - <li><a href="http://dev.vaadin.com/ticket/9593">#9593</a>: vaadin-maven-plugin can not compile widgetset without vaadin-client-precompiled</li> - <li><a href="http://dev.vaadin.com/ticket/9596">#9596</a>: HorizontalLayout fails to calculate relative sized children correctly</li> - <li><a href="http://dev.vaadin.com/ticket/9597">#9597</a>: Maven plugin should update .gwt.xml in src folder, not in target</li> - <li><a href="http://dev.vaadin.com/ticket/9598">#9598</a>: Rename themes-compiled package to themes</li> - <li><a href="http://dev.vaadin.com/ticket/9600">#9600</a>: FieldGroup: missing propagation of read-only state in setReadOnly()</li> - <li><a href="http://dev.vaadin.com/ticket/9604">#9604</a>: Unable to compile themes on the fly</li> - <li><a href="http://dev.vaadin.com/ticket/9605">#9605</a>: Packages incorrectly require servlet-api 2.5</li> - <li><a href="http://dev.vaadin.com/ticket/9606">#9606</a>: VaadinServlet.serveOnTheFlyCompiledScss doesn't find scss files from vaadin-themes JAR in Windows</li> - <li><a href="http://dev.vaadin.com/ticket/9608">#9608</a>: Package modified/rebased dependencies as separate packages and remove them from vaadin-* jar files</li> - <li><a href="http://dev.vaadin.com/ticket/9609">#9609</a>: Modified Flute jar is declared as an (invalid) dependency</li> - <li><a href="http://dev.vaadin.com/ticket/9612">#9612</a>: Create vaadin-shared-deps.jar</li> - <li><a href="http://dev.vaadin.com/ticket/9613">#9613</a>: Create an all-javadoc package</li> - <li><a href="http://dev.vaadin.com/ticket/9618">#9618</a>: Label: setPropertyDataSource() won't update Label value on client</li> - <li><a href="http://dev.vaadin.com/ticket/9619">#9619</a>: Multi-servlet deployment configuration broken</li> - <li><a href="http://dev.vaadin.com/ticket/9624">#9624</a>: Vaadin 7 Beta 1 reports the wrong widget build version</li> - <li><a href="http://dev.vaadin.com/ticket/9625">#9625</a>: Change "close" to "cleanup" in UI.CloseListener and others</li> - <li><a href="http://dev.vaadin.com/ticket/9628">#9628</a>: Allow specifying UIProvider using a servlet parameter</li> - <li><a href="http://dev.vaadin.com/ticket/9633">#9633</a>: Rename the WrappedXYZ classes</li> - <li><a href="http://dev.vaadin.com/ticket/9635">#9635</a>: Add listeners for initialized and destroyed VaadinSession</li> - <li><a href="http://dev.vaadin.com/ticket/9637">#9637</a>: Move UIProvider logic from VaadinSession to VaadinService</li> - <li><a href="http://dev.vaadin.com/ticket/9638">#9638</a>: Remove VaadinServletSession</li> - <li><a href="http://dev.vaadin.com/ticket/9639">#9639</a>: Support defining UIProviders as servlet/portlet init parameters</li> - <li><a href="http://dev.vaadin.com/ticket/9640">#9640</a>: java.io.NotSerializableException: org.json.JSONObject</li> - <li><a href="http://dev.vaadin.com/ticket/9642">#9642</a>: Make UIProvider easier to use</li> - <li><a href="http://dev.vaadin.com/ticket/9644">#9644</a>: Write tutorial "Setting and reading Cookies"</li> - <li><a href="http://dev.vaadin.com/ticket/9645">#9645</a>: Write tutorial "Setting and reading session attributes"</li> - <li><a href="http://dev.vaadin.com/ticket/9646">#9646</a>: Write tutorial "Handling logout"</li> - <li><a href="http://dev.vaadin.com/ticket/9647">#9647</a>: Delete ScssServlet</li> - <li><a href="http://dev.vaadin.com/ticket/9648">#9648</a>: Multiple Vaadin portlets on the same page does not work</li> - <li><a href="http://dev.vaadin.com/ticket/9652">#9652</a>: SessionExpired when embedding UIs in a HTML page</li> - <li><a href="http://dev.vaadin.com/ticket/9654">#9654</a>: All thread locals should be cleared at the beginning of any request</li> - <li><a href="http://dev.vaadin.com/ticket/9655">#9655</a>: Add getWrappedSession method that does not create a new session</li> - <li><a href="http://dev.vaadin.com/ticket/9656">#9656</a>: Session is not locked during browser details request</li> - <li><a href="http://dev.vaadin.com/ticket/9658">#9658</a>: Change VaadinService to be an abstract class</li> - <li><a href="http://dev.vaadin.com/ticket/9684">#9684</a>: requestRepaint deprecation message should tell that requestRepaint is rarely needed anymore</li> - <li><a href="http://dev.vaadin.com/ticket/9687">#9687</a>: Reindeer WINDOW_LIGHT style broken</li> - <li><a href="http://dev.vaadin.com/ticket/9689">#9689</a>: Update mini tutorial for using Resource in connectors</li> - <li><a href="http://dev.vaadin.com/ticket/9690">#9690</a>: Remove ApplicationClassException</li> - <li><a href="http://dev.vaadin.com/ticket/9691">#9691</a>: Rename old connector resource concept</li> - <li><a href="http://dev.vaadin.com/ticket/9695">#9695</a>: All components are marked dirty at the end of each request</li> - <li><a href="http://dev.vaadin.com/ticket/9696">#9696</a>: Diff state fails to compare null values properly</li> - <li><a href="http://dev.vaadin.com/ticket/9704">#9704</a>: Make GWT generator require RPC methods to return void</li> - <li><a href="http://dev.vaadin.com/ticket/9706">#9706</a>: Add getContextPath to VaadinRequest</li> - <li><a href="http://dev.vaadin.com/ticket/9707">#9707</a>: Support both ui and UI as the init parameter for selecting UI class</li> - <li><a href="http://dev.vaadin.com/ticket/9711">#9711</a>: Not possible to set custom system messages</li> - <li><a href="http://dev.vaadin.com/ticket/9716">#9716</a>: browserWindowHeight and browserWindowWidth are always -1</li> - <li><a href="http://dev.vaadin.com/ticket/9717">#9717</a>: ConnectorTracker should serialize diff state</li> - <li><a href="http://dev.vaadin.com/ticket/9718">#9718</a>: Rename ServletService and move to its own file</li> - <li><a href="http://dev.vaadin.com/ticket/9719">#9719</a>: Remove ApplicationStartedListener</li> - <li><a href="http://dev.vaadin.com/ticket/9720">#9720</a>: Remove WidgetMapGenerator and subclasses</li> - <li><a href="http://dev.vaadin.com/ticket/9721">#9721</a>: Pass UI id to UIProvider.createInstance</li> - <li><a href="http://dev.vaadin.com/ticket/9722">#9722</a>: Make DefaultUIProvider path aware</li> - <li><a href="http://dev.vaadin.com/ticket/9723">#9723</a>: Validatable.getValidators() is specified to return null if no validators</li> - <li><a href="http://dev.vaadin.com/ticket/9724">#9724</a>: Add Component.setPrimaryStyleName</li> - <li><a href="http://dev.vaadin.com/ticket/9725">#9725</a>: CustomLayout without children doesn't display anything</li> - <li><a href="http://dev.vaadin.com/ticket/9726">#9726</a>: Review usage of the Vaadin prefix in method names</li> - <li><a href="http://dev.vaadin.com/ticket/9727">#9727</a>: It should be easier to write custom NavigationStateManagers</li> - <li><a href="http://dev.vaadin.com/ticket/9728">#9728</a>: NPE when initializing LegacyVaadinPortlet</li> - <li><a href="http://dev.vaadin.com/ticket/9730">#9730</a>: Two portlets on the same page conflict with each other</li> - <li><a href="http://dev.vaadin.com/ticket/9731">#9731</a>: Map PortalDefaultWidgetSet to DefaultWidgetSet</li> - <li><a href="http://dev.vaadin.com/ticket/9733">#9733</a>: Make VaadinSession non-global. - <b>VOTED FEATURE</b></li> - <li><a href="http://dev.vaadin.com/ticket/9734">#9734</a>: Slider max value is 0 by default, should be 100</li> - <li><a href="http://dev.vaadin.com/ticket/9735">#9735</a>: Handle exceptions from UI.init in a better way</li> - <li><a href="http://dev.vaadin.com/ticket/9736">#9736</a>: HTML5 doctype changes breaks vertical alignment in HorizontalLayout</li> - <li><a href="http://dev.vaadin.com/ticket/9737">#9737</a>: AbstractField.convertToModel error handling throws NPE</li> - <li><a href="http://dev.vaadin.com/ticket/9740">#9740</a>: NPE in Slider inside a GridLayout</li> - <li><a href="http://dev.vaadin.com/ticket/9745">#9745</a>: Build all javadoc automatically during build</li> - <li><a href="http://dev.vaadin.com/ticket/9747">#9747</a>: Invalid request path info in CombinedRequest</li> - <li><a href="http://dev.vaadin.com/ticket/9749">#9749</a>: Add common methods from servlet/portlet request, response and session to Vaadin interfaces</li> - <li><a href="http://dev.vaadin.com/ticket/9750">#9750</a>: Rename addVaadinSessionInitializationListener to addSessionInitListener</li> - <li><a href="http://dev.vaadin.com/ticket/9751">#9751</a>: Import sass tests</li> - <li><a href="http://dev.vaadin.com/ticket/9752">#9752</a>: UI serialization fails because of VaadinServiceData</li> - <li><a href="http://dev.vaadin.com/ticket/9755">#9755</a>: Roots do not get detach() notifications</li> - <li><a href="http://dev.vaadin.com/ticket/9764">#9764</a>: Make DefaultUIProvider serve the default UI for all paths</li> - <li><a href="http://dev.vaadin.com/ticket/9767">#9767</a>: ConnectorTracker throws NPE if using deserialized session</li> - <li><a href="http://dev.vaadin.com/ticket/9768">#9768</a>: ComboBox drop down list in PopupView Content has wrong offset</li> - <li><a href="http://dev.vaadin.com/ticket/9770">#9770</a>: Heartbeat and Connector resource requests do not clean up inactive UIs</li> - <li><a href="http://dev.vaadin.com/ticket/9776">#9776</a>: Vaadin 7 beta 1/2 and Websphere 8: Hourglass is running - no GUI components are shown</li> - <li><a href="http://dev.vaadin.com/ticket/9777">#9777</a>: Sass mixin does not handle named parameters correctly</li> - <li><a href="http://dev.vaadin.com/ticket/9791">#9791</a>: The constructor is ambiguous (Navigator)</li> - <li><a href="http://dev.vaadin.com/ticket/9792">#9792</a>: Layout-Bug in AbstractJavaScriptComponent</li> - <li><a href="http://dev.vaadin.com/ticket/9793">#9793</a>: Vaadin 7 - OSGi</li> - <li><a href="http://dev.vaadin.com/ticket/9794">#9794</a>: VaadinService.addUiProvider -> NPE</li> - <li><a href="http://dev.vaadin.com/ticket/9798">#9798</a>: Datefield's container div height is 4 pixels too much</li> - <li><a href="http://dev.vaadin.com/ticket/9802">#9802</a>: RpcInvoicationHandler.toString() should not cause an client rpc invocation</li> - <li><a href="http://dev.vaadin.com/ticket/9804">#9804</a>: sun.io.serialization.extendedDebugInfo & toString</li> - <li><a href="http://dev.vaadin.com/ticket/9805">#9805</a>: Javascript handling regression</li> - <li><a href="http://dev.vaadin.com/ticket/9807">#9807</a>: vaadin 7 beta 2 Accordion not working properly</li> - <li><a href="http://dev.vaadin.com/ticket/9808">#9808</a>: NPEs when calling removeAllComponents() for VerticalLayout</li> - <li><a href="http://dev.vaadin.com/ticket/9815">#9815</a>: Hierarchy change events should be sent to component containers which are about to be removed</li> - <li><a href="http://dev.vaadin.com/ticket/9816">#9816</a>: Update Google App Engine test to use UI</li> - <li><a href="http://dev.vaadin.com/ticket/9817">#9817</a>: GlobalResourceHandler is not serializable</li> - <li><a href="http://dev.vaadin.com/ticket/9819">#9819</a>: Setting custom class loader doesn't work</li> - <li><a href="http://dev.vaadin.com/ticket/9821">#9821</a>: Sass mixin can't call other mixin with param</li> - <li><a href="http://dev.vaadin.com/ticket/9824">#9824</a>: Remove support for default configuration options during bootstrap</li> - <li><a href="http://dev.vaadin.com/ticket/9826">#9826</a>: NoDataException when (lazy) loading CheckBox first time with overrided CheckBoxConnector</li> - <li><a href="http://dev.vaadin.com/ticket/9828">#9828</a>: Vaadin 7 ComponentLocator doesn't work with debug IDs</li> - <li><a href="http://dev.vaadin.com/ticket/9832">#9832</a>: Root div should have v-ui and v-ui-<uiclass> css class names</li> - <li><a href="http://dev.vaadin.com/ticket/9838">#9838</a>: Combobox popup item line heights are wrong in Chameleon theme</li> - <li><a href="http://dev.vaadin.com/ticket/9841">#9841</a>: Deploy vaadin-buildhelpers to Maven</li> - <li><a href="http://dev.vaadin.com/ticket/9845">#9845</a>: Resizing browser window throws exception in Firefox</li> - <li><a href="http://dev.vaadin.com/ticket/9846">#9846</a>: Sass mixin does not support multiple params w/ defaults</li> - <li><a href="http://dev.vaadin.com/ticket/9848">#9848</a>: VaadinServlet.servletInitialized() should throw ServletException</li> - <li><a href="http://dev.vaadin.com/ticket/9852">#9852</a>: Add dependencies to client-compiler module for jars which are not rebased or modified by GWT</li> - <li><a href="http://dev.vaadin.com/ticket/9858">#9858</a>: SassCompiler does not accept CSS3 selectors</li> - <li><a href="http://dev.vaadin.com/ticket/9859">#9859</a>: Need replacement for Application.close() and .setLogoutUrl()</li> - <li><a href="http://dev.vaadin.com/ticket/9860">#9860</a>: layout.scss contains wrong selectors</li> - <li><a href="http://dev.vaadin.com/ticket/9863">#9863</a>: Building with recent Ant versions throws NPE</li> - <li><a href="http://dev.vaadin.com/ticket/9867">#9867</a>: Add information about SuperDevMode in the widgetset in the archetype</li> - <li><a href="http://dev.vaadin.com/ticket/9871">#9871</a>: SASS parses CSS incorrectly</li> - <li><a href="http://dev.vaadin.com/ticket/9880">#9880</a>: Convert Runo to scss</li> - <li><a href="http://dev.vaadin.com/ticket/9881">#9881</a>: Convert Chameleon to scss</li> - <li><a href="http://dev.vaadin.com/ticket/9883">#9883</a>: Document limitations in setPrimaryStyleName</li> - <li><a href="http://dev.vaadin.com/ticket/9884">#9884</a>: Remove VaadinServiceSession.getURL</li> - <li><a href="http://dev.vaadin.com/ticket/9887">#9887</a>: Check Trident version before declaring IE incompatible</li> - <li><a href="http://dev.vaadin.com/ticket/9888">#9888</a>: NPE in getBrowserDetailsUI()</li> - <li><a href="http://dev.vaadin.com/ticket/9891">#9891</a>: Theme resources can not be loaded if theme name contains -</li> - <li><a href="http://dev.vaadin.com/ticket/9893">#9893</a>: Reorganize VOrderedLayout package and class structure</li> - <li><a href="http://dev.vaadin.com/ticket/9895">#9895</a>: Client-side NPE if hiding CustomComponent child</li> - <li><a href="http://dev.vaadin.com/ticket/9896">#9896</a>: TextField.setPrimaryStyleName does not work dynamically</li> - <li><a href="http://dev.vaadin.com/ticket/9897">#9897</a>: Document layout changes in migration guide</li> - <li><a href="http://dev.vaadin.com/ticket/9898">#9898</a>: Slider does not change primary stylenames of inner elements when calling setPrimaryStylename</li> - <li><a href="http://dev.vaadin.com/ticket/9899">#9899</a>: Dynamically setting the primary stylename for the AbsoluteLayout does not work</li> - <li><a href="http://dev.vaadin.com/ticket/9900">#9900</a>: Accordion.setPrimaryStylename does not change the stylename for inner elements</li> - <li><a href="http://dev.vaadin.com/ticket/9901">#9901</a>: Combobox does not support primary stylenames</li> - <li><a href="http://dev.vaadin.com/ticket/9902">#9902</a>: CustomLayout does not work properly with primary stylenames</li> - <li><a href="http://dev.vaadin.com/ticket/9903">#9903</a>: DateField does not work properly with primary stylenames</li> - <li><a href="http://dev.vaadin.com/ticket/9904">#9904</a>: Form does not work properly with primary stylenames</li> - <li><a href="http://dev.vaadin.com/ticket/9907">#9907</a>: ListSelect does not properly support primary stylenames</li> - <li><a href="http://dev.vaadin.com/ticket/9908">#9908</a>: MenuBars does not support primary stylenames properly</li> - <li><a href="http://dev.vaadin.com/ticket/9917">#9917</a>: LegacyWindow should not be a UI inner class</li> - <li><a href="http://dev.vaadin.com/ticket/9921">#9921</a>: Redirect if trailing slash missing after context path</li> - <li><a href="http://dev.vaadin.com/ticket/9923">#9923</a>: Move hierarchy related code in Form to onConnectorHierarchyChange</li> - <li><a href="http://dev.vaadin.com/ticket/9924">#9924</a>: Move hierarchy related code in PopupView to onConnectorHierarchyChange</li> - <li><a href="http://dev.vaadin.com/ticket/9926">#9926</a>: Build script should not automatically deploy to local Maven</li> - <li><a href="http://dev.vaadin.com/ticket/9931">#9931</a>: Vaadin-maven-plugin does not include vaadin-client-compiler dependencies when compiling widget set</li> - <li><a href="http://dev.vaadin.com/ticket/9936">#9936</a>: Remove Navigator.SimpleViewDisplay</li> - <li><a href="http://dev.vaadin.com/ticket/9943">#9943</a>: CompileTheme.createSprites hides classpath problems</li> - <li><a href="http://dev.vaadin.com/ticket/9946">#9946</a>: VaadinServiceSession.getCurrent() fails on first request</li> - <li><a href="http://dev.vaadin.com/ticket/9947">#9947</a>: UI constructor invariably throws IllegalStateException</li> - <li><a href="http://dev.vaadin.com/ticket/9949">#9949</a>: Browser Back Button does not trigger ValueChangeListener/Blur (Vaadin 7)</li> - <li><a href="http://dev.vaadin.com/ticket/9952">#9952</a>: UI is not Scrollable</li> - <li><a href="http://dev.vaadin.com/ticket/9956">#9956</a>: DoubleClick on table row failed in IE8</li> - <li><a href="http://dev.vaadin.com/ticket/9963">#9963</a>: Vaadin All zip size and JavaDoc</li> - <li><a href="http://dev.vaadin.com/ticket/9967">#9967</a>: UI.replaceComponent() throws UnsupportedOperationException</li> - <li><a href="http://dev.vaadin.com/ticket/9969">#9969</a>: UI iterator() and getComponentCount() are inconsistent with addComponent() and others</li> - <li><a href="http://dev.vaadin.com/ticket/9970">#9970</a>: Duplicate jars in Vaadin All zip archive</li> - <li><a href="http://dev.vaadin.com/ticket/9972">#9972</a>: Add Navigator.getState()</li> - <li><a href="http://dev.vaadin.com/ticket/9974">#9974</a>: Sass remove() does not work properly in @mixin</li> - <li><a href="http://dev.vaadin.com/ticket/9975">#9975</a>: Sass contains() does not work directly in if()</li> - <li><a href="http://dev.vaadin.com/ticket/9977">#9977</a>: ItemClickListener in Table throws NullPointerException in IE8</li> - <li><a href="http://dev.vaadin.com/ticket/9983">#9983</a>: Adding multiple stylenames fails in certain conditions</li> - <li><a href="http://dev.vaadin.com/ticket/9987">#9987</a>: Changing heartbeat interval in web.xml does not work</li> - <li><a href="http://dev.vaadin.com/ticket/9989">#9989</a>: Improve message when session is already set</li> - <li><a href="http://dev.vaadin.com/ticket/9999">#9999</a>: Debug console does not recognize ExtensionConnectors</li> - <li><a href="http://dev.vaadin.com/ticket/10000">#10000</a>: @keyframes syntax breaks Sass compiler</li> - <li><a href="http://dev.vaadin.com/ticket/10003">#10003</a>: CssLayout click listeners do not work unless there's at least one child component</li> - <li><a href="http://dev.vaadin.com/ticket/10006">#10006</a>: ServerRpc causes the target connector and all its parents to be marked dirty</li> - <li><a href="http://dev.vaadin.com/ticket/10007">#10007</a>: Property.setValue should be setValue(T) and not setValue(Object)</li> - <li><a href="http://dev.vaadin.com/ticket/10008">#10008</a>: Update ProgressIndicator to use state and Rpc</li> - <li><a href="http://dev.vaadin.com/ticket/10030">#10030</a>: Button.DisableOnClick</li> - <li><a href="http://dev.vaadin.com/ticket/10034">#10034</a>: Moving components from outer AbsoluteLayout to an inner layout fails with client side exception</li> - <li><a href="http://dev.vaadin.com/ticket/10036">#10036</a>: Selecting a row in Table leaves focus indicator for previously selected line</li> - <li><a href="http://dev.vaadin.com/ticket/10039">#10039</a>: ComponentLocator.getElementByDOMPath throws NPE if the target could not be found</li> - <li><a href="http://dev.vaadin.com/ticket/10040">#10040</a>: uitest.war web.xml does not validate</li> - <li><a href="http://dev.vaadin.com/ticket/10043">#10043</a>: NullPointerException in AbstractField.convertToModel()</li> - <li><a href="http://dev.vaadin.com/ticket/10044">#10044</a>: Reopening UI with @PreserveOnRefresh doesn't fire fragment change</li> - <li><a href="http://dev.vaadin.com/ticket/10045">#10045</a>: WebLogic 9 does not support Java 6</li> - <li><a href="http://dev.vaadin.com/ticket/10049">#10049</a>: Util.getAbsoluteUrl does nothing in IE 8</li> - <li><a href="http://dev.vaadin.com/ticket/10050">#10050</a>: Create tutorials for BrowserPopupOpener and FileDownloader</li> - <li><a href="http://dev.vaadin.com/ticket/10053">#10053</a>: A ClassResource which points to a non-existing file should return 404 and not an empty page</li> - <li><a href="http://dev.vaadin.com/ticket/10061">#10061</a>: OSGi - can not instantiate vaadin session anymore</li> - <li><a href="http://dev.vaadin.com/ticket/10066">#10066</a>: OSGi - wrong dependencies</li> - <li><a href="http://dev.vaadin.com/ticket/10068">#10068</a>: Vertical- and Horizontal-layouts should not attach/detach element resize listeners on state change</li> - <li><a href="http://dev.vaadin.com/ticket/10069">#10069</a>: Update the "Using Vaadin in an existing GWT project" tutorial</li> - <li><a href="http://dev.vaadin.com/ticket/10070">#10070</a>: InlineDateField broken with Chameleon</li> - <li><a href="http://dev.vaadin.com/ticket/10071">#10071</a>: Internal Error - Table marked as dirty while connected SQLContainer is rolled back</li> - <li><a href="http://dev.vaadin.com/ticket/10075">#10075</a>: InlineDateField has extra horizontal line below day names</li> - <li><a href="http://dev.vaadin.com/ticket/10076">#10076</a>: Write tutorial about creating a LoginForm with Vaadin components</li> - <li><a href="http://dev.vaadin.com/ticket/10077">#10077</a>: MenuItem stylenames are lost when the menu item is selected</li> - <li><a href="http://dev.vaadin.com/ticket/10078">#10078</a>: CustomField should implement HasComponents, not ComponentContainer</li> - <li><a href="http://dev.vaadin.com/ticket/10079">#10079</a>: AbstractOrderedLayout does not add v-disabled to caption of child when a parent is disabled</li> - <li><a href="http://dev.vaadin.com/ticket/10080">#10080</a>: Undefined wide HorizontalLayout becomes 100% wide</li> - <li><a href="http://dev.vaadin.com/ticket/10082">#10082</a>: Icon in Panel caption causes wrapping</li> - <li><a href="http://dev.vaadin.com/ticket/10083">#10083</a>: AbsoluteLayout does not render captions</li> - <li><a href="http://dev.vaadin.com/ticket/10085">#10085</a>: HasComponents should not declare getComponentIterator()</li> - <li><a href="http://dev.vaadin.com/ticket/10088">#10088</a>: Non-transient servlet reference in VaadinServletService</li> - <li><a href="http://dev.vaadin.com/ticket/10089">#10089</a>: NPE in Page.setFragment(String newFragment, boolean fireEvents)</li> - <li><a href="http://dev.vaadin.com/ticket/10093">#10093</a>: Allow to provide parameters for the UI in a popup window</li> - <li><a href="http://dev.vaadin.com/ticket/10097">#10097</a>: GridLayout insertRow() causes client side exception</li> - <li><a href="http://dev.vaadin.com/ticket/10098">#10098</a>: Layout bug: nested HorizontalLayout is offset vertically downward</li> - <li><a href="http://dev.vaadin.com/ticket/10100">#10100</a>: Sass parent selector fails if rule has more than one selector</li> - <li><a href="http://dev.vaadin.com/ticket/10101">#10101</a>: Client side exception with Image()</li> - <li><a href="http://dev.vaadin.com/ticket/10104">#10104</a>: LegacyComponent should be in com.vaadin.ui</li> - <li><a href="http://dev.vaadin.com/ticket/10107">#10107</a>: SCSS compiler fails when theme is not in same project as UI</li> - <li><a href="http://dev.vaadin.com/ticket/10112">#10112</a>: Using Upload with multiple UIs causes NPE</li> - <li><a href="http://dev.vaadin.com/ticket/10113">#10113</a>: VerticalLayout is a block element which always makes it 100% wide</li> - <li><a href="http://dev.vaadin.com/ticket/10116">#10116</a>: Idle UIs should be closed only when all UIs have been idle long enough</li> - <li><a href="http://dev.vaadin.com/ticket/10118">#10118</a>: josn dependency is not OSGi compatible out-of-the-box</li> - <li><a href="http://dev.vaadin.com/ticket/10121">#10121</a>: Fields named description don't bind in FieldGroup.bindMemberFields method</li> - <li><a href="http://dev.vaadin.com/ticket/10124">#10124</a>: SQLContainer.prevItem() does not return null</li> - <li><a href="http://dev.vaadin.com/ticket/10126">#10126</a>: Using GWT PopupPanel.show() fails with NPE due to Vaadin PopupView</li> - <li><a href="http://dev.vaadin.com/ticket/10128">#10128</a>: Undefined wide accordion sets width 2px too small, causing scrollbars</li> - <li><a href="http://dev.vaadin.com/ticket/10130">#10130</a>: ProgressIndicator keeps polling after it has been removed</li> - <li><a href="http://dev.vaadin.com/ticket/10132">#10132</a>: Navigator.navigateTo(…) should call View.enter(…) AFTER it has called ViewDisplay.showView(…)</li> - <li><a href="http://dev.vaadin.com/ticket/10134">#10134</a>: Check that connector has a matching RPC handler before deserializing parameters</li> - <li><a href="http://dev.vaadin.com/ticket/10136">#10136</a>: Tooltip is too high in Runo</li> - <li><a href="http://dev.vaadin.com/ticket/10137">#10137</a>: NativeButton does not set the v-disabled style when using disableOnClick</li> - <li><a href="http://dev.vaadin.com/ticket/10140">#10140</a>: Unify slash usage in constants</li> - <li><a href="http://dev.vaadin.com/ticket/10141">#10141</a>: Rename Page.getFragment to Page.getUriFragment</li> - <li><a href="http://dev.vaadin.com/ticket/10143">#10143</a>: Add AbstractConnector.getRpcProxy to be consistent with server side</li> - <li><a href="http://dev.vaadin.com/ticket/10144">#10144</a>: AbstractComponentContainer should implement getComponentIterator and not iterator()</li> - <li><a href="http://dev.vaadin.com/ticket/10145">#10145</a>: Move classes from the com.vaadin package</li> - <li><a href="http://dev.vaadin.com/ticket/10146">#10146</a>: Move classes from the com.vaadin.service package</li> - <li><a href="http://dev.vaadin.com/ticket/10150">#10150</a>: Detached SplitPanel still holds on to its previous children.</li> - <li><a href="http://dev.vaadin.com/ticket/10151">#10151</a>: Invalid state in hierarchy change event for detached connector</li> - <li><a href="http://dev.vaadin.com/ticket/10153">#10153</a>: Update "Dependencies Included in Installation package"</li> - <li><a href="http://dev.vaadin.com/ticket/10154">#10154</a>: HorizontalLayout adds component in wrong order</li> - <li><a href="http://dev.vaadin.com/ticket/10155">#10155</a>: Hiding or removing a component from an AbsoluteLayout causes ClassCastException</li> - <li><a href="http://dev.vaadin.com/ticket/10156">#10156</a>: Vaadin internal init parameters should be prefixed by "v-"</li> - <li><a href="http://dev.vaadin.com/ticket/10157">#10157</a>: Vaadin internal init parameters should be prefixed by "v-"</li> - <li><a href="http://dev.vaadin.com/ticket/10158">#10158</a>: API: getRootConnector() should be getUIConnector()</li> - <li><a href="http://dev.vaadin.com/ticket/10161">#10161</a>: VerticalLayout expand ratio cannot be changed dynamically</li> - <li><a href="http://dev.vaadin.com/ticket/10162">#10162</a>: VLayoutSlot.positionHorizontally does not sanitize availableWidth before setting it to the DOM</li> - <li><a href="http://dev.vaadin.com/ticket/10166">#10166</a>: SassCompiler parent reference in middle of selector bugs</li> - <li><a href="http://dev.vaadin.com/ticket/10172">#10172</a>: Ue IE9 mode for IE10</li> - <li><a href="http://dev.vaadin.com/ticket/10174">#10174</a>: Value of a variable cannot be assigned to another variable</li> - <li><a href="http://dev.vaadin.com/ticket/10179">#10179</a>: AbstractComponentConnector removes id attribute set in widget</li> - <li><a href="http://dev.vaadin.com/ticket/10180">#10180</a>: AbsoluteLayout will not position components with setVisible(false)</li> - <li><a href="http://dev.vaadin.com/ticket/10181">#10181</a>: AbsoluteLayout will not position components with setVisible(false)</li> - <li><a href="http://dev.vaadin.com/ticket/10182">#10182</a>: Rule order not preserved when using parent reference in sass</li> - <li><a href="http://dev.vaadin.com/ticket/10183">#10183</a>: InlineDateField and ComboBox broken in BaseTheme</li> - <li><a href="http://dev.vaadin.com/ticket/10184">#10184</a>: Match not found in GlobalResourceHandler when requesting dynamic resource from a Table</li> - <li><a href="http://dev.vaadin.com/ticket/10186">#10186</a>: Using the lighten function breaks up any later references to the parameter value</li> - <li><a href="http://dev.vaadin.com/ticket/10187">#10187</a>: VPopupView no longer works with TestBench</li> - <li><a href="http://dev.vaadin.com/ticket/10198">#10198</a>: FileDownloaderExtension cannot be removed</li> - <li><a href="http://dev.vaadin.com/ticket/10202">#10202</a>: Allow the client side to use an SASS file</li> - <li><a href="http://dev.vaadin.com/ticket/10203">#10203</a>: add setFileDownloadResource to FileDownloader</li> - <li><a href="http://dev.vaadin.com/ticket/10204">#10204</a>: Update Eclipse project template to be compatible with beta9</li> - <li><a href="http://dev.vaadin.com/ticket/10205">#10205</a>: Ensure Maven project template is compatible with beta9</li> - <li><a href="http://dev.vaadin.com/ticket/10211">#10211</a>: No longer possible to use Navigator on a Panel/Window/UI</li> - <li><a href="http://dev.vaadin.com/ticket/10221">#10221</a>: Generated AsyncBundleLoader.load() too long</li> - <li><a href="http://dev.vaadin.com/ticket/10222">#10222</a>: Aborting layout after 100 passes</li> - <li><a href="http://dev.vaadin.com/ticket/10223">#10223</a>: Rename VaadinServiceSession to VaadinSession</li> - <li><a href="http://dev.vaadin.com/ticket/10224">#10224</a>: Rename DependencyResource to PublishedFile</li> - <li><a href="http://dev.vaadin.com/ticket/10225">#10225</a>: Remove verifyLock() from and add getLockInstance() to VaadinSession</li> - <li><a href="http://dev.vaadin.com/ticket/10226">#10226</a>: SystemMessagesProvider.getSystemMessages should get an event object</li> - <li><a href="http://dev.vaadin.com/ticket/10227">#10227</a>: Remove DynamicConnectorResource</li> - <li><a href="http://dev.vaadin.com/ticket/10229">#10229</a>: Update all @deprecated messages in VaadinService related classes</li> - <li><a href="http://dev.vaadin.com/ticket/10230">#10230</a>: Remove Terminal</li> - <li><a href="http://dev.vaadin.com/ticket/10231">#10231</a>: Replace ComponentErrorHandler with ErrorListener and make error handling use hierarchy</li> - <li><a href="http://dev.vaadin.com/ticket/10232">#10232</a>: Remove ApplicationError</li> - <li><a href="http://dev.vaadin.com/ticket/10235">#10235</a>: CustomComponent should implement HasComponents</li> - <li><a href="http://dev.vaadin.com/ticket/10236">#10236</a>: DragAndDropWrapper should not be a ComponentContainer</li> - <li><a href="http://dev.vaadin.com/ticket/10237">#10237</a>: LoginForm should not be a ComponentContainer</li> - <li><a href="http://dev.vaadin.com/ticket/10238">#10238</a>: PopupView should implement HasComponents</li> - <li><a href="http://dev.vaadin.com/ticket/10239">#10239</a>: Remove Navigator.navigate()</li> - <li><a href="http://dev.vaadin.com/ticket/10240">#10240</a>: Update Navigator.addView(String,View) and Navigator.setErrorView(View) javadoc</li> - <li><a href="http://dev.vaadin.com/ticket/10241">#10241</a>: Refactor BrowserPopupOpener API</li> - <li><a href="http://dev.vaadin.com/ticket/10242">#10242</a>: Rename ApplicationConnection suspend/resumeRendering</li> - <li><a href="http://dev.vaadin.com/ticket/10243">#10243</a>: Refactor ApplicationConnection communication related API</li> - <li><a href="http://dev.vaadin.com/ticket/10244">#10244</a>: Correct camelCasing in @Delayed</li> - <li><a href="http://dev.vaadin.com/ticket/10245">#10245</a>: Add addComponents(Component...) to ComponentContainer</li> - <li><a href="http://dev.vaadin.com/ticket/10246">#10246</a>: Add multiple Component constructors to all ComponentContainers</li> - <li><a href="http://dev.vaadin.com/ticket/10247">#10247</a>: Remove EventRouter deprecation messages</li> - <li><a href="http://dev.vaadin.com/ticket/10248">#10248</a>: Implement abstract client side connector classes for HasComponents and SingleComponentContainer</li> - <li><a href="http://dev.vaadin.com/ticket/10249">#10249</a>: Add UI.close(), UI.isClosing()</li> - <li><a href="http://dev.vaadin.com/ticket/10251">#10251</a>: Refactor clean up of UIs</li> - <li><a href="http://dev.vaadin.com/ticket/10252">#10252</a>: Refactor hearbeat API</li> - <li><a href="http://dev.vaadin.com/ticket/10253">#10253</a>: Refactor VaadinSession API request time API</li> - <li><a href="http://dev.vaadin.com/ticket/10254">#10254</a>: Remove AddonContext and related methods</li> - <li><a href="http://dev.vaadin.com/ticket/10257">#10257</a>: Loading indicator remains visible if there is an exception during layout</li> - <li><a href="http://dev.vaadin.com/ticket/10258">#10258</a>: Bottom left corner of the Runo panel is not visible</li> - <li><a href="http://dev.vaadin.com/ticket/10284">#10284</a>: Document @PreserveOnRefresh</li> - <li><a href="http://dev.vaadin.com/ticket/10289">#10289</a>: Javadoc for com.vaadin.ui.Window contains wrong information</li> - <li><a href="http://dev.vaadin.com/ticket/10293">#10293</a>: Resolve sass compiler thread safety problems in servlet</li> - <li><a href="http://dev.vaadin.com/ticket/10294">#10294</a>: Change primary style name mixin parameter to $primaryStyleName</li> - <li><a href="http://dev.vaadin.com/ticket/10299">#10299</a>: SassCompiler input argument not resolved correctly</li> - <li><a href="http://dev.vaadin.com/ticket/10300">#10300</a>: Panel and Window constructors should use Component</li> - <li><a href="http://dev.vaadin.com/ticket/10302">#10302</a>: Remove RpcManager interface as ServerRpcManager must be used</li> - <li><a href="http://dev.vaadin.com/ticket/10303">#10303</a>: Move HasComponents.isComponentVisible to SelectiveRenderer.isRendered</li> - <li><a href="http://dev.vaadin.com/ticket/10304">#10304</a>: Update ServerConnector.getState javadoc</li> - <li><a href="http://dev.vaadin.com/ticket/10305">#10305</a>: Rename Page.setBrowserWindowSize to updateBrowserWindowSize</li> - <li><a href="http://dev.vaadin.com/ticket/10306">#10306</a>: Change WebBrowser.getTimezoneOffset and getRawTimezoneOffset to return int instead of Integer</li> - <li><a href="http://dev.vaadin.com/ticket/10308">#10308</a>: SassCompiler drops selectors when & is used</li> - <li><a href="http://dev.vaadin.com/ticket/10309">#10309</a>: SassCompiler wrong order when nesting</li> - <li><a href="http://dev.vaadin.com/ticket/10310">#10310</a>: Compare.Equal passesFilter() does not work on some Comparable values</li> - <li><a href="http://dev.vaadin.com/ticket/10315">#10315</a>: No propagation tabIndex on PopupFIeld, Table, Selects</li> - <li><a href="http://dev.vaadin.com/ticket/10316">#10316</a>: fails to parse selectors with parenthesis "(", ")" in styles.scss</li> - <li><a href="http://dev.vaadin.com/ticket/10318">#10318</a>: Compare performance with Vaadin 6</li> - <li><a href="http://dev.vaadin.com/ticket/10322">#10322</a>: vaadin-shared-deps osgi manifest should declare versions</li> - <li><a href="http://dev.vaadin.com/ticket/10324">#10324</a>: Fix GridLayout to update hierarchy in onConnectorHierarchyChange</li> - <li><a href="http://dev.vaadin.com/ticket/10325">#10325</a>: Opening a sub-window without content displays client-side exception</li> - <li><a href="http://dev.vaadin.com/ticket/10326">#10326</a>: SassCompiler wrong order when mixing parent selectors and other blocks</li> - <li><a href="http://dev.vaadin.com/ticket/10330">#10330</a>: Wrap themes in themename{}</li> - <li><a href="http://dev.vaadin.com/ticket/10332">#10332</a>: Nothing happens in browser if UI.init throws exception</li> - <li><a href="http://dev.vaadin.com/ticket/10337">#10337</a>: Refactor Extension API</li> - <li><a href="http://dev.vaadin.com/ticket/10339">#10339</a>: SassCompiler should be the only public API to sass ATM</li> - <li><a href="http://dev.vaadin.com/ticket/10340">#10340</a>: Rename ComponentEventListener to ConnectorEventListener</li> - <li><a href="http://dev.vaadin.com/ticket/10355">#10355</a>: Debug window no longer gets any styles</li> - <li><a href="http://dev.vaadin.com/ticket/10357">#10357</a>: Debug console can't find its theme</li> - <li><a href="http://dev.vaadin.com/ticket/10358">#10358</a>: Specfiy version numbers for vaadin-shared-deps imports</li> - <li><a href="http://dev.vaadin.com/ticket/10359">#10359</a>: Test using Firefox 17 ESR</li> - <li><a href="http://dev.vaadin.com/ticket/10360">#10360</a>: Overlays cause scrollbars on body</li> - <li><a href="http://dev.vaadin.com/ticket/10362">#10362</a>: Browser specific theme selectors broken</li> - <li><a href="http://dev.vaadin.com/ticket/10364">#10364</a>: com.vaadin.server.ServerRpcManager not Serializable</li> - <li><a href="http://dev.vaadin.com/ticket/10367">#10367</a>: Session scope converters doesn't properly works with Vaadin 7</li> - <li><a href="http://dev.vaadin.com/ticket/10369">#10369</a>: Include fixes from Vaadin 6</li> - <li><a href="http://dev.vaadin.com/ticket/10370">#10370</a>: Set Cache-Control in heartbeat responses</li> - <li><a href="http://dev.vaadin.com/ticket/10372">#10372</a>: Debug window should tell which theme is being used</li> - <li><a href="http://dev.vaadin.com/ticket/10373">#10373</a>: Write a tutorial on how to change the "unsupported browser" page</li> - <li><a href="http://dev.vaadin.com/ticket/10374">#10374</a>: Throw an exception if a Window is added to the component hierarchy</li> - <li><a href="http://dev.vaadin.com/ticket/10375">#10375</a>: ClassCastException when resizing a Window containing a Label</li> - <li><a href="http://dev.vaadin.com/ticket/10378">#10378</a>: AbstractExtensionConnector.extend should be abstract</li> - <li><a href="http://dev.vaadin.com/ticket/10381">#10381</a>: NPE in StringToDoubleConverter</li> - <li><a href="http://dev.vaadin.com/ticket/10382">#10382</a>: Chameleon uses "body" prefix rules which are now broken</li> - <li><a href="http://dev.vaadin.com/ticket/10383">#10383</a>: LoginForm generated HTML does not get "themename" style resulting in inconsistent look</li> - <li><a href="http://dev.vaadin.com/ticket/10384">#10384</a>: Drag'n'drop drag-image should be attached to the overlay container</li> - <li><a href="http://dev.vaadin.com/ticket/10385">#10385</a>: Drag elements are not shown</li> - <li><a href="http://dev.vaadin.com/ticket/10386">#10386</a>: Uncaught exceptions are not styled</li> - <li><a href="http://dev.vaadin.com/ticket/10388">#10388</a>: First accordion tab cannot be closed when active</li> - <li><a href="http://dev.vaadin.com/ticket/10389">#10389</a>: VisualDesigner generates invalid code for Vaadin 7</li> - <li><a href="http://dev.vaadin.com/ticket/10395">#10395</a>: Update release notes</li> - <li><a href="http://dev.vaadin.com/ticket/10396">#10396</a>: Rewrite migration guide</li> - <li><a href="http://dev.vaadin.com/ticket/10397">#10397</a>: Update tutorials for Vaadin 7</li> - <li><a href="http://dev.vaadin.com/ticket/10399">#10399</a>: ClassCastException when using extensions with multiple portlets on the same page</li> - <li><a href="http://dev.vaadin.com/ticket/10400">#10400</a>: NPE from VUI.windowSizeMaybeChanged</li> - <li><a href="http://dev.vaadin.com/ticket/10401">#10401</a>: Add Notification.show(String caption, String message, Type type) helper</li> - <li><a href="http://dev.vaadin.com/ticket/10404">#10404</a>: TabSheet containing a HasComponent causes child not to be rendered</li> - <li><a href="http://dev.vaadin.com/ticket/10406">#10406</a>: SCSS parser (sometimes) fails after ":" (colon) inside @mixin</li> - <li><a href="http://dev.vaadin.com/ticket/10408">#10408</a>: Converter created in a ConverterFactory isn't used in Table</li> - <li><a href="http://dev.vaadin.com/ticket/10409">#10409</a>: Table never uses ConverterFactory converters</li> - <li><a href="http://dev.vaadin.com/ticket/10411">#10411</a>: VaadinSession throws NPE if Http session is invalidated</li> - <li><a href="http://dev.vaadin.com/ticket/10414">#10414</a>: CustomComponent setVisible doesn't show the component</li> - <li><a href="http://dev.vaadin.com/ticket/10415">#10415</a>: vaadin-theme-compiler incorrectly depends on old vaadin-shared-deps</li> - <li><a href="http://dev.vaadin.com/ticket/10416">#10416</a>: ListSelect jumps to top row after each client -> server contact</li> - <li><a href="http://dev.vaadin.com/ticket/10417">#10417</a>: com.google.gwt.user.client.rpc.IsSerializable should be in vaadin-shared</li> - <li><a href="http://dev.vaadin.com/ticket/10418">#10418</a>: AbstractSplitPanel.setMinSplitPosition takes incorrect parameter type</li> - <li><a href="http://dev.vaadin.com/ticket/10419">#10419</a>: Data type conversion forced for non-used fields of a BeanItem</li> - <li><a href="http://dev.vaadin.com/ticket/10421">#10421</a>: Serving *nocache* files using VaadinServlet should not set the cache header to 1h</li> - <li><a href="http://dev.vaadin.com/ticket/10422">#10422</a>: It should be possible to remove the ?timestamp from the request for the widgetset</li> - <li><a href="http://dev.vaadin.com/ticket/10423">#10423</a>: "Object Expected" in IE8 if Native XMLHttpSupport is disabled</li> - <li><a href="http://dev.vaadin.com/ticket/10432">#10432</a>: ApplicationConnection.handleComponentRelativeSize and related methods serve no purpose</li> - <li><a href="http://dev.vaadin.com/ticket/10433">#10433</a>: AbstractComponentConnector.hasEventListener should be in AbstractConnector</li> - <li><a href="http://dev.vaadin.com/ticket/10434">#10434</a>: Wrong memcache expiration in GAEVaadinServlet</li> - <li><a href="http://dev.vaadin.com/ticket/10438">#10438</a>: @if does not work directly in @mixin</li> - <li><a href="http://dev.vaadin.com/ticket/10453">#10453</a>: Sass @mixin variables behaves strangely</li> - <li><a href="http://dev.vaadin.com/ticket/10458">#10458</a>: Unable to use a SQLContainer with ComboBox</li> - <li><a href="http://dev.vaadin.com/ticket/10478">#10478</a>: Form should support empty footer</li> - <li><a href="http://dev.vaadin.com/ticket/10479">#10479</a>: TabSheet custom stylename in GWT Mode gives NPE</li> - <li><a href="http://dev.vaadin.com/ticket/10480">#10480</a>: AssertionError when using DragAndDropWrapper with DevMode</li> - <li><a href="http://dev.vaadin.com/ticket/10481">#10481</a>: Custom VDropHandler causes NPE in JsonEncoder when dropping component</li> - <li><a href="http://dev.vaadin.com/ticket/10484">#10484</a>: ComboBox rendering problem in Runo Theme</li> - <li><a href="http://dev.vaadin.com/ticket/10485">#10485</a>: PopupDateField rendering problem in Runo and Chameleon theme</li> - <li><a href="http://dev.vaadin.com/ticket/10486">#10486</a>: @something should be passed through the sass compiler as-is</li> - <li><a href="http://dev.vaadin.com/ticket/10488">#10488</a>: Only measure connectors for which a measurement is actually required</li> - <li><a href="http://dev.vaadin.com/ticket/10489">#10489</a>: OrderedLayout should send detach and attach events when updating the DOM for expand</li> - <li><a href="http://dev.vaadin.com/ticket/10494">#10494</a>: Space not always properly allocated in ordered layout with fixed size</li> - <li><a href="http://dev.vaadin.com/ticket/10496">#10496</a>: Provide a way for connectors to avoid recalculating internal values if it gets multiple events based on the same data</li> - <li><a href="http://dev.vaadin.com/ticket/10498">#10498</a>: DateField in a GridLayout causes scrollbars in IE</li> - <li><a href="http://dev.vaadin.com/ticket/10503">#10503</a>: Panel content not displaying inside TabSheet</li> - <li><a href="http://dev.vaadin.com/ticket/10504">#10504</a>: FieldGroup bound to inherited layout error</li> - <li><a href="http://dev.vaadin.com/ticket/10505">#10505</a>: Sass compiler should preserve UTF-8 characters from imported files and output UTF-8 to the browser</li> - <li><a href="http://dev.vaadin.com/ticket/10511">#10511</a>: Compiling widgetset using plugin fails</li> - <li><a href="http://dev.vaadin.com/ticket/10520">#10520</a>: Write tutorial about using Vaadin 7 with Liferay</li> - <li><a href="http://dev.vaadin.com/ticket/10529">#10529</a>: "Not using retained UI" always prints Integer.class instead of the class of the UI</li> - <li><a href="http://dev.vaadin.com/ticket/10531">#10531</a>: Pixel values with fractions should not be rounded before sent to client</li> - <li><a href="http://dev.vaadin.com/ticket/10532">#10532</a>: Invalid state update for reattached connector</li> - <li><a href="http://dev.vaadin.com/ticket/10537">#10537</a>: NewItemsAllowed in Optiongroup and ListSelect give javascriptException</li> - <li><a href="http://dev.vaadin.com/ticket/10541">#10541</a>: TestBench 3 doesn't work with Vaadin 7 beta10</li> - <li><a href="http://dev.vaadin.com/ticket/10545">#10545</a>: FormFieldFactory should be deprecated in Vaadin 7</li> - <li><a href="http://dev.vaadin.com/ticket/10549">#10549</a>: Cannot send subclassed objects over RPC</li> - <li><a href="http://dev.vaadin.com/ticket/10553">#10553</a>: Provide a StringToFloat converter</li> - <li><a href="http://dev.vaadin.com/ticket/10559">#10559</a>: ComboBox popup higher in Firefox 17 than in other browsers</li> - <li><a href="http://dev.vaadin.com/ticket/10560">#10560</a>: EmailValidator on TextField always shows the error mark</li> - <li><a href="http://dev.vaadin.com/ticket/10561">#10561</a>: EmailValidator on TextField always shows the error symbol</li> - <li><a href="http://dev.vaadin.com/ticket/10562">#10562</a>: ReadOnlyException when TextField with setReadOnly(true) is added</li> - <li><a href="http://dev.vaadin.com/ticket/10564">#10564</a>: Ensure updateCaption is invoked for new children</li> - <li><a href="http://dev.vaadin.com/ticket/10587">#10587</a>: NativeButton broken in Liferay theme</li> - <li><a href="http://dev.vaadin.com/ticket/10588">#10588</a>: IE8 does not always update layout slot sizes</li> - <li><a href="http://dev.vaadin.com/ticket/10589">#10589</a>: Form error display does not work</li> - <li><a href="http://dev.vaadin.com/ticket/10593">#10593</a>: SassLinker fails for deeper folder hierarchies</li> - <li><a href="http://dev.vaadin.com/ticket/10594">#10594</a>: Unnesessary scss files from SassLinker</li> - <li><a href="http://dev.vaadin.com/ticket/10596">#10596</a>: SplitPanel splitter left in bad position if temporarily out of bounds</li> - <li><a href="http://dev.vaadin.com/ticket/10597">#10597</a>: Compile error for Microsoft css gradient filter</li> - <li><a href="http://dev.vaadin.com/ticket/10598">#10598</a>: Extra vertical scrollbars in IE 9</li> - <li><a href="http://dev.vaadin.com/ticket/10599">#10599</a>: Window with style Runo.WINDOW_DIALOG has rendering errors</li> - <li><a href="http://dev.vaadin.com/ticket/10606">#10606</a>: Chameleon styles ceased working in Vaadin 7</li> - <li><a href="http://dev.vaadin.com/ticket/10616">#10616</a>: Legacy style for Reindeer.TABSHEET_MINIMAL is broken in FF</li> - <li><a href="http://dev.vaadin.com/ticket/10630">#10630</a>: Uncaught client side exception with to narrow GridLayout in IE8</li> - <li><a href="http://dev.vaadin.com/ticket/10631">#10631</a>: MenuBar, css font-size in % / VerticalLayout, width in em / Button, size while dis-/enabled</li> - <li><a href="http://dev.vaadin.com/ticket/10636">#10636</a>: Util.getRequiredHeight/getRequiredWidth incorreclty rounds down for IE9</li> - <li><a href="http://dev.vaadin.com/ticket/10651">#10651</a>: Update release notes for RC1</li> - <li><a href="http://dev.vaadin.com/ticket/10656">#10656</a>: No requiredFieldIndicator for CustomField</li> - <li><a href="http://dev.vaadin.com/ticket/10658">#10658</a>: Bottom left corner of the Runo tabsheet is not visible</li> - <li><a href="http://dev.vaadin.com/ticket/10659">#10659</a>: "Can't start a new layout phase before the previous layout phase ends." in Opera 12</li> - <li><a href="http://dev.vaadin.com/ticket/10682">#10682</a>: Close element should not be placed before the caption text</li> - <li><a href="http://dev.vaadin.com/ticket/10705">#10705</a>: Vaadin beta 11 - Javascript error</li> - <li><a href="http://dev.vaadin.com/ticket/10710">#10710</a>: Enable building minimal widgetset</li> - <li><a href="http://dev.vaadin.com/ticket/10713">#10713</a>: NullPointerException on TextField validation</li> - <li><a href="http://dev.vaadin.com/ticket/10722">#10722</a>: Client ClassCastException Safari/IOS6</li> - <li><a href="http://dev.vaadin.com/ticket/10723">#10723</a>: Vaadin test war cannot be deployed to Liferay 6.1.1</li> - <li><a href="http://dev.vaadin.com/ticket/10735">#10735</a>: Ensure all server and shared classes are serializable</li> - <li><a href="http://dev.vaadin.com/ticket/10743">#10743</a>: NPE when reloading the browser</li> - <li><a href="http://dev.vaadin.com/ticket/10744">#10744</a>: Write tutorial about how to include a set of widgets in the eager bundle and defer others</li> - <li><a href="http://dev.vaadin.com/ticket/10746">#10746</a>: Correct which connectors are eagerly loaded</li> - <li><a href="http://dev.vaadin.com/ticket/10783">#10783</a>: A component which is 100% and expand=0 should not be shown</li> - <li><a href="http://dev.vaadin.com/ticket/10792">#10792</a>: Analyze layouts should show an error for a relative sized component which will not be expanded</li> - + <li>Separate server-side (<tt>vaadin-server</tt>) and client-side (<tt>vaadin-client</tt>, <tt>vaadin-client-compiler</tt>) development libraries</li> + <li>Precompiled widget set (<tt>vaadin-client-compiled</tt>) for server-side development</li> + <li>Shared library (<tt>vaadin-shared</tt>) for both server- and client-side libraries</li> + <li>Built-in themes (<tt>vaadin-themes</tt>) and the theme compiler (<tt>vaadin-theme-compiler</tt>)</li> + <li>Dependency libraries provided under the <tt>lib/</tt> folder</li> </ul> + <p> + See the <tt>README.TXT</tt> in the installation package for detailed information + about the package contents. <a href="http://vaadin.com/book">Book of Vaadin</a> + (for Vaadin 7) gives more detailed instructions. + </p> + + <p> + For server-side development, copy the <tt>vaadin-server</tt>, + <tt>vaadin-client-compiled</tt>, <tt>vaadin-shared</tt>, + <tt>vaadin-theme-compiler</tt>, and <tt>vaadin-themes</tt> from the main + folder and the dependencies from the <tt>lib</tt> folder to the + <tt>WEB-INF/lib</tt> folder of your Vaadin project. (The + <tt>vaadin-client-compiled</tt> is necessary if you do not wish to compile the + widget set by your own, which you need to do if you use almost any add-on + components.) + </p> + + <p> + For pure client-side development, you only need the <tt>vaadin-client</tt> and + <tt>vaadin-client-compiler</tt> JARs, which should be put to a non-deployed + project library folder, such as <tt>lib</tt>. You also need them if you compile + the widget set for any reason, such as using Vaadin add-ons, or create new + server-side components integrated with client-side widgets. + </p> + <h2 id="migrating">Migrating from Vaadin 6</h2> <p> diff --git a/all/build.xml b/all/build.xml index ef8ac71c4d..40d82b3d47 100644 --- a/all/build.xml +++ b/all/build.xml @@ -35,6 +35,9 @@ </target> <target name="javadoc" depends="copy-jars"> + <!-- Ensure filtered webcontent files are available --> + <antcall target="common.filter.webcontent" /> + <!-- Unpack all source files to javadoc.temp.dir--> <antcontrib:foreach list="${modules.to.publish.to.maven}" target="unzip.to.javadoctemp" param="module" /> @@ -76,6 +79,9 @@ </target> <target name="zip" depends="copy-jars, javadoc"> + <!-- Ensure filtered webcontent files are available --> + <antcall target="common.filter.webcontent" /> + <zip destfile="${zip.file}"> <fileset dir="${temp.dir}"> <!-- Avoid conflicts with servlet and portlet API. They are provided by the container --> diff --git a/build/bin/closed-to-rn.py b/build/bin/closed-to-rn.py deleted file mode 100644 index 0928877e1c..0000000000 --- a/build/bin/closed-to-rn.py +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/python - -import sys,string - -filename = sys.argv[1] - -fin = open(filename, "r") -lines = fin.readlines() -fin.close() - -for line in lines: - fields = string.split(line, "\t") - - if fields[0] != "id": - ticketid = "<a href=\"http://dev.vaadin.com/ticket/%s\">#%s</a>" % (fields[0],fields[0]) - print " <li>%s: %s</li>" % (ticketid, fields[1]) diff --git a/buildhelpers/build.xml b/buildhelpers/build.xml index c7b9eba9d3..b56209f6cc 100644 --- a/buildhelpers/build.xml +++ b/buildhelpers/build.xml @@ -36,6 +36,13 @@ </antcall> </target> + <target name="fetch-release-notes-tickets"> + <antcall target="common.exec-buildhelper"> + <param name="main.class" value="com.vaadin.buildhelpers.FetchReleaseNotesTickets" /> + <param name="output" value="${output}" /> + </antcall> + </target> + <target name="tests" depends="checkstyle"> <!--<antcall target="common.tests.run" />--> <echo>WHAT? No JUnit tests for ${module.name}!</echo> diff --git a/buildhelpers/ivy.xml b/buildhelpers/ivy.xml index ba44ebfc3f..d8e4457296 100644 --- a/buildhelpers/ivy.xml +++ b/buildhelpers/ivy.xml @@ -27,6 +27,8 @@ <artifact type="pom" ext="pom" /> </publications> - <dependencies /> + <dependencies> + <dependency org="commons-io" name="commons-io" rev="1.4" /> + </dependencies> </ivy-module> diff --git a/buildhelpers/src/com/vaadin/buildhelpers/FetchReleaseNotesTickets.java b/buildhelpers/src/com/vaadin/buildhelpers/FetchReleaseNotesTickets.java new file mode 100644 index 0000000000..76952bb329 --- /dev/null +++ b/buildhelpers/src/com/vaadin/buildhelpers/FetchReleaseNotesTickets.java @@ -0,0 +1,46 @@ +package com.vaadin.buildhelpers; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.util.List; + +import org.apache.commons.io.IOUtils; + +public class FetchReleaseNotesTickets { + private static final String queryURL = "http://dev.vaadin.com/query?status=closed&milestone=Vaadin+@version@&resolution=fixed&format=tab&order=id"; + private static final String ticketTemplate = " <li><a href=\"http://dev.vaadin.com/ticket/@ticket@\">#@ticket@</a>: @description@</li>"; + + public static void main(String[] args) throws IOException { + String version = System.getProperty("vaadin.version"); + if (version == null || version.equals("")) { + usage(); + } + + URL url = new URL(queryURL.replace("@version@", version)); + URLConnection connection = url.openConnection(); + InputStream urlStream = connection.getInputStream(); + + @SuppressWarnings("unchecked") + List<String> tickets = IOUtils.readLines(urlStream); + + for (String ticket : tickets) { + String[] fields = ticket.split("\t"); + if ("id".equals(fields[0])) { + // This is the header + continue; + } + System.out.println(ticketTemplate.replace("@ticket@", fields[0]) + .replace("@description@", fields[1])); + } + urlStream.close(); + } + + private static void usage() { + System.err.println("Usage: " + + FetchReleaseNotesTickets.class.getSimpleName() + + " -Dvaadin.version=<version>"); + System.exit(1); + } +} diff --git a/client-compiled/build.xml b/client-compiled/build.xml index d1f3eda674..1a78b17a7f 100644 --- a/client-compiled/build.xml +++ b/client-compiled/build.xml @@ -98,6 +98,9 @@ </target> <target name="client-compiled-cache.jar" depends="default-widgetset-cache"> + <!-- Ensure filtered webcontent files are available --> + <antcall target="common.filter.webcontent" /> + <jar file="${compiled-cache.jar}" compress="true"> <fileset dir="${gwtar.dir}"> <include name="**/*.gwtar" /> diff --git a/client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java b/client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java index f8aa586064..2be3bf5a16 100644 --- a/client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java +++ b/client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java @@ -334,6 +334,22 @@ public class ConnectorBundleLoaderFactory extends Generator { writeGetters(logger, w, bundle); writeSerializers(logger, w, bundle); writeDelegateToWidget(logger, w, bundle); + writeHasGetTooltip(logger, w, bundle); + } + + /** + * @deprecated As of 7.0.1. This is just a hack to avoid breaking backwards + * compatibility and will be removed in Vaadin 7.1 + */ + @Deprecated + private void writeHasGetTooltip(TreeLogger logger, SplittingSourceWriter w, + ConnectorBundle bundle) { + Set<JClassType> types = bundle.getHasGetTooltip(); + for (JClassType type : types) { + w.println("store.setHasGetTooltipInfo(%s);", + getClassLiteralString(type)); + w.splitIfNeeded(); + } } private void writeDelegateToWidget(TreeLogger logger, diff --git a/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ConnectorBundle.java b/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ConnectorBundle.java index ff91e249b7..f6dc982f15 100644 --- a/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ConnectorBundle.java +++ b/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ConnectorBundle.java @@ -63,6 +63,7 @@ public class ConnectorBundle { private final Set<JClassType> needsGwtConstructor = new HashSet<JClassType>(); private final Set<JClassType> visitedTypes = new HashSet<JClassType>(); private final Set<JClassType> needsProxySupport = new HashSet<JClassType>(); + private final Set<JClassType> hasGetTooltip = new HashSet<JClassType>(); private final Map<JClassType, Set<String>> identifiers = new HashMap<JClassType, Set<String>>(); private final Map<JClassType, Set<JMethod>> needsReturnType = new HashMap<JClassType, Set<JMethod>>(); @@ -618,4 +619,38 @@ public class ConnectorBundle { public Set<Property> getNeedsDelegateToWidget() { return Collections.unmodifiableSet(needsDelegateToWidget); } + + /** + * @deprecated As of 7.0.1. This is just a hack to avoid breaking backwards + * compatibility and will be removed in Vaadin 7.1 + */ + @Deprecated + public Set<JClassType> getHasGetTooltip() { + return Collections.unmodifiableSet(hasGetTooltip); + } + + /** + * @deprecated As of 7.0.1. This is just a hack to avoid breaking backwards + * compatibility and will be removed in Vaadin 7.1 + */ + @Deprecated + public void setHasGetTooltip(JClassType type) { + if (!isHasGetTooltip(type)) { + hasGetTooltip.add(type); + } + } + + /** + * @deprecated As of 7.0.1. This is just a hack to avoid breaking backwards + * compatibility and will be removed in Vaadin 7.1 + */ + @Deprecated + private boolean isHasGetTooltip(JClassType type) { + if (hasGetTooltip.contains(type)) { + return true; + } else { + return previousBundle != null + && previousBundle.isHasGetTooltip(type); + } + } }
\ No newline at end of file diff --git a/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/WidgetInitVisitor.java b/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/WidgetInitVisitor.java index 4de9d2ae99..662ecf872b 100644 --- a/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/WidgetInitVisitor.java +++ b/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/WidgetInitVisitor.java @@ -47,6 +47,25 @@ public class WidgetInitVisitor extends TypeVisitor { bundle.setNeedsReturnType(type, getWidget); } + // Hack to detect when getTooltipInfo has a custom implementation + // #11051 + JClassType getTooltipParamType = type.getOracle().findType( + "com.google.gwt.dom.client.Element"); + JMethod getTooltipInfoMethod = findInheritedMethod(type, + "getTooltipInfo", getTooltipParamType); + if (getTooltipInfoMethod == null) { + logger.log(Type.ERROR, "Could not find getTooltipInfo in " + + type.getQualifiedSourceName()); + throw new UnableToCompleteException(); + } + JClassType enclosingType = getTooltipInfoMethod.getEnclosingType(); + if (!enclosingType.getQualifiedSourceName().equals( + AbstractComponentConnector.class.getCanonicalName())) { + logger.log(Type.WARN, type.getQualifiedSourceName() + + " has overridden getTooltipInfo"); + bundle.setHasGetTooltip(type); + } + // Check state properties for @DelegateToWidget JMethod getState = findInheritedMethod(type, "getState"); JClassType stateType = getState.getReturnType().isClass(); diff --git a/client/src/com/vaadin/client/ApplicationConfiguration.java b/client/src/com/vaadin/client/ApplicationConfiguration.java index 5c3ec36d78..9ba660626e 100644 --- a/client/src/com/vaadin/client/ApplicationConfiguration.java +++ b/client/src/com/vaadin/client/ApplicationConfiguration.java @@ -381,11 +381,14 @@ public class ApplicationConfiguration implements EntryPoint { @Override public void execute() { + Profiler.enter("ApplicationConfiguration.startApplication"); ApplicationConfiguration appConf = getConfigFromDOM(applicationId); ApplicationConnection a = GWT .create(ApplicationConnection.class); a.init(widgetSet, appConf); runningApplications.add(a); + Profiler.leave("ApplicationConfiguration.startApplication"); + a.start(); } }); @@ -532,6 +535,8 @@ public class ApplicationConfiguration implements EntryPoint { @Override public void onModuleLoad() { + Profiler.reset(); + Profiler.enter("ApplicationConfiguration.onModuleLoad"); BrowserInfo browserInfo = BrowserInfo.get(); @@ -567,6 +572,7 @@ public class ApplicationConfiguration implements EntryPoint { VConsole.getImplementation().error(e); } }); + Profiler.leave("ApplicationConfiguration.onModuleLoad"); if (SuperDevMode.enableBasedOnParameter()) { // Do not start any application as super dev mode will refresh the diff --git a/client/src/com/vaadin/client/ApplicationConnection.java b/client/src/com/vaadin/client/ApplicationConnection.java index 44c7397655..de034a65a6 100644 --- a/client/src/com/vaadin/client/ApplicationConnection.java +++ b/client/src/com/vaadin/client/ApplicationConnection.java @@ -1311,8 +1311,6 @@ public class ApplicationConnection { return; } - Profiler.reset(); - VConsole.log("Handling message from server"); eventBus.fireEvent(new ResponseHandlingStartedEvent(this)); @@ -1397,15 +1395,12 @@ public class ApplicationConnection { Profiler.leave("Handling locales"); Profiler.enter("Handling meta information"); - boolean repaintAll = false; ValueMap meta = null; if (json.containsKey("meta")) { VConsole.log(" * Handling meta information"); meta = json.getValueMap("meta"); if (meta.containsKey("repaintAll")) { - repaintAll = true; - uIConnector.getWidget().clear(); - getConnectorMap().clear(); + prepareRepaintAll(); if (meta.containsKey("invalidLayouts")) { validatingLayouts = true; } @@ -1528,10 +1523,46 @@ public class ApplicationConnection { endRequest(); if (Profiler.isEnabled()) { - Profiler.logTimings(); - Profiler.reset(); + Scheduler.get().scheduleDeferred(new ScheduledCommand() { + @Override + public void execute() { + Profiler.logTimings(); + Profiler.reset(); + } + }); + } + + } + + /** + * Properly clean up any old stuff to ensure everything is properly + * reinitialized. + */ + private void prepareRepaintAll() { + String uiConnectorId = uIConnector.getConnectorId(); + if (uiConnectorId == null) { + // Nothing to clear yet + return; } + // Create fake server response that says that the uiConnector + // has no children + JSONObject fakeHierarchy = new JSONObject(); + fakeHierarchy.put(uiConnectorId, new JSONArray()); + JSONObject fakeJson = new JSONObject(); + fakeJson.put("hierarchy", fakeHierarchy); + ValueMap fakeValueMap = fakeJson.getJavaScriptObject().cast(); + + // Update hierarchy based on the fake response + ConnectorHierarchyUpdateResult connectorHierarchyUpdateResult = updateConnectorHierarchy(fakeValueMap); + + // Send hierarchy events based on the fake update + sendHierarchyChangeEvents(connectorHierarchyUpdateResult.events); + + // Unregister all the old connectors that have now been removed + unregisterRemovedConnectors(); + + getLayoutManager().cleanMeasuredSizes(); } private void updateCaptions( @@ -1548,8 +1579,10 @@ public class ApplicationConnection { // Find components with potentially changed caption state for (StateChangeEvent event : pendingStateChangeEvents) { - ServerConnector connector = event.getConnector(); - needsCaptionUpdate.add(connector); + if (VCaption.mightChange(event)) { + ServerConnector connector = event.getConnector(); + needsCaptionUpdate.add(connector); + } } // Update captions for all suitable candidates @@ -1916,6 +1949,7 @@ public class ApplicationConnection { } } + Profiler.enter("updateConnectorState newWithoutState"); // Fire events for properties using the default value for newly // created connectors even if there were no state changes for (ServerConnector connector : remainingNewConnectors) { @@ -1928,6 +1962,7 @@ public class ApplicationConnection { events.add(event); } + Profiler.leave("updateConnectorState newWithoutState"); Profiler.leave("updateConnectorState"); diff --git a/client/src/com/vaadin/client/ConnectorMap.java b/client/src/com/vaadin/client/ConnectorMap.java index 5f6053dd32..810f12824a 100644 --- a/client/src/com/vaadin/client/ConnectorMap.java +++ b/client/src/com/vaadin/client/ConnectorMap.java @@ -126,8 +126,9 @@ public class ConnectorMap { componentDetail.setConnector(connector); if (connector instanceof ComponentConnector) { ComponentConnector pw = (ComponentConnector) connector; + Widget widget = pw.getWidget(); Profiler.enter("ConnectorMap.setConnectorId"); - setConnectorId(pw.getWidget().getElement(), id); + setConnectorId(widget.getElement(), id); Profiler.leave("ConnectorMap.setConnectorId"); } Profiler.leave("ConnectorMap.registerConnector"); diff --git a/client/src/com/vaadin/client/FastStringMap.java b/client/src/com/vaadin/client/FastStringMap.java index cbb61427d2..5b15b1263a 100644 --- a/client/src/com/vaadin/client/FastStringMap.java +++ b/client/src/com/vaadin/client/FastStringMap.java @@ -1,5 +1,5 @@ /* - * Copyright 2012 Vaadin Ltd. + * Copyright 2000-2013 Vaadin Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/client/src/com/vaadin/client/JsArrayObject.java b/client/src/com/vaadin/client/JsArrayObject.java index 182b68ac3f..5b45650684 100644 --- a/client/src/com/vaadin/client/JsArrayObject.java +++ b/client/src/com/vaadin/client/JsArrayObject.java @@ -1,5 +1,5 @@ /* - * Copyright 2012 Vaadin Ltd. + * Copyright 2000-2013 Vaadin Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/client/src/com/vaadin/client/VCaption.java b/client/src/com/vaadin/client/VCaption.java index efa9be1850..47287636c4 100644 --- a/client/src/com/vaadin/client/VCaption.java +++ b/client/src/com/vaadin/client/VCaption.java @@ -20,6 +20,7 @@ import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.HTML; +import com.vaadin.client.communication.StateChangeEvent; import com.vaadin.client.ui.AbstractFieldConnector; import com.vaadin.client.ui.Icon; import com.vaadin.shared.AbstractComponentState; @@ -408,6 +409,29 @@ public class VCaption extends HTML { } /** + * Checks whether anything in a given state change might cause the caption + * to change. + * + * @param event + * the state change event to check + * @return <code>true</code> if the caption might have changed; otherwise + * <code>false</code> + */ + public static boolean mightChange(StateChangeEvent event) { + if (event.hasPropertyChanged("caption")) { + return true; + } + if (event.hasPropertyChanged("resources")) { + return true; + } + if (event.hasPropertyChanged("errorMessage")) { + return true; + } + + return false; + } + + /** * Returns Paintable for which this Caption belongs to. * * @return owner Widget diff --git a/client/src/com/vaadin/client/VTooltip.java b/client/src/com/vaadin/client/VTooltip.java index 6e365b4017..759b90a8cd 100644 --- a/client/src/com/vaadin/client/VTooltip.java +++ b/client/src/com/vaadin/client/VTooltip.java @@ -366,8 +366,10 @@ public class VTooltip extends VOverlay { * Widget which DOM handlers are connected */ public void connectHandlersToWidget(Widget widget) { + Profiler.enter("VTooltip.connectHandlersToWidget"); widget.addDomHandler(tooltipEventHandler, MouseMoveEvent.getType()); widget.addDomHandler(tooltipEventHandler, ClickEvent.getType()); widget.addDomHandler(tooltipEventHandler, KeyDownEvent.getType()); + Profiler.leave("VTooltip.connectHandlersToWidget"); } } diff --git a/client/src/com/vaadin/client/metadata/AsyncBundleLoader.java b/client/src/com/vaadin/client/metadata/AsyncBundleLoader.java index e0ebb5e047..6be89c9cc9 100644 --- a/client/src/com/vaadin/client/metadata/AsyncBundleLoader.java +++ b/client/src/com/vaadin/client/metadata/AsyncBundleLoader.java @@ -19,6 +19,8 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import com.vaadin.client.Profiler; + public abstract class AsyncBundleLoader { public enum State { NOT_STARTED, LOADING, LOADED, ERROR; @@ -63,9 +65,11 @@ public abstract class AsyncBundleLoader { public void load(BundleLoadCallback callback, TypeDataStore store) { assert state == State.NOT_STARTED; + Profiler.enter("AsyncBundleLoader.load"); state = State.LOADING; addCallback(callback); load(store); + Profiler.leave("AsyncBundleLoader.load"); } public void addCallback(BundleLoadCallback callback) { diff --git a/client/src/com/vaadin/client/metadata/TypeDataStore.java b/client/src/com/vaadin/client/metadata/TypeDataStore.java index 5b466146a3..c1eca0a168 100644 --- a/client/src/com/vaadin/client/metadata/TypeDataStore.java +++ b/client/src/com/vaadin/client/metadata/TypeDataStore.java @@ -38,6 +38,7 @@ public class TypeDataStore { private final FastStringSet delayedMethods = FastStringSet.create(); private final FastStringSet lastOnlyMethods = FastStringSet.create(); + private final FastStringSet hasGetTooltipInfo = FastStringSet.create(); private final FastStringMap<Type> returnTypes = FastStringMap.create(); private final FastStringMap<Invoker> invokers = FastStringMap.create(); @@ -276,4 +277,22 @@ public class TypeDataStore { public static boolean hasProperties(Type type) { return get().properties.containsKey(type.getSignature()); } + + /** + * @deprecated As of 7.0.1. This is just a hack to avoid breaking backwards + * compatibility and will be removed in Vaadin 7.1 + */ + @Deprecated + public void setHasGetTooltipInfo(Class<?> clazz) { + hasGetTooltipInfo.add(getType(clazz).getSignature()); + } + + /** + * @deprecated As of 7.0.1. This is just a hack to avoid breaking backwards + * compatibility and will be removed in Vaadin 7.1 + */ + @Deprecated + public static boolean getHasGetTooltipInfo(Class clazz) { + return get().hasGetTooltipInfo.contains(getType(clazz).getSignature()); + } } diff --git a/client/src/com/vaadin/client/ui/AbstractComponentConnector.java b/client/src/com/vaadin/client/ui/AbstractComponentConnector.java index e35e3eafcf..694db6f02c 100644 --- a/client/src/com/vaadin/client/ui/AbstractComponentConnector.java +++ b/client/src/com/vaadin/client/ui/AbstractComponentConnector.java @@ -15,9 +15,6 @@ */ package com.vaadin.client.ui; -import java.util.ArrayList; -import java.util.List; - import com.google.gwt.core.client.JsArrayString; import com.google.gwt.dom.client.Element; import com.google.gwt.user.client.ui.Focusable; @@ -27,6 +24,7 @@ import com.vaadin.client.ApplicationConnection; import com.vaadin.client.ComponentConnector; import com.vaadin.client.HasComponentsConnector; import com.vaadin.client.LayoutManager; +import com.vaadin.client.Profiler; import com.vaadin.client.ServerConnector; import com.vaadin.client.StyleConstants; import com.vaadin.client.TooltipInfo; @@ -37,6 +35,7 @@ import com.vaadin.client.communication.StateChangeEvent; import com.vaadin.client.metadata.NoDataException; import com.vaadin.client.metadata.Type; import com.vaadin.client.metadata.TypeData; +import com.vaadin.client.metadata.TypeDataStore; import com.vaadin.client.ui.datefield.PopupDateFieldConnector; import com.vaadin.client.ui.ui.UIConnector; import com.vaadin.shared.AbstractComponentState; @@ -55,6 +54,8 @@ public abstract class AbstractComponentConnector extends AbstractConnector private boolean initialStateEvent = true; + private boolean tooltipListenersAttached = false; + /** * The style names from getState().getStyles() which are currently applied * to the widget. @@ -67,14 +68,6 @@ public abstract class AbstractComponentConnector extends AbstractConnector public AbstractComponentConnector() { } - @Override - protected void init() { - super.init(); - - getConnection().getVTooltip().connectHandlersToWidget(getWidget()); - - } - /** * Creates and returns the widget for this VPaintableWidget. This method * should only be called once when initializing the paintable. @@ -105,7 +98,11 @@ public abstract class AbstractComponentConnector extends AbstractConnector @Override public Widget getWidget() { if (widget == null) { + Profiler.enter("AbstractComponentConnector.createWidget for " + + Util.getSimpleName(this)); widget = createWidget(); + Profiler.leave("AbstractComponentConnector.createWidget for " + + Util.getSimpleName(this)); } return widget; @@ -123,6 +120,8 @@ public abstract class AbstractComponentConnector extends AbstractConnector @Override public void onStateChanged(StateChangeEvent stateChangeEvent) { + Profiler.enter("AbstractComponentConnector.onStateChanged"); + Profiler.enter("AbstractComponentConnector.onStateChanged update id"); if (stateChangeEvent.hasPropertyChanged("id")) { if (getState().id != null) { getWidget().getElement().setId(getState().id); @@ -130,17 +129,20 @@ public abstract class AbstractComponentConnector extends AbstractConnector getWidget().getElement().removeAttribute("id"); } } + Profiler.leave("AbstractComponentConnector.onStateChanged update id"); /* * Disabled state may affect (override) tabindex so the order must be * first setting tabindex, then enabled state (through super * implementation). */ + Profiler.enter("AbstractComponentConnector.onStateChanged update tab index"); if (getState() instanceof TabIndexState && getWidget() instanceof Focusable) { ((Focusable) getWidget()) .setTabIndex(((TabIndexState) getState()).tabIndex); } + Profiler.leave("AbstractComponentConnector.onStateChanged update tab index"); super.onStateChanged(stateChangeEvent); @@ -154,7 +156,20 @@ public abstract class AbstractComponentConnector extends AbstractConnector updateComponentSize(); + Profiler.enter("AbstractComponentContainer.onStateChanged check tooltip"); + if (!tooltipListenersAttached && hasTooltip()) { + /* + * Add event handlers for tooltips if they are needed but have not + * yet been added. + */ + tooltipListenersAttached = true; + getConnection().getVTooltip().connectHandlersToWidget(getWidget()); + } + Profiler.leave("AbstractComponentContainer.onStateChanged check tooltip"); + initialStateEvent = false; + + Profiler.leave("AbstractComponentConnector.onStateChanged"); } @Override @@ -182,6 +197,8 @@ public abstract class AbstractComponentConnector extends AbstractConnector } private void updateComponentSize() { + Profiler.enter("AbstractComponentConnector.updateComponentSize"); + String newWidth = getState().width == null ? "" : getState().width; String newHeight = getState().height == null ? "" : getState().height; @@ -209,11 +226,17 @@ public abstract class AbstractComponentConnector extends AbstractConnector // Set defined sizes Widget widget = getWidget(); + Profiler.enter("AbstractComponentConnector.updateComponentSize update styleNames"); widget.setStyleName("v-has-width", !isUndefinedWidth()); widget.setStyleName("v-has-height", !isUndefinedHeight()); + Profiler.leave("AbstractComponentConnector.updateComponentSize update styleNames"); + Profiler.enter("AbstractComponentConnector.updateComponentSize update DOM"); widget.setHeight(newHeight); widget.setWidth(newWidth); + Profiler.leave("AbstractComponentConnector.updateComponentSize update DOM"); + + Profiler.leave("AbstractComponentConnector.updateComponentSize"); } @Override @@ -257,10 +280,12 @@ public abstract class AbstractComponentConnector extends AbstractConnector * </p> */ protected void updateWidgetStyleNames() { + Profiler.enter("AbstractComponentConnector.updateWidgetStyleNames"); AbstractComponentState state = getState(); String primaryStyleName = getWidget().getStylePrimaryName(); - if (state.primaryStyleName != null) { + if (state.primaryStyleName != null + && !state.primaryStyleName.equals(primaryStyleName)) { /* * We overwrite the widgets primary stylename if state defines a * primary stylename. @@ -302,7 +327,7 @@ public abstract class AbstractComponentConnector extends AbstractConnector } } - + Profiler.leave("AbstractComponentConnector.updateWidgetStyleNames"); } /** @@ -394,11 +419,16 @@ public abstract class AbstractComponentConnector extends AbstractConnector } } - /* - * (non-Javadoc) + /** + * {@inheritDoc} + * + * <p> + * When overriding this method, {@link #hasTooltip()} should also be + * overridden to return true in all situations where this method might + * return a non-empty result. + * </p> * - * @see com.vaadin.client.ComponentConnector#getTooltipInfo(com. - * google.gwt.dom.client.Element) + * @see ComponentConnector#getTooltipInfo(Element) */ @Override public TooltipInfo getTooltipInfo(Element element) { @@ -406,6 +436,35 @@ public abstract class AbstractComponentConnector extends AbstractConnector } /** + * Check whether there might be a tooltip for this component. The framework + * will only add event listeners for automatically handling tooltips (using + * {@link #getTooltipInfo(Element)}) if this method returns true. + * + * @return <code>true</code> if some part of the component might have a + * tooltip, otherwise <code>false</code> + */ + private boolean hasTooltip() { + /* + * Hack to avoid breaking backwards compatibility - use a generator to + * know whether there's a custom implementation of getTooltipInfo, and + * in that case always assume that there might be tooltip. + */ + if (TypeDataStore.getHasGetTooltipInfo(getClass())) { + return true; + } + + // Normally, there is a tooltip if description or errorMessage is set + AbstractComponentState state = getState(); + if (state.description != null && !state.description.equals("")) { + return true; + } else if (state.errorMessage != null && !state.errorMessage.equals("")) { + return true; + } else { + return false; + } + } + + /** * Gets the icon set for this component. * * @return the URL of the icon, or <code>null</code> if no icon has been diff --git a/client/src/com/vaadin/client/ui/AbstractConnector.java b/client/src/com/vaadin/client/ui/AbstractConnector.java index 32f5370dc3..2c76aa93fe 100644 --- a/client/src/com/vaadin/client/ui/AbstractConnector.java +++ b/client/src/com/vaadin/client/ui/AbstractConnector.java @@ -218,6 +218,7 @@ public abstract class AbstractConnector implements ServerConnector, } if (statePropertyHandlerManagers != null && event instanceof StateChangeEvent) { + Profiler.enter("AbstractConnector.fireEvent statePropertyHandlerManagers"); StateChangeEvent stateChangeEvent = (StateChangeEvent) event; JsArrayString keys = statePropertyHandlerManagers.getKeys(); for (int i = 0; i < keys.length(); i++) { @@ -226,6 +227,7 @@ public abstract class AbstractConnector implements ServerConnector, statePropertyHandlerManagers.get(property).fireEvent(event); } } + Profiler.leave("AbstractConnector.fireEvent statePropertyHandlerManagers"); } if (Profiler.isEnabled()) { Profiler.leave(profilerKey); @@ -400,6 +402,7 @@ public abstract class AbstractConnector implements ServerConnector, if (lastEnabledState == enabledState) { return; } + Profiler.enter("AbstractConnector.updateEnabledState"); lastEnabledState = enabledState; for (ServerConnector c : getChildren()) { @@ -407,6 +410,7 @@ public abstract class AbstractConnector implements ServerConnector, // their parent c.updateEnabledState(c.isEnabled()); } + Profiler.leave("AbstractConnector.updateEnabledState"); } /** diff --git a/client/src/com/vaadin/client/ui/VAbsoluteLayout.java b/client/src/com/vaadin/client/ui/VAbsoluteLayout.java index 92a51f209d..88fbae6e88 100644 --- a/client/src/com/vaadin/client/ui/VAbsoluteLayout.java +++ b/client/src/com/vaadin/client/ui/VAbsoluteLayout.java @@ -326,6 +326,10 @@ public class VAbsoluteLayout extends ComplexPanel { Style wrapperStyle = wrapper.getElement().getStyle(); Style widgetStyle = wrapper.getWidget().getElement().getStyle(); + + // Ensure previous heights do not affect the measures + wrapperStyle.clearHeight(); + if (widgetStyle.getHeight() != null && widgetStyle.getHeight().endsWith("%")) { int h; @@ -343,8 +347,6 @@ public class VAbsoluteLayout extends ComplexPanel { - wrapper.getElement().getOffsetTop(); } wrapperStyle.setHeight(h, Unit.PX); - } else { - wrapperStyle.clearHeight(); } wrapper.updateCaptionPosition(); @@ -380,6 +382,9 @@ public class VAbsoluteLayout extends ComplexPanel { Style wrapperStyle = wrapper.getElement().getStyle(); Style widgetStyle = wrapper.getWidget().getElement().getStyle(); + // Ensure previous heights do not affect the measures + wrapperStyle.clearWidth(); + if (widgetStyle.getWidth() != null && widgetStyle.getWidth().endsWith("%")) { int w; @@ -398,8 +403,6 @@ public class VAbsoluteLayout extends ComplexPanel { - wrapper.getElement().getOffsetLeft(); } wrapperStyle.setWidth(w, Unit.PX); - } else { - wrapperStyle.clearWidth(); } wrapper.updateCaptionPosition(); diff --git a/client/src/com/vaadin/client/ui/VCssLayout.java b/client/src/com/vaadin/client/ui/VCssLayout.java index 0936859ace..4357116707 100644 --- a/client/src/com/vaadin/client/ui/VCssLayout.java +++ b/client/src/com/vaadin/client/ui/VCssLayout.java @@ -18,6 +18,7 @@ package com.vaadin.client.ui; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Widget; +import com.vaadin.client.Profiler; import com.vaadin.client.StyleConstants; /** @@ -41,12 +42,15 @@ public class VCssLayout extends FlowPanel { * For internal use only. May be removed or replaced in the future. */ public void addOrMove(Widget child, int index) { + Profiler.enter("VCssLayout.addOrMove"); if (child.getParent() == this) { int currentIndex = getWidgetIndex(child); if (index == currentIndex) { + Profiler.leave("VCssLayout.addOrMove"); return; } } insert(child, index); + Profiler.leave("VCssLayout.addOrMove"); } } diff --git a/client/src/com/vaadin/client/ui/VScrollTable.java b/client/src/com/vaadin/client/ui/VScrollTable.java index 75d67b82d6..c76dd38d8f 100644 --- a/client/src/com/vaadin/client/ui/VScrollTable.java +++ b/client/src/com/vaadin/client/ui/VScrollTable.java @@ -1191,6 +1191,39 @@ public class VScrollTable extends FlowPanel implements HasWidgets, return totalRows; } + /** + * Returns the extra space that is given to the header column when column + * width is determined by header text. + * + * @return extra space in pixels + */ + private int getHeaderPadding() { + return scrollBody.getCellExtraWidth(); + } + + /** + * This method exists for the needs of {@link VTreeTable} only. Not part of + * the official API, <b>extend at your own risk</b>. May be removed or + * replaced in the future. + * + * @return index of TreeTable's hierarchy column, or -1 if not applicable + */ + protected int getHierarchyColumnIndex() { + return -1; + } + + /** + * For internal use only. May be removed or replaced in the future. + */ + public void updateMaxIndent() { + int oldIndent = scrollBody.getMaxIndent(); + scrollBody.calculateMaxIndent(); + if (oldIndent != scrollBody.getMaxIndent()) { + // indent updated, headers might need adjusting + triggerLazyColumnAdjustment(true); + } + } + /** For internal use only. May be removed or replaced in the future. */ public void focusRowFromBody() { if (selectedRowKeys.size() == 1) { @@ -1382,6 +1415,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, * amount of rows in data set */ public void updateBody(UIDL uidl, int firstRow, int reqRows) { + int oldIndent = scrollBody.getMaxIndent(); if (uidl == null || reqRows < 1) { // container is empty, remove possibly existing rows if (firstRow <= 0) { @@ -1399,6 +1433,11 @@ public class VScrollTable extends FlowPanel implements HasWidgets, scrollBody.renderRows(uidl, firstRow, reqRows); discardRowsOutsideCacheWindow(); + scrollBody.calculateMaxIndent(); + if (oldIndent != scrollBody.getMaxIndent()) { + // indent updated, headers might need adjusting + headerChangedDuringUpdate = true; + } } /** For internal use only. May be removed or replaced in the future. */ @@ -1591,31 +1630,55 @@ public class VScrollTable extends FlowPanel implements HasWidgets, return tHead.getHeaderCell(index).getColKey(); } - private void setColWidth(int colIndex, int w, boolean isDefinedWidth) { + /** + * Note: not part of the official API, extend at your own risk. May be + * removed or replaced in the future. + * + * Sets the indicated column's width for headers and scrollBody alike. + * + * @param colIndex + * index of the modified column + * @param w + * new width (may be subject to modifications if doesn't meet + * minimum requirements) + * @param isDefinedWidth + * disables expand ratio if set true + */ + protected void setColWidth(int colIndex, int w, boolean isDefinedWidth) { final HeaderCell hcell = tHead.getHeaderCell(colIndex); // Make sure that the column grows to accommodate the sort indicator if // necessary. - if (w < hcell.getMinWidth()) { - w = hcell.getMinWidth(); + // get min width with no indent or padding + int minWidth = hcell.getMinWidth(false, false); + if (w < minWidth) { + w = minWidth; } - // Set header column width + // Set header column width WITHOUT INDENT hcell.setWidth(w, isDefinedWidth); + // Set footer column width likewise + FooterCell fcell = tFoot.getFooterCell(colIndex); + fcell.setWidth(w, isDefinedWidth); + // Ensure indicators have been taken into account tHead.resizeCaptionContainer(hcell); + // Make sure that the body column grows to accommodate the indent if + // necessary. + // get min width with indent, no padding + minWidth = hcell.getMinWidth(true, false); + if (w < minWidth) { + w = minWidth; + } + // Set body column width scrollBody.setColWidth(colIndex, w); - - // Set footer column width - FooterCell fcell = tFoot.getFooterCell(colIndex); - fcell.setWidth(w, isDefinedWidth); } private int getColWidth(String colKey) { - return tHead.getHeaderCell(colKey).getWidth(); + return tHead.getHeaderCell(colKey).getWidthWithIndent(); } /** @@ -1813,22 +1876,37 @@ public class VScrollTable extends FlowPanel implements HasWidgets, tHead.enableBrowserIntelligence(); tFoot.enableBrowserIntelligence(); + int hierarchyColumnIndent = scrollBody != null ? scrollBody + .getMaxIndent() : 0; + HeaderCell hierarchyHeaderWithExpandRatio = null; + // first loop: collect natural widths while (headCells.hasNext()) { final HeaderCell hCell = (HeaderCell) headCells.next(); final FooterCell fCell = (FooterCell) footCells.next(); + boolean needsIndent = hierarchyColumnIndent > 0 + && hCell.isHierarchyColumn(); int w = hCell.getWidth(); if (hCell.isDefinedWidth()) { // server has defined column width explicitly + if (needsIndent && w < hierarchyColumnIndent) { + // hierarchy indent overrides explicitly set width + w = hierarchyColumnIndent; + } totalExplicitColumnsWidths += w; } else { if (hCell.getExpandRatio() > 0) { expandRatioDivider += hCell.getExpandRatio(); w = 0; + if (needsIndent && w < hierarchyColumnIndent) { + hierarchyHeaderWithExpandRatio = hCell; + // don't add to widths here, because will be included in + // the expand ratio space if there's enough of it + } } else { // get and store greater of header width and column width, - // and - // store it as a minimumn natural col width + // and store it as a minimum natural column width (these + // already contain the indent if any) int headerWidth = hCell.getNaturalColumnWidth(i); int footerWidth = fCell.getNaturalColumnWidth(i); w = headerWidth > footerWidth ? headerWidth : footerWidth; @@ -1840,6 +1918,9 @@ public class VScrollTable extends FlowPanel implements HasWidgets, total += w; i++; } + if (hierarchyHeaderWithExpandRatio != null) { + total += hierarchyColumnIndent; + } tHead.disableBrowserIntelligence(); tFoot.disableBrowserIntelligence(); @@ -1871,13 +1952,24 @@ public class VScrollTable extends FlowPanel implements HasWidgets, if (availW > total) { // natural size is smaller than available space - final int extraSpace = availW - total; + int extraSpace = availW - total; + if (hierarchyHeaderWithExpandRatio != null) { + /* + * add the indent's space back to ensure each column gets an + * even share according to the expand ratios (note: if the + * allocated space isn't enough for the hierarchy column it + * shall be treated like a defined width column and the indent + * space gets removed from the extra space again) + */ + extraSpace += hierarchyColumnIndent; + } final int totalWidthR = total - totalExplicitColumnsWidths; int checksum = 0; if (extraSpace == 1) { // We cannot divide one single pixel so we give it the first // undefined column + // no need to worry about indent here headCells = tHead.iterator(); i = 0; checksum = availW; @@ -1891,6 +1983,22 @@ public class VScrollTable extends FlowPanel implements HasWidgets, } } else if (expandRatioDivider > 0) { + boolean setIndentToHierarchyHeader = false; + if (hierarchyHeaderWithExpandRatio != null) { + // ensure first that the hierarchyColumn gets at least the + // space allocated for indent + final int newSpace = Math + .round((extraSpace * (hierarchyHeaderWithExpandRatio + .getExpandRatio() / expandRatioDivider))); + if (newSpace < hierarchyColumnIndent) { + // not enough space for indent, remove indent from the + // extraSpace again and handle hierarchy column's header + // separately + setIndentToHierarchyHeader = true; + extraSpace -= hierarchyColumnIndent; + } + } + // visible columns have some active expand ratios, excess // space is divided according to them headCells = tHead.iterator(); @@ -1899,9 +2007,17 @@ public class VScrollTable extends FlowPanel implements HasWidgets, HeaderCell hCell = (HeaderCell) headCells.next(); if (hCell.getExpandRatio() > 0) { int w = widths[i]; - final int newSpace = Math.round((extraSpace * (hCell - .getExpandRatio() / expandRatioDivider))); - w += newSpace; + if (setIndentToHierarchyHeader + && hierarchyHeaderWithExpandRatio.equals(hCell)) { + // hierarchy column's header is no longer part of + // the expansion divide and only gets indent + w += hierarchyColumnIndent; + } else { + final int newSpace = Math + .round((extraSpace * (hCell + .getExpandRatio() / expandRatioDivider))); + w += newSpace; + } widths[i] = w; } checksum += widths[i]; @@ -1911,6 +2027,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, // no expand ratios defined, we will share extra space // relatively to "natural widths" among those without // explicit width + // no need to worry about indent here, it's already included headCells = tHead.iterator(); i = 0; while (headCells.hasNext()) { @@ -1946,7 +2063,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, } } else { - // bodys size will be more than available and scrollbar will appear + // body's size will be more than available and scrollbar will appear } // last loop: set possibly modified values or reset if new tBody @@ -2046,8 +2163,8 @@ public class VScrollTable extends FlowPanel implements HasWidgets, } /** - * Note, this method is not official api although declared as protected. - * Extend at you own risk. + * Note: this method is not part of official API although declared as + * protected. Extend at your own risk. * * @return true if content area will have scrollbars visible. */ @@ -2430,6 +2547,16 @@ public class VScrollTable extends FlowPanel implements HasWidgets, expandRatio = 0; } + /** + * Sets width to the header cell. This width should not include any + * possible indent modifications that are present in + * {@link VScrollTableBody#getMaxIndent()}. + * + * @param w + * required width of the cell sans indentations + * @param ensureDefinedWidth + * disables expand ratio if required + */ public void setWidth(int w, boolean ensureDefinedWidth) { if (ensureDefinedWidth) { definedWidth = true; @@ -2453,15 +2580,23 @@ public class VScrollTable extends FlowPanel implements HasWidgets, * unless TD width is not explicitly set. */ if (scrollBody != null) { - int tdWidth = width + scrollBody.getCellExtraWidth(); + int maxIndent = scrollBody.getMaxIndent(); + if (w < maxIndent && isHierarchyColumn()) { + w = maxIndent; + } + int tdWidth = w + scrollBody.getCellExtraWidth(); setWidth(tdWidth + "px"); } else { Scheduler.get().scheduleDeferred(new Command() { @Override public void execute() { - int tdWidth = width - + scrollBody.getCellExtraWidth(); + int maxIndent = scrollBody.getMaxIndent(); + int tdWidth = width; + if (tdWidth < maxIndent && isHierarchyColumn()) { + tdWidth = maxIndent; + } + tdWidth += scrollBody.getCellExtraWidth(); setWidth(tdWidth + "px"); } }); @@ -2484,10 +2619,45 @@ public class VScrollTable extends FlowPanel implements HasWidgets, return definedWidth && width >= 0; } + /** + * This method exists for the needs of {@link VTreeTable} only. + * + * Returns the pixels width of the header cell. This includes the + * indent, if applicable. + * + * @return The width in pixels + */ + protected int getWidthWithIndent() { + if (scrollBody != null && isHierarchyColumn()) { + int maxIndent = scrollBody.getMaxIndent(); + if (maxIndent > width) { + return maxIndent; + } + } + return width; + } + + /** + * Returns the pixels width of the header cell. + * + * @return The width in pixels + */ public int getWidth() { return width; } + /** + * This method exists for the needs of {@link VTreeTable} only. + * + * @return <code>true</code> if this is hierarcyColumn's header cell, + * <code>false</code> otherwise + */ + private boolean isHierarchyColumn() { + int hierarchyColumnIndex = getHierarchyColumnIndex(); + return hierarchyColumnIndex >= 0 + && tHead.visibleCells.indexOf(this) == hierarchyColumnIndex; + } + public void setText(String headerText) { DOM.setInnerHTML(captionContainer, headerText); } @@ -2742,7 +2912,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, DOM.setCapture(getElement()); dragStartX = DOM.eventGetClientX(event); colIndex = getColIndexByKey(cid); - originalWidth = getWidth(); + originalWidth = getWidthWithIndent(); DOM.eventPreventDefault(event); break; case Event.ONMOUSEUP: @@ -2774,8 +2944,11 @@ public class VScrollTable extends FlowPanel implements HasWidgets, tHead.disableAutoColumnWidthCalculation(this); int newWidth = originalWidth + deltaX; - if (newWidth < getMinWidth()) { - newWidth = getMinWidth(); + // get min width with indent, no padding + int minWidth = getMinWidth(true, false); + if (newWidth < minWidth) { + // already includes indent if any + newWidth = minWidth; } setColWidth(colIndex, newWidth, true); triggerLazyColumnAdjustment(false); @@ -2787,12 +2960,37 @@ public class VScrollTable extends FlowPanel implements HasWidgets, } } - public int getMinWidth() { - int cellExtraWidth = 0; + /** + * Returns the smallest possible cell width in pixels. + * + * @param includeIndent + * - width should include hierarchy column indent if + * applicable (VTreeTable only) + * @param includeCellExtraWidth + * - width should include paddings etc. + * @return + */ + private int getMinWidth(boolean includeIndent, + boolean includeCellExtraWidth) { + int minWidth = sortIndicator.getOffsetWidth(); if (scrollBody != null) { - cellExtraWidth += scrollBody.getCellExtraWidth(); + // check the need for indent before adding paddings etc. + if (includeIndent && isHierarchyColumn()) { + int maxIndent = scrollBody.getMaxIndent(); + if (minWidth < maxIndent) { + minWidth = maxIndent; + } + } + if (includeCellExtraWidth) { + minWidth += scrollBody.getCellExtraWidth(); + } } - return cellExtraWidth + sortIndicator.getOffsetWidth(); + return minWidth; + } + + public int getMinWidth() { + // get min width with padding, no indent + return getMinWidth(false, true); } public String getCaption() { @@ -2823,16 +3021,20 @@ public class VScrollTable extends FlowPanel implements HasWidgets, * @return */ public int getNaturalColumnWidth(int columnIndex) { + final int iw = columnIndex == getHierarchyColumnIndex() ? scrollBody + .getMaxIndent() : 0; if (isDefinedWidth()) { + if (iw > width) { + return iw; + } return width; } else { if (naturalWidth < 0) { // This is recently revealed column. Try to detect a proper - // value (greater of header and data - // cols) + // value (greater of header and data columns) int hw = captionContainer.getOffsetWidth() - + scrollBody.getCellExtraWidth(); + + getHeaderPadding(); if (BrowserInfo.get().isGecko()) { hw += sortIndicator.getOffsetWidth(); } @@ -2848,7 +3050,13 @@ public class VScrollTable extends FlowPanel implements HasWidgets, final int cw = scrollBody.getColWidth(columnIndex); naturalWidth = (hw > cw ? hw : cw); } - return naturalWidth; + if (iw > naturalWidth) { + // indent is temporary value, naturalWidth shouldn't be + // updated + return iw; + } else { + return naturalWidth; + } } } @@ -2945,32 +3153,49 @@ public class VScrollTable extends FlowPanel implements HasWidgets, public void resizeCaptionContainer(HeaderCell cell) { HeaderCell lastcell = getHeaderCell(visibleCells.size() - 1); + int columnSelectorOffset = columnSelector.getOffsetWidth(); - // Measure column widths - int columnTotalWidth = 0; - for (Widget w : visibleCells) { - columnTotalWidth += w.getOffsetWidth(); - } - - if (cell == lastcell - && columnSelector.getOffsetWidth() > 0 - && columnTotalWidth >= div.getOffsetWidth() - - columnSelector.getOffsetWidth() + if (cell == lastcell && columnSelectorOffset > 0 && !hasVerticalScrollbar()) { - // Ensure column caption is visible when placed under the column - // selector widget by shifting and resizing the caption. - int offset = 0; - int diff = div.getOffsetWidth() - columnTotalWidth; - if (diff < columnSelector.getOffsetWidth() && diff > 0) { - // If the difference is less than the column selectors width - // then just offset by the - // difference - offset = columnSelector.getOffsetWidth() - diff; + + // Measure column widths + int columnTotalWidth = 0; + for (Widget w : visibleCells) { + int cellExtraWidth = w.getOffsetWidth(); + if (scrollBody != null + && visibleCells.indexOf(w) == getHierarchyColumnIndex() + && cellExtraWidth < scrollBody.getMaxIndent()) { + // indent must be taken into consideration even if it + // hasn't been applied yet + columnTotalWidth += scrollBody.getMaxIndent(); + } else { + columnTotalWidth += cellExtraWidth; + } + } + + int divOffset = div.getOffsetWidth(); + if (columnTotalWidth >= divOffset - columnSelectorOffset) { + /* + * Ensure column caption is visible when placed under the + * column selector widget by shifting and resizing the + * caption. + */ + int offset = 0; + int diff = divOffset - columnTotalWidth; + if (diff < columnSelectorOffset && diff > 0) { + /* + * If the difference is less than the column selectors + * width then just offset by the difference + */ + offset = columnSelectorOffset - diff; + } else { + // Else offset by the whole column selector + offset = columnSelectorOffset; + } + lastcell.resizeCaptionContainer(offset); } else { - // Else offset by the whole column selector - offset = columnSelector.getOffsetWidth(); + cell.resizeCaptionContainer(0); } - lastcell.resizeCaptionContainer(offset); } else { cell.resizeCaptionContainer(0); } @@ -3033,10 +3258,14 @@ public class VScrollTable extends FlowPanel implements HasWidgets, // Make sure to accomodate for the sort indicator if // necessary. int width = Integer.parseInt(widthStr); - if (width < c.getMinWidth()) { - width = c.getMinWidth(); + int widthWithoutAddedIndent = width; + + // get min width with indent, no padding + int minWidth = c.getMinWidth(true, false); + if (width < minWidth) { + width = minWidth; } - if (width != c.getWidth() && scrollBody != null) { + if (scrollBody != null && width != c.getWidthWithIndent()) { // Do a more thorough update if a column is resized from // the server *after* the header has been properly // initialized @@ -3052,7 +3281,13 @@ public class VScrollTable extends FlowPanel implements HasWidgets, }); refreshContentWidths = true; } else { - c.setWidth(width, true); + // get min width with no indent or padding + minWidth = c.getMinWidth(false, false); + if (widthWithoutAddedIndent < minWidth) { + widthWithoutAddedIndent = minWidth; + } + // save min width without indent + c.setWidth(widthWithoutAddedIndent, true); } } else if (recalcWidths) { c.setUndefinedWidth(); @@ -3507,12 +3742,14 @@ public class VScrollTable extends FlowPanel implements HasWidgets, } /** - * Sets the width of the cell + * Sets the width of the cell. This width should not include any + * possible indent modifications that are present in + * {@link VScrollTableBody#getMaxIndent()}. * * @param w * The width of the cell * @param ensureDefinedWidth - * Ensures the the given width is not recalculated + * Ensures that the given width is not recalculated */ public void setWidth(int w, boolean ensureDefinedWidth) { @@ -3549,7 +3786,13 @@ public class VScrollTable extends FlowPanel implements HasWidgets, * unless TD width is not explicitly set. */ if (scrollBody != null) { - int tdWidth = width + scrollBody.getCellExtraWidth() + int maxIndent = scrollBody.getMaxIndent(); + if (w < maxIndent + && tFoot.visibleCells.indexOf(this) == getHierarchyColumnIndex()) { + // ensure there's room for the indent + w = maxIndent; + } + int tdWidth = w + scrollBody.getCellExtraWidth() - borderWidths; setWidth(Math.max(tdWidth, 0) + "px"); } else { @@ -3557,8 +3800,14 @@ public class VScrollTable extends FlowPanel implements HasWidgets, @Override public void execute() { - int tdWidth = width - + scrollBody.getCellExtraWidth() + int tdWidth = width; + int maxIndent = scrollBody.getMaxIndent(); + if (tdWidth < maxIndent + && tFoot.visibleCells.indexOf(this) == getHierarchyColumnIndex()) { + // ensure there's room for the indent + tdWidth = maxIndent; + } + tdWidth += scrollBody.getCellExtraWidth() - borderWidths; setWidth(Math.max(tdWidth, 0) + "px"); } @@ -3571,6 +3820,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, * Sets the width to undefined */ public void setUndefinedWidth() { + definedWidth = false; setWidth(-1, false); } @@ -3585,7 +3835,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, } /** - * Returns the pixels width of the footer cell + * Returns the pixels width of the footer cell. * * @return The width in pixels */ @@ -3699,7 +3949,12 @@ public class VScrollTable extends FlowPanel implements HasWidgets, * @return */ public int getNaturalColumnWidth(int columnIndex) { + final int iw = columnIndex == getHierarchyColumnIndex() ? scrollBody + .getMaxIndent() : 0; if (isDefinedWidth()) { + if (iw > width) { + return iw; + } return width; } else { if (naturalWidth < 0) { @@ -3708,7 +3963,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets, // cols) final int hw = ((Element) getElement().getLastChild()) - .getOffsetWidth() + scrollBody.getCellExtraWidth(); + .getOffsetWidth() + getHeaderPadding(); if (columnIndex < 0) { columnIndex = 0; for (Iterator<Widget> it = tHead.iterator(); it @@ -3721,7 +3976,11 @@ public class VScrollTable extends FlowPanel implements HasWidgets, final int cw = scrollBody.getColWidth(columnIndex); naturalWidth = (hw > cw ? hw : cw); } - return naturalWidth; + if (iw > naturalWidth) { + return iw; + } else { + return naturalWidth; + } } } @@ -4627,6 +4886,28 @@ public class VScrollTable extends FlowPanel implements HasWidgets, return cellExtraWidth; } + /** + * This method exists for the needs of {@link VTreeTable} only. May be + * removed or replaced in the future.</br> </br> Returns the maximum + * indent of the hierarcyColumn, if applicable. + * + * @see {@link VScrollTable#getHierarchyColumnIndex()} + * + * @return maximum indent in pixels + */ + protected int getMaxIndent() { + return 0; + } + + /** + * This method exists for the needs of {@link VTreeTable} only. May be + * removed or replaced in the future.</br> </br> Calculates the maximum + * indent of the hierarcyColumn, if applicable. + */ + protected void calculateMaxIndent() { + // NOP + } + private void detectExtrawidth() { NodeList<TableRowElement> rows = tBodyElement.getRows(); if (rows.getLength() == 0) { @@ -4806,8 +5087,23 @@ public class VScrollTable extends FlowPanel implements HasWidgets, protected void setCellWidth(int cellIx, int width) { final Element cell = DOM.getChild(getElement(), cellIx); - cell.getFirstChildElement().getStyle() - .setPropertyPx("width", width); + Style wrapperStyle = cell.getFirstChildElement().getStyle(); + int wrapperWidth = width; + if (BrowserInfo.get().isWebkit() + || BrowserInfo.get().isOpera10()) { + /* + * Some versions of Webkit and Opera ignore the width + * definition of zero width table cells. Instead, use 1px + * and compensate with a negative margin. + */ + if (width == 0) { + wrapperWidth = 1; + wrapperStyle.setMarginRight(-1, Unit.PX); + } else { + wrapperStyle.clearMarginRight(); + } + } + wrapperStyle.setPropertyPx("width", wrapperWidth); cell.getStyle().setPropertyPx("width", width); } @@ -5866,7 +6162,8 @@ public class VScrollTable extends FlowPanel implements HasWidgets, @Override public void execute() { if (showRowHeaders) { - setCellWidth(0, tHead.getHeaderCell(0).getWidth()); + setCellWidth(0, tHead.getHeaderCell(0) + .getWidthWithIndent()); calcAndSetSpanWidthOnCell(1); } else { calcAndSetSpanWidthOnCell(0); @@ -6100,14 +6397,35 @@ public class VScrollTable extends FlowPanel implements HasWidgets, int totalExplicitColumnsWidths = 0; float expandRatioDivider = 0; int colIndex = 0; + + int hierarchyColumnIndent = scrollBody.getMaxIndent(); + int hierarchyColumnIndex = getHierarchyColumnIndex(); + HeaderCell hierarchyHeaderInNeedOfFurtherHandling = null; + while (headCells.hasNext()) { final HeaderCell hCell = (HeaderCell) headCells.next(); + boolean hasIndent = hierarchyColumnIndent > 0 + && hCell.isHierarchyColumn(); if (hCell.isDefinedWidth()) { - totalExplicitColumnsWidths += hCell.getWidth(); - usedMinimumWidth += hCell.getWidth(); + // get width without indent to find out whether adjustments + // are needed (requires special handling further ahead) + int w = hCell.getWidth(); + if (hasIndent && w < hierarchyColumnIndent) { + // enforce indent if necessary + w = hierarchyColumnIndent; + hierarchyHeaderInNeedOfFurtherHandling = hCell; + } + totalExplicitColumnsWidths += w; + usedMinimumWidth += w; } else { - usedMinimumWidth += hCell.getNaturalColumnWidth(colIndex); + // natural width already includes indent if any + int naturalColumnWidth = hCell + .getNaturalColumnWidth(colIndex); + usedMinimumWidth += naturalColumnWidth; expandRatioDivider += hCell.getExpandRatio(); + if (hasIndent) { + hierarchyHeaderInNeedOfFurtherHandling = hCell; + } } colIndex++; } @@ -6152,6 +6470,28 @@ public class VScrollTable extends FlowPanel implements HasWidgets, int totalUndefinedNaturalWidths = usedMinimumWidth - totalExplicitColumnsWidths; + if (hierarchyHeaderInNeedOfFurtherHandling != null + && !hierarchyHeaderInNeedOfFurtherHandling.isDefinedWidth()) { + // ensure the cell gets enough space for the indent + int w = hierarchyHeaderInNeedOfFurtherHandling + .getNaturalColumnWidth(hierarchyColumnIndex); + int newSpace = Math.round(w + (float) extraSpace * (float) w + / totalUndefinedNaturalWidths); + if (newSpace >= hierarchyColumnIndent) { + // no special handling required + hierarchyHeaderInNeedOfFurtherHandling = null; + } else { + // treat as a defined width column of indent's width + totalExplicitColumnsWidths += hierarchyColumnIndent; + usedMinimumWidth -= w - hierarchyColumnIndent; + totalUndefinedNaturalWidths = usedMinimumWidth + - totalExplicitColumnsWidths; + expandRatioDivider += hierarchyHeaderInNeedOfFurtherHandling + .getExpandRatio(); + extraSpace = Math.max(availW - usedMinimumWidth, 0); + } + } + // we have some space that can be divided optimally HeaderCell hCell; colIndex = 0; @@ -6167,7 +6507,10 @@ public class VScrollTable extends FlowPanel implements HasWidgets, newSpace = Math.round((w + extraSpace * hCell.getExpandRatio() / expandRatioDivider)); } else { - if (totalUndefinedNaturalWidths != 0) { + if (hierarchyHeaderInNeedOfFurtherHandling == hCell) { + // still exists, so needs exactly the indent's width + newSpace = hierarchyColumnIndent; + } else if (totalUndefinedNaturalWidths != 0) { // divide relatively to natural column widths newSpace = Math.round(w + (float) extraSpace * (float) w / totalUndefinedNaturalWidths); @@ -6177,8 +6520,21 @@ public class VScrollTable extends FlowPanel implements HasWidgets, } checksum += newSpace; setColWidth(colIndex, newSpace, false); + } else { - checksum += hCell.getWidth(); + if (hierarchyHeaderInNeedOfFurtherHandling == hCell) { + // defined with enforced into indent width + checksum += hierarchyColumnIndent; + setColWidth(colIndex, hierarchyColumnIndent, false); + } else { + int cellWidth = hCell.getWidthWithIndent(); + checksum += cellWidth; + if (hCell.isHierarchyColumn()) { + // update in case the indent has changed + // (not detectable earlier) + setColWidth(colIndex, cellWidth, true); + } + } } colIndex++; } @@ -6194,8 +6550,8 @@ public class VScrollTable extends FlowPanel implements HasWidgets, while (headCells.hasNext()) { HeaderCell hc = (HeaderCell) headCells.next(); if (!hc.isDefinedWidth()) { - setColWidth(colIndex, - hc.getWidth() + availW - checksum, false); + setColWidth(colIndex, hc.getWidthWithIndent() + availW + - checksum, false); break; } colIndex++; diff --git a/client/src/com/vaadin/client/ui/VTextField.java b/client/src/com/vaadin/client/ui/VTextField.java index 1229eda093..0fbed0dd90 100644 --- a/client/src/com/vaadin/client/ui/VTextField.java +++ b/client/src/com/vaadin/client/ui/VTextField.java @@ -272,19 +272,16 @@ public class VTextField extends TextBoxBase implements Field, ChangeHandler, /** For internal use only. May be removed or replaced in the future. */ public void setMaxLength(int newMaxLength) { - if (newMaxLength >= 0 && newMaxLength != maxLength) { - maxLength = newMaxLength; - updateMaxLength(maxLength); - } else if (maxLength != -1) { - maxLength = -1; - updateMaxLength(maxLength); + if (newMaxLength == maxLength) { + return; } - + maxLength = newMaxLength; + updateMaxLength(maxLength); } /** - * This method is reponsible for updating the DOM or otherwise ensuring that - * the given max length is enforced. Called when the max length for the + * This method is responsible for updating the DOM or otherwise ensuring + * that the given max length is enforced. Called when the max length for the * field has changed. * * @param maxLength diff --git a/client/src/com/vaadin/client/ui/VTreeTable.java b/client/src/com/vaadin/client/ui/VTreeTable.java index f65198865c..097b9c7ab2 100644 --- a/client/src/com/vaadin/client/ui/VTreeTable.java +++ b/client/src/com/vaadin/client/ui/VTreeTable.java @@ -122,8 +122,14 @@ public class VTreeTable extends VScrollTable { } } + @Override + protected int getHierarchyColumnIndex() { + return colIndexOfHierarchy + (showRowHeaders ? 1 : 0); + } + public class VTreeTableScrollBody extends VScrollTable.VScrollTableBody { private int indentWidth = -1; + private int maxIndent = 0; VTreeTableScrollBody() { super(); @@ -232,6 +238,11 @@ public class VTreeTable extends VScrollTable { treeSpacer.getParentElement().getStyle() .setPaddingLeft(getIndent(), Unit.PX); treeSpacer.getStyle().setWidth(getIndent(), Unit.PX); + int colWidth = getColWidth(getHierarchyColumnIndex()); + if (colWidth > 0 && getIndent() > colWidth) { + VTreeTable.this.setColWidth(getHierarchyColumnIndex(), + getIndent(), false); + } } } @@ -277,16 +288,12 @@ public class VTreeTable extends VScrollTable { // hierarchy column int indent = getIndent(); if (indent != -1) { - width = Math.max(width - getIndent(), 0); + width = Math.max(width - indent, 0); } } super.setCellWidth(cellIx, width); } - private int getHierarchyColumnIndex() { - return colIndexOfHierarchy + (showRowHeaders ? 1 : 0); - } - private int getIndent() { return (depth + 1) * getIndentWidth(); } @@ -323,7 +330,8 @@ public class VTreeTable extends VScrollTable { @Override public void execute() { if (showRowHeaders) { - setCellWidth(0, tHead.getHeaderCell(0).getWidth()); + setCellWidth(0, tHead.getHeaderCell(0) + .getWidthWithIndent()); calcAndSetSpanWidthOnCell(1); } else { calcAndSetSpanWidthOnCell(0); @@ -421,6 +429,22 @@ public class VTreeTable extends VScrollTable { return indentWidth; } + @Override + protected int getMaxIndent() { + return maxIndent; + } + + @Override + protected void calculateMaxIndent() { + int maxIndent = 0; + Iterator<Widget> iterator = iterator(); + while (iterator.hasNext()) { + VTreeTableRow next = (VTreeTableRow) iterator.next(); + maxIndent = Math.max(maxIndent, next.getIndent()); + } + this.maxIndent = maxIndent; + } + private void detectIndent(VTreeTableRow vTreeTableRow) { indentWidth = vTreeTableRow.treeSpacer.getOffsetWidth(); if (indentWidth == 0) { @@ -432,6 +456,7 @@ public class VTreeTable extends VScrollTable { VTreeTableRow next = (VTreeTableRow) iterator.next(); next.setIndent(); } + calculateMaxIndent(); } protected void unlinkRowsAnimatedAndUpdateCacheWhenFinished( @@ -471,6 +496,7 @@ public class VTreeTable extends VScrollTable { RowExpandAnimation anim = new RowExpandAnimation(insertedRows); anim.run(150); } + scrollBody.calculateMaxIndent(); return insertedRows; } diff --git a/client/src/com/vaadin/client/ui/VUI.java b/client/src/com/vaadin/client/ui/VUI.java index 6e6bcaf587..b627d4a2a9 100644 --- a/client/src/com/vaadin/client/ui/VUI.java +++ b/client/src/com/vaadin/client/ui/VUI.java @@ -41,6 +41,7 @@ import com.vaadin.client.ComponentConnector; import com.vaadin.client.ConnectorMap; import com.vaadin.client.Focusable; import com.vaadin.client.LayoutManager; +import com.vaadin.client.Profiler; import com.vaadin.client.VConsole; import com.vaadin.client.ui.ShortcutActionHandler.ShortcutActionHandlerOwner; import com.vaadin.client.ui.TouchScrollDelegate.TouchScrollHandler; @@ -395,11 +396,13 @@ public class VUI extends SimplePanel implements ResizeHandler, * For internal use only. May be removed or replaced in the future. */ public void sendClientResized() { + Profiler.enter("VUI.sendClientResized"); Element parentElement = getElement().getParentElement(); int viewHeight = parentElement.getClientHeight(); int viewWidth = parentElement.getClientWidth(); ResizeEvent.fire(this, viewWidth, viewHeight); + Profiler.leave("VUI.sendClientResized"); } public native static void goTo(String url) diff --git a/client/src/com/vaadin/client/ui/label/LabelConnector.java b/client/src/com/vaadin/client/ui/label/LabelConnector.java index 896c9d8573..9639987e8d 100644 --- a/client/src/com/vaadin/client/ui/label/LabelConnector.java +++ b/client/src/com/vaadin/client/ui/label/LabelConnector.java @@ -17,6 +17,7 @@ package com.vaadin.client.ui.label; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.PreElement; +import com.vaadin.client.Profiler; import com.vaadin.client.Util; import com.vaadin.client.communication.StateChangeEvent; import com.vaadin.client.ui.AbstractComponentConnector; @@ -44,6 +45,7 @@ public class LabelConnector extends AbstractComponentConnector { public void onStateChanged(StateChangeEvent stateChangeEvent) { super.onStateChanged(stateChangeEvent); boolean sinkOnloads = false; + Profiler.enter("LabelConnector.onStateChanged update content"); switch (getState().contentMode) { case PREFORMATTED: PreElement preElement = Document.get().createPreElement(); @@ -69,8 +71,12 @@ public class LabelConnector extends AbstractComponentConnector { break; } + Profiler.leave("LabelConnector.onStateChanged update content"); + if (sinkOnloads) { + Profiler.enter("LabelConnector.onStateChanged sinkOnloads"); Util.sinkOnloadForImages(getWidget().getElement()); + Profiler.leave("LabelConnector.onStateChanged sinkOnloads"); } } diff --git a/client/src/com/vaadin/client/ui/link/LinkConnector.java b/client/src/com/vaadin/client/ui/link/LinkConnector.java index 807a9bcc64..228897278e 100644 --- a/client/src/com/vaadin/client/ui/link/LinkConnector.java +++ b/client/src/com/vaadin/client/ui/link/LinkConnector.java @@ -42,7 +42,11 @@ public class LinkConnector extends AbstractComponentConnector implements @Override public void onStateChanged(StateChangeEvent stateChangeEvent) { getWidget().src = getResourceUrl(LinkConstants.HREF_RESOURCE); - getWidget().anchor.setAttribute("href", getWidget().src); + if (getWidget().src == null) { + getWidget().anchor.removeAttribute("href"); + } else { + getWidget().anchor.setAttribute("href", getWidget().src); + } } }); } diff --git a/client/src/com/vaadin/client/ui/table/TableConnector.java b/client/src/com/vaadin/client/ui/table/TableConnector.java index c967642059..fc31cdf8ea 100644 --- a/client/src/com/vaadin/client/ui/table/TableConnector.java +++ b/client/src/com/vaadin/client/ui/table/TableConnector.java @@ -176,6 +176,7 @@ public class TableConnector extends AbstractHasComponentsConnector implements // amount of rows) getWidget().scrollBody.setLastRendered(getWidget().scrollBody .getLastRendered()); + getWidget().updateMaxIndent(); } else { getWidget().postponeSanityCheckForLastRendered = false; UIDL rowData = uidl.getChildByTagName("rows"); diff --git a/client/src/com/vaadin/client/ui/tabsheet/TabsheetBaseConnector.java b/client/src/com/vaadin/client/ui/tabsheet/TabsheetBaseConnector.java index 9944ec5308..283bc1b63b 100644 --- a/client/src/com/vaadin/client/ui/tabsheet/TabsheetBaseConnector.java +++ b/client/src/com/vaadin/client/ui/tabsheet/TabsheetBaseConnector.java @@ -89,6 +89,14 @@ public abstract class TabsheetBaseConnector extends } } + // Detach any old tab widget, should be max 1 + for (Iterator<Widget> iterator = oldWidgets.iterator(); iterator + .hasNext();) { + Widget oldWidget = iterator.next(); + if (oldWidget.isAttached()) { + oldWidget.removeFromParent(); + } + } } @Override diff --git a/client/src/com/vaadin/client/ui/textfield/TextFieldConnector.java b/client/src/com/vaadin/client/ui/textfield/TextFieldConnector.java index 922e8d4a32..e2ede121b6 100644 --- a/client/src/com/vaadin/client/ui/textfield/TextFieldConnector.java +++ b/client/src/com/vaadin/client/ui/textfield/TextFieldConnector.java @@ -77,8 +77,10 @@ public class TextFieldConnector extends AbstractFieldConnector implements } getWidget().setColumns(getState().columns); - final String text = getState().text; - + String text = getState().text; + if (text == null) { + text = ""; + } /* * We skip the text content update if field has been repainted, but text * has not been changed. Additional sanity check verifies there is no diff --git a/client/src/com/vaadin/client/ui/ui/UIConnector.java b/client/src/com/vaadin/client/ui/ui/UIConnector.java index 85e75b943e..0fb7439587 100644 --- a/client/src/com/vaadin/client/ui/ui/UIConnector.java +++ b/client/src/com/vaadin/client/ui/ui/UIConnector.java @@ -20,6 +20,7 @@ import java.util.Iterator; import java.util.List; import com.google.gwt.core.client.Scheduler; +import com.google.gwt.core.client.Scheduler.ScheduledCommand; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.dom.client.Style; import com.google.gwt.dom.client.Style.Position; @@ -43,6 +44,7 @@ import com.vaadin.client.ConnectorHierarchyChangeEvent; import com.vaadin.client.ConnectorMap; import com.vaadin.client.Focusable; import com.vaadin.client.Paintable; +import com.vaadin.client.TooltipInfo; import com.vaadin.client.UIDL; import com.vaadin.client.VConsole; import com.vaadin.client.communication.StateChangeEvent; @@ -312,7 +314,12 @@ public class UIConnector extends AbstractSingleComponentContainerConnector if (firstPaint) { // Queue the initial window size to be sent with the following // request. - getWidget().sendClientResized(); + Scheduler.get().scheduleDeferred(new ScheduledCommand() { + @Override + public void execute() { + getWidget().sendClientResized(); + } + }); } getWidget().rendering = false; } @@ -467,6 +474,16 @@ public class UIConnector extends AbstractSingleComponentContainerConnector } } + @Override + public TooltipInfo getTooltipInfo(com.google.gwt.dom.client.Element element) { + /* + * Override method to make AbstractComponentConnector.hasTooltip() + * return true so there's a top level handler that takes care of hiding + * tooltips whenever the mouse is moved somewhere else. + */ + return super.getTooltipInfo(element); + } + /** * Tries to scroll the viewport so that the given connector is in view. * diff --git a/common.xml b/common.xml index ff82b6b7ec..163ce8827d 100644 --- a/common.xml +++ b/common.xml @@ -27,9 +27,12 @@ <union id="empty.reference" /> <property name="filtered.webcontent.dir" location="${vaadin.basedir}/result/filteredWebContent" /> + <property name="release-notes-tickets-file" location="${vaadin.basedir}/result/release-notes-tickets.html" /> - <target name="filter.webcontent" unless="webcontent.filtered"> + <target name="filter.webcontent" unless="webcontent.filtered" depends="fetch-release-notes-tickets"> <property name="webcontent.filtered" value="true" /> + <!-- Running without build.release-notes will cause an error, which is ignored --> + <loadfile property="release-notes-tickets" srcFile="${release-notes-tickets-file}" failonerror="false" /> <delete dir="${filtered.webcontent.dir}" /> <copy todir="${filtered.webcontent.dir}"> @@ -57,11 +60,21 @@ <replacetokens begintoken="@" endtoken="@"> <token key="builddate" value="${build.date}" /> </replacetokens> + <replacetokens begintoken="@" endtoken="@"> + <token key="release-notes-tickets" value="${release-notes-tickets}" /> + </replacetokens> </filterchain> </copy> + </target> - + <target name="fetch-release-notes-tickets" unless="built.release-notes" if="build.release-notes"> + <mkdir dir="${vaadin.basedir}/result"/> + <subant buildpath="${vaadin.basedir}/buildhelpers" target="fetch-release-notes-tickets" antfile="build.xml" inheritall="true"> + <property name="output" location="${release-notes-tickets-file}" /> + </subant> + <property name="built.release-notes" value="1" /> </target> + <fileset dir="${filtered.webcontent.dir}" id="common.files.for.all.jars"> <patternset> <include name="release-notes.html" /> @@ -110,7 +123,7 @@ </target> - <target name="sources.jar" depends="compile"> + <target name="sources.jar" depends="compile, filter.webcontent"> <fail unless="result.dir" message="No result.dir parameter given" /> <fail unless="module.name" message="No module.name parameter given" /> <fail unless="src" message="No src directory parameter given" /> @@ -132,7 +145,7 @@ </target> - <target name="javadoc.jar" depends="dependencies"> + <target name="javadoc.jar" depends="dependencies, filter.webcontent"> <fail unless="result.dir" message="No result.dir parameter given" /> <fail unless="module.name" message="No module.name parameter given" /> <property name="src" location="{$result.dir}/../src" /> @@ -157,7 +170,7 @@ </target> - <target name="jar" depends="compile, pom.xml"> + <target name="jar" depends="compile, pom.xml, filter.webcontent"> <fail unless="result.dir" message="No result.dir parameter given" /> <fail unless="module.name" message="No module.name parameter given" /> @@ -261,6 +274,16 @@ </javac> </target> + <target name="exec-buildhelper" depends="compile"> + <fail unless="main.class" message="No main class given in 'main.class'" /> + <fail unless="output" message="No output file given in 'output'" /> + <java classname="${main.class}" output="${output}" failonerror="true" fork="yes"> + <classpath refid="vaadin.buildhelpers.classpath" /> + <classpath refid="classpath.compile.dependencies" /> + <jvmarg value="-Dvaadin.version=${vaadin.version}" /> + </java> + </target> + <target name="directories"> <property name="result.dir" location="result" /> <property name="src" location="${result.dir}/../src" /> @@ -321,7 +344,7 @@ </copy> </target> - <target name="dependencies" description="Resolves dependencies needed by this module" depends="filter.webcontent"> + <target name="dependencies" description="Resolves dependencies needed by this module"> <property name='conf' value="build, build-provided" /> <ivy:resolve resolveid="common" conf="${conf}" /> <ivy:cachepath pathid="classpath.compile.dependencies" conf="${conf}" /> diff --git a/server/src/com/vaadin/ui/CheckBox.java b/server/src/com/vaadin/ui/CheckBox.java index 22b90b224f..0ace0a4f26 100644 --- a/server/src/com/vaadin/ui/CheckBox.java +++ b/server/src/com/vaadin/ui/CheckBox.java @@ -110,6 +110,13 @@ public class CheckBox extends AbstractField<Boolean> { return (CheckBoxState) super.getState(); } + /* + * Overridden to keep the shared state in sync with the AbstractField + * internal value. Should be removed once AbstractField is refactored to use + * shared state. + * + * See tickets #10921 and #11064. + */ @Override protected void setInternalValue(Boolean newValue) { super.setInternalValue(newValue); diff --git a/server/src/com/vaadin/ui/ProgressIndicator.java b/server/src/com/vaadin/ui/ProgressIndicator.java index 96c2d2814a..c481aa1e8f 100644 --- a/server/src/com/vaadin/ui/ProgressIndicator.java +++ b/server/src/com/vaadin/ui/ProgressIndicator.java @@ -157,4 +157,19 @@ public class ProgressIndicator extends AbstractField<Float> implements return getState().pollingInterval; } + /* + * Overridden to keep the shared state in sync with the AbstractField + * internal value. Should be removed once AbstractField is refactored to use + * shared state. + * + * See tickets #10921 and #11064. + */ + @Override + protected void setInternalValue(Float newValue) { + super.setInternalValue(newValue); + if (newValue == null) { + newValue = 0.0f; + } + getState().state = newValue; + } } diff --git a/server/src/com/vaadin/ui/Slider.java b/server/src/com/vaadin/ui/Slider.java index 2bf05f895c..e63fdc5e10 100644 --- a/server/src/com/vaadin/ui/Slider.java +++ b/server/src/com/vaadin/ui/Slider.java @@ -263,6 +263,22 @@ public class Slider extends AbstractField<Double> { getState().value = newFieldValue; } + /* + * Overridden to keep the shared state in sync with the AbstractField + * internal value. Should be removed once AbstractField is refactored to use + * shared state. + * + * See tickets #10921 and #11064. + */ + @Override + protected void setInternalValue(Double newValue) { + super.setInternalValue(newValue); + if (newValue == null) { + newValue = 0.0; + } + getState().value = newValue; + } + /** * Thrown when the value of the slider is about to be set to a value that is * outside the valid range of the slider. diff --git a/server/src/com/vaadin/ui/Tree.java b/server/src/com/vaadin/ui/Tree.java index 608c947d59..32c5712f0f 100644 --- a/server/src/com/vaadin/ui/Tree.java +++ b/server/src/com/vaadin/ui/Tree.java @@ -414,6 +414,9 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, final Object id = itemIdMapper.get(keys[i]); if (id != null && isExpanded(id)) { expanded.remove(id); + if (expandedItemId == id) { + expandedItemId = null; + } fireCollapseEvent(id); } } @@ -841,6 +844,10 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, super.setContainerDataSource(new ContainerHierarchicalWrapper( newDataSource)); } + + // Ensure previous expanded items are cleaned up if they don't exist in + // the new container + cleanupExpandedItems(); } /* Expand event and listener */ @@ -1670,4 +1677,24 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, return itemDescriptionGenerator; } + @Override + public void containerItemSetChange( + com.vaadin.data.Container.ItemSetChangeEvent event) { + + // Ensure removed items are cleaned up from expanded list + cleanupExpandedItems(); + + super.containerItemSetChange(event); + } + + private void cleanupExpandedItems() { + for (Object expandedItemId : expanded) { + if (getItem(expandedItemId) == null) { + expanded.remove(expandedItemId); + if (this.expandedItemId == expandedItemId) { + this.expandedItemId = null; + } + } + } + } } diff --git a/server/tests/src/com/vaadin/tests/server/component/tree/TreeTest.java b/server/tests/src/com/vaadin/tests/server/component/tree/TreeTest.java index 16a7091947..c1d7653c01 100644 --- a/server/tests/src/com/vaadin/tests/server/component/tree/TreeTest.java +++ b/server/tests/src/com/vaadin/tests/server/component/tree/TreeTest.java @@ -1,5 +1,8 @@ package com.vaadin.tests.server.component.tree; +import java.lang.reflect.Field; +import java.util.HashSet; + import junit.framework.TestCase; import com.vaadin.data.Container; @@ -71,4 +74,63 @@ public class TreeTest extends TestCase { assertTrue(Container.Hierarchical.class.isAssignableFrom(tree4 .getContainerDataSource().getClass())); } + + public void testRemoveExpandedItems() throws Exception { + tree.expandItem("parent"); + tree.expandItem("child"); + + Field expandedField = tree.getClass() + .getDeclaredField("expanded"); + Field expandedItemIdField = tree.getClass().getDeclaredField( + "expandedItemId"); + + expandedField.setAccessible(true); + expandedItemIdField.setAccessible(true); + + HashSet<Object> expanded = (HashSet<Object>) expandedField.get(tree); + Object expandedItemId = expandedItemIdField.get(tree); + + assertEquals(2, expanded.size()); + assertTrue("Contains parent", expanded.contains("parent")); + assertTrue("Contains child", expanded.contains("child")); + assertEquals("child", expandedItemId); + + tree.removeItem("parent"); + + expanded = (HashSet<Object>) expandedField.get(tree); + expandedItemId = expandedItemIdField.get(tree); + + assertEquals(1, expanded.size()); + assertTrue("Contains child", expanded.contains("child")); + assertEquals("child", expandedItemId); + + tree.removeItem("child"); + + expanded = (HashSet<Object>) expandedField.get(tree); + expandedItemId = expandedItemIdField.get(tree); + + assertEquals(0, expanded.size()); + assertNull(expandedItemId); + } + + public void testRemoveExpandedItemsOnContainerChange() throws Exception { + tree.expandItem("parent"); + tree.expandItem("child"); + + tree.setContainerDataSource(new HierarchicalContainer()); + + Field expandedField = tree.getClass().getDeclaredField("expanded"); + Field expandedItemIdField = tree.getClass().getDeclaredField( + "expandedItemId"); + + expandedField.setAccessible(true); + expandedItemIdField.setAccessible(true); + + HashSet<Object> expanded = (HashSet<Object>) expandedField.get(tree); + assertEquals(0, expanded.size()); + + Object expandedItemId = expandedItemIdField.get(tree); + assertNull(expandedItemId); + } + } diff --git a/theme-compiler/src/com/vaadin/sass/internal/parser/Parser.java b/theme-compiler/src/com/vaadin/sass/internal/parser/Parser.java index 928c889956..4861a27e75 100644 --- a/theme-compiler/src/com/vaadin/sass/internal/parser/Parser.java +++ b/theme-compiler/src/com/vaadin/sass/internal/parser/Parser.java @@ -314,10 +314,12 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { String encoding = source.getEncoding(); InputStream input = source.getByteStream(); if (!input.markSupported()) { + // If mark is not supported, wrap it in a stream which supports mark input = new BufferedInputStream(input); source.setByteStream(input); - input.mark(100); } + // Mark either the original stream or the wrapped stream + input.mark(100); if (encoding == null) { encoding = "ASCII"; @@ -603,6 +605,9 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { case INCLUDE_SYM: includeDirective(); break; + case PLUS: + case PRECEDES: + case SIBLING: case LBRACKET: case ANY: case PARENT: @@ -938,6 +943,9 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { documentHandler.startKeyframeSelector(n.image); label_21: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { + case PLUS: + case PRECEDES: + case SIBLING: case LBRACKET: case ANY: case PARENT: @@ -963,6 +971,9 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { break label_21; } switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { + case PLUS: + case PRECEDES: + case SIBLING: case LBRACKET: case ANY: case PARENT: @@ -1110,6 +1121,9 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { case WARN_SYM: debuggingDirective(); break; + case PLUS: + case PRECEDES: + case SIBLING: case LBRACKET: case ANY: case PARENT: @@ -1124,12 +1138,9 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { case LBRACE: case DASHMATCH: case INCLUDES: - case PLUS: case MINUS: case COMMA: case SEMICOLON: - case PRECEDES: - case SIBLING: case NONASCII: case STRING: case NUMBER: @@ -1564,15 +1575,6 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { case SEMICOLON: n = jj_consume_token(SEMICOLON); break; - case PLUS: - n = jj_consume_token(PLUS); - break; - case PRECEDES: - n = jj_consume_token(PRECEDES); - break; - case SIBLING: - n = jj_consume_token(SIBLING); - break; case MINUS: n = jj_consume_token(MINUS); break; @@ -1602,61 +1604,9 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { char connector = ' '; switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case PLUS: - jj_consume_token(PLUS); - label_42: while (true) { - switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { - case S: - ; - break; - default: - jj_la1[58] = jj_gen; - break label_42; - } - jj_consume_token(S); - } - { - if (true) { - return '+'; - } - } - break; case PRECEDES: - jj_consume_token(PRECEDES); - label_43: while (true) { - switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { - case S: - ; - break; - default: - jj_la1[59] = jj_gen; - break label_43; - } - jj_consume_token(S); - } - { - if (true) { - return '>'; - } - } - break; case SIBLING: - jj_consume_token(SIBLING); - label_44: while (true) { - switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { - case S: - ; - break; - default: - jj_la1[60] = jj_gen; - break label_44; - } - jj_consume_token(S); - } - { - if (true) { - return '~'; - } - } + connector = combinatorChar(); break; case S: jj_consume_token(S); @@ -1664,51 +1614,60 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { case PLUS: case PRECEDES: case SIBLING: - switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { - case PLUS: - jj_consume_token(PLUS); - connector = '+'; - break; - case PRECEDES: - jj_consume_token(PRECEDES); - connector = '>'; - break; - case SIBLING: - jj_consume_token(SIBLING); - connector = '~'; - break; - default: - jj_la1[61] = jj_gen; - jj_consume_token(-1); - throw new ParseException(); - } - label_45: while (true) { - switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { - case S: - ; - break; - default: - jj_la1[62] = jj_gen; - break label_45; - } - jj_consume_token(S); - } + connector = combinatorChar(); break; default: - jj_la1[63] = jj_gen; + jj_la1[58] = jj_gen; ; } - { - if (true) { - return connector; - } + break; + default: + jj_la1[59] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + { + if (true) { + return connector; } + } + throw new Error("Missing return statement in function"); + } + + /** to refactor combinator and reuse in selector(). */ + final public char combinatorChar() throws ParseException { + Token t; + switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { + case PLUS: + t = jj_consume_token(PLUS); + break; + case PRECEDES: + t = jj_consume_token(PRECEDES); + break; + case SIBLING: + t = jj_consume_token(SIBLING); break; default: - jj_la1[64] = jj_gen; + jj_la1[60] = jj_gen; jj_consume_token(-1); throw new ParseException(); } + label_42: while (true) { + switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { + case S: + ; + break; + default: + jj_la1[61] = jj_gen; + break label_42; + } + jj_consume_token(S); + } + { + if (true) { + return t.image.charAt(0); + } + } throw new Error("Missing return statement in function"); } @@ -1718,20 +1677,20 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { String value = ""; // This is not really taking the syntax of filter rules into account n = jj_consume_token(MICROSOFT_RULE); - label_46: while (true) { + label_43: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[65] = jj_gen; - break label_46; + jj_la1[62] = jj_gen; + break label_43; } jj_consume_token(S); } name = n.image; jj_consume_token(COLON); - label_47: while (true) { + label_44: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case IDENT: n = jj_consume_token(IDENT); @@ -1780,7 +1739,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { } break; default: - jj_la1[66] = jj_gen; + jj_la1[63] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1799,19 +1758,19 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { ; break; default: - jj_la1[67] = jj_gen; - break label_47; + jj_la1[64] = jj_gen; + break label_44; } } jj_consume_token(SEMICOLON); - label_48: while (true) { + label_45: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[68] = jj_gen; - break label_48; + jj_la1[65] = jj_gen; + break label_45; } jj_consume_token(S); } @@ -1825,7 +1784,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { final public String property() throws ParseException { Token t; String s = ""; - label_49: while (true) { + label_46: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case IDENT: t = jj_consume_token(IDENT); @@ -1836,7 +1795,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { s += t.image; break; default: - jj_la1[69] = jj_gen; + jj_la1[66] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1846,18 +1805,18 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { ; break; default: - jj_la1[70] = jj_gen; - break label_49; + jj_la1[67] = jj_gen; + break label_46; } } - label_50: while (true) { + label_47: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[71] = jj_gen; - break label_50; + jj_la1[68] = jj_gen; + break label_47; } jj_consume_token(S); } @@ -1872,14 +1831,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { final public String variableName() throws ParseException { Token n; n = jj_consume_token(VARIABLE); - label_51: while (true) { + label_48: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[72] = jj_gen; - break label_51; + jj_la1[69] = jj_gen; + break label_48; } jj_consume_token(S); } @@ -1894,14 +1853,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { final public String functionName() throws ParseException { Token n; n = jj_consume_token(FUNCTION); - label_52: while (true) { + label_49: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[73] = jj_gen; - break label_52; + jj_la1[70] = jj_gen; + break label_49; } jj_consume_token(S); } @@ -1926,21 +1885,24 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { l = selectorList(); save = token; jj_consume_token(LBRACE); - label_53: while (true) { + label_50: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[74] = jj_gen; - break label_53; + jj_la1[71] = jj_gen; + break label_50; } jj_consume_token(S); } start = true; documentHandler.startSelector(l); - label_54: while (true) { + label_51: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { + case PLUS: + case PRECEDES: + case SIBLING: case LBRACKET: case ANY: case PARENT: @@ -1962,10 +1924,13 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { ; break; default: - jj_la1[75] = jj_gen; - break label_54; + jj_la1[72] = jj_gen; + break label_51; } switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { + case PLUS: + case PRECEDES: + case SIBLING: case LBRACKET: case ANY: case PARENT: @@ -1991,20 +1956,20 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { microsoftExtension(); break; default: - jj_la1[76] = jj_gen; + jj_la1[73] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } jj_consume_token(RBRACE); - label_55: while (true) { + label_52: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[77] = jj_gen; - break label_55; + jj_la1[74] = jj_gen; + break label_52; } jj_consume_token(S); } @@ -2033,24 +1998,24 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { ArrayList<String> selectors = new ArrayList<String>(); String selector; selector = selector(); - label_56: while (true) { + label_53: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case COMMA: ; break; default: - jj_la1[78] = jj_gen; - break label_56; + jj_la1[75] = jj_gen; + break label_53; } jj_consume_token(COMMA); - label_57: while (true) { + label_54: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[79] = jj_gen; - break label_57; + jj_la1[76] = jj_gen; + break label_54; } jj_consume_token(S); } @@ -2071,27 +2036,48 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { * exception during the parse */ final public String selector() throws ParseException { - String selector; + String selector = null; char comb; try { - selector = simple_selector(null, ' '); - label_58: while (true) { + switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { + case LBRACKET: + case ANY: + case PARENT: + case DOT: + case COLON: + case INTERPOLATION: + case IDENT: + case HASH: + selector = simple_selector(null, ' '); + break; + case PLUS: + case PRECEDES: + case SIBLING: + comb = combinatorChar(); + selector = simple_selector(selector, comb); + break; + default: + jj_la1[77] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + label_55: while (true) { if (jj_2_2(2)) { ; } else { - break label_58; + break label_55; } comb = combinator(); selector = simple_selector(selector, comb); } - label_59: while (true) { + label_56: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[80] = jj_gen; - break label_59; + jj_la1[78] = jj_gen; + break label_56; } jj_consume_token(S); } @@ -2140,7 +2126,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { case INTERPOLATION: case IDENT: simple_current = element_name(); - label_60: while (true) { + label_57: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case LBRACKET: case DOT: @@ -2149,8 +2135,8 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { ; break; default: - jj_la1[81] = jj_gen; - break label_60; + jj_la1[79] = jj_gen; + break label_57; } switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case HASH: @@ -2166,7 +2152,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { cond = pseudo(cond); break; default: - jj_la1[82] = jj_gen; + jj_la1[80] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -2174,7 +2160,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { break; case HASH: cond = hash(cond); - label_61: while (true) { + label_58: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case LBRACKET: case DOT: @@ -2182,8 +2168,8 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { ; break; default: - jj_la1[83] = jj_gen; - break label_61; + jj_la1[81] = jj_gen; + break label_58; } switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case DOT: @@ -2196,7 +2182,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { cond = pseudo(cond); break; default: - jj_la1[84] = jj_gen; + jj_la1[82] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -2204,7 +2190,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { break; case DOT: cond = _class(cond); - label_62: while (true) { + label_59: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case LBRACKET: case DOT: @@ -2213,8 +2199,8 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { ; break; default: - jj_la1[85] = jj_gen; - break label_62; + jj_la1[83] = jj_gen; + break label_59; } switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case HASH: @@ -2230,7 +2216,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { cond = pseudo(cond); break; default: - jj_la1[86] = jj_gen; + jj_la1[84] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -2238,7 +2224,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { break; case COLON: cond = pseudo(cond); - label_63: while (true) { + label_60: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case LBRACKET: case DOT: @@ -2247,8 +2233,8 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { ; break; default: - jj_la1[87] = jj_gen; - break label_63; + jj_la1[85] = jj_gen; + break label_60; } switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case HASH: @@ -2264,7 +2250,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { cond = pseudo(cond); break; default: - jj_la1[88] = jj_gen; + jj_la1[86] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -2272,7 +2258,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { break; case LBRACKET: cond = attrib(cond); - label_64: while (true) { + label_61: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case LBRACKET: case DOT: @@ -2281,8 +2267,8 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { ; break; default: - jj_la1[89] = jj_gen; - break label_64; + jj_la1[87] = jj_gen; + break label_61; } switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case HASH: @@ -2298,14 +2284,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { cond = pseudo(cond); break; default: - jj_la1[90] = jj_gen; + jj_la1[88] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } break; default: - jj_la1[91] = jj_gen; + jj_la1[89] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -2315,25 +2301,30 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { if (cond != null) { simple_current = simple_current + cond; } - if (selector != null) { - switch (comb) { - case ' ': - selector = selector + comb + simple_current; - break; - case '+': - case '>': - case '~': - selector = selector + " " + comb + " " + simple_current; - break; - default: { - if (true) { - throw new ParseException("invalid state. send a bug report"); - } + StringBuilder builder = new StringBuilder(); + switch (comb) { + case ' ': + if (selector != null) { + builder.append(selector).append(" "); } + break; + case '+': + case '>': + case '~': + if (selector != null) { + builder.append(selector).append(" "); + } + builder.append(comb).append(" "); + break; + default: { + if (true) { + throw new ParseException("invalid state. send a bug report"); } - } else { - selector = simple_current; } + } + builder.append(simple_current); + selector = builder.toString(); + if (pseudoElt != null) { selector = selector + pseudoElt; } @@ -2353,7 +2344,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { Token t; String s = "."; jj_consume_token(DOT); - label_65: while (true) { + label_62: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case IDENT: t = jj_consume_token(IDENT); @@ -2364,7 +2355,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { s += t.image; break; default: - jj_la1[92] = jj_gen; + jj_la1[90] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -2374,8 +2365,8 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { ; break; default: - jj_la1[93] = jj_gen; - break label_65; + jj_la1[91] = jj_gen; + break label_62; } } if (pred == null) { @@ -2404,7 +2395,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case INTERPOLATION: case IDENT: - label_66: while (true) { + label_63: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case IDENT: t = jj_consume_token(IDENT); @@ -2415,7 +2406,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { s += t.image; break; default: - jj_la1[94] = jj_gen; + jj_la1[92] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -2425,8 +2416,8 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { ; break; default: - jj_la1[95] = jj_gen; - break label_66; + jj_la1[93] = jj_gen; + break label_63; } } { @@ -2452,7 +2443,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { } break; default: - jj_la1[96] = jj_gen; + jj_la1[94] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -2469,26 +2460,26 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { Token val = null; String attValue = null; jj_consume_token(LBRACKET); - label_67: while (true) { + label_64: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[97] = jj_gen; - break label_67; + jj_la1[95] = jj_gen; + break label_64; } jj_consume_token(S); } att = jj_consume_token(IDENT); - label_68: while (true) { + label_65: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[98] = jj_gen; - break label_68; + jj_la1[96] = jj_gen; + break label_65; } jj_consume_token(S); } @@ -2525,18 +2516,18 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { cases = 6; break; default: - jj_la1[99] = jj_gen; + jj_la1[97] = jj_gen; jj_consume_token(-1); throw new ParseException(); } - label_69: while (true) { + label_66: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[100] = jj_gen; - break label_69; + jj_la1[98] = jj_gen; + break label_66; } jj_consume_token(S); } @@ -2550,24 +2541,24 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { attValue = val.image; break; default: - jj_la1[101] = jj_gen; + jj_la1[99] = jj_gen; jj_consume_token(-1); throw new ParseException(); } - label_70: while (true) { + label_67: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[102] = jj_gen; - break label_70; + jj_la1[100] = jj_gen; + break label_67; } jj_consume_token(S); } break; default: - jj_la1[103] = jj_gen; + jj_la1[101] = jj_gen; ; } jj_consume_token(RBRACKET); @@ -2632,7 +2623,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { isPseudoElement = true; break; default: - jj_la1[104] = jj_gen; + jj_la1[102] = jj_gen; ; } switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { @@ -2675,14 +2666,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { break; case FUNCTION: n = jj_consume_token(FUNCTION); - label_71: while (true) { + label_68: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[105] = jj_gen; - break label_71; + jj_la1[103] = jj_gen; + break label_68; } jj_consume_token(S); } @@ -2707,7 +2698,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { } break; default: - jj_la1[106] = jj_gen; + jj_la1[104] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -2746,14 +2737,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { try { name = variableName(); jj_consume_token(COLON); - label_72: while (true) { + label_69: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[107] = jj_gen; - break label_72; + jj_la1[105] = jj_gen; + break label_69; } jj_consume_token(S); } @@ -2763,19 +2754,19 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { guarded = guarded(); break; default: - jj_la1[108] = jj_gen; + jj_la1[106] = jj_gen; ; } - label_73: while (true) { + label_70: while (true) { jj_consume_token(SEMICOLON); - label_74: while (true) { + label_71: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[109] = jj_gen; - break label_74; + jj_la1[107] = jj_gen; + break label_71; } jj_consume_token(S); } @@ -2784,8 +2775,8 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { ; break; default: - jj_la1[110] = jj_gen; - break label_73; + jj_la1[108] = jj_gen; + break label_70; } } documentHandler.variable(name, exp, guarded); @@ -2823,7 +2814,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { eachDirective(); break; default: - jj_la1[111] = jj_gen; + jj_la1[109] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -2840,6 +2831,9 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { case EXTEND_SYM: extendDirective(); break; + case PLUS: + case PRECEDES: + case SIBLING: case LBRACKET: case ANY: case PARENT: @@ -2856,7 +2850,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { keyframes(); break; default: - jj_la1[112] = jj_gen; + jj_la1[110] = jj_gen; if (jj_2_3(2147483647)) { variable(); } else { @@ -2865,7 +2859,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { listModifyDirective(); break; default: - jj_la1[113] = jj_gen; + jj_la1[111] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -2878,7 +2872,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { String s = null; String evaluator = ""; jj_consume_token(IF_SYM); - label_75: while (true) { + label_72: while (true) { s = booleanExpressionToken(); evaluator += s; switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { @@ -2903,26 +2897,29 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { ; break; default: - jj_la1[114] = jj_gen; - break label_75; + jj_la1[112] = jj_gen; + break label_72; } } jj_consume_token(LBRACE); - label_76: while (true) { + label_73: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[115] = jj_gen; - break label_76; + jj_la1[113] = jj_gen; + break label_73; } jj_consume_token(S); } documentHandler.startIfElseDirective(); documentHandler.ifDirective(evaluator); - label_77: while (true) { + label_74: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { + case PLUS: + case PRECEDES: + case SIBLING: case LBRACKET: case ANY: case PARENT: @@ -2941,31 +2938,31 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { ; break; default: - jj_la1[116] = jj_gen; - break label_77; + jj_la1[114] = jj_gen; + break label_74; } ifContentStatement(); } jj_consume_token(RBRACE); - label_78: while (true) { + label_75: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[117] = jj_gen; - break label_78; + jj_la1[115] = jj_gen; + break label_75; } jj_consume_token(S); } - label_79: while (true) { + label_76: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case ELSE_SYM: ; break; default: - jj_la1[118] = jj_gen; - break label_79; + jj_la1[116] = jj_gen; + break label_76; } elseDirective(); } @@ -2977,21 +2974,21 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { Token n = null; String s = null; jj_consume_token(ELSE_SYM); - label_80: while (true) { + label_77: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[119] = jj_gen; - break label_80; + jj_la1[117] = jj_gen; + break label_77; } jj_consume_token(S); } switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case IF: jj_consume_token(IF); - label_81: while (true) { + label_78: while (true) { s = booleanExpressionToken(); evaluator += s; switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { @@ -3016,24 +3013,24 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { ; break; default: - jj_la1[120] = jj_gen; - break label_81; + jj_la1[118] = jj_gen; + break label_78; } } break; default: - jj_la1[121] = jj_gen; + jj_la1[119] = jj_gen; ; } jj_consume_token(LBRACE); - label_82: while (true) { + label_79: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[122] = jj_gen; - break label_82; + jj_la1[120] = jj_gen; + break label_79; } jj_consume_token(S); } @@ -3042,8 +3039,11 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { } else { documentHandler.elseDirective(); } - label_83: while (true) { + label_80: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { + case PLUS: + case PRECEDES: + case SIBLING: case LBRACKET: case ANY: case PARENT: @@ -3062,20 +3062,20 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { ; break; default: - jj_la1[123] = jj_gen; - break label_83; + jj_la1[121] = jj_gen; + break label_80; } ifContentStatement(); } jj_consume_token(RBRACE); - label_84: while (true) { + label_81: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[124] = jj_gen; - break label_84; + jj_la1[122] = jj_gen; + break label_81; } jj_consume_token(S); } @@ -3140,7 +3140,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { n = jj_consume_token(NOT_EQ); break; default: - jj_la1[125] = jj_gen; + jj_la1[123] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -3166,38 +3166,38 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { ArrayList<String> list = null; String listVariable = null; jj_consume_token(EACH_SYM); - label_85: while (true) { + label_82: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[126] = jj_gen; - break label_85; + jj_la1[124] = jj_gen; + break label_82; } jj_consume_token(S); } var = jj_consume_token(VARIABLE); - label_86: while (true) { + label_83: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[127] = jj_gen; - break label_86; + jj_la1[125] = jj_gen; + break label_83; } jj_consume_token(S); } jj_consume_token(EACH_IN); - label_87: while (true) { + label_84: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[128] = jj_gen; - break label_87; + jj_la1[126] = jj_gen; + break label_84; } jj_consume_token(S); } @@ -3211,24 +3211,27 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { documentHandler.startEachDirective(var.image, listVariable); break; default: - jj_la1[129] = jj_gen; + jj_la1[127] = jj_gen; jj_consume_token(-1); throw new ParseException(); } jj_consume_token(LBRACE); - label_88: while (true) { + label_85: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[130] = jj_gen; - break label_88; + jj_la1[128] = jj_gen; + break label_85; } jj_consume_token(S); } - label_89: while (true) { + label_86: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { + case PLUS: + case PRECEDES: + case SIBLING: case LBRACKET: case ANY: case PARENT: @@ -3247,20 +3250,20 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { ; break; default: - jj_la1[131] = jj_gen; - break label_89; + jj_la1[129] = jj_gen; + break label_86; } ifContentStatement(); } jj_consume_token(RBRACE); - label_90: while (true) { + label_87: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[132] = jj_gen; - break label_90; + jj_la1[130] = jj_gen; + break label_87; } jj_consume_token(S); } @@ -3271,49 +3274,49 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { ArrayList<String> strings = new ArrayList<String>(); Token input; input = jj_consume_token(IDENT); - label_91: while (true) { + label_88: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[133] = jj_gen; - break label_91; + jj_la1[131] = jj_gen; + break label_88; } jj_consume_token(S); } strings.add(input.image); - label_92: while (true) { + label_89: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case COMMA: ; break; default: - jj_la1[134] = jj_gen; - break label_92; + jj_la1[132] = jj_gen; + break label_89; } jj_consume_token(COMMA); - label_93: while (true) { + label_90: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[135] = jj_gen; - break label_93; + jj_la1[133] = jj_gen; + break label_90; } jj_consume_token(S); } input = jj_consume_token(IDENT); strings.add(input.image); - label_94: while (true) { + label_91: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[136] = jj_gen; - break label_94; + jj_la1[134] = jj_gen; + break label_91; } jj_consume_token(S); } @@ -3331,14 +3334,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { ArrayList<VariableNode> args = null; String body; jj_consume_token(MIXIN_SYM); - label_95: while (true) { + label_92: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[137] = jj_gen; - break label_95; + jj_la1[135] = jj_gen; + break label_92; } jj_consume_token(S); } @@ -3351,38 +3354,41 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { name = functionName(); args = arglist(); jj_consume_token(RPARAN); - label_96: while (true) { + label_93: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[138] = jj_gen; - break label_96; + jj_la1[136] = jj_gen; + break label_93; } jj_consume_token(S); } break; default: - jj_la1[139] = jj_gen; + jj_la1[137] = jj_gen; jj_consume_token(-1); throw new ParseException(); } jj_consume_token(LBRACE); - label_97: while (true) { + label_94: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[140] = jj_gen; - break label_97; + jj_la1[138] = jj_gen; + break label_94; } jj_consume_token(S); } documentHandler.startMixinDirective(name, args); - label_98: while (true) { + label_95: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { + case PLUS: + case PRECEDES: + case SIBLING: case LBRACKET: case ANY: case PARENT: @@ -3405,10 +3411,13 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { ; break; default: - jj_la1[141] = jj_gen; - break label_98; + jj_la1[139] = jj_gen; + break label_95; } switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { + case PLUS: + case PRECEDES: + case SIBLING: case LBRACKET: case ANY: case PARENT: @@ -3437,20 +3446,20 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { page(); break; default: - jj_la1[142] = jj_gen; + jj_la1[140] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } jj_consume_token(RBRACE); - label_99: while (true) { + label_96: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[143] = jj_gen; - break label_99; + jj_la1[141] = jj_gen; + break label_96; } jj_consume_token(S); } @@ -3462,24 +3471,24 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { VariableNode arg; boolean hasNonOptionalArgument = false; arg = mixinArg(); - label_100: while (true) { + label_97: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case COMMA: ; break; default: - jj_la1[144] = jj_gen; - break label_100; + jj_la1[142] = jj_gen; + break label_97; } jj_consume_token(COMMA); - label_101: while (true) { + label_98: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[145] = jj_gen; - break label_101; + jj_la1[143] = jj_gen; + break label_98; } jj_consume_token(S); } @@ -3530,42 +3539,42 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case COLON: jj_consume_token(COLON); - label_102: while (true) { + label_99: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[146] = jj_gen; - break label_102; + jj_la1[144] = jj_gen; + break label_99; } jj_consume_token(S); } first = nonVariableTerm(null); prev = first; - label_103: while (true) { + label_100: while (true) { if (jj_2_5(3)) { ; } else { - break label_103; + break label_100; } switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case COMMA: jj_consume_token(COMMA); - label_104: while (true) { + label_101: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[147] = jj_gen; - break label_104; + jj_la1[145] = jj_gen; + break label_101; } jj_consume_token(S); } break; default: - jj_la1[148] = jj_gen; + jj_la1[146] = jj_gen; ; } prev = nonVariableTerm(prev); @@ -3577,13 +3586,13 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { token.beginColumn, prev, variable.image); break; default: - jj_la1[149] = jj_gen; + jj_la1[147] = jj_gen; jj_consume_token(-1); throw new ParseException(); } break; default: - jj_la1[150] = jj_gen; + jj_la1[148] = jj_gen; ; } VariableNode arg = new VariableNode(name, first, false); @@ -3604,7 +3613,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { first = term(null); args.add(first); prev = first; - label_105: while (true) { + label_102: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case PLUS: case MINUS: @@ -3640,57 +3649,57 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { ; break; default: - jj_la1[151] = jj_gen; - break label_105; + jj_la1[149] = jj_gen; + break label_102; } switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case COLON: jj_consume_token(COLON); - label_106: while (true) { + label_103: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[152] = jj_gen; - break label_106; + jj_la1[150] = jj_gen; + break label_103; } jj_consume_token(S); } break; default: - jj_la1[153] = jj_gen; + jj_la1[151] = jj_gen; ; } next = term(prev); prev.setNextLexicalUnit(next); prev = next; } - label_107: while (true) { + label_104: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case COMMA: ; break; default: - jj_la1[154] = jj_gen; - break label_107; + jj_la1[152] = jj_gen; + break label_104; } jj_consume_token(COMMA); - label_108: while (true) { + label_105: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[155] = jj_gen; - break label_108; + jj_la1[153] = jj_gen; + break label_105; } jj_consume_token(S); } first = term(null); args.add(first); prev = first; - label_109: while (true) { + label_106: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case PLUS: case MINUS: @@ -3726,26 +3735,26 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { ; break; default: - jj_la1[156] = jj_gen; - break label_109; + jj_la1[154] = jj_gen; + break label_106; } switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case COLON: jj_consume_token(COLON); - label_110: while (true) { + label_107: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[157] = jj_gen; - break label_110; + jj_la1[155] = jj_gen; + break label_107; } jj_consume_token(S); } break; default: - jj_la1[158] = jj_gen; + jj_la1[156] = jj_gen; ; } next = term(prev); @@ -3765,14 +3774,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { String name; ArrayList<LexicalUnitImpl> args = null; jj_consume_token(INCLUDE_SYM); - label_111: while (true) { + label_108: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[159] = jj_gen; - break label_111; + jj_la1[157] = jj_gen; + break label_108; } jj_consume_token(S); } @@ -3791,20 +3800,20 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { jj_consume_token(RPARAN); break; default: - jj_la1[160] = jj_gen; + jj_la1[158] = jj_gen; jj_consume_token(-1); throw new ParseException(); } - label_112: while (true) { + label_109: while (true) { jj_consume_token(SEMICOLON); - label_113: while (true) { + label_110: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[161] = jj_gen; - break label_113; + jj_la1[159] = jj_gen; + break label_110; } jj_consume_token(S); } @@ -3813,8 +3822,8 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { ; break; default: - jj_la1[162] = jj_gen; - break label_112; + jj_la1[160] = jj_gen; + break label_109; } } documentHandler.includeDirective(name, args); @@ -3841,26 +3850,26 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { // refactor, remove those 3 LOOKAHEAD(5). n = jj_consume_token(VARIABLE); variable = n.image; - label_114: while (true) { + label_111: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[163] = jj_gen; - break label_114; + jj_la1[161] = jj_gen; + break label_111; } jj_consume_token(S); } jj_consume_token(COLON); - label_115: while (true) { + label_112: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[164] = jj_gen; - break label_115; + jj_la1[162] = jj_gen; + break label_112; } jj_consume_token(S); } @@ -3875,18 +3884,18 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { type = jj_consume_token(CONTAINS); break; default: - jj_la1[165] = jj_gen; + jj_la1[163] = jj_gen; jj_consume_token(-1); throw new ParseException(); } - label_116: while (true) { + label_113: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[166] = jj_gen; - break label_116; + jj_la1[164] = jj_gen; + break label_113; } jj_consume_token(S); } @@ -3896,18 +3905,18 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { jj_consume_token(RPARAN); break; default: - jj_la1[167] = jj_gen; + jj_la1[165] = jj_gen; ; } jj_consume_token(COMMA); - label_117: while (true) { + label_114: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[168] = jj_gen; - break label_117; + jj_la1[166] = jj_gen; + break label_114; } jj_consume_token(S); } @@ -3915,33 +3924,33 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case COMMA: jj_consume_token(COMMA); - label_118: while (true) { + label_115: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[169] = jj_gen; - break label_118; + jj_la1[167] = jj_gen; + break label_115; } jj_consume_token(S); } n = jj_consume_token(IDENT); separator = n.image; - label_119: while (true) { + label_116: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[170] = jj_gen; - break label_119; + jj_la1[168] = jj_gen; + break label_116; } jj_consume_token(S); } break; default: - jj_la1[171] = jj_gen; + jj_la1[169] = jj_gen; ; } jj_consume_token(RPARAN); @@ -3962,26 +3971,26 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { default: break; } - label_120: while (true) { + label_117: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[172] = jj_gen; - break label_120; + jj_la1[170] = jj_gen; + break label_117; } jj_consume_token(S); } jj_consume_token(SEMICOLON); - label_121: while (true) { + label_118: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[173] = jj_gen; - break label_121; + jj_la1[171] = jj_gen; + break label_118; } jj_consume_token(S); } @@ -3999,38 +4008,38 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { Token n = null; n = jj_consume_token(VARIABLE); variable = n.image; - label_122: while (true) { + label_119: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[174] = jj_gen; - break label_122; + jj_la1[172] = jj_gen; + break label_119; } jj_consume_token(S); } jj_consume_token(COLON); - label_123: while (true) { + label_120: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[175] = jj_gen; - break label_123; + jj_la1[173] = jj_gen; + break label_120; } jj_consume_token(S); } jj_consume_token(APPEND); - label_124: while (true) { + label_121: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[176] = jj_gen; - break label_124; + jj_la1[174] = jj_gen; + break label_121; } jj_consume_token(S); } @@ -4040,18 +4049,18 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { jj_consume_token(RPARAN); break; default: - jj_la1[177] = jj_gen; + jj_la1[175] = jj_gen; ; } jj_consume_token(COMMA); - label_125: while (true) { + label_122: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[178] = jj_gen; - break label_125; + jj_la1[176] = jj_gen; + break label_122; } jj_consume_token(S); } @@ -4059,33 +4068,33 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case COMMA: jj_consume_token(COMMA); - label_126: while (true) { + label_123: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[179] = jj_gen; - break label_126; + jj_la1[177] = jj_gen; + break label_123; } jj_consume_token(S); } n = jj_consume_token(IDENT); separator = n.image; - label_127: while (true) { + label_124: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[180] = jj_gen; - break label_127; + jj_la1[178] = jj_gen; + break label_124; } jj_consume_token(S); } break; default: - jj_la1[181] = jj_gen; + jj_la1[179] = jj_gen; ; } jj_consume_token(RPARAN); @@ -4104,38 +4113,38 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { Token n = null; n = jj_consume_token(VARIABLE); variable = n.image; - label_128: while (true) { + label_125: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[182] = jj_gen; - break label_128; + jj_la1[180] = jj_gen; + break label_125; } jj_consume_token(S); } jj_consume_token(COLON); - label_129: while (true) { + label_126: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[183] = jj_gen; - break label_129; + jj_la1[181] = jj_gen; + break label_126; } jj_consume_token(S); } jj_consume_token(REMOVE); - label_130: while (true) { + label_127: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[184] = jj_gen; - break label_130; + jj_la1[182] = jj_gen; + break label_127; } jj_consume_token(S); } @@ -4145,18 +4154,18 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { jj_consume_token(RPARAN); break; default: - jj_la1[185] = jj_gen; + jj_la1[183] = jj_gen; ; } jj_consume_token(COMMA); - label_131: while (true) { + label_128: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[186] = jj_gen; - break label_131; + jj_la1[184] = jj_gen; + break label_128; } jj_consume_token(S); } @@ -4164,33 +4173,33 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case COMMA: jj_consume_token(COMMA); - label_132: while (true) { + label_129: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[187] = jj_gen; - break label_132; + jj_la1[185] = jj_gen; + break label_129; } jj_consume_token(S); } n = jj_consume_token(IDENT); separator = n.image; - label_133: while (true) { + label_130: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[188] = jj_gen; - break label_133; + jj_la1[186] = jj_gen; + break label_130; } jj_consume_token(S); } break; default: - jj_la1[189] = jj_gen; + jj_la1[187] = jj_gen; ; } jj_consume_token(RPARAN); @@ -4211,43 +4220,43 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { case VARIABLE: n = jj_consume_token(VARIABLE); variable = n.image; - label_134: while (true) { + label_131: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[190] = jj_gen; - break label_134; + jj_la1[188] = jj_gen; + break label_131; } jj_consume_token(S); } jj_consume_token(COLON); - label_135: while (true) { + label_132: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[191] = jj_gen; - break label_135; + jj_la1[189] = jj_gen; + break label_132; } jj_consume_token(S); } break; default: - jj_la1[192] = jj_gen; + jj_la1[190] = jj_gen; ; } jj_consume_token(CONTAINS); - label_136: while (true) { + label_133: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[193] = jj_gen; - break label_136; + jj_la1[191] = jj_gen; + break label_133; } jj_consume_token(S); } @@ -4257,18 +4266,18 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { jj_consume_token(RPARAN); break; default: - jj_la1[194] = jj_gen; + jj_la1[192] = jj_gen; ; } jj_consume_token(COMMA); - label_137: while (true) { + label_134: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[195] = jj_gen; - break label_137; + jj_la1[193] = jj_gen; + break label_134; } jj_consume_token(S); } @@ -4276,33 +4285,33 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case COMMA: jj_consume_token(COMMA); - label_138: while (true) { + label_135: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[196] = jj_gen; - break label_138; + jj_la1[194] = jj_gen; + break label_135; } jj_consume_token(S); } n = jj_consume_token(IDENT); separator = n.image; - label_139: while (true) { + label_136: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[197] = jj_gen; - break label_139; + jj_la1[195] = jj_gen; + break label_136; } jj_consume_token(S); } break; default: - jj_la1[198] = jj_gen; + jj_la1[196] = jj_gen; ; } jj_consume_token(RPARAN); @@ -4404,7 +4413,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { warnDirective(); break; default: - jj_la1[199] = jj_gen; + jj_la1[197] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -4416,14 +4425,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { // TODO should evaluate the content expression, call // documentHandler.debugDirective() etc. System.out.println(content); - label_140: while (true) { + label_137: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[200] = jj_gen; - break label_140; + jj_la1[198] = jj_gen; + break label_137; } jj_consume_token(S); } @@ -4435,14 +4444,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { // TODO should evaluate the content expression, call // documentHandler.warnDirective() etc. System.err.println(content); - label_141: while (true) { + label_138: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[201] = jj_gen; - break label_141; + jj_la1[199] = jj_gen; + break label_138; } jj_consume_token(S); } @@ -4468,19 +4477,19 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { exclusive = false; break; default: - jj_la1[202] = jj_gen; + jj_la1[200] = jj_gen; jj_consume_token(-1); throw new ParseException(); } to = skipStatementUntilLeftBrace(); - label_142: while (true) { + label_139: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[203] = jj_gen; - break label_142; + jj_la1[201] = jj_gen; + break label_139; } jj_consume_token(S); } @@ -4510,28 +4519,28 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { final public void extendDirective() throws ParseException { ArrayList<String> list; jj_consume_token(EXTEND_SYM); - label_143: while (true) { + label_140: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[204] = jj_gen; - break label_143; + jj_la1[202] = jj_gen; + break label_140; } jj_consume_token(S); } list = selectorList(); - label_144: while (true) { + label_141: while (true) { jj_consume_token(SEMICOLON); - label_145: while (true) { + label_142: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[205] = jj_gen; - break label_145; + jj_la1[203] = jj_gen; + break label_142; } jj_consume_token(S); } @@ -4540,8 +4549,8 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { ; break; default: - jj_la1[206] = jj_gen; - break label_144; + jj_la1[204] = jj_gen; + break label_141; } } documentHandler.extendDirective(list); @@ -4568,26 +4577,26 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { LexicalUnit exp; name = property(); jj_consume_token(COLON); - label_146: while (true) { + label_143: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[207] = jj_gen; - break label_146; + jj_la1[205] = jj_gen; + break label_143; } jj_consume_token(S); } jj_consume_token(LBRACE); - label_147: while (true) { + label_144: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[208] = jj_gen; - break label_147; + jj_la1[206] = jj_gen; + break label_144; } jj_consume_token(S); } @@ -4598,27 +4607,27 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { declaration(); break; default: - jj_la1[209] = jj_gen; + jj_la1[207] = jj_gen; ; } - label_148: while (true) { + label_145: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case SEMICOLON: ; break; default: - jj_la1[210] = jj_gen; - break label_148; + jj_la1[208] = jj_gen; + break label_145; } jj_consume_token(SEMICOLON); - label_149: while (true) { + label_146: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[211] = jj_gen; - break label_149; + jj_la1[209] = jj_gen; + break label_146; } jj_consume_token(S); } @@ -4628,20 +4637,20 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { declaration(); break; default: - jj_la1[212] = jj_gen; + jj_la1[210] = jj_gen; ; } } jj_consume_token(RBRACE); documentHandler.endNestedProperties(name); - label_150: while (true) { + label_147: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[213] = jj_gen; - break label_150; + jj_la1[211] = jj_gen; + break label_147; } jj_consume_token(S); } @@ -4660,13 +4669,16 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { debuggingDirective(); break; default: - jj_la1[214] = jj_gen; + jj_la1[212] = jj_gen; if (jj_2_6(2147483647)) { styleRule(); } else if (jj_2_7(3)) { declarationOrNestedProperties(); } else { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { + case PLUS: + case PRECEDES: + case SIBLING: case LBRACKET: case ANY: case PARENT: @@ -4678,7 +4690,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { styleRule(); break; default: - jj_la1[215] = jj_gen; + jj_la1[213] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -4723,14 +4735,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { name = property(); save = token; jj_consume_token(COLON); - label_151: while (true) { + label_148: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[216] = jj_gen; - break label_151; + jj_la1[214] = jj_gen; + break label_148; } jj_consume_token(S); } @@ -4771,7 +4783,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { important = prio(); break; default: - jj_la1[217] = jj_gen; + jj_la1[215] = jj_gen; ; } Token next = getToken(1); @@ -4790,14 +4802,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { break; case LBRACE: jj_consume_token(LBRACE); - label_152: while (true) { + label_149: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[218] = jj_gen; - break label_152; + jj_la1[216] = jj_gen; + break label_149; } jj_consume_token(S); } @@ -4808,27 +4820,27 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { declaration(); break; default: - jj_la1[219] = jj_gen; + jj_la1[217] = jj_gen; ; } - label_153: while (true) { + label_150: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case SEMICOLON: ; break; default: - jj_la1[220] = jj_gen; - break label_153; + jj_la1[218] = jj_gen; + break label_150; } jj_consume_token(SEMICOLON); - label_154: while (true) { + label_151: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[221] = jj_gen; - break label_154; + jj_la1[219] = jj_gen; + break label_151; } jj_consume_token(S); } @@ -4838,26 +4850,26 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { declaration(); break; default: - jj_la1[222] = jj_gen; + jj_la1[220] = jj_gen; ; } } jj_consume_token(RBRACE); - label_155: while (true) { + label_152: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[223] = jj_gen; - break label_155; + jj_la1[221] = jj_gen; + break label_152; } jj_consume_token(S); } documentHandler.endNestedProperties(name); break; default: - jj_la1[224] = jj_gen; + jj_la1[222] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -4905,14 +4917,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { name = property(); save = token; jj_consume_token(COLON); - label_156: while (true) { + label_153: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[225] = jj_gen; - break label_156; + jj_la1[223] = jj_gen; + break label_153; } jj_consume_token(S); } @@ -4922,7 +4934,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { important = prio(); break; default: - jj_la1[226] = jj_gen; + jj_la1[224] = jj_gen; ; } documentHandler.property(name, exp, important); @@ -4963,14 +4975,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { */ final public boolean prio() throws ParseException { jj_consume_token(IMPORTANT_SYM); - label_157: while (true) { + label_154: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[227] = jj_gen; - break label_157; + jj_la1[225] = jj_gen; + break label_154; } jj_consume_token(S); } @@ -4984,14 +4996,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { final public boolean guarded() throws ParseException { jj_consume_token(GUARDED_SYM); - label_158: while (true) { + label_155: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[228] = jj_gen; - break label_158; + jj_la1[226] = jj_gen; + break label_155; } jj_consume_token(S); } @@ -5013,14 +5025,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case DIV: n = jj_consume_token(DIV); - label_159: while (true) { + label_156: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[229] = jj_gen; - break label_159; + jj_la1[227] = jj_gen; + break label_156; } jj_consume_token(S); } @@ -5033,14 +5045,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { break; case COMMA: n = jj_consume_token(COMMA); - label_160: while (true) { + label_157: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[230] = jj_gen; - break label_160; + jj_la1[228] = jj_gen; + break label_157; } jj_consume_token(S); } @@ -5052,7 +5064,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { } break; default: - jj_la1[231] = jj_gen; + jj_la1[229] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -5068,11 +5080,11 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { char op; first = term(null); res = first; - label_161: while (true) { + label_158: while (true) { if (jj_2_8(2)) { ; } else { - break label_161; + break label_158; } switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case COMMA: @@ -5080,7 +5092,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { res = operator(res); break; default: - jj_la1[232] = jj_gen; + jj_la1[230] = jj_gen; ; } res = term(res); @@ -5116,7 +5128,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { } break; default: - jj_la1[233] = jj_gen; + jj_la1[231] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -5168,7 +5180,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { result = variableTerm(prev); break; default: - jj_la1[234] = jj_gen; + jj_la1[232] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -5232,7 +5244,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { op = unaryOperator(); break; default: - jj_la1[235] = jj_gen; + jj_la1[233] = jj_gen; ; } switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { @@ -5347,7 +5359,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { result = function(op, prev); break; default: - jj_la1[236] = jj_gen; + jj_la1[234] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -5373,7 +5385,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { s += "."; break; default: - jj_la1[237] = jj_gen; + jj_la1[235] = jj_gen; ; } n = jj_consume_token(IDENT); @@ -5411,24 +5423,24 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { result = unicode(prev); break; default: - jj_la1[238] = jj_gen; + jj_la1[236] = jj_gen; jj_consume_token(-1); throw new ParseException(); } break; default: - jj_la1[239] = jj_gen; + jj_la1[237] = jj_gen; jj_consume_token(-1); throw new ParseException(); } - label_162: while (true) { + label_159: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[240] = jj_gen; - break label_162; + jj_la1[238] = jj_gen; + break label_159; } jj_consume_token(S); } @@ -5451,14 +5463,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { Token n; LexicalUnit params = null; n = jj_consume_token(FUNCTION); - label_163: while (true) { + label_160: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[241] = jj_gen; - break label_163; + jj_la1[239] = jj_gen; + break label_160; } jj_consume_token(S); } @@ -5514,7 +5526,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { params = expr(); break; default: - jj_la1[242] = jj_gen; + jj_la1[240] = jj_gen; ; } jj_consume_token(RPARAN); @@ -6051,14 +6063,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { */ final public void _parseRule() throws ParseException { String ret = null; - label_164: while (true) { + label_161: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[243] = jj_gen; - break label_164; + jj_la1[241] = jj_gen; + break label_161; } jj_consume_token(S); } @@ -6070,6 +6082,9 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { case WARN_SYM: debuggingDirective(); break; + case PLUS: + case PRECEDES: + case SIBLING: case LBRACKET: case ANY: case PARENT: @@ -6090,7 +6105,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { fontFace(); break; default: - jj_la1[244] = jj_gen; + jj_la1[242] = jj_gen; ret = skipStatement(); if ((ret == null) || (ret.length() == 0)) { { @@ -6113,14 +6128,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { } final public void _parseImportRule() throws ParseException { - label_165: while (true) { + label_162: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[245] = jj_gen; - break label_165; + jj_la1[243] = jj_gen; + break label_162; } jj_consume_token(S); } @@ -6128,14 +6143,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { } final public void _parseMediaRule() throws ParseException { - label_166: while (true) { + label_163: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[246] = jj_gen; - break label_166; + jj_la1[244] = jj_gen; + break label_163; } jj_consume_token(S); } @@ -6143,14 +6158,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { } final public void _parseDeclarationBlock() throws ParseException { - label_167: while (true) { + label_164: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[247] = jj_gen; - break label_167; + jj_la1[245] = jj_gen; + break label_164; } jj_consume_token(S); } @@ -6160,27 +6175,27 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { declaration(); break; default: - jj_la1[248] = jj_gen; + jj_la1[246] = jj_gen; ; } - label_168: while (true) { + label_165: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case SEMICOLON: ; break; default: - jj_la1[249] = jj_gen; - break label_168; + jj_la1[247] = jj_gen; + break label_165; } jj_consume_token(SEMICOLON); - label_169: while (true) { + label_166: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[250] = jj_gen; - break label_169; + jj_la1[248] = jj_gen; + break label_166; } jj_consume_token(S); } @@ -6190,7 +6205,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { declaration(); break; default: - jj_la1[251] = jj_gen; + jj_la1[249] = jj_gen; ; } } @@ -6199,14 +6214,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { final public ArrayList<String> _parseSelectors() throws ParseException { ArrayList<String> p = null; try { - label_170: while (true) { + label_167: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case S: ; break; default: - jj_la1[252] = jj_gen; - break label_170; + jj_la1[250] = jj_gen; + break label_167; } jj_consume_token(S); } @@ -6322,87 +6337,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { } } - private boolean jj_3R_212() { - if (jj_3R_249()) { - return true; - } - return false; - } - - private boolean jj_3R_195() { - Token xsp; - xsp = jj_scanpos; - if (jj_3R_212()) { - jj_scanpos = xsp; - } - xsp = jj_scanpos; - if (jj_3R_213()) { - jj_scanpos = xsp; - if (jj_3R_214()) { - jj_scanpos = xsp; - if (jj_3R_215()) { - jj_scanpos = xsp; - if (jj_3R_216()) { - jj_scanpos = xsp; - if (jj_3R_217()) { - jj_scanpos = xsp; - if (jj_3R_218()) { - jj_scanpos = xsp; - if (jj_3R_219()) { - jj_scanpos = xsp; - if (jj_3R_220()) { - jj_scanpos = xsp; - if (jj_3R_221()) { - jj_scanpos = xsp; - if (jj_3R_222()) { - jj_scanpos = xsp; - if (jj_3R_223()) { - jj_scanpos = xsp; - if (jj_3R_224()) { - jj_scanpos = xsp; - if (jj_3R_225()) { - jj_scanpos = xsp; - if (jj_3R_226()) { - jj_scanpos = xsp; - if (jj_3R_227()) { - jj_scanpos = xsp; - if (jj_3R_228()) { - jj_scanpos = xsp; - if (jj_3R_229()) { - jj_scanpos = xsp; - if (jj_3R_230()) { - jj_scanpos = xsp; - if (jj_3R_231()) { - jj_scanpos = xsp; - if (jj_3R_232()) { - jj_scanpos = xsp; - if (jj_3R_233()) { - return true; - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - return false; - } - - private boolean jj_3R_181() { + private boolean jj_3R_178() { if (jj_scan_token(VARIABLE)) { return true; } @@ -6417,74 +6352,47 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_176() { - Token xsp; - xsp = jj_scanpos; - if (jj_3R_195()) { - jj_scanpos = xsp; - if (jj_3R_196()) { - return true; - } - } - while (true) { - xsp = jj_scanpos; - if (jj_scan_token(1)) { - jj_scanpos = xsp; - break; - } - } - return false; - } - - private boolean jj_3R_184() { - if (jj_scan_token(SEMICOLON)) { - return true; - } - Token xsp; - while (true) { - xsp = jj_scanpos; - if (jj_scan_token(1)) { - jj_scanpos = xsp; - break; - } - } - return false; - } - - private boolean jj_3R_252() { - if (jj_scan_token(HASH)) { + private boolean jj_3R_240() { + if (jj_3R_178()) { return true; } return false; } - private boolean jj_3R_239() { + private boolean jj_3R_237() { Token xsp; xsp = jj_scanpos; - if (jj_3R_255()) { + if (jj_3R_250()) { jj_scanpos = xsp; - if (jj_3R_256()) { + if (jj_3R_251()) { return true; } } return false; } - private boolean jj_3R_255() { + private boolean jj_3R_250() { if (jj_scan_token(IDENT)) { return true; } return false; } - private boolean jj_3R_199() { + private boolean jj_3R_248() { + if (jj_scan_token(URL)) { + return true; + } + return false; + } + + private boolean jj_3R_194() { Token xsp; - if (jj_3R_239()) { + if (jj_3R_237()) { return true; } while (true) { xsp = jj_scanpos; - if (jj_3R_239()) { + if (jj_3R_237()) { jj_scanpos = xsp; break; } @@ -6499,127 +6407,114 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_242() { - if (jj_3R_181()) { - return true; - } - return false; - } - - private boolean jj_3R_253() { - if (jj_scan_token(URL)) { - return true; - } - return false; - } - - private boolean jj_3R_183() { - if (jj_3R_205()) { + private boolean jj_3R_180() { + if (jj_3R_200()) { return true; } return false; } - private boolean jj_3R_203() { - if (jj_3R_176()) { + private boolean jj_3R_198() { + if (jj_3R_173()) { return true; } return false; } - private boolean jj_3R_180() { + private boolean jj_3R_177() { Token xsp; xsp = jj_scanpos; - if (jj_3R_203()) { + if (jj_3R_198()) { jj_scanpos = xsp; - if (jj_3R_204()) { + if (jj_3R_199()) { return true; } } return false; } - private boolean jj_3R_179() { - if (jj_3R_202()) { + private boolean jj_3R_176() { + if (jj_3R_197()) { return true; } return false; } - private boolean jj_3R_259() { + private boolean jj_3R_254() { if (jj_scan_token(PLUS)) { return true; } return false; } - private boolean jj_3R_249() { + private boolean jj_3R_244() { Token xsp; xsp = jj_scanpos; - if (jj_3R_258()) { + if (jj_3R_253()) { jj_scanpos = xsp; - if (jj_3R_259()) { + if (jj_3R_254()) { return true; } } return false; } - private boolean jj_3R_258() { + private boolean jj_3R_253() { if (jj_scan_token(MINUS)) { return true; } return false; } - private boolean jj_3R_245() { - if (jj_scan_token(SIBLING)) { + private boolean jj_3R_249() { + if (jj_scan_token(UNICODERANGE)) { return true; } return false; } - private boolean jj_3R_244() { - if (jj_scan_token(PRECEDES)) { - return true; + private boolean jj_3_8() { + Token xsp; + xsp = jj_scanpos; + if (jj_3R_176()) { + jj_scanpos = xsp; } - return false; - } - - private boolean jj_3R_254() { - if (jj_scan_token(UNICODERANGE)) { + if (jj_3R_177()) { return true; } return false; } - private boolean jj_3R_243() { - if (jj_scan_token(PLUS)) { + private boolean jj_3R_179() { + if (jj_3R_177()) { return true; } + Token xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3_8()) { + jj_scanpos = xsp; + break; + } + } return false; } - private boolean jj_3_8() { - Token xsp; - xsp = jj_scanpos; - if (jj_3R_179()) { - jj_scanpos = xsp; - } - if (jj_3R_180()) { + private boolean jj_3R_202() { + if (jj_3R_201()) { return true; } return false; } - private boolean jj_3R_206() { + private boolean jj_3R_201() { Token xsp; xsp = jj_scanpos; - if (jj_3R_243()) { + if (jj_scan_token(20)) { jj_scanpos = xsp; - if (jj_3R_244()) { + if (jj_scan_token(24)) { jj_scanpos = xsp; - if (jj_3R_245()) { + if (jj_scan_token(25)) { return true; } } @@ -6634,23 +6529,11 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_182() { - if (jj_3R_180()) { + private boolean jj_3R_168() { + if (jj_3R_178()) { return true; } - Token xsp; - while (true) { - xsp = jj_scanpos; - if (jj_3_8()) { - jj_scanpos = xsp; - break; - } - } - return false; - } - - private boolean jj_3R_187() { - if (jj_scan_token(SIBLING)) { + if (jj_scan_token(COLON)) { return true; } Token xsp; @@ -6661,17 +6544,19 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { break; } } - return false; - } - - private boolean jj_3R_186() { - if (jj_scan_token(PRECEDES)) { + if (jj_3R_179()) { + return true; + } + xsp = jj_scanpos; + if (jj_3R_180()) { + jj_scanpos = xsp; + } + if (jj_3R_181()) { return true; } - Token xsp; while (true) { xsp = jj_scanpos; - if (jj_scan_token(1)) { + if (jj_3R_181()) { jj_scanpos = xsp; break; } @@ -6679,38 +6564,20 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_188() { + private boolean jj_3R_183() { if (jj_scan_token(S)) { return true; } Token xsp; xsp = jj_scanpos; - if (jj_3R_206()) { + if (jj_3R_202()) { jj_scanpos = xsp; } return false; } - private boolean jj_3R_172() { - Token xsp; - xsp = jj_scanpos; - if (jj_3R_185()) { - jj_scanpos = xsp; - if (jj_3R_186()) { - jj_scanpos = xsp; - if (jj_3R_187()) { - jj_scanpos = xsp; - if (jj_3R_188()) { - return true; - } - } - } - } - return false; - } - - private boolean jj_3R_185() { - if (jj_scan_token(PLUS)) { + private boolean jj_3R_239() { + if (jj_scan_token(COMMA)) { return true; } Token xsp; @@ -6724,69 +6591,38 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_171() { - if (jj_3R_181()) { - return true; - } - if (jj_scan_token(COLON)) { - return true; - } - Token xsp; - while (true) { - xsp = jj_scanpos; - if (jj_scan_token(1)) { - jj_scanpos = xsp; - break; - } - } - if (jj_3R_182()) { - return true; - } - xsp = jj_scanpos; - if (jj_3R_183()) { - jj_scanpos = xsp; - } - if (jj_3R_184()) { + private boolean jj_3R_182() { + if (jj_3R_201()) { return true; } - while (true) { - xsp = jj_scanpos; - if (jj_3R_184()) { - jj_scanpos = xsp; - break; - } - } return false; } - private boolean jj_3R_241() { - if (jj_scan_token(COMMA)) { - return true; - } + private boolean jj_3R_169() { Token xsp; - while (true) { - xsp = jj_scanpos; - if (jj_scan_token(1)) { - jj_scanpos = xsp; - break; + xsp = jj_scanpos; + if (jj_3R_182()) { + jj_scanpos = xsp; + if (jj_3R_183()) { + return true; } } return false; } - private boolean jj_3R_202() { + private boolean jj_3R_197() { Token xsp; xsp = jj_scanpos; - if (jj_3R_240()) { + if (jj_3R_238()) { jj_scanpos = xsp; - if (jj_3R_241()) { + if (jj_3R_239()) { return true; } } return false; } - private boolean jj_3R_240() { + private boolean jj_3R_238() { if (jj_scan_token(DIV)) { return true; } @@ -6801,7 +6637,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_205() { + private boolean jj_3R_200() { if (jj_scan_token(GUARDED_SYM)) { return true; } @@ -6816,7 +6652,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_194() { + private boolean jj_3R_189() { if (jj_scan_token(VARIABLE)) { return true; } @@ -6841,10 +6677,10 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_174() { + private boolean jj_3R_171() { Token xsp; xsp = jj_scanpos; - if (jj_3R_194()) { + if (jj_3R_189()) { jj_scanpos = xsp; } if (jj_scan_token(CONTAINS)) { @@ -6865,21 +6701,21 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_208() { + private boolean jj_3R_204() { if (jj_scan_token(HASH)) { return true; } return false; } - private boolean jj_3R_281() { + private boolean jj_3R_276() { if (jj_scan_token(IDENT)) { return true; } return false; } - private boolean jj_3R_282() { + private boolean jj_3R_277() { if (jj_scan_token(FUNCTION)) { return true; } @@ -6899,26 +6735,26 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_280() { + private boolean jj_3R_275() { if (jj_scan_token(COLON)) { return true; } return false; } - private boolean jj_3R_210() { + private boolean jj_3R_206() { if (jj_scan_token(COLON)) { return true; } Token xsp; xsp = jj_scanpos; - if (jj_3R_280()) { + if (jj_3R_275()) { jj_scanpos = xsp; } xsp = jj_scanpos; - if (jj_3R_281()) { + if (jj_3R_276()) { jj_scanpos = xsp; - if (jj_3R_282()) { + if (jj_3R_277()) { return true; } } @@ -6926,96 +6762,96 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { } private boolean jj_3_7() { - if (jj_3R_178()) { + if (jj_3R_175()) { return true; } return false; } - private boolean jj_3R_301() { + private boolean jj_3R_296() { if (jj_scan_token(STRING)) { return true; } return false; } - private boolean jj_3R_299() { + private boolean jj_3R_294() { if (jj_scan_token(STARMATCH)) { return true; } return false; } - private boolean jj_3R_300() { - if (jj_scan_token(IDENT)) { + private boolean jj_3R_293() { + if (jj_scan_token(DOLLARMATCH)) { return true; } return false; } - private boolean jj_3R_298() { - if (jj_scan_token(DOLLARMATCH)) { + private boolean jj_3R_295() { + if (jj_scan_token(IDENT)) { return true; } return false; } - private boolean jj_3R_297() { + private boolean jj_3R_292() { if (jj_scan_token(CARETMATCH)) { return true; } return false; } - private boolean jj_3R_296() { + private boolean jj_3R_291() { if (jj_scan_token(DASHMATCH)) { return true; } return false; } - private boolean jj_3R_295() { + private boolean jj_3R_290() { if (jj_scan_token(INCLUDES)) { return true; } return false; } - private boolean jj_3R_267() { + private boolean jj_3R_257() { if (jj_scan_token(INTERPOLATION)) { return true; } return false; } - private boolean jj_3R_294() { + private boolean jj_3R_289() { if (jj_scan_token(EQ)) { return true; } return false; } - private boolean jj_3R_201() { + private boolean jj_3R_196() { if (jj_scan_token(LBRACE)) { return true; } return false; } - private boolean jj_3R_287() { + private boolean jj_3R_282() { Token xsp; xsp = jj_scanpos; - if (jj_3R_294()) { + if (jj_3R_289()) { jj_scanpos = xsp; - if (jj_3R_295()) { + if (jj_3R_290()) { jj_scanpos = xsp; - if (jj_3R_296()) { + if (jj_3R_291()) { jj_scanpos = xsp; - if (jj_3R_297()) { + if (jj_3R_292()) { jj_scanpos = xsp; - if (jj_3R_298()) { + if (jj_3R_293()) { jj_scanpos = xsp; - if (jj_3R_299()) { + if (jj_3R_294()) { return true; } } @@ -7031,9 +6867,9 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { } } xsp = jj_scanpos; - if (jj_3R_300()) { + if (jj_3R_295()) { jj_scanpos = xsp; - if (jj_3R_301()) { + if (jj_3R_296()) { return true; } } @@ -7047,7 +6883,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_211() { + private boolean jj_3R_207() { if (jj_scan_token(LBRACKET)) { return true; } @@ -7070,7 +6906,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { } } xsp = jj_scanpos; - if (jj_3R_287()) { + if (jj_3R_282()) { jj_scanpos = xsp; } if (jj_scan_token(RBRACKET)) { @@ -7079,28 +6915,28 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_293() { + private boolean jj_3R_288() { if (jj_scan_token(INTERPOLATION)) { return true; } return false; } - private boolean jj_3R_200() { - if (jj_3R_182()) { + private boolean jj_3R_195() { + if (jj_3R_179()) { return true; } return false; } - private boolean jj_3R_248() { + private boolean jj_3R_243() { if (jj_scan_token(PARENT)) { return true; } return false; } - private boolean jj_3R_247() { + private boolean jj_3R_242() { if (jj_scan_token(ANY)) { return true; } @@ -7108,7 +6944,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { } private boolean jj_3_6() { - if (jj_3R_177()) { + if (jj_3R_174()) { return true; } if (jj_scan_token(LBRACE)) { @@ -7117,8 +6953,8 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_178() { - if (jj_3R_199()) { + private boolean jj_3R_175() { + if (jj_3R_194()) { return true; } if (jj_scan_token(COLON)) { @@ -7133,42 +6969,42 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { } } xsp = jj_scanpos; - if (jj_3R_200()) { + if (jj_3R_195()) { jj_scanpos = xsp; - if (jj_3R_201()) { + if (jj_3R_196()) { return true; } } return false; } - private boolean jj_3R_257() { + private boolean jj_3R_252() { Token xsp; xsp = jj_scanpos; - if (jj_3R_266()) { + if (jj_3R_256()) { jj_scanpos = xsp; - if (jj_3R_267()) { + if (jj_3R_257()) { return true; } } return false; } - private boolean jj_3R_266() { + private boolean jj_3R_256() { if (jj_scan_token(IDENT)) { return true; } return false; } - private boolean jj_3R_207() { + private boolean jj_3R_203() { Token xsp; xsp = jj_scanpos; - if (jj_3R_246()) { + if (jj_3R_241()) { jj_scanpos = xsp; - if (jj_3R_247()) { + if (jj_3R_242()) { jj_scanpos = xsp; - if (jj_3R_248()) { + if (jj_3R_243()) { return true; } } @@ -7176,14 +7012,14 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_246() { + private boolean jj_3R_241() { Token xsp; - if (jj_3R_257()) { + if (jj_3R_252()) { return true; } while (true) { xsp = jj_scanpos; - if (jj_3R_257()) { + if (jj_3R_252()) { jj_scanpos = xsp; break; } @@ -7191,7 +7027,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_175() { + private boolean jj_3R_172() { if (jj_scan_token(COMMA)) { return true; } @@ -7206,48 +7042,27 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_291() { - if (jj_3R_210()) { - return true; - } - return false; - } - - private boolean jj_3R_275() { + private boolean jj_3R_270() { Token xsp; xsp = jj_scanpos; - if (jj_3R_292()) { + if (jj_3R_287()) { jj_scanpos = xsp; - if (jj_3R_293()) { + if (jj_3R_288()) { return true; } } return false; } - private boolean jj_3R_292() { + private boolean jj_3R_287() { if (jj_scan_token(IDENT)) { return true; } return false; } - private boolean jj_3R_289() { - if (jj_3R_209()) { - return true; - } - return false; - } - - private boolean jj_3R_284() { - if (jj_3R_209()) { - return true; - } - return false; - } - private boolean jj_3R_286() { - if (jj_3R_210()) { + if (jj_3R_206()) { return true; } return false; @@ -7256,26 +7071,26 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { private boolean jj_3_5() { Token xsp; xsp = jj_scanpos; - if (jj_3R_175()) { + if (jj_3R_172()) { jj_scanpos = xsp; } - if (jj_3R_176()) { + if (jj_3R_173()) { return true; } return false; } - private boolean jj_3R_209() { + private boolean jj_3R_205() { if (jj_scan_token(DOT)) { return true; } Token xsp; - if (jj_3R_275()) { + if (jj_3R_270()) { return true; } while (true) { xsp = jj_scanpos; - if (jj_3R_275()) { + if (jj_3R_270()) { jj_scanpos = xsp; break; } @@ -7283,51 +7098,72 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_274() { - if (jj_3R_210()) { + private boolean jj_3R_284() { + if (jj_3R_205()) { return true; } return false; } - private boolean jj_3R_277() { - if (jj_3R_209()) { + private boolean jj_3R_279() { + if (jj_3R_205()) { return true; } return false; } - private boolean jj_3R_279() { - if (jj_3R_210()) { + private boolean jj_3R_281() { + if (jj_3R_206()) { return true; } return false; } - private boolean jj_3R_290() { - if (jj_3R_211()) { + private boolean jj_3R_269() { + if (jj_3R_206()) { return true; } return false; } - private boolean jj_3R_260() { - if (jj_3R_182()) { + private boolean jj_3R_272() { + if (jj_3R_205()) { return true; } return false; } - private boolean jj_3R_265() { + private boolean jj_3R_274() { + if (jj_3R_206()) { + return true; + } + return false; + } + + private boolean jj_3R_255() { + if (jj_3R_179()) { + return true; + } + return false; + } + + private boolean jj_3R_285() { + if (jj_3R_207()) { + return true; + } + return false; + } + + private boolean jj_3R_262() { Token xsp; xsp = jj_scanpos; - if (jj_3R_288()) { + if (jj_3R_283()) { jj_scanpos = xsp; - if (jj_3R_289()) { + if (jj_3R_284()) { jj_scanpos = xsp; - if (jj_3R_290()) { + if (jj_3R_285()) { jj_scanpos = xsp; - if (jj_3R_291()) { + if (jj_3R_286()) { return true; } } @@ -7336,23 +7172,23 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_288() { - if (jj_3R_208()) { + private boolean jj_3R_283() { + if (jj_3R_204()) { return true; } return false; } - private boolean jj_3R_264() { + private boolean jj_3R_261() { Token xsp; xsp = jj_scanpos; - if (jj_3R_283()) { + if (jj_3R_278()) { jj_scanpos = xsp; - if (jj_3R_284()) { + if (jj_3R_279()) { jj_scanpos = xsp; - if (jj_3R_285()) { + if (jj_3R_280()) { jj_scanpos = xsp; - if (jj_3R_286()) { + if (jj_3R_281()) { return true; } } @@ -7361,30 +7197,30 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_283() { - if (jj_3R_208()) { + private boolean jj_3R_278() { + if (jj_3R_204()) { return true; } return false; } - private boolean jj_3R_271() { - if (jj_3R_210()) { + private boolean jj_3R_266() { + if (jj_3R_206()) { return true; } return false; } - private boolean jj_3R_263() { + private boolean jj_3R_260() { Token xsp; xsp = jj_scanpos; - if (jj_3R_276()) { + if (jj_3R_271()) { jj_scanpos = xsp; - if (jj_3R_277()) { + if (jj_3R_272()) { jj_scanpos = xsp; - if (jj_3R_278()) { + if (jj_3R_273()) { jj_scanpos = xsp; - if (jj_3R_279()) { + if (jj_3R_274()) { return true; } } @@ -7393,42 +7229,42 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_276() { - if (jj_3R_208()) { + private boolean jj_3R_271() { + if (jj_3R_204()) { return true; } return false; } - private boolean jj_3R_285() { - if (jj_3R_211()) { + private boolean jj_3R_280() { + if (jj_3R_207()) { return true; } return false; } - private boolean jj_3R_273() { - if (jj_3R_211()) { + private boolean jj_3R_268() { + if (jj_3R_207()) { return true; } return false; } - private boolean jj_3R_278() { - if (jj_3R_211()) { + private boolean jj_3R_273() { + if (jj_3R_207()) { return true; } return false; } - private boolean jj_3R_262() { + private boolean jj_3R_259() { Token xsp; xsp = jj_scanpos; - if (jj_3R_272()) { + if (jj_3R_267()) { jj_scanpos = xsp; - if (jj_3R_273()) { + if (jj_3R_268()) { jj_scanpos = xsp; - if (jj_3R_274()) { + if (jj_3R_269()) { return true; } } @@ -7436,21 +7272,21 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_269() { - if (jj_3R_209()) { + private boolean jj_3R_264() { + if (jj_3R_205()) { return true; } return false; } - private boolean jj_3R_272() { - if (jj_3R_209()) { + private boolean jj_3R_267() { + if (jj_3R_205()) { return true; } return false; } - private boolean jj_3R_250() { + private boolean jj_3R_245() { if (jj_scan_token(FUNCTION)) { return true; } @@ -7463,7 +7299,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { } } xsp = jj_scanpos; - if (jj_3R_260()) { + if (jj_3R_255()) { jj_scanpos = xsp; } if (jj_scan_token(RPARAN)) { @@ -7472,29 +7308,28 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_193() { - if (jj_3R_211()) { + private boolean jj_3R_234() { + if (jj_3R_249()) { return true; } - Token xsp; - while (true) { - xsp = jj_scanpos; - if (jj_3R_265()) { - jj_scanpos = xsp; - break; - } + return false; + } + + private boolean jj_3R_233() { + if (jj_3R_248()) { + return true; } return false; } - private boolean jj_3R_192() { - if (jj_3R_210()) { + private boolean jj_3R_188() { + if (jj_3R_207()) { return true; } Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_264()) { + if (jj_3R_262()) { jj_scanpos = xsp; break; } @@ -7502,28 +7337,21 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_270() { - if (jj_3R_211()) { - return true; - } - return false; - } - - private boolean jj_3R_238() { - if (jj_3R_254()) { + private boolean jj_3R_232() { + if (jj_3R_247()) { return true; } return false; } - private boolean jj_3R_191() { - if (jj_3R_209()) { + private boolean jj_3R_187() { + if (jj_3R_206()) { return true; } Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_263()) { + if (jj_3R_261()) { jj_scanpos = xsp; break; } @@ -7531,28 +7359,36 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_237() { - if (jj_3R_253()) { + private boolean jj_3R_265() { + if (jj_3R_207()) { return true; } return false; } - private boolean jj_3R_236() { - if (jj_3R_252()) { + private boolean jj_3R_186() { + if (jj_3R_205()) { return true; } + Token xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_260()) { + jj_scanpos = xsp; + break; + } + } return false; } - private boolean jj_3R_190() { - if (jj_3R_208()) { + private boolean jj_3R_185() { + if (jj_3R_204()) { return true; } Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_262()) { + if (jj_3R_259()) { jj_scanpos = xsp; break; } @@ -7560,16 +7396,16 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_261() { + private boolean jj_3R_258() { Token xsp; xsp = jj_scanpos; - if (jj_3R_268()) { + if (jj_3R_263()) { jj_scanpos = xsp; - if (jj_3R_269()) { + if (jj_3R_264()) { jj_scanpos = xsp; - if (jj_3R_270()) { + if (jj_3R_265()) { jj_scanpos = xsp; - if (jj_3R_271()) { + if (jj_3R_266()) { return true; } } @@ -7578,21 +7414,21 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_268() { - if (jj_3R_208()) { + private boolean jj_3R_263() { + if (jj_3R_204()) { return true; } return false; } - private boolean jj_3R_189() { - if (jj_3R_207()) { + private boolean jj_3R_184() { + if (jj_3R_203()) { return true; } Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_261()) { + if (jj_3R_258()) { jj_scanpos = xsp; break; } @@ -7600,18 +7436,18 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_173() { + private boolean jj_3R_170() { Token xsp; xsp = jj_scanpos; - if (jj_3R_189()) { + if (jj_3R_184()) { jj_scanpos = xsp; - if (jj_3R_190()) { + if (jj_3R_185()) { jj_scanpos = xsp; - if (jj_3R_191()) { + if (jj_3R_186()) { jj_scanpos = xsp; - if (jj_3R_192()) { + if (jj_3R_187()) { jj_scanpos = xsp; - if (jj_3R_193()) { + if (jj_3R_188()) { return true; } } @@ -7621,68 +7457,61 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_251() { - if (jj_scan_token(DOT)) { + private boolean jj_3R_236() { + if (jj_3R_201()) { return true; } - return false; - } - - private boolean jj_3R_235() { - Token xsp; - xsp = jj_scanpos; - if (jj_3R_251()) { - jj_scanpos = xsp; - } - if (jj_scan_token(IDENT)) { + if (jj_3R_170()) { return true; } return false; } - private boolean jj_3_1() { - if (jj_3R_171()) { + private boolean jj_3R_246() { + if (jj_scan_token(DOT)) { return true; } return false; } - private boolean jj_3R_234() { - if (jj_scan_token(STRING)) { + private boolean jj_3R_231() { + Token xsp; + xsp = jj_scanpos; + if (jj_3R_246()) { + jj_scanpos = xsp; + } + if (jj_scan_token(IDENT)) { return true; } return false; } - private boolean jj_3_2() { - if (jj_3R_172()) { - return true; - } - if (jj_3R_173()) { + private boolean jj_3R_230() { + if (jj_scan_token(STRING)) { return true; } return false; } - private boolean jj_3R_233() { - if (jj_3R_250()) { + private boolean jj_3R_229() { + if (jj_3R_245()) { return true; } return false; } - private boolean jj_3R_196() { + private boolean jj_3R_191() { Token xsp; xsp = jj_scanpos; - if (jj_3R_234()) { + if (jj_3R_230()) { jj_scanpos = xsp; - if (jj_3R_235()) { + if (jj_3R_231()) { jj_scanpos = xsp; - if (jj_3R_236()) { + if (jj_3R_232()) { jj_scanpos = xsp; - if (jj_3R_237()) { + if (jj_3R_233()) { jj_scanpos = xsp; - if (jj_3R_238()) { + if (jj_3R_234()) { return true; } } @@ -7692,7 +7521,24 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_198() { + private boolean jj_3_2() { + if (jj_3R_169()) { + return true; + } + if (jj_3R_170()) { + return true; + } + return false; + } + + private boolean jj_3_1() { + if (jj_3R_168()) { + return true; + } + return false; + } + + private boolean jj_3R_193() { if (jj_scan_token(COMMA)) { return true; } @@ -7704,17 +7550,42 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { break; } } - if (jj_3R_197()) { + if (jj_3R_192()) { return true; } return false; } - private boolean jj_3R_197() { - if (jj_3R_173()) { + private boolean jj_3R_235() { + if (jj_3R_170()) { return true; } + return false; + } + + private boolean jj_3R_228() { + if (jj_scan_token(DIMEN)) { + return true; + } + return false; + } + + private boolean jj_3R_227() { + if (jj_scan_token(KHZ)) { + return true; + } + return false; + } + + private boolean jj_3R_192() { Token xsp; + xsp = jj_scanpos; + if (jj_3R_235()) { + jj_scanpos = xsp; + if (jj_3R_236()) { + return true; + } + } while (true) { xsp = jj_scanpos; if (jj_3_2()) { @@ -7732,49 +7603,49 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_232() { - if (jj_scan_token(DIMEN)) { + private boolean jj_3R_226() { + if (jj_scan_token(HZ)) { return true; } return false; } - private boolean jj_3R_231() { - if (jj_scan_token(KHZ)) { + private boolean jj_3R_225() { + if (jj_scan_token(MS)) { return true; } return false; } - private boolean jj_3R_230() { - if (jj_scan_token(HZ)) { + private boolean jj_3R_224() { + if (jj_scan_token(SECOND)) { return true; } return false; } - private boolean jj_3R_229() { - if (jj_scan_token(MS)) { + private boolean jj_3R_223() { + if (jj_scan_token(GRAD)) { return true; } return false; } - private boolean jj_3R_228() { - if (jj_scan_token(SECOND)) { + private boolean jj_3R_222() { + if (jj_scan_token(RAD)) { return true; } return false; } - private boolean jj_3R_177() { - if (jj_3R_197()) { + private boolean jj_3R_174() { + if (jj_3R_192()) { return true; } Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_198()) { + if (jj_3R_193()) { jj_scanpos = xsp; break; } @@ -7782,35 +7653,21 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { return false; } - private boolean jj_3R_227() { - if (jj_scan_token(GRAD)) { - return true; - } - return false; - } - - private boolean jj_3R_226() { - if (jj_scan_token(RAD)) { - return true; - } - return false; - } - - private boolean jj_3R_225() { + private boolean jj_3R_221() { if (jj_scan_token(DEG)) { return true; } return false; } - private boolean jj_3R_224() { + private boolean jj_3R_220() { if (jj_scan_token(EXS)) { return true; } return false; } - private boolean jj_3R_223() { + private boolean jj_3R_219() { if (jj_scan_token(REM)) { return true; } @@ -7818,103 +7675,224 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { } private boolean jj_3_4() { - if (jj_3R_174()) { + if (jj_3R_171()) { return true; } return false; } - private boolean jj_3R_222() { + private boolean jj_3R_218() { if (jj_scan_token(LEM)) { return true; } return false; } - private boolean jj_3R_221() { + private boolean jj_3R_217() { if (jj_scan_token(EMS)) { return true; } return false; } - private boolean jj_3R_220() { + private boolean jj_3R_216() { if (jj_scan_token(PX)) { return true; } return false; } - private boolean jj_3R_219() { + private boolean jj_3R_215() { if (jj_scan_token(IN)) { return true; } return false; } - private boolean jj_3R_218() { + private boolean jj_3R_214() { if (jj_scan_token(PC)) { return true; } return false; } - private boolean jj_3R_256() { - if (jj_scan_token(INTERPOLATION)) { + private boolean jj_3R_213() { + if (jj_scan_token(MM)) { return true; } return false; } - private boolean jj_3R_217() { - if (jj_scan_token(MM)) { + private boolean jj_3R_212() { + if (jj_scan_token(CM)) { return true; } return false; } - private boolean jj_3R_216() { - if (jj_scan_token(CM)) { + private boolean jj_3R_251() { + if (jj_scan_token(INTERPOLATION)) { return true; } return false; } - private boolean jj_3R_215() { + private boolean jj_3R_211() { if (jj_scan_token(PT)) { return true; } return false; } - private boolean jj_3R_214() { + private boolean jj_3R_210() { if (jj_scan_token(PERCENTAGE)) { return true; } return false; } - private boolean jj_3R_204() { - if (jj_3R_242()) { + private boolean jj_3R_199() { + if (jj_3R_240()) { return true; } return false; } private boolean jj_3_3() { - if (jj_3R_171()) { + if (jj_3R_168()) { return true; } return false; } - private boolean jj_3R_213() { + private boolean jj_3R_209() { if (jj_scan_token(NUMBER)) { return true; } return false; } + private boolean jj_3R_208() { + if (jj_3R_244()) { + return true; + } + return false; + } + + private boolean jj_3R_190() { + Token xsp; + xsp = jj_scanpos; + if (jj_3R_208()) { + jj_scanpos = xsp; + } + xsp = jj_scanpos; + if (jj_3R_209()) { + jj_scanpos = xsp; + if (jj_3R_210()) { + jj_scanpos = xsp; + if (jj_3R_211()) { + jj_scanpos = xsp; + if (jj_3R_212()) { + jj_scanpos = xsp; + if (jj_3R_213()) { + jj_scanpos = xsp; + if (jj_3R_214()) { + jj_scanpos = xsp; + if (jj_3R_215()) { + jj_scanpos = xsp; + if (jj_3R_216()) { + jj_scanpos = xsp; + if (jj_3R_217()) { + jj_scanpos = xsp; + if (jj_3R_218()) { + jj_scanpos = xsp; + if (jj_3R_219()) { + jj_scanpos = xsp; + if (jj_3R_220()) { + jj_scanpos = xsp; + if (jj_3R_221()) { + jj_scanpos = xsp; + if (jj_3R_222()) { + jj_scanpos = xsp; + if (jj_3R_223()) { + jj_scanpos = xsp; + if (jj_3R_224()) { + jj_scanpos = xsp; + if (jj_3R_225()) { + jj_scanpos = xsp; + if (jj_3R_226()) { + jj_scanpos = xsp; + if (jj_3R_227()) { + jj_scanpos = xsp; + if (jj_3R_228()) { + jj_scanpos = xsp; + if (jj_3R_229()) { + return true; + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + return false; + } + + private boolean jj_3R_173() { + Token xsp; + xsp = jj_scanpos; + if (jj_3R_190()) { + jj_scanpos = xsp; + if (jj_3R_191()) { + return true; + } + } + while (true) { + xsp = jj_scanpos; + if (jj_scan_token(1)) { + jj_scanpos = xsp; + break; + } + } + return false; + } + + private boolean jj_3R_181() { + if (jj_scan_token(SEMICOLON)) { + return true; + } + Token xsp; + while (true) { + xsp = jj_scanpos; + if (jj_scan_token(1)) { + jj_scanpos = xsp; + break; + } + } + return false; + } + + private boolean jj_3R_247() { + if (jj_scan_token(HASH)) { + return true; + } + return false; + } + /** Generated Token Manager. */ public ParserTokenManager token_source; /** Current token. */ @@ -7925,7 +7903,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { private Token jj_scanpos, jj_lastpos; private int jj_la; private int jj_gen; - final private int[] jj_la1 = new int[253]; + final private int[] jj_la1 = new int[251]; static private int[] jj_la1_0; static private int[] jj_la1_1; static private int[] jj_la1_2; @@ -7939,33 +7917,33 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { private static void jj_la1_init_0() { jj_la1_0 = new int[] { 0x0, 0xc02, 0xc02, 0x0, 0xc00, 0x2, 0x2, 0x2, - 0xd0000000, 0x0, 0xc00, 0x2, 0xc00, 0x2, 0x0, 0x2, 0x0, 0x2, - 0x2, 0x0, 0x0, 0x2, 0x2, 0x0, 0x2, 0x0, 0x2, 0x2, 0xd0000000, - 0xd0000000, 0x2, 0x2, 0x2, 0xd3f45400, 0xd3f45400, 0x2, + 0xd3100000, 0x0, 0xc00, 0x2, 0xc00, 0x2, 0x0, 0x2, 0x0, 0x2, + 0x2, 0x0, 0x0, 0x2, 0x2, 0x0, 0x2, 0x0, 0x2, 0x2, 0xd3100000, + 0xd3100000, 0x2, 0x2, 0x2, 0xd3f45400, 0xd3f45400, 0x2, 0x400000, 0x2, 0x2, 0x2, 0x2, 0x0, 0x0, 0x2, 0x0, 0x800000, 0x2, 0x0, 0x2, 0x2, 0x2, 0x2, 0x0, 0x800000, 0x2, 0x0, 0x2, - 0x3f45400, 0x2, 0x2, 0x2, 0x3100000, 0x2, 0x3100000, 0x3100002, - 0x2, 0x480002, 0x480002, 0x2, 0x0, 0x0, 0x2, 0x2, 0x2, 0x2, - 0xd0000000, 0xd0000000, 0x2, 0x400000, 0x2, 0x2, 0x10000000, + 0xe45400, 0x3100000, 0x3100002, 0x3100000, 0x2, 0x2, 0x480002, + 0x480002, 0x2, 0x0, 0x0, 0x2, 0x2, 0x2, 0x2, 0xd3100000, + 0xd3100000, 0x2, 0x400000, 0x2, 0xd3100000, 0x2, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0xd0000000, 0x0, 0x0, 0x0, 0x0, 0xc0000000, 0x2, 0x2, 0xfc000, 0x2, 0x0, 0x2, 0xfc000, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x800000, 0x0, - 0xd0000000, 0x0, 0x4d380002, 0x2, 0xd0000000, 0x2, 0x0, 0x2, - 0x4d380002, 0x0, 0x2, 0xd0000000, 0x2, 0x4d380002, 0x2, 0x2, - 0x2, 0x0, 0x2, 0xd0000000, 0x2, 0x2, 0x400000, 0x2, 0x2, 0x2, - 0x2, 0x0, 0x2, 0xd0000000, 0xd0000000, 0x2, 0x400000, 0x2, 0x2, + 0xd3100000, 0x0, 0x4d380002, 0x2, 0xd3100000, 0x2, 0x0, 0x2, + 0x4d380002, 0x0, 0x2, 0xd3100000, 0x2, 0x4d380002, 0x2, 0x2, + 0x2, 0x0, 0x2, 0xd3100000, 0x2, 0x2, 0x400000, 0x2, 0x2, 0x2, + 0x2, 0x0, 0x2, 0xd3100000, 0xd3100000, 0x2, 0x400000, 0x2, 0x2, 0x2, 0x400000, 0x0, 0x0, 0x300000, 0x2, 0x0, 0x400000, 0x2, 0x300000, 0x2, 0x0, 0x2, 0x0, 0x2, 0x800000, 0x2, 0x2, 0x0, 0x2, 0x0, 0x2, 0x2, 0x2, 0x400000, 0x2, 0x2, 0x2, 0x2, 0x2, 0x0, 0x2, 0x2, 0x2, 0x400000, 0x2, 0x2, 0x2, 0x0, 0x2, 0x2, 0x2, 0x400000, 0x2, 0x2, 0x0, 0x2, 0x0, 0x2, 0x2, 0x2, 0x400000, 0x0, 0x2, 0x2, 0x0, 0x2, 0x2, 0x2, 0x800000, 0x2, - 0x2, 0x0, 0x800000, 0x2, 0x0, 0x2, 0x0, 0xd0000000, 0x2, 0x0, + 0x2, 0x0, 0x800000, 0x2, 0x0, 0x2, 0x0, 0xd3100000, 0x2, 0x0, 0x2, 0x0, 0x800000, 0x2, 0x0, 0x2, 0x301000, 0x2, 0x0, 0x2, 0x2, 0x2, 0x2, 0x8400000, 0x8400000, 0x300000, 0x300000, 0x300000, 0x0, 0x0, 0x0, 0x300000, 0x2, 0x2, 0x300000, 0x2, - 0xd0000000, 0x2, 0x2, 0x2, 0x0, 0x800000, 0x2, 0x0, 0x2, }; + 0xd3100000, 0x2, 0x2, 0x2, 0x0, 0x800000, 0x2, 0x0, 0x2, }; } private static void jj_la1_init_1() { @@ -7975,11 +7953,11 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { 0xac800181, 0xac800181, 0x0, 0x0, 0x0, 0xc000381, 0xc000381, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x100, 0x0, 0x0, 0x100, 0x0, 0x0, 0x0, 0x0, 0x100, 0x0, 0x0, 0x100, 0x0, 0x200, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x185, 0x185, 0x0, - 0x100, 0x100, 0x0, 0x0, 0x0, 0x0, 0xac800181, 0xac800181, 0x0, - 0x0, 0x0, 0x0, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x181, 0x100, 0x100, 0x100, 0x100, 0x100, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x185, 0x185, 0x0, 0x100, 0x100, 0x0, + 0x0, 0x0, 0x0, 0xac800181, 0xac800181, 0x0, 0x0, 0x0, 0x181, + 0x0, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x181, 0x100, 0x100, 0x100, 0x100, 0x100, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa0000000, 0xc800181, 0x0, 0x7e, 0x0, 0xc800181, 0x0, 0x0, 0x0, 0x7e, 0x0, 0x0, 0xc800181, 0x0, 0x7e, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc800181, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x100, 0x0, @@ -8003,25 +7981,24 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { 0x0, 0x0, 0x0, 0x2b80, 0x2b80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x100, 0x0, 0x0, 0x100, 0x0, 0x0, 0x100, 0x0, 0x0, 0x0, 0x0, 0x100, 0x0, 0x0, 0x100, 0x0, 0x2a80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x380, 0x380, 0x0, 0x100, 0x100, 0x0, 0x0, 0x0, - 0x0, 0x1112, 0x1112, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x100, 0x100, 0x100, 0x100, - 0x100, 0x100, 0x0, 0x0, 0x0, 0x0, 0x180, 0x0, 0x0, 0x0, 0x0, - 0x100, 0x0, 0x40, 0x0, 0x0, 0x0, 0x102, 0x1000, 0x1300, 0x0, - 0x1102, 0x0, 0x1, 0x0, 0x1300, 0x20, 0x0, 0x1102, 0x0, 0x1300, - 0x0, 0x0, 0x0, 0x1100, 0x0, 0x1102, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x100, 0x0, 0x1102, 0x1102, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1000, 0x1000, 0xfffffb80, 0x0, 0x0, 0x0, 0x0, - 0xfffffb80, 0x0, 0x0, 0x0, 0x1100, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x380, 0x380, 0x0, 0x100, 0x100, 0x0, 0x0, 0x0, 0x0, 0x1112, + 0x1112, 0x0, 0x0, 0x0, 0x100, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x100, 0x100, 0x100, 0x100, 0x100, + 0x100, 0x0, 0x0, 0x0, 0x0, 0x180, 0x0, 0x0, 0x0, 0x0, 0x100, + 0x0, 0x40, 0x0, 0x0, 0x0, 0x102, 0x1000, 0x1300, 0x0, 0x1102, + 0x0, 0x1, 0x0, 0x1300, 0x20, 0x0, 0x1102, 0x0, 0x1300, 0x0, + 0x0, 0x0, 0x1100, 0x0, 0x1102, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x100, 0x0, 0x1102, 0x1102, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1000, 0x1000, 0xfffffb80, 0x0, 0x0, 0x0, 0x0, 0xfffffb80, + 0x0, 0x0, 0x0, 0x1100, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x100, 0x0, 0x0, 0x100, 0x0, - 0x0, 0x100, 0x0, 0x0, 0x0, 0x100, 0x0, 0x0, 0x100, 0x0, - 0xfffffb80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xfffffb80, 0x0, 0xffffe200, 0x0, 0x980, 0xffffeb80, 0x0, 0x0, - 0xfffffb80, 0x0, 0x100, 0x0, 0x0, 0x0, 0x100, 0x0, 0x0, 0x100, - 0x0, }; + 0x0, 0x0, 0x0, 0x0, 0x100, 0x0, 0x0, 0x100, 0x0, 0x0, 0x100, + 0x0, 0x0, 0x0, 0x100, 0x0, 0x0, 0x100, 0x0, 0xfffffb80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfffffb80, 0x0, + 0xffffe200, 0x0, 0x980, 0xffffeb80, 0x0, 0x0, 0xfffffb80, 0x0, + 0x100, 0x0, 0x0, 0x0, 0x100, 0x0, 0x0, 0x100, 0x0, }; } private static void jj_la1_init_3() { @@ -8030,16 +8007,16 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x45, 0x45, 0x0, 0x0, 0x0, 0xc401bf, 0xc401bf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc401be, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x400000, 0x400000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x45, - 0x45, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x0, 0x0, 0x1, 0x1, 0x1, - 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x400000, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x45, 0x0, 0x200000, 0x0, 0x45, 0x0, 0x0, 0x0, 0x200000, - 0x0, 0x0, 0x45, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x45, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x400000, 0x0, 0x75, 0x75, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x440001, 0x0, 0x0, 0x0, - 0x0, 0x440001, 0x0, 0x0, 0x0, 0x400000, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc401be, 0x0, 0x0, 0x0, 0x0, 0x0, 0x400000, + 0x400000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x45, 0x45, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x1, 0x1, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x400000, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x45, 0x0, 0x200000, 0x0, 0x45, 0x0, 0x0, 0x0, 0x200000, 0x0, + 0x0, 0x45, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x45, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x400000, 0x0, 0x75, 0x75, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x440001, 0x0, 0x0, 0x0, 0x0, + 0x440001, 0x0, 0x0, 0x0, 0x400000, 0x0, 0x0, 0x0, 0x0, 0x380000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, @@ -8060,7 +8037,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 253; i++) { + for (int i = 0; i < 251; i++) { jj_la1[i] = -1; } for (int i = 0; i < jj_2_rtns.length; i++) { @@ -8074,7 +8051,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 253; i++) { + for (int i = 0; i < 251; i++) { jj_la1[i] = -1; } for (int i = 0; i < jj_2_rtns.length; i++) { @@ -8088,7 +8065,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 253; i++) { + for (int i = 0; i < 251; i++) { jj_la1[i] = -1; } for (int i = 0; i < jj_2_rtns.length; i++) { @@ -8102,7 +8079,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 253; i++) { + for (int i = 0; i < 251; i++) { jj_la1[i] = -1; } for (int i = 0; i < jj_2_rtns.length; i++) { @@ -8253,7 +8230,7 @@ public class Parser implements org.w3c.css.sac.Parser, ParserConstants { la1tokens[jj_kind] = true; jj_kind = -1; } - for (int i = 0; i < 253; i++) { + for (int i = 0; i < 251; i++) { if (jj_la1[i] == jj_gen) { for (int j = 0; j < 32; j++) { if ((jj_la1_0[i] & (1 << j)) != 0) { diff --git a/theme-compiler/src/com/vaadin/sass/internal/parser/Parser.jj b/theme-compiler/src/com/vaadin/sass/internal/parser/Parser.jj index a0bd883101..3798947d1d 100644 --- a/theme-compiler/src/com/vaadin/sass/internal/parser/Parser.jj +++ b/theme-compiler/src/com/vaadin/sass/internal/parser/Parser.jj @@ -319,10 +319,12 @@ public class Parser implements org.w3c.css.sac.Parser { String encoding = source.getEncoding(); InputStream input = source.getByteStream(); if (!input.markSupported()) { + // If mark is not supported, wrap it in a stream which supports mark input = new BufferedInputStream(input); source.setByteStream(input); - input.mark(100); } + // Mark either the original stream or the wrapped stream + input.mark(100); if(encoding == null){ encoding = "ASCII"; @@ -1056,9 +1058,6 @@ void skipUnknownRule() : | n=<UNICODERANGE> | n=<URL> | n=";" -| n="+" -| n=">" -| n="~" | n="-" | n=<UNKNOWN> ) { @@ -1081,13 +1080,18 @@ char combinator() : char connector = ' '; } { - "+" ( <S> )* { return '+'; } - | ">" ( <S> )* { return '>'; } - | "~" ( <S> )* { return '~'; } -| <S> ( ( "+" { connector = '+'; } - | ">" { connector = '>'; } - | "~" { connector = '~'; } ) - ( <S> )* )? { return connector; } + (connector = combinatorChar() + | <S> (connector = combinatorChar())?) { return connector; } +} + +/**to refactor combinator and reuse in selector().*/ +char combinatorChar() : +{Token t;} +{ + (t = <PLUS> | t = <PRECEDES> | t = <SIBLING>) (<S>)* + { + return t.image.charAt(0); + } } void microsoftExtension() : @@ -1200,12 +1204,14 @@ void styleRule() : */ String selector() : { - String selector; + String selector = null; char comb; } { try { - selector=simple_selector(null, ' ') + // the selector can begin either a simple_selector, or a combinatorChar(+, >, ~). + // when beginning with combinatorChar, the next one should be a simple_selector(). + (selector=simple_selector(null, ' ') | (comb=combinatorChar() selector=simple_selector(selector, comb))) ( LOOKAHEAD(2) comb=combinator() selector=simple_selector(selector, comb) )* (<S>)* { @@ -1265,22 +1271,27 @@ String simple_selector(String selector, char comb) : if (cond != null) { simple_current = simple_current + cond; } - if (selector != null) { - switch (comb) { + StringBuilder builder = new StringBuilder(); + switch (comb) { case ' ': - selector = selector + comb + simple_current; + if(selector!=null){ + builder.append(selector).append(" "); + } break; case '+': case '>': case '~': - selector = selector + " " + comb + " " + simple_current; + if(selector!=null){ + builder.append(selector).append(" "); + } + builder.append(comb).append(" "); break; default: throw new ParseException("invalid state. send a bug report"); - } - } else { - selector= simple_current; } + builder.append(simple_current); + selector = builder.toString(); + if (pseudoElt != null) { selector = selector + pseudoElt; } diff --git a/theme-compiler/src/com/vaadin/sass/internal/parser/ParserTokenManager.java b/theme-compiler/src/com/vaadin/sass/internal/parser/ParserTokenManager.java index e5116bdb49..9ff123c808 100644 --- a/theme-compiler/src/com/vaadin/sass/internal/parser/ParserTokenManager.java +++ b/theme-compiler/src/com/vaadin/sass/internal/parser/ParserTokenManager.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2013 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ /* Generated By:JavaCC: Do not edit this line. ParserTokenManager.java */ package com.vaadin.sass.internal.parser; @@ -5835,21 +5850,6 @@ public class ParserTokenManager implements ParserConstants { int jjmatchedPos; int jjmatchedKind; - /* - * Copyright 2000-2013 Vaadin Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. You may obtain a - * copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ /** Get the next Token. */ public Token getNextToken() { Token specialToken = null; diff --git a/theme-compiler/src/com/vaadin/sass/internal/visitor/MixinNodeHandler.java b/theme-compiler/src/com/vaadin/sass/internal/visitor/MixinNodeHandler.java index 8a62e3abf8..5aa90151b9 100644 --- a/theme-compiler/src/com/vaadin/sass/internal/visitor/MixinNodeHandler.java +++ b/theme-compiler/src/com/vaadin/sass/internal/visitor/MixinNodeHandler.java @@ -108,18 +108,39 @@ public class MixinNodeHandler { } } } - - int i = 0; - for (final LexicalUnitImpl unit : remainingUnits) { + checkExtraParameters(mixinNode, remainingNodes.size(), + remainingUnits.size()); + for (int i = 0; i < remainingNodes.size() + && i < remainingUnits.size(); i++) { + LexicalUnitImpl unit = remainingUnits.get(i); remainingNodes.get(i).setExpr( (LexicalUnitImpl) DeepCopy.copy(unit)); - i++; } - } } + protected static void checkExtraParameters(MixinNode mixinNode, + int remainingNodesSize, int remainingUnitsSize) { + if (remainingUnitsSize > remainingNodesSize) { + String fileName = null; + Node root = mixinNode.getParentNode(); + while (root != null && !(root instanceof ScssStylesheet)) { + root = root.getParentNode(); + } + if (root != null) { + fileName = ((ScssStylesheet) root).getFileName(); + } + StringBuilder builder = new StringBuilder(); + builder.append("More parameters than expected, in Mixin ").append( + mixinNode.getName()); + if (fileName != null) { + builder.append(", in file ").append(fileName); + } + throw new RuntimeException(builder.toString()); + } + } + private static void replaceChildVariables(MixinDefNode mixinDef, Node node) { for (final Node child : node.getChildren()) { replaceChildVariables(mixinDef, child); diff --git a/theme-compiler/tests/resources/automatic/css/nested-selector-begin-with-plus.css b/theme-compiler/tests/resources/automatic/css/nested-selector-begin-with-plus.css new file mode 100644 index 0000000000..fa8d2861a6 --- /dev/null +++ b/theme-compiler/tests/resources/automatic/css/nested-selector-begin-with-plus.css @@ -0,0 +1,9 @@ +.v-panel { + display: block; + max-width: 84em; + margin: auto; +} + +.v-panel + .abc { + margin-top: 1em; +}
\ No newline at end of file diff --git a/theme-compiler/tests/resources/automatic/scss/nested-selector-begin-with-plus.scss b/theme-compiler/tests/resources/automatic/scss/nested-selector-begin-with-plus.scss new file mode 100644 index 0000000000..f5a61b86ea --- /dev/null +++ b/theme-compiler/tests/resources/automatic/scss/nested-selector-begin-with-plus.scss @@ -0,0 +1,9 @@ +.v-panel { + display: block; + max-width: 84em; + margin: auto; + + + .abc { + margin-top: 1em; + } + }
\ No newline at end of file diff --git a/theme-compiler/tests/resources/sasslangbroken/css/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.css b/theme-compiler/tests/resources/sasslang/css/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.css index 09b4ccac27..09b4ccac27 100644 --- a/theme-compiler/tests/resources/sasslangbroken/css/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.css +++ b/theme-compiler/tests/resources/sasslang/css/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.css diff --git a/theme-compiler/tests/resources/sasslangbroken/scss/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.scss b/theme-compiler/tests/resources/sasslang/scss/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.scss index 73f6254f21..73f6254f21 100644 --- a/theme-compiler/tests/resources/sasslangbroken/scss/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.scss +++ b/theme-compiler/tests/resources/sasslang/scss/95-test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee.scss diff --git a/theme-compiler/tests/resources/scss/mixin-extra-params.scss b/theme-compiler/tests/resources/scss/mixin-extra-params.scss new file mode 100644 index 0000000000..af376adf90 --- /dev/null +++ b/theme-compiler/tests/resources/scss/mixin-extra-params.scss @@ -0,0 +1,4 @@ +@mixin test ($p1) { + color: $p1; +} +@include test(foo, bar);
\ No newline at end of file diff --git a/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/MixinExtraParameters.java b/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/MixinExtraParameters.java new file mode 100644 index 0000000000..79c2ec366a --- /dev/null +++ b/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/MixinExtraParameters.java @@ -0,0 +1,25 @@ +package com.vaadin.sass.testcases.scss; + +import org.junit.Assert; +import org.junit.Test; + +import com.vaadin.sass.AbstractTestBase; +import com.vaadin.sass.internal.ScssStylesheet; + +public class MixinExtraParameters extends AbstractTestBase { + String scss = "/scss/mixin-extra-params.scss"; + + @Test + public void testCompiler() { + ScssStylesheet sheet; + try { + sheet = getStyleSheet(scss); + sheet.compile(); + } catch (RuntimeException e) { + Assert.assertEquals(e.getMessage(), + "More parameters than expected, in Mixin test"); + } catch (Exception e) { + Assert.fail(); + } + } +} diff --git a/uitest/build.xml b/uitest/build.xml index ee2b2c6124..53da0ae2e9 100644 --- a/uitest/build.xml +++ b/uitest/build.xml @@ -106,6 +106,10 @@ <path refid="classpath.runtime.dependencies" /> </copy> + + <!-- Ensure filtered webcontent files are available --> + <antcall target="common.filter.webcontent" /> + <war destfile="${result.war}" duplicate="fail" index="true"> <fileset refid="common.files.for.all.jars" /> <fileset dir="${result.dir}"> diff --git a/uitest/src/com/vaadin/tests/components/absolutelayout/AbsoluteLayoutResizing.html b/uitest/src/com/vaadin/tests/components/absolutelayout/AbsoluteLayoutResizing.html new file mode 100644 index 0000000000..01206b317c --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/absolutelayout/AbsoluteLayoutResizing.html @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head profile="http://selenium-ide.openqa.org/profiles/test-case"> +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> +<link rel="selenium.base" href="http://localhost:8888/" /> +<title>New Test</title> +</head> +<body> +<table cellpadding="1" cellspacing="1" border="1"> +<thead> +<tr><td rowspan="1" colspan="3">New Test</td></tr> +</thead><tbody> +<tr> + <td>open</td> + <td>/run/com.vaadin.tests.components.absolutelayout.AbsoluteLayoutResizing?restartApplication</td> + <td></td> +</tr> +<tr> + <td>dragAndDrop</td> + <td>vaadin=runcomvaadintestscomponentsabsolutelayoutAbsoluteLayoutResizing::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VSplitPanelVertical[0]/domChild[0]/domChild[1]/domChild[0]</td> + <td>0,294</td> +</tr> +<tr> + <td>dragAndDrop</td> + <td>vaadin=runcomvaadintestscomponentsabsolutelayoutAbsoluteLayoutResizing::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VSplitPanelVertical[0]/VSplitPanelHorizontal[0]/domChild[0]/domChild[1]/domChild[0]</td> + <td>588,0</td> +</tr> +<tr> + <td>screenCapture</td> + <td></td> + <td>resized</td> +</tr> + +</tbody></table> +</body> +</html> diff --git a/uitest/src/com/vaadin/tests/components/absolutelayout/AbsoluteLayoutResizing.java b/uitest/src/com/vaadin/tests/components/absolutelayout/AbsoluteLayoutResizing.java new file mode 100644 index 0000000000..810a583ba5 --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/absolutelayout/AbsoluteLayoutResizing.java @@ -0,0 +1,44 @@ +package com.vaadin.tests.components.absolutelayout; + +import com.vaadin.tests.components.TestBase; +import com.vaadin.ui.AbsoluteLayout; +import com.vaadin.ui.HorizontalSplitPanel; +import com.vaadin.ui.TextArea; +import com.vaadin.ui.VerticalSplitPanel; + +public class AbsoluteLayoutResizing extends TestBase { + + @Override + protected void setup() { + getLayout().setSizeFull(); + + AbsoluteLayout al = new AbsoluteLayout(); + + TextArea ta = new TextArea(); + ta.setValue("When resizing the layout this text area should also get resized"); + ta.setSizeFull(); + al.addComponent(ta, "left: 10px; right: 10px; top: 10px; bottom: 10px;"); + + HorizontalSplitPanel horizPanel = new HorizontalSplitPanel(); + horizPanel.setSizeFull(); + horizPanel.setFirstComponent(al); + + VerticalSplitPanel vertPanel = new VerticalSplitPanel(); + vertPanel.setSizeFull(); + vertPanel.setFirstComponent(horizPanel); + + addComponent(vertPanel); + + } + + @Override + protected String getDescription() { + return "Absolute layout should correctly dynamically resize itself"; + } + + @Override + protected Integer getTicketNumber() { + return 10427; + } + +} diff --git a/uitest/src/com/vaadin/tests/components/slider/SliderValueFromDataSource.html b/uitest/src/com/vaadin/tests/components/slider/SliderValueFromDataSource.html new file mode 100644 index 0000000000..8b5a7067e4 --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/slider/SliderValueFromDataSource.html @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head profile="http://selenium-ide.openqa.org/profiles/test-case"> +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> +<link rel="selenium.base" href="http://localhost:8070/" /> +<title>SliderValueFromDataSource</title> +</head> +<body> +<table cellpadding="1" cellspacing="1" border="1"> +<thead> +<tr><td rowspan="1" colspan="3">SliderValueFromDataSource</td></tr> +</thead><tbody> +<tr> + <td>open</td> + <td>/run/SliderValueFromDataSource?restartApplication</td> + <td></td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runSliderValueFromDataSource::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[1]/VProgressIndicator[0]/domChild[0]/domChild[0]@style</td> + <td>regex:.*(width|WIDTH): 50%.*</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runSliderValueFromDataSource::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VSlider[0]/domChild[2]/domChild[0]@style</td> + <td>regex:.*(margin-left|MARGIN-LEFT): 94px.*</td> +</tr> + +</tbody></table> +</body> +</html> diff --git a/uitest/src/com/vaadin/tests/components/slider/SliderValueFromDataSource.java b/uitest/src/com/vaadin/tests/components/slider/SliderValueFromDataSource.java new file mode 100644 index 0000000000..141dc5baf4 --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/slider/SliderValueFromDataSource.java @@ -0,0 +1,59 @@ +package com.vaadin.tests.components.slider; + +import com.vaadin.data.Item; +import com.vaadin.data.util.BeanItem; +import com.vaadin.server.VaadinRequest; +import com.vaadin.tests.components.AbstractTestUI; +import com.vaadin.ui.ProgressIndicator; +import com.vaadin.ui.Slider; + +public class SliderValueFromDataSource extends AbstractTestUI { + + public static class TestBean { + + private double doubleValue = 10.0; + private float floatValue = 0.5f; + + public double getDoubleValue() { + return doubleValue; + } + + public void setDoubleValue(double doubleValue) { + this.doubleValue = doubleValue; + } + + public float getFloatValue() { + return floatValue; + } + + public void setFloatValue(float floatValue) { + this.floatValue = floatValue; + } + } + + @Override + protected void setup(VaadinRequest request) { + Item item = new BeanItem<TestBean>(new TestBean()); + + Slider slider = new Slider(0, 20); + slider.setWidth("200px"); + slider.setPropertyDataSource(item.getItemProperty("doubleValue")); + addComponent(slider); + + ProgressIndicator pi = new ProgressIndicator(); + pi.setPollingInterval(60 * 1000); + pi.setWidth("200px"); + pi.setPropertyDataSource(item.getItemProperty("floatValue")); + addComponent(pi); + } + + @Override + protected String getTestDescription() { + return "Slider and ProgressIndicator do not properly pass a value from data source to the client"; + } + + @Override + protected Integer getTicketNumber() { + return 10921; + } +} diff --git a/uitest/src/com/vaadin/tests/components/textfield/TextFieldMaxLengthRemovedFromDOM.html b/uitest/src/com/vaadin/tests/components/textfield/TextFieldMaxLengthRemovedFromDOM.html new file mode 100644 index 0000000000..3086b66dfa --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/textfield/TextFieldMaxLengthRemovedFromDOM.html @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head profile="http://selenium-ide.openqa.org/profiles/test-case"> +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> +<link rel="selenium.base" href="http://localhost:8888/" /> +<title>New Test</title> +</head> +<body> +<table cellpadding="1" cellspacing="1" border="1"> +<thead> +<tr><td rowspan="1" colspan="3">New Test</td></tr> +</thead><tbody> +<tr> + <td>open</td> + <td>/run/com.vaadin.tests.components.textfield.TextFieldMaxLengthRemovedFromDOM?restartApplication</td> + <td></td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestscomponentstextfieldTextFieldMaxLengthRemovedFromDOM::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTextField[0]@maxlength</td> + <td>11</td> +</tr> +<tr> + <td>mouseClick</td> + <td>vaadin=runcomvaadintestscomponentstextfieldTextFieldMaxLengthRemovedFromDOM::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTextField[0]</td> + <td>118,13</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestscomponentstextfieldTextFieldMaxLengthRemovedFromDOM::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTextField[0]@maxlength</td> + <td>11</td> +</tr> +<tr> + <td>type</td> + <td>vaadin=runcomvaadintestscomponentstextfieldTextFieldMaxLengthRemovedFromDOM::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTextField[0]</td> + <td>hello</td> +</tr> +<tr> + <td>mouseClick</td> + <td>vaadin=runcomvaadintestscomponentstextfieldTextFieldMaxLengthRemovedFromDOM::/VVerticalLayout[0]/domChild[0]</td> + <td>172,60</td> +</tr> +<tr> + <td>assertAttribute</td> + <td>vaadin=runcomvaadintestscomponentstextfieldTextFieldMaxLengthRemovedFromDOM::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTextField[0]@maxlength</td> + <td>11</td> +</tr> +</tbody></table> +</body> +</html> diff --git a/uitest/src/com/vaadin/tests/components/textfield/TextFieldMaxLengthRemovedFromDOM.java b/uitest/src/com/vaadin/tests/components/textfield/TextFieldMaxLengthRemovedFromDOM.java new file mode 100644 index 0000000000..28ff20c174 --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/textfield/TextFieldMaxLengthRemovedFromDOM.java @@ -0,0 +1,37 @@ +package com.vaadin.tests.components.textfield; + +import com.vaadin.event.FieldEvents; +import com.vaadin.event.FieldEvents.FocusEvent; +import com.vaadin.tests.components.TestBase; +import com.vaadin.ui.TextField; + +public class TextFieldMaxLengthRemovedFromDOM extends TestBase { + + @Override + protected void setup() { + final TextField tf = new TextField(); + tf.setMaxLength(11); + tf.setRequired(true); + tf.setImmediate(true); + addComponent(tf); + + tf.addFocusListener(new FieldEvents.FocusListener() { + + public void focus(FocusEvent event) { + // Resetting Max length should not remove maxlength attribute + tf.setMaxLength(11); + } + }); + } + + @Override + protected String getDescription() { + return "Maxlength attribute should not dissappear from the DOM when I focus the text field."; + } + + @Override + protected Integer getTicketNumber() { + return 9940; + } + +} diff --git a/uitest/src/com/vaadin/tests/components/textfield/TextFieldWithDataSourceAndInputPrompt.html b/uitest/src/com/vaadin/tests/components/textfield/TextFieldWithDataSourceAndInputPrompt.html new file mode 100644 index 0000000000..cf08d8923d --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/textfield/TextFieldWithDataSourceAndInputPrompt.html @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head profile="http://selenium-ide.openqa.org/profiles/test-case"> +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> +<link rel="selenium.base" href="http://localhost:8888/" /> +<title>New Test</title> +</head> +<body> +<table cellpadding="1" cellspacing="1" border="1"> +<thead> +<tr><td rowspan="1" colspan="3">New Test</td></tr> +</thead><tbody> +<tr> + <td>open</td> + <td>/run/com.vaadin.tests.components.textfield.TextFieldWithDataSourceAndInputPrompt?restartApplication</td> + <td></td> +</tr> +<tr> + <td>assertValue</td> + <td>vaadin=runcomvaadintestscomponentstextfieldTextFieldWithDataSourceAndInputPrompt::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VTextField[0]</td> + <td>Me is input prompt</td> +</tr> +<tr> + <td>assertValue</td> + <td>vaadin=runcomvaadintestscomponentstextfieldTextFieldWithDataSourceAndInputPrompt::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[1]/VTextField[0]</td> + <td>Me is input prompt</td> +</tr> +</tbody></table> +</body> +</html> diff --git a/uitest/src/com/vaadin/tests/components/textfield/TextFieldWithDataSourceAndInputPrompt.java b/uitest/src/com/vaadin/tests/components/textfield/TextFieldWithDataSourceAndInputPrompt.java new file mode 100644 index 0000000000..881aa11fbb --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/textfield/TextFieldWithDataSourceAndInputPrompt.java @@ -0,0 +1,63 @@ +/* + * Copyright 2012 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.vaadin.tests.components.textfield; + +import com.vaadin.data.util.BeanItem; +import com.vaadin.server.VaadinRequest; +import com.vaadin.tests.components.AbstractTestUI; +import com.vaadin.ui.TextField; + +public class TextFieldWithDataSourceAndInputPrompt extends AbstractTestUI { + public static class Pojo { + private String string; + + public String getString() { + return string; + } + + public void setString(String string) { + this.string = string; + } + } + + @Override + protected void setup(VaadinRequest request) { + TextField textField = new TextField("TextField with null value"); + textField.setInputPrompt("Me is input prompt"); + textField.setNullRepresentation(null); + textField.setValue(null); + addComponent(textField); + + TextField textField2 = new TextField( + "TextField with null data source value"); + textField2.setInputPrompt("Me is input prompt"); + textField2.setNullRepresentation(null); + BeanItem<Pojo> beanItem = new BeanItem<Pojo>(new Pojo()); + textField2.setPropertyDataSource(beanItem.getItemProperty("string")); + addComponent(textField2); + } + + @Override + protected String getTestDescription() { + return "Input prompt should be shown when data source provides null"; + } + + @Override + protected Integer getTicketNumber() { + return 11021; + } + +} diff --git a/uitest/src/com/vaadin/tests/components/treetable/TreeTableExtraScrollBarWithChildren.html b/uitest/src/com/vaadin/tests/components/treetable/TreeTableExtraScrollBarWithChildren.html new file mode 100644 index 0000000000..611e7a5994 --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/treetable/TreeTableExtraScrollBarWithChildren.html @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head profile="http://selenium-ide.openqa.org/profiles/test-case"> +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> +<link rel="selenium.base" href="" /> +<title>TreeTableExtraScrollbar</title> +</head> +<body> +<table cellpadding="1" cellspacing="1" border="1"> +<thead> +<tr><td rowspan="1" colspan="3">TreeTableExtraScrollbar</td></tr> +</thead><tbody> +<tr> + <td>open</td> + <td>/run/com.vaadin.tests.components.treetable.TreeTableExtraScrollbarWithChildren?restartApplication</td> + <td></td> +</tr> +<tr> + <td>mouseClick</td> + <td>button</td> + <td></td> +</tr> +<tr> + <td>pause</td> + <td>300</td> + <td></td> +</tr> +<!-- screenCapture should not have a horizontal scrollbar, and the columns should be the same width in body and headers --> +<tr> + <td>screenCapture</td> + <td></td> + <td>expanded</td> +</tr> +<tr> + <td>mouseClick</td> + <td>button</td> + <td></td> +</tr> +<tr> + <td>pause</td> + <td>300</td> + <td></td> +</tr> +<!-- screenCapture should not have a horizontal scrollbar, the columns should be back to original width in body and headers, and vertical scrollbar shouldn't have left an empty space --> +<tr> + <td>screenCapture</td> + <td></td> + <td>collapsed</td> +</tr> +<tr> + <td>open</td> + <td>/run/com.vaadin.tests.components.treetable.TreeTableExtraScrollbarWithChildren</td> + <td></td> +</tr> +<tr> + <td>pause</td> + <td>300</td> + <td></td> +</tr> +<!-- screenCapture should not have changed --> +<tr> + <td>screenCapture</td> + <td></td> + <td>refreshed</td> +</tr> +</tbody></table> +</body> +</html> diff --git a/uitest/src/com/vaadin/tests/components/treetable/TreeTableExtraScrollbarWithChildren.java b/uitest/src/com/vaadin/tests/components/treetable/TreeTableExtraScrollbarWithChildren.java new file mode 100644 index 0000000000..cad33e242f --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/treetable/TreeTableExtraScrollbarWithChildren.java @@ -0,0 +1,92 @@ +package com.vaadin.tests.components.treetable; + +import com.vaadin.tests.components.TestBase; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.Notification; +import com.vaadin.ui.Table; +import com.vaadin.ui.TreeTable; + +public class TreeTableExtraScrollbarWithChildren extends TestBase { + + @Override + protected String getDescription() { + return "Arrow calculation should not cause a horizontal scrollbar" + + " if there is enough space for the final contents."; + } + + @Override + protected Integer getTicketNumber() { + return 10513; + } + + @Override + protected void setup() { + HorizontalLayout layout = new HorizontalLayout(); + layout.setWidth("300px"); + layout.setHeight("300px"); + + final TreeTable table = new TreeTable(); + table.setSizeFull(); + + table.addGeneratedColumn("parameterId", new HierarchyColumnGenerator()); + table.addGeneratedColumn("wordingTextId", new TypeColumnGenerator()); + table.addGeneratedColumn("parameterTypeId", new TypeColumnGenerator()); + + table.setColumnWidth("parameterId", 26); + + table.addItem(new TestObject("name 1", "value 1")); + table.addItem(new TestObject("name 2", "value 2")); + table.addItem(new TestObject("name 3", "value 3")); + table.addItem(new TestObject("name 4", "value 4")); + table.addItem(new TestObject("name 5", "value 5")); + final TestObject parent = new TestObject("name 6", "value 6"); + table.addItem(parent); + table.setFooterVisible(true); + for (int i = 1; i <= 10; ++i) { + TestObject child = new TestObject("name 6-" + i, "value 6-" + i); + table.addItem(child); + table.setParent(child, parent); + } + table.setVisibleColumns(new Object[] { "wordingTextId", "parameterId", + "parameterTypeId" }); + table.setColumnHeaders(new String[] { "", "", "" }); + table.setHierarchyColumn("parameterId"); + + layout.addComponent(table); + + Button button = new Button("Toggle"); + button.setId("button"); + button.addClickListener(new ClickListener() { + + public void buttonClick(ClickEvent event) { + table.setCollapsed(parent, !table.isCollapsed(parent)); + Notification.show("collapsed: " + table.isCollapsed(parent)); + } + }); + + addComponent(layout); + addComponent(button); + } + + private class HierarchyColumnGenerator implements Table.ColumnGenerator { + public Object generateCell(Table table, Object itemId, Object columnId) { + Label label = new Label("this should be mostly hidden"); + label.setSizeUndefined(); + return label; + } + } + + private class TypeColumnGenerator implements Table.ColumnGenerator { + public Object generateCell(Table table, Object itemId, Object columnId) { + if (itemId instanceof TestObject) { + return new Label(((TestObject) itemId).getValue()); + } + return null; + } + } + +} diff --git a/uitest/src/com/vaadin/tests/debug/HierarchyAfterAnalyzeLayouts.html b/uitest/src/com/vaadin/tests/debug/HierarchyAfterAnalyzeLayouts.html new file mode 100644 index 0000000000..03d8f34651 --- /dev/null +++ b/uitest/src/com/vaadin/tests/debug/HierarchyAfterAnalyzeLayouts.html @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head profile="http://selenium-ide.openqa.org/profiles/test-case"> +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> +<link rel="selenium.base" href="" /> +<title>New Test</title> +</head> +<body> +<table cellpadding="1" cellspacing="1" border="1"> +<thead> +<tr><td rowspan="1" colspan="3">New Test</td></tr> +</thead><tbody> +<tr> + <td>open</td> + <td>/run/com.vaadin.tests.debug.HierarchyAfterAnalyzeLayouts?restartApplication&debug</td> + <td></td> +</tr> +<tr> + <td>mouseClick</td> + <td>vaadin=runcomvaadintestsdebugHierarchyAfterAnalyzeLayouts::Root/VDebugConsole[0]/FlowPanel[0]/HorizontalPanel[0]/domChild[0]/domChild[0]/domChild[3]/domChild[0]</td> + <td>18,9</td> +</tr> +<tr> + <td>assertTextPresent</td> + <td>Layouts analyzed on server, total top level problems: 0</td> + <td></td> +</tr> +<tr> + <td>assertElementPresent</td> + <td>vaadin=runcomvaadintestsdebugHierarchyAfterAnalyzeLayouts::/VVerticalLayout[0]/Slot[1]/VVerticalLayout[0]/Slot[0]/VLabel[0]</td> + <td></td> +</tr> + +</tbody></table> +</body> +</html> diff --git a/uitest/src/com/vaadin/tests/debug/HierarchyAfterAnalyzeLayouts.java b/uitest/src/com/vaadin/tests/debug/HierarchyAfterAnalyzeLayouts.java new file mode 100644 index 0000000000..6f55e050c0 --- /dev/null +++ b/uitest/src/com/vaadin/tests/debug/HierarchyAfterAnalyzeLayouts.java @@ -0,0 +1,40 @@ +/* + * Copyright 2000-2013 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.vaadin.tests.debug; + +import com.vaadin.server.VaadinRequest; +import com.vaadin.tests.components.AbstractTestUI; +import com.vaadin.ui.Label; + +public class HierarchyAfterAnalyzeLayouts extends AbstractTestUI { + + @Override + protected void setup(VaadinRequest request) { + addComponent(new Label("This is a label")); + } + + @Override + protected String getTestDescription() { + return "The connector hierarchy should be in order after clicking AL in the debug console"; + } + + @Override + protected Integer getTicketNumber() { + return Integer.valueOf(11067); + } + +} diff --git a/uitest/src/com/vaadin/tests/minitutorials/v7a1/CreatingPreserveState.java b/uitest/src/com/vaadin/tests/minitutorials/v7a1/CreatingPreserveState.java index ecca98b884..48ccd217ca 100644 --- a/uitest/src/com/vaadin/tests/minitutorials/v7a1/CreatingPreserveState.java +++ b/uitest/src/com/vaadin/tests/minitutorials/v7a1/CreatingPreserveState.java @@ -18,6 +18,7 @@ package com.vaadin.tests.minitutorials.v7a1; import com.vaadin.annotations.PreserveOnRefresh; import com.vaadin.server.VaadinRequest; +import com.vaadin.ui.CssLayout; import com.vaadin.ui.TextField; import com.vaadin.ui.UI; @@ -31,13 +32,12 @@ import com.vaadin.ui.UI; */ @PreserveOnRefresh public class CreatingPreserveState extends UI { - private static int windowCounter = 0; + private static int instanceCounter = 0; @Override public void init(VaadinRequest request) { - TextField tf = new TextField("Window #" + (++windowCounter)); + TextField tf = new TextField("Instance #" + (++instanceCounter)); tf.setImmediate(true); - setContent(tf); + setContent(new CssLayout(tf)); } - } |