From e35351b3d817c9b49682e180bec1e43e87ae94d1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Petter=20Holmstr=C3=B6m?= Date: Wed, 28 Oct 2009 10:46:26 +0000 Subject: [PATCH] Merge svn changeset:9426/svn branch:portlet_2.0 --- src/com/vaadin/demo/Calc.java | 77 -- src/com/vaadin/demo/HelloWorld.java | 23 - src/com/vaadin/demo/PortletDemo.java | 155 ---- src/com/vaadin/demo/SimpleAddressBook.java | 143 --- src/com/vaadin/demo/VaadinTunesLayout.java | 334 ------- .../vaadin/demo/colorpicker/ColorPicker.java | 66 -- .../colorpicker/ColorPickerApplication.java | 56 -- .../gwt/ColorPickerWidgetSet.gwt.xml | 8 - .../gwt/client/ui/GwtColorPicker.java | 105 --- .../gwt/client/ui/VColorPicker.java | 82 -- .../gwt/public/colorpicker/styles.css | 26 - src/com/vaadin/demo/coverflow/Coverflow.java | 108 --- .../demo/coverflow/CoverflowApplication.html | 149 ---- .../demo/coverflow/CoverflowApplication.java | 116 --- .../coverflow/gwt/CoverflowWidgetSet.gwt.xml | 5 - .../coverflow/gwt/client/ui/VCoverflow.java | 334 ------- .../vaadin/demo/coverflow/gwt/flex/Cover.as | 392 --------- .../demo/coverflow/gwt/flex/Coverflow.as | 598 ------------- .../demo/coverflow/gwt/flex/EventHandler.as | 16 - .../coverflow/gwt/flex/coverflowflash.mxml | 34 - .../gwt/flex/sandy/util/DistortImage.as | 306 ------- .../gwt/flex/sandy/util/SandyPoint.as | 17 - .../coverflow/gwt/flex/sandy/util/Triangle.as | 20 - .../coverflow/gwt/public/coverflowflash.swf | Bin 203769 -> 0 bytes .../demo/featurebrowser/AccordionExample.java | 39 - .../demo/featurebrowser/ButtonExample.java | 140 --- .../featurebrowser/ClientCachingExample.java | 72 -- .../demo/featurebrowser/ComboBoxExample.java | 71 -- .../EmbeddedBrowserExample.java | 89 -- .../demo/featurebrowser/FeatureBrowser.java | 383 -------- .../demo/featurebrowser/FormExample.java | 230 ----- .../GeneratedColumnExample.java | 559 ------------ .../featurebrowser/JavaScriptAPIExample.java | 98 --- .../demo/featurebrowser/LabelExample.java | 78 -- .../demo/featurebrowser/LayoutExample.java | 89 -- .../featurebrowser/NotificationExample.java | 96 -- .../demo/featurebrowser/RichTextExample.java | 64 -- .../demo/featurebrowser/SelectExample.java | 103 --- .../demo/featurebrowser/TableExample.java | 300 ------- .../demo/featurebrowser/TreeExample.java | 163 ---- .../featurebrowser/ValueInputExample.java | 147 ---- .../demo/featurebrowser/WindowingExample.java | 113 --- src/com/vaadin/demo/package.html | 22 - .../vaadin/demo/reservation/CalendarDemo.java | 121 --- .../demo/reservation/CalendarField.java | 327 ------- .../vaadin/demo/reservation/GoogleMap.java | 194 ---- .../reservation/ReservationApplication.java | 342 ------- .../ResourceNotAvailableException.java | 12 - .../reservation/ResourceSelectorPanel.java | 142 --- src/com/vaadin/demo/reservation/SampleDB.java | 559 ------------ .../gwt/ReservationWidgetSet.gwt.xml | 26 - .../gwt/client/ui/VCalendarField.java | 295 ------- .../reservation/gwt/client/ui/VGoogleMap.java | 93 -- .../reservr/googlemap/css/googlemap.css | 4 - .../reservr/img/calendar-time-selected.gif | Bin 48 -> 0 bytes .../gwt/public/reservr/img/entry-bg.jpg | Bin 357 -> 0 bytes .../gwt/public/reservr/img/entry-topleft.jpg | Bin 687 -> 0 bytes .../gwt/public/reservr/img/event-bg.jpg | Bin 437 -> 0 bytes .../reservation/gwt/public/reservr/styles.css | 149 ---- .../demo/reservation/simple/AdminView.java | 98 --- .../demo/reservation/simple/SampleDB.java | 502 ----------- .../reservation/simple/SimpleReserver.java | 137 --- .../demo/reservation/simple/StdView.java | 195 ---- src/com/vaadin/demo/sampler/APIResource.java | 58 -- src/com/vaadin/demo/sampler/ActiveLink.java | 162 ---- src/com/vaadin/demo/sampler/CodeLabel.java | 30 - src/com/vaadin/demo/sampler/ExampleUtil.java | 246 ------ src/com/vaadin/demo/sampler/Feature.java | 204 ----- src/com/vaadin/demo/sampler/FeatureSet.java | 563 ------------ src/com/vaadin/demo/sampler/FeatureView.java | 260 ------ .../vaadin/demo/sampler/GoogleAnalytics.java | 53 -- src/com/vaadin/demo/sampler/ModeSwitch.java | 108 --- .../demo/sampler/NamedExternalResource.java | 19 - .../demo/sampler/SamplerApplication.java | 832 ------------------ .../accordions/75-AccordionDisabled.png | Bin 6137 -> 0 bytes .../features/accordions/75-AccordionIcons.png | Bin 5941 -> 0 bytes .../accordions/AccordionDisabled.java | 38 - .../accordions/AccordionDisabledExample.java | 86 -- .../features/accordions/AccordionIcons.java | 39 - .../accordions/AccordionIconsExample.java | 46 - .../blueprints/75-ProminentPrimaryAction.png | Bin 7433 -> 0 bytes .../blueprints/ProminentPrimaryAction.java | 57 -- .../ProminentPrimaryActionExample.java | 69 -- .../features/buttons/75-ButtonLink.png | Bin 3284 -> 0 bytes .../features/buttons/75-ButtonPush.png | Bin 5459 -> 0 bytes .../features/buttons/75-ButtonSwitch.png | Bin 5063 -> 0 bytes .../sampler/features/buttons/ButtonLink.java | 45 - .../features/buttons/ButtonLinkExample.java | 51 -- .../sampler/features/buttons/ButtonPush.java | 42 - .../features/buttons/ButtonPushExample.java | 48 - .../features/buttons/ButtonSwitch.java | 41 - .../features/buttons/ButtonSwitchExample.java | 52 -- .../sampler/features/commons/75-Errors.png | Bin 5295 -> 0 bytes .../sampler/features/commons/75-Icons.png | Bin 7020 -> 0 bytes .../sampler/features/commons/75-Tooltips.png | Bin 12665 -> 0 bytes .../features/commons/75-Validation.png | Bin 6638 -> 0 bytes .../demo/sampler/features/commons/Errors.java | 58 -- .../features/commons/ErrorsExample.java | 25 - .../demo/sampler/features/commons/Icons.java | 56 -- .../features/commons/IconsExample.java | 50 -- .../sampler/features/commons/Tooltips.java | 41 - .../features/commons/TooltipsExample.java | 57 -- .../sampler/features/commons/Validation.java | 52 -- .../features/commons/ValidationExample.java | 65 -- .../sampler/features/dates/75-DateInline.png | Bin 5854 -> 0 bytes .../sampler/features/dates/75-DateLocale.png | Bin 4524 -> 0 bytes .../sampler/features/dates/75-DatePopup.png | Bin 4802 -> 0 bytes .../features/dates/75-DateResolution.png | Bin 5613 -> 0 bytes .../sampler/features/dates/DateInline.java | 41 - .../features/dates/DateInlineExample.java | 41 - .../sampler/features/dates/DateLocale.java | 44 - .../features/dates/DateLocaleExample.java | 49 -- .../sampler/features/dates/DatePopup.java | 40 - .../features/dates/DatePopupExample.java | 47 - .../features/dates/DateResolution.java | 41 - .../features/dates/DateResolutionExample.java | 70 -- .../sampler/features/form/75-FormBasic.png | Bin 4945 -> 0 bytes .../sampler/features/form/75-FormPojo.png | Bin 8388 -> 0 bytes .../demo/sampler/features/form/FormBasic.java | 57 -- .../demo/sampler/features/form/FormPojo.java | 53 -- .../features/form/FormPojoExample.java | 252 ------ .../features/layouts/75-ApplicationLayout.png | Bin 3865 -> 0 bytes .../features/layouts/75-CssLayouts.png | Bin 9005 -> 0 bytes .../features/layouts/75-CustomLayouts.png | Bin 4227 -> 0 bytes .../layouts/75-ExpandingComponent.png | Bin 7207 -> 0 bytes .../features/layouts/75-GridLayoutBasic.png | Bin 3928 -> 0 bytes .../layouts/75-HorizontalLayoutBasic.png | Bin 2609 -> 0 bytes .../features/layouts/75-LayoutAlignment.png | Bin 3633 -> 0 bytes .../features/layouts/75-LayoutMargin.png | Bin 6103 -> 0 bytes .../features/layouts/75-LayoutSpacing.png | Bin 9380 -> 0 bytes .../features/layouts/75-SplitPanelBasic.png | Bin 10390 -> 0 bytes .../layouts/75-VerticalLayoutBasic.png | Bin 3591 -> 0 bytes .../sampler/features/layouts/75-WebLayout.png | Bin 4963 -> 0 bytes .../features/layouts/ApplicationLayout.java | 45 - .../layouts/ApplicationLayoutExample.java | 100 --- .../sampler/features/layouts/CssLayouts.java | 49 -- .../features/layouts/CssLayoutsExample.java | 78 -- .../features/layouts/CustomLayouts.java | 45 - .../layouts/CustomLayoutsExample.java | 32 - .../features/layouts/ExpandingComponent.java | 43 - .../layouts/ExpandingComponentExample.java | 65 -- .../features/layouts/GridLayoutBasic.java | 42 - .../layouts/GridLayoutBasicExample.java | 56 -- .../layouts/HorizontalLayoutBasic.java | 37 - .../layouts/HorizontalLayoutBasicExample.java | 49 -- .../features/layouts/LayoutAlignment.java | 45 - .../layouts/LayoutAlignmentExample.java | 88 -- .../features/layouts/LayoutMargin.java | 49 -- .../features/layouts/LayoutMarginExample.java | 59 -- .../features/layouts/LayoutSpacing.java | 45 - .../layouts/LayoutSpacingExample.java | 39 - .../features/layouts/SplitPanelBasic.java | 41 - .../layouts/SplitPanelBasicExample.java | 51 -- .../features/layouts/VerticalLayoutBasic.java | 39 - .../layouts/VerticalLayoutBasicExample.java | 19 - .../sampler/features/layouts/WebLayout.java | 46 - .../features/layouts/WebLayoutExample.java | 88 -- .../features/link/75-LinkCurrentWindow.png | Bin 4548 -> 0 bytes .../features/link/75-LinkNoDecorations.png | Bin 5513 -> 0 bytes .../features/link/75-LinkSizedWindow.png | Bin 4966 -> 0 bytes .../features/link/LinkCurrentWindow.java | 40 - .../link/LinkCurrentWindowExample.java | 38 - .../features/link/LinkNoDecorations.java | 40 - .../link/LinkNoDecorationsExample.java | 44 - .../features/link/LinkSizedWindow.java | 40 - .../features/link/LinkSizedWindowExample.java | 52 -- .../notifications/75-NotificationCustom.png | Bin 6701 -> 0 bytes .../notifications/75-NotificationError.png | Bin 6333 -> 0 bytes .../75-NotificationHumanized.png | Bin 6108 -> 0 bytes .../notifications/75-NotificationTray.png | Bin 3692 -> 0 bytes .../notifications/75-NotificationWarning.png | Bin 7110 -> 0 bytes .../notifications/NotificationCustom.java | 47 - .../NotificationCustomExample.java | 134 --- .../notifications/NotificationError.java | 48 - .../NotificationErrorExample.java | 43 - .../notifications/NotificationHumanized.java | 50 -- .../NotificationHumanizedExample.java | 38 - .../notifications/NotificationTray.java | 51 -- .../NotificationTrayExample.java | 40 - .../notifications/NotificationWarning.java | 51 -- .../NotificationWarningExample.java | 40 - .../sampler/features/panels/75-PanelBasic.png | Bin 5204 -> 0 bytes .../sampler/features/panels/75-PanelLight.png | Bin 4652 -> 0 bytes .../sampler/features/panels/PanelBasic.java | 41 - .../features/panels/PanelBasicExample.java | 48 - .../sampler/features/panels/PanelLight.java | 41 - .../features/panels/PanelLightExample.java | 50 -- .../features/selects/75-ComboBoxContains.png | Bin 7912 -> 0 bytes .../selects/75-ComboBoxInputPrompt.png | Bin 3317 -> 0 bytes .../features/selects/75-ComboBoxNewItems.png | Bin 5573 -> 0 bytes .../features/selects/75-ComboBoxPlain.png | Bin 5120 -> 0 bytes .../selects/75-ComboBoxStartsWith.png | Bin 7256 -> 0 bytes .../selects/75-ListSelectMultiple.png | Bin 8633 -> 0 bytes .../features/selects/75-ListSelectSingle.png | Bin 8167 -> 0 bytes .../features/selects/75-NativeSelection.png | Bin 7721 -> 0 bytes .../features/selects/75-TwinColumnSelect.png | Bin 7415 -> 0 bytes .../features/selects/ComboBoxContains.java | 45 - .../selects/ComboBoxContainsExample.java | 51 -- .../features/selects/ComboBoxInputPrompt.java | 46 - .../selects/ComboBoxInputPromptExample.java | 40 - .../features/selects/ComboBoxNewItems.java | 47 - .../selects/ComboBoxNewItemsExample.java | 52 -- .../features/selects/ComboBoxPlain.java | 42 - .../selects/ComboBoxPlainExample.java | 38 - .../features/selects/ComboBoxStartsWith.java | 45 - .../selects/ComboBoxStartsWithExample.java | 51 -- .../features/selects/ListSelectMultiple.java | 43 - .../selects/ListSelectMultipleExample.java | 38 - .../features/selects/ListSelectSingle.java | 41 - .../selects/ListSelectSingleExample.java | 43 - .../features/selects/NativeSelection.java | 47 - .../selects/NativeSelectionExample.java | 38 - .../features/selects/TwinColumnSelect.java | 45 - .../selects/TwinColumnSelectExample.java | 40 - .../features/table/75-TableActions.png | Bin 10540 -> 0 bytes .../features/table/75-TableCellStyling.png | Bin 8540 -> 0 bytes .../table/75-TableColumnAlignment.png | Bin 7501 -> 0 bytes .../table/75-TableColumnCollapsing.png | Bin 10964 -> 0 bytes .../features/table/75-TableColumnHeaders.png | Bin 7921 -> 0 bytes .../table/75-TableColumnReordering.png | Bin 8709 -> 0 bytes .../features/table/75-TableHeaderIcons.png | Bin 7921 -> 0 bytes .../features/table/75-TableLazyLoading.png | Bin 4065 -> 0 bytes .../features/table/75-TableMouseEvents.png | Bin 8540 -> 0 bytes .../features/table/75-TableRowHeaders.png | Bin 7921 -> 0 bytes .../features/table/75-TableRowStyling.png | Bin 7103 -> 0 bytes .../features/table/75-TableSorting.png | Bin 6362 -> 0 bytes .../sampler/features/table/TableActions.java | 46 - .../features/table/TableCellStyling.java | 48 - .../features/table/TableColumnAlignment.java | 44 - .../features/table/TableColumnCollapsing.java | 48 - .../features/table/TableColumnHeaders.java | 45 - .../features/table/TableColumnReordering.java | 45 - .../features/table/TableHeaderIcons.java | 46 - .../features/table/TableLazyLoading.java | 48 - .../table/TableMainFeaturesExample.java | 151 ---- .../features/table/TableMouseEvents.java | 47 - .../features/table/TableRowHeaders.java | 45 - .../features/table/TableRowStyling.java | 48 - .../sampler/features/table/TableSorting.java | 47 - .../features/table/TableStylingExample.java | 160 ---- .../tabsheets/75-TabSheetDisabled.png | Bin 5778 -> 0 bytes .../features/tabsheets/75-TabSheetIcons.png | Bin 5678 -> 0 bytes .../tabsheets/75-TabSheetScrolling.png | Bin 4142 -> 0 bytes .../features/tabsheets/TabSheetDisabled.java | 37 - .../tabsheets/TabSheetDisabledExample.java | 89 -- .../features/tabsheets/TabSheetIcons.java | 37 - .../tabsheets/TabSheetIconsExample.java | 54 -- .../features/tabsheets/TabSheetScrolling.java | 37 - .../tabsheets/TabSheetScrollingExample.java | 62 -- .../sampler/features/text/75-LabelPlain.png | Bin 5149 -> 0 bytes .../features/text/75-LabelPreformatted.png | Bin 7128 -> 0 bytes .../sampler/features/text/75-LabelRich.png | Bin 5867 -> 0 bytes .../features/text/75-RichTextEditor.png | Bin 9046 -> 0 bytes .../sampler/features/text/75-TextArea.png | Bin 5842 -> 0 bytes .../features/text/75-TextFieldInputPrompt.png | Bin 4911 -> 0 bytes .../features/text/75-TextFieldSecret.png | Bin 5297 -> 0 bytes .../features/text/75-TextFieldSingle.png | Bin 3562 -> 0 bytes .../sampler/features/text/LabelPlain.java | 41 - .../features/text/LabelPlainExample.java | 21 - .../features/text/LabelPreformatted.java | 41 - .../text/LabelPreformattedExample.java | 26 - .../demo/sampler/features/text/LabelRich.java | 41 - .../features/text/LabelRichExample.java | 49 -- .../sampler/features/text/RichTextEditor.java | 44 - .../demo/sampler/features/text/TextArea.java | 42 - .../features/text/TextAreaExample.java | 52 -- .../features/text/TextFieldInputPrompt.java | 49 -- .../text/TextFieldInputPromptExample.java | 50 -- .../features/text/TextFieldSecret.java | 43 - .../features/text/TextFieldSecretExample.java | 41 - .../features/text/TextFieldSingle.java | 45 - .../features/text/TextFieldSingleExample.java | 32 - .../sampler/features/trees/75-TreeActions.png | Bin 6813 -> 0 bytes .../features/trees/75-TreeMouseEvents.png | Bin 7032 -> 0 bytes .../features/trees/75-TreeMultiSelect.png | Bin 7787 -> 0 bytes .../features/trees/75-TreeSingleSelect.png | Bin 7120 -> 0 bytes .../sampler/features/trees/TreeActions.java | 45 - .../features/trees/TreeMouseEvents.java | 43 - .../trees/TreeMouseEventsExample.java | 100 --- .../features/trees/TreeMultiSelect.java | 38 - .../trees/TreeMultiSelectExample.java | 112 --- .../features/trees/TreeSingleSelect.java | 37 - .../trees/TreeSingleSelectExample.java | 134 --- .../features/upload/75-UploadBasic.png | Bin 12597 -> 0 bytes .../75-UploadWithProgressMonitoring.png | Bin 10533 -> 0 bytes .../sampler/features/upload/UploadBasic.java | 43 - .../features/upload/UploadBasicExample.java | 72 -- .../upload/UploadWithProgressMonitoring.java | 47 - .../UploadWithProgressMonitoringExample.java | 200 ----- .../features/windows/75-NativeWindow.png | Bin 9208 -> 0 bytes .../sampler/features/windows/75-Subwindow.png | Bin 5176 -> 0 bytes .../windows/75-SubwindowAutoSized.png | Bin 4426 -> 0 bytes .../features/windows/75-SubwindowClose.png | Bin 5398 -> 0 bytes .../features/windows/75-SubwindowModal.png | Bin 6837 -> 0 bytes .../windows/75-SubwindowPositioned.png | Bin 7467 -> 0 bytes .../features/windows/75-SubwindowSized.png | Bin 5116 -> 0 bytes .../features/windows/NativeWindow.java | 47 - .../features/windows/NativeWindowExample.java | 84 -- .../sampler/features/windows/Subwindow.java | 40 - .../features/windows/SubwindowAutoSized.java | 41 - .../windows/SubwindowAutoSizedExample.java | 66 -- .../features/windows/SubwindowClose.java | 38 - .../windows/SubwindowCloseExample.java | 53 -- .../features/windows/SubwindowExample.java | 57 -- .../features/windows/SubwindowModal.java | 49 -- .../windows/SubwindowModalExample.java | 63 -- .../features/windows/SubwindowPositioned.java | 38 - .../windows/SubwindowPositionedExample.java | 100 --- .../features/windows/SubwindowSized.java | 39 - .../windows/SubwindowSizedExample.java | 65 -- src/com/vaadin/demo/sampler/folder.gif | Bin 249 -> 0 bytes .../demo/sampler/gwt/SamplerWidgetSet.gwt.xml | 12 - .../sampler/gwt/client/ui/VActiveLink.java | 91 -- .../sampler/gwt/client/ui/VCodeLabel.java | 29 - .../gwt/client/ui/VGoogleAnalytics.java | 70 -- .../sampler/gwt/public/prettify/README.txt | 3 - .../sampler/gwt/public/prettify/prettify.css | 1 - .../sampler/gwt/public/prettify/prettify.js | 25 - .../demo/themes/ReindeerThemeStyles.java | 419 --------- .../addressbook/AddressBookApplication.java | 241 ----- .../tutorial/addressbook/data/Person.java | 120 --- .../addressbook/data/PersonContainer.java | 94 -- .../addressbook/data/SearchFilter.java | 44 - .../tutorial/addressbook/ui/HelpWindow.java | 18 - .../tutorial/addressbook/ui/ListView.java | 13 - .../addressbook/ui/NavigationTree.java | 29 - .../tutorial/addressbook/ui/PersonForm.java | 180 ---- .../tutorial/addressbook/ui/PersonList.java | 46 - .../tutorial/addressbook/ui/SearchView.java | 100 --- .../addressbook/ui/SharingOptions.java | 40 - .../demo/util/SampleCalendarDatabase.java | 169 ---- src/com/vaadin/demo/util/SampleDatabase.java | 173 ---- src/com/vaadin/demo/util/SampleDirectory.java | 73 -- .../terminal/gwt/client/ui/VEmbedded.java | 15 +- .../terminal/gwt/client/ui/VPopupView.java | 18 + .../client/ui/richtextarea/VRichTextArea.java | 18 +- .../gwt/widgetsetutils/ClassPathExplorer.java | 37 +- .../gwt/widgetsetutils/WidgetSetBuilder.java | 29 +- src/com/vaadin/tools/WidgetsetCompiler.java | 16 +- src/com/vaadin/ui/AbstractSelect.java | 8 +- src/com/vaadin/ui/LoginForm.java | 87 +- .../automatedtests/ComponentsInTable.java | 0 .../automatedtests/SimplestApplication.java | 0 .../featurebrowser/AccordionExample.java | 0 .../featurebrowser/ButtonExample.java | 0 .../featurebrowser/ClientCachingExample.java | 0 .../featurebrowser/ComboBoxExample.java | 0 .../EmbeddedBrowserExample.java | 0 .../featurebrowser/FeatureBrowser.java | 0 .../featurebrowser/FormExample.java | 0 .../GeneratedColumnExample.java | 0 .../featurebrowser/JavaScriptAPIExample.java | 0 .../featurebrowser/LabelExample.java | 0 .../featurebrowser/LayoutExample.java | 0 .../featurebrowser/NotificationExample.java | 0 .../featurebrowser/RichTextExample.java | 0 .../featurebrowser/SelectExample.java | 0 .../featurebrowser/TableExample.java | 0 .../featurebrowser/TreeExample.java | 0 .../featurebrowser/ValueInputExample.java | 0 .../featurebrowser/WindowingExample.java | 0 .../automatedtests/robustness/Robustness.java | 0 .../robustness/RobustnessComplex.java | 0 .../vaadin/automatedtests/util/DebugId.java | 0 .../com/vaadin/automatedtests/util/Log.java | 0 .../automatedtests/util/MultiListener.java | 0 .../automatedtests/util/RandomComponents.java | 0 .../automatedtests/util/StatusServlet.java | 0 .../com/vaadin/tests/BasicRandomTest.java | 0 .../com/vaadin/tests/CustomLayoutDemo.java | 0 .../com/vaadin/tests/FocusingComponents.java | 0 .../src}/com/vaadin/tests/LayoutDemo.java | 0 .../src}/com/vaadin/tests/ListenerOrder.java | 0 .../src}/com/vaadin/tests/ModalWindow.java | 0 .../com/vaadin/tests/NativeWindowing.java | 0 .../tests/OrderedLayoutSwapComponents.java | 0 .../src}/com/vaadin/tests/Parameters.java | 0 ...erformanceTestBasicComponentRendering.java | 0 ...erformanceTestLabelsAndOrderedLayouts.java | 0 .../tests/PerformanceTestSubTreeCaching.java | 0 .../com/vaadin/tests/QueryContainerDemo.java | 0 .../com/vaadin/tests/RandomLayoutStress.java | 0 .../com/vaadin/tests/ScrollbarStressTest.java | 0 .../vaadin/tests/StressComponentsInTable.java | 0 .../vaadin/tests/TableChangingDatasource.java | 0 .../com/vaadin/tests/TableSelectTest.java | 0 .../src}/com/vaadin/tests/TestBench.java | 0 .../com/vaadin/tests/TestCaptionWrapper.java | 0 .../tests/TestComponentAddAndRecursion.java | 0 .../tests/TestComponentsAndLayouts.java | 0 .../vaadin/tests/TestContainerChanges.java | 0 .../src}/com/vaadin/tests/TestDateField.java | 0 .../com/vaadin/tests/TestForAlignments.java | 0 ...cationLayoutThatUsesWholeBrosersSpace.java | 0 .../tests/TestForBasicApplicationLayout.java | 0 .../tests/TestForChildComponentRendering.java | 0 .../tests/TestForContainerFilterable.java | 0 .../com/vaadin/tests/TestForExpandLayout.java | 0 .../vaadin/tests/TestForExpandLayout2.java | 0 .../vaadin/tests/TestForExpandLayout3.java | 0 ...tForGridLayoutChildComponentRendering.java | 0 .../tests/TestForMultipleStyleNames.java | 0 .../vaadin/tests/TestForNativeWindowing.java | 0 .../tests/TestForPreconfiguredComponents.java | 0 .../vaadin/tests/TestForRichTextEditor.java | 0 .../com/vaadin/tests/TestForStyledUpload.java | 0 .../com/vaadin/tests/TestForTabSheet.java | 0 ...ablesInitialColumnWidthLogicRendering.java | 0 .../src}/com/vaadin/tests/TestForTrees.java | 0 .../src}/com/vaadin/tests/TestForUpload.java | 0 .../com/vaadin/tests/TestForWindowOpen.java | 0 .../com/vaadin/tests/TestForWindowing.java | 0 .../src}/com/vaadin/tests/TestIFrames.java | 0 .../TestSelectAndDatefieldInDeepLayouts.java | 0 .../com/vaadin/tests/TestSerialization.java | 0 .../tests/TestSetVisibleAndCaching.java | 0 .../tests/TestSizeableIncomponents.java | 0 .../src}/com/vaadin/tests/TestSplitPanel.java | 0 .../src}/com/vaadin/tests/TreeFilesystem.java | 0 .../vaadin/tests/TreeFilesystemContainer.java | 0 .../com/vaadin/tests/UpgradingSample.java | 0 .../UsingCustomNewItemHandlerInSelect.java | 0 .../vaadin/tests/UsingObjectsInSelect.java | 0 .../vaadin/tests/appengine/GAESyncTest.java | 0 .../src}/com/vaadin/tests/appengine/img1.png | Bin .../applicationservlet/NoMainWindow.java | 0 .../TestStaticFilesLocation.java | 0 .../tests/book/BookTestApplication.java | 0 .../vaadin/tests/book/ChatApplication.java | 0 .../tests/book/DefaultButtonExample.java | 0 .../com/vaadin/tests/book/EmbeddedButton.java | 0 .../com/vaadin/tests/book/FormExample.java | 0 .../com/vaadin/tests/book/FormExample2.java | 0 .../vaadin/tests/book/MyDynamicResource.java | 0 .../com/vaadin/tests/book/MyUploader.java | 0 .../src}/com/vaadin/tests/book/SSNField.java | 0 .../com/vaadin/tests/book/SelectExample.java | 0 .../vaadin/tests/book/TabSheetExample.java | 0 .../com/vaadin/tests/book/TableCellStyle.java | 0 .../com/vaadin/tests/book/TableEditable.java | 0 .../vaadin/tests/book/TableEditableBean.java | 0 .../com/vaadin/tests/book/TableExample.java | 0 .../com/vaadin/tests/book/TableExample1.java | 0 .../com/vaadin/tests/book/TableExample2.java | 0 .../com/vaadin/tests/book/TableExample3.java | 0 .../src}/com/vaadin/tests/book/TableHuge.java | 0 .../src}/com/vaadin/tests/book/TheButton.java | 0 .../com/vaadin/tests/book/TheButtons.java | 0 .../com/vaadin/tests/book/TheButtons2.java | 0 .../com/vaadin/tests/book/TheButtons3.java | 0 .../com/vaadin/tests/book/WindowOpener.java | 0 .../tests/book/WindowTestApplication.java | 0 .../vaadin/tests/book/images/Earth_small.png | Bin .../vaadin/tests/book/images/Earth_symbol.png | Bin .../tests/book/images/Jupiter_symbol.png | Bin .../vaadin/tests/book/images/Mars_symbol.png | Bin .../tests/book/images/Mercury_small.png | Bin .../tests/book/images/Mercury_symbol.png | Bin .../tests/book/images/Neptune_symbol.png | Bin .../tests/book/images/Saturn_symbol.png | Bin .../tests/book/images/Uranus_symbol.png | Bin .../vaadin/tests/book/images/Venus_small.png | Bin .../vaadin/tests/book/images/Venus_symbol.png | Bin .../src}/com/vaadin/tests/book/smiley.jpg | Bin .../tests/components/AbstractTestCase.java | 0 .../CustomComponentwithUndefinedSize.java | 0 .../HierarchicalContainerSorting.java | 0 .../tests/components/MultipleDebugIds.java | 0 .../com/vaadin/tests/components/TestBase.java | 0 .../AbsoluteLayoutClipping.html | 0 .../AbsoluteLayoutClipping.java | 0 .../AbstractFieldCommitWithInvalidValues.html | 0 .../AbstractFieldCommitWithInvalidValues.java | 0 .../accordion/AccordionInactiveTabSize.java | 0 .../components/accordion/RemoveTabs.html | 0 .../components/accordion/RemoveTabs.java | 0 .../BeanItemContainerGenerator.java | 0 .../BeanItemContainerNullValues.java | 0 .../TestBeanItemContainerUsage.html | 0 .../TestBeanItemContainerUsage.java | 0 .../components/button/ButtonErrorMessage.java | 0 .../button/ButtonUndefinedWidth.html | 0 .../button/ButtonUndefinedWidth.java | 0 .../components/button/DisabledButtons.html | 0 .../components/button/DisabledButtons.java | 0 .../components/button/IE7ButtonWithIcon.html | 0 .../components/button/IE7ButtonWithIcon.java | 0 .../button/TooltipForDisabledButton.java | 0 .../components/caption/LargeCaptionIcon.html | 0 .../components/caption/LargeCaptionIcon.java | 0 .../checkbox/CheckboxCaptionWrapping.html | 0 .../checkbox/CheckboxCaptionWrapping.java | 0 .../components/checkbox/CheckboxIcon.java | 0 .../combobox/ComboBoxInPopupView.java | 0 .../components/combobox/ComboBoxItemIcon.html | 0 .../components/combobox/ComboBoxItemIcon.java | 0 .../combobox/ComboBoxLargeIcons.java | 0 .../combobox/ComboBoxNavigation.html | 0 .../combobox/ComboBoxNavigation.java | 0 .../combobox/ComboBoxValueInput.html | 0 .../combobox/ComboBoxValueInput.java | 0 .../combobox/ComboBoxValueUpdate.java | 0 .../combobox/ComboxBoxErrorMessage.java | 0 .../vaadin/tests/components/combobox/fi.gif | Bin .../vaadin/tests/components/combobox/se.gif | Bin .../datefield/DateFieldReadOnly.html | 0 .../datefield/DateFieldReadOnly.java | 0 .../datefield/DisabledDateFieldWidth | 0 .../datefield/DisabledDateFieldWidth.java | 0 .../datefield/TestDatefieldYear.html | 0 .../datefield/TestDatefieldYear.java | 0 .../components/embedded/EmbeddedFlash.java | 0 .../embedded/EmbeddedImageRefresh.java | 0 .../components/embedded/EmbeddedTooltip.java | 0 .../form/FormCommitWithInvalidValues.html | 0 .../form/FormCommitWithInvalidValues.java | 0 .../form/FormNotGettingSmaller.java | 0 .../components/form/FormRenderingFlicker.java | 0 .../label/HundredPercentWideLabelResize.html | 0 .../label/HundredPercentWideLabelResize.java | 0 .../tests/components/label/LabelWrapping.html | 0 .../tests/components/label/LabelWrapping.java | 0 .../tests/components/link/LinkIcon.java | 0 .../tests/components/link/LinkTargetSize.java | 0 .../components/loginform/LoginFormTest.java | 63 ++ .../OptionGroupMultipleValueChange.java | 0 .../orderedlayout/ReplaceComponentNPE.html | 0 .../orderedlayout/ReplaceComponentNPE.java | 0 .../panel/PanelShouldRemoveActionHandler.java | 0 .../popupview/PopupViewLabelResized.java | 0 .../popupview/PopupViewNullValues.java | 0 .../popupview/PopupViewOffScreen.html | 0 .../popupview/PopupViewOffScreen.java | 0 .../popupview/PopupViewWithRTE.java | 50 ++ .../richtextarea/RichTextAreaSize.html | 0 .../richtextarea/RichTextAreaSize.java | 0 .../select/NullSelectionItemId.java | 26 +- .../splitpanel/SplitPanelExtraScrollbars.html | 0 .../splitpanel/SplitPanelExtraScrollbars.java | 0 .../splitpanel/SplitPanelSplitterWidth.java | 0 .../splitpanel/SplitPanelWidthOnResize.java | 0 .../table/ClippedComponentsInTable.html | 0 .../table/ClippedComponentsInTable.java | 0 .../ColumnCollapsingAndColumnExpansion.html | 0 .../ColumnCollapsingAndColumnExpansion.java | 0 .../components/table/ColumnExpandRatio.html | 0 .../components/table/ColumnExpandRatio.java | 0 .../table/ColumnExpandWithFixedColumns.html | 0 .../table/ColumnExpandWithFixedColumns.java | 0 .../table/ColumnGeneratorAddingOrder.java | 0 .../tests/components/table/ColumnWidths.java | 0 .../components/table/ContainerSizeChange.html | 0 .../components/table/ContainerSizeChange.java | 0 .../LabelEmbeddedClickThroughForTable.html | 0 .../LabelEmbeddedClickThroughForTable.java | 0 .../components/table/MissingScrollbar.html | 0 .../components/table/MissingScrollbar.java | 0 .../table/ModifyContainerProperty.java | 0 .../table/NotselectablePaintSelections.java | 0 .../components/table/PropertyValueChange.html | 0 .../components/table/PropertyValueChange.java | 0 .../components/table/RowAdditionTest.java | 0 .../tests/components/table/TableItemIcon.java | 0 .../components/table/TableLastRowMissing.html | 0 .../components/table/TableLastRowMissing.java | 0 .../table/TablePageLengthUpdate.html | 0 .../table/TablePageLengthUpdate.java | 0 .../components/table/TableRowHeight.html | 0 .../components/table/TableRowHeight.java | 0 .../components/table/TableRowHeight2.html | 0 .../components/table/TableRowHeight2.java | 0 .../components/table/TableRowHeight3.html | 0 .../components/table/TableRowHeight3.java | 0 .../table/TableVisibleColumnsUpdate.html | 0 .../table/TableVisibleColumnsUpdate.java | 0 .../table/TestCurrentPageFirstItem.java | 0 .../table/TextFieldRelativeWidth.html | 0 .../table/TextFieldRelativeWidth.java | 0 .../com/vaadin/tests/components/table/fi.gif | Bin .../com/vaadin/tests/components/table/se.gif | Bin .../components/tabsheet/AddAndRemoveTabs.html | 0 .../components/tabsheet/AddAndRemoveTabs.java | 0 .../components/tabsheet/PreventTabChange.html | 0 .../components/tabsheet/PreventTabChange.java | 0 .../tests/components/tabsheet/RemoveTabs.java | 0 .../tabsheet/RemoveTabsTabsheet.html | 0 .../components/tabsheet/TabSheetCaptions.html | 0 .../components/tabsheet/TabSheetCaptions.java | 0 .../tabsheet/TabSheetDisabling.html | 0 .../tabsheet/TabSheetDisabling.java | 0 .../components/tabsheet/TabSheetIcons.html | 0 .../components/tabsheet/TabSheetIcons.java | 0 .../tabsheet/TabSheetWithoutTabCaption.html | 0 .../tabsheet/TabSheetWithoutTabCaption.java | 0 .../components/tabsheet/TabsheetNPE.java | 0 .../tabsheet/TabsheetScrolling.html | 0 .../tabsheet/TabsheetScrolling.java | 0 .../components/tabsheet/TabsheetTooltip.html | 0 .../components/tabsheet/TabsheetTooltip.java | 0 .../tabsheet/VerticalScrollbarPosition.html | 0 .../tabsheet/VerticalScrollbarPosition.java | 0 ...nterShortcutMaySendInputPromptAsValue.java | 0 .../tests/components/textfield/IE6Cursor.java | 0 .../components/textfield/TextFields.html | 0 .../components/textfield/TextFields.java | 0 .../tree/TreeNodeCaptionWrapping.html | 0 .../tree/TreeNodeCaptionWrapping.java | 0 .../CenteredWindowWithUndefinedSize.html | 0 .../CenteredWindowWithUndefinedSize.java | 0 .../window/EmbeddedInSubWindow.html | 0 .../window/EmbeddedInSubWindow.java | 0 .../components/window/FullSizedWindow.java | 0 .../components/window/SubWindowOrder.java | 0 .../window/SubwindowInvalidLayout.java | 0 .../window/TestTooSmallSubwindowSize.html | 0 .../window/TestTooSmallSubwindowSize.java | 0 .../window/UndefinedWidthSubWindow.html | 0 .../window/UndefinedWidthSubWindow.java | 0 .../window/WindowResizeListener.java | 0 .../WindowShouldRemoveActionHandler.html | 0 .../WindowShouldRemoveActionHandler.java | 0 .../components/window/WindowStyleNames.java | 0 .../BeanItemContainerFilteringTest.java | 0 .../containers/BeanItemContainerTest.java | 0 .../IndexedContainerFilteringTest.java | 0 .../vaadin/tests/featurebrowser/Feature.java | 0 .../tests/featurebrowser/FeatureBrowser.java | 0 .../featurebrowser/FeatureBuffering.java | 0 .../tests/featurebrowser/FeatureButton.java | 0 .../featurebrowser/FeatureContainers.java | 0 .../featurebrowser/FeatureCustomLayout.java | 0 .../featurebrowser/FeatureDateField.java | 0 .../tests/featurebrowser/FeatureEmbedded.java | 0 .../tests/featurebrowser/FeatureForm.java | 0 .../featurebrowser/FeatureGridLayout.java | 0 .../tests/featurebrowser/FeatureItems.java | 0 .../tests/featurebrowser/FeatureLabel.java | 0 .../tests/featurebrowser/FeatureLink.java | 0 .../featurebrowser/FeatureOrderedLayout.java | 0 .../tests/featurebrowser/FeaturePanel.java | 0 .../featurebrowser/FeatureParameters.java | 0 .../featurebrowser/FeatureProperties.java | 0 .../tests/featurebrowser/FeatureSelect.java | 0 .../tests/featurebrowser/FeatureTabSheet.java | 0 .../tests/featurebrowser/FeatureTable.java | 0 .../featurebrowser/FeatureTextField.java | 0 .../tests/featurebrowser/FeatureTree.java | 0 .../tests/featurebrowser/FeatureUpload.java | 0 .../tests/featurebrowser/FeatureUtil.java | 0 .../featurebrowser/FeatureValidators.java | 0 .../tests/featurebrowser/FeatureWindow.java | 0 .../featurebrowser/FeaturesApplication.java | 0 .../tests/featurebrowser/IntroBasic.java | 0 .../tests/featurebrowser/IntroComponents.java | 0 .../featurebrowser/IntroDataHandling.java | 0 .../tests/featurebrowser/IntroDataModel.java | 0 .../featurebrowser/IntroItemContainers.java | 0 .../tests/featurebrowser/IntroLayouts.java | 0 .../tests/featurebrowser/IntroTerminal.java | 0 .../tests/featurebrowser/IntroWelcome.java | 0 .../tests/featurebrowser/PropertyPanel.java | 0 .../tests/featurebrowser/components.png | Bin .../vaadin/tests/featurebrowser/icon_demo.png | Bin .../tests/featurebrowser/icon_intro.png | Bin .../vaadin/tests/featurebrowser/itmill.gif | Bin .../tests/featurebrowser/m-bullet-blue.gif | Bin .../com/vaadin/tests/featurebrowser/m.gif | Bin .../tests/featurebrowser/vaadin_spin.swf | Bin .../layouts/AbsoluteLayoutAddRemove.java | 0 .../tests/layouts/DeepComponentTrees.java | 0 .../FormLayoutWithInvisibleComponent.java | 0 .../GridLayoutExpandRatioModification.java | 0 .../tests/layouts/GridLayoutInsidePanel.java | 0 .../tests/layouts/GridLayoutInsidePanel2.java | 0 .../tests/layouts/HiddenHorizontalLayout.java | 0 .../tests/layouts/OrderedLayoutBasics.java | 0 .../OrderedLayoutCSSCompatibility.java | 0 .../tests/layouts/TestAbsoluteLayout.java | 0 .../tests/layouts/TestLayoutPerformance.java | 0 ...VerticalLayoutExpandRatioModification.java | 0 ...ticalLayoutWithRelativeSizeComponents.java | 0 {src => tests/src}/com/vaadin/tests/m.gif | Bin .../tests/resources/ResourceDownload.java | 0 .../vaadin/tests/robustness/Robustness.java | 0 .../tests/robustness/RobustnessSimple.java | 0 .../com/vaadin/tests/themes/ButtonsTest.java | 0 .../com/vaadin/tests/tickets/Ticket1225.java | 0 .../com/vaadin/tests/tickets/Ticket1230.java | 280 +++--- .../com/vaadin/tests/tickets/Ticket124.java | 0 .../com/vaadin/tests/tickets/Ticket1245.java | 0 .../vaadin/tests/tickets/Ticket1362Login.java | 0 .../com/vaadin/tests/tickets/Ticket1365.java | 0 .../com/vaadin/tests/tickets/Ticket1368.java | 0 .../com/vaadin/tests/tickets/Ticket1397.java | 0 .../com/vaadin/tests/tickets/Ticket1435.java | 0 .../com/vaadin/tests/tickets/Ticket1444.java | 0 .../tickets/Ticket1465ModalNotification.java | 0 .../com/vaadin/tests/tickets/Ticket1506.java | 0 .../tests/tickets/Ticket1506_Panel.java | 0 .../tickets/Ticket1506_TestContainer.java | 0 .../tickets/Ticket1506_TestContainer2.java | 0 .../com/vaadin/tests/tickets/Ticket1519.java | 0 .../com/vaadin/tests/tickets/Ticket1572.java | 0 .../com/vaadin/tests/tickets/Ticket1581.java | 0 .../com/vaadin/tests/tickets/Ticket1589.java | 0 .../com/vaadin/tests/tickets/Ticket1598.java | 0 .../com/vaadin/tests/tickets/Ticket161.java | 0 .../com/vaadin/tests/tickets/Ticket1632.java | 0 .../com/vaadin/tests/tickets/Ticket1659.java | 0 .../com/vaadin/tests/tickets/Ticket1663.java | 0 .../com/vaadin/tests/tickets/Ticket1673.java | 0 .../com/vaadin/tests/tickets/Ticket1710.java | 0 .../com/vaadin/tests/tickets/Ticket1737.java | 0 .../com/vaadin/tests/tickets/Ticket1767.java | 0 .../com/vaadin/tests/tickets/Ticket1772.java | 0 .../com/vaadin/tests/tickets/Ticket1775.java | 0 .../com/vaadin/tests/tickets/Ticket1804.java | 0 .../com/vaadin/tests/tickets/Ticket1805.java | 0 .../com/vaadin/tests/tickets/Ticket1806.java | 0 .../com/vaadin/tests/tickets/Ticket1811.java | 0 .../com/vaadin/tests/tickets/Ticket1819.java | 0 .../tickets/Ticket1834PanelScrolling.java | 0 .../com/vaadin/tests/tickets/Ticket1857.java | 0 .../com/vaadin/tests/tickets/Ticket1868.java | 0 .../com/vaadin/tests/tickets/Ticket1869.java | 0 .../com/vaadin/tests/tickets/Ticket1878.java | 0 .../com/vaadin/tests/tickets/Ticket1900.java | 0 .../com/vaadin/tests/tickets/Ticket1902.java | 0 .../com/vaadin/tests/tickets/Ticket1904.java | 0 .../com/vaadin/tests/tickets/Ticket1916.java | 0 .../com/vaadin/tests/tickets/Ticket1919.java | 0 .../com/vaadin/tests/tickets/Ticket1921.java | 0 .../com/vaadin/tests/tickets/Ticket1923.java | 0 .../tickets/Ticket1924ThemeChanging.java | 0 .../com/vaadin/tests/tickets/Ticket1925.java | 0 .../com/vaadin/tests/tickets/Ticket1934.java | 0 .../com/vaadin/tests/tickets/Ticket1939.java | 0 .../com/vaadin/tests/tickets/Ticket1940.java | 0 .../com/vaadin/tests/tickets/Ticket1953.java | 0 .../com/vaadin/tests/tickets/Ticket1966.java | 0 .../vaadin/tests/tickets/Ticket1966_2.java | 0 .../vaadin/tests/tickets/Ticket1966_3.java | 0 .../com/vaadin/tests/tickets/Ticket1969.java | 0 .../com/vaadin/tests/tickets/Ticket1970.java | 0 .../com/vaadin/tests/tickets/Ticket1972.java | 0 .../com/vaadin/tests/tickets/Ticket1973.java | 0 .../vaadin/tests/tickets/Ticket1973_2.java | 0 .../com/vaadin/tests/tickets/Ticket1975.java | 0 .../com/vaadin/tests/tickets/Ticket1982.java | 0 .../com/vaadin/tests/tickets/Ticket1983.java | 0 .../com/vaadin/tests/tickets/Ticket1986.java | 0 .../com/vaadin/tests/tickets/Ticket1991.java | 0 .../com/vaadin/tests/tickets/Ticket1995.java | 0 .../com/vaadin/tests/tickets/Ticket20.java | 0 .../com/vaadin/tests/tickets/Ticket2001.java | 0 .../com/vaadin/tests/tickets/Ticket2002.java | 0 .../com/vaadin/tests/tickets/Ticket2007.java | 0 .../com/vaadin/tests/tickets/Ticket2009.java | 0 .../com/vaadin/tests/tickets/Ticket2011.java | 0 .../com/vaadin/tests/tickets/Ticket2014.java | 0 .../com/vaadin/tests/tickets/Ticket2021.java | 0 .../com/vaadin/tests/tickets/Ticket2022.java | 0 .../com/vaadin/tests/tickets/Ticket2023.java | 0 .../com/vaadin/tests/tickets/Ticket2024.java | 0 .../com/vaadin/tests/tickets/Ticket2026.java | 0 .../com/vaadin/tests/tickets/Ticket2029.java | 0 .../com/vaadin/tests/tickets/Ticket2032.java | 0 .../com/vaadin/tests/tickets/Ticket2033.java | 0 .../com/vaadin/tests/tickets/Ticket2037.java | 0 .../com/vaadin/tests/tickets/Ticket2038.java | 0 .../com/vaadin/tests/tickets/Ticket2040.java | 0 .../com/vaadin/tests/tickets/Ticket2042.java | 0 .../com/vaadin/tests/tickets/Ticket2043.java | 0 .../com/vaadin/tests/tickets/Ticket2048.java | 0 .../com/vaadin/tests/tickets/Ticket2051.java | 0 .../com/vaadin/tests/tickets/Ticket2053.java | 0 .../com/vaadin/tests/tickets/Ticket2060.java | 0 .../com/vaadin/tests/tickets/Ticket2061.java | 0 .../com/vaadin/tests/tickets/Ticket2061b.java | 0 .../com/vaadin/tests/tickets/Ticket2061c.java | 0 .../com/vaadin/tests/tickets/Ticket2062.java | 0 .../com/vaadin/tests/tickets/Ticket2083.java | 0 .../com/vaadin/tests/tickets/Ticket2090.java | 0 .../com/vaadin/tests/tickets/Ticket2095.java | 0 .../com/vaadin/tests/tickets/Ticket2098.java | 0 .../com/vaadin/tests/tickets/Ticket2099.java | 0 .../com/vaadin/tests/tickets/Ticket2101.java | 0 .../com/vaadin/tests/tickets/Ticket2103.java | 0 .../com/vaadin/tests/tickets/Ticket2104.java | 0 .../com/vaadin/tests/tickets/Ticket2106.java | 0 .../com/vaadin/tests/tickets/Ticket2107.java | 0 .../com/vaadin/tests/tickets/Ticket2117.java | 0 .../com/vaadin/tests/tickets/Ticket2119.java | 0 .../com/vaadin/tests/tickets/Ticket2125.java | 0 .../com/vaadin/tests/tickets/Ticket2126.java | 0 .../com/vaadin/tests/tickets/Ticket2151.java | 0 .../com/vaadin/tests/tickets/Ticket2157.java | 0 .../com/vaadin/tests/tickets/Ticket2178.java | 0 .../com/vaadin/tests/tickets/Ticket2179.java | 0 .../com/vaadin/tests/tickets/Ticket2180.java | 0 .../com/vaadin/tests/tickets/Ticket2181.java | 0 .../com/vaadin/tests/tickets/Ticket2186.java | 0 .../com/vaadin/tests/tickets/Ticket2204.java | 0 .../com/vaadin/tests/tickets/Ticket2208.java | 0 .../com/vaadin/tests/tickets/Ticket2209.java | 0 .../vaadin/tests/tickets/Ticket2209OL.java | 0 .../vaadin/tests/tickets/Ticket2209OL2.java | 0 .../com/vaadin/tests/tickets/Ticket2215.java | 0 .../com/vaadin/tests/tickets/Ticket2221.java | 0 .../com/vaadin/tests/tickets/Ticket2222.java | 0 .../Ticket2227OrderedlayoutInTable.java | 0 .../com/vaadin/tests/tickets/Ticket2231.java | 0 .../com/vaadin/tests/tickets/Ticket2232.java | 0 .../com/vaadin/tests/tickets/Ticket2234.java | 0 .../com/vaadin/tests/tickets/Ticket2235.java | 0 .../com/vaadin/tests/tickets/Ticket2240.java | 0 .../com/vaadin/tests/tickets/Ticket2242.java | 0 .../com/vaadin/tests/tickets/Ticket2244.java | 0 .../com/vaadin/tests/tickets/Ticket2245.java | 0 .../com/vaadin/tests/tickets/Ticket2267.java | 0 .../com/vaadin/tests/tickets/Ticket2271.java | 0 .../com/vaadin/tests/tickets/Ticket2279.java | 0 .../com/vaadin/tests/tickets/Ticket2282.java | 0 .../com/vaadin/tests/tickets/Ticket2283.java | 0 .../com/vaadin/tests/tickets/Ticket2287.java | 0 .../com/vaadin/tests/tickets/Ticket2289.java | 0 .../com/vaadin/tests/tickets/Ticket2292.java | 0 .../com/vaadin/tests/tickets/Ticket2294.java | 0 .../com/vaadin/tests/tickets/Ticket2296.java | 0 .../com/vaadin/tests/tickets/Ticket2297.java | 0 .../com/vaadin/tests/tickets/Ticket2303.java | 0 .../com/vaadin/tests/tickets/Ticket2304.java | 0 .../com/vaadin/tests/tickets/Ticket2310.java | 0 .../com/vaadin/tests/tickets/Ticket2319.java | 0 .../com/vaadin/tests/tickets/Ticket2323.java | 0 .../com/vaadin/tests/tickets/Ticket2325.java | 0 .../com/vaadin/tests/tickets/Ticket2329.java | 0 .../com/vaadin/tests/tickets/Ticket2337.java | 0 .../com/vaadin/tests/tickets/Ticket2339.java | 0 .../com/vaadin/tests/tickets/Ticket2341.java | 0 .../com/vaadin/tests/tickets/Ticket2344.java | 0 .../com/vaadin/tests/tickets/Ticket2347.java | 0 .../com/vaadin/tests/tickets/Ticket2364.java | 0 .../com/vaadin/tests/tickets/Ticket2365.java | 0 .../com/vaadin/tests/tickets/Ticket2398.java | 0 .../com/vaadin/tests/tickets/Ticket2404.java | 0 .../com/vaadin/tests/tickets/Ticket2405.java | 0 .../com/vaadin/tests/tickets/Ticket2406.java | 0 .../com/vaadin/tests/tickets/Ticket2407.java | 0 .../com/vaadin/tests/tickets/Ticket2411.java | 0 .../com/vaadin/tests/tickets/Ticket2415.java | 0 .../com/vaadin/tests/tickets/Ticket2420.java | 0 .../com/vaadin/tests/tickets/Ticket2425.java | 0 .../com/vaadin/tests/tickets/Ticket2426.java | 0 .../com/vaadin/tests/tickets/Ticket2431.java | 0 .../com/vaadin/tests/tickets/Ticket2432.java | 0 .../com/vaadin/tests/tickets/Ticket2434.java | 0 .../com/vaadin/tests/tickets/Ticket2436.java | 0 .../com/vaadin/tests/tickets/Ticket2440.java | 0 .../com/vaadin/tests/tickets/Ticket2526.java | 0 .../com/vaadin/tests/tickets/Ticket2742.java | 0 .../com/vaadin/tests/tickets/Ticket2901.java | 0 .../com/vaadin/tests/tickets/Ticket2998.java | 0 .../com/vaadin/tests/tickets/Ticket3146.java | 0 .../com/vaadin/tests/tickets/Ticket34.java | 0 .../com/vaadin/tests/tickets/Ticket677.java | 0 .../com/vaadin/tests/tickets/Ticket695.java | 0 .../com/vaadin/tests/tickets/Ticket736.java | 0 .../com/vaadin/tests/tickets/Ticket846.java | 0 .../com/vaadin/tests/tickets/Ticket932.java | 0 .../com/vaadin/tests/util/LogPrintWriter.java | 0 .../com/vaadin/tests/util/LoremIpsum.java | 0 .../vaadin/tests/util/RandomComponents.java | 0 .../vaadin/tests/util/TestClickListener.java | 0 .../src}/com/vaadin/tests/vaadin_spin.swf | Bin .../validation/RequiredErrorMessage.java | 0 .../RequiredIndicatorForReadOnly.java | 0 .../tests/validation/TestValidators.java | 0 878 files changed, 447 insertions(+), 22170 deletions(-) delete mode 100644 src/com/vaadin/demo/Calc.java delete mode 100644 src/com/vaadin/demo/HelloWorld.java delete mode 100644 src/com/vaadin/demo/PortletDemo.java delete mode 100644 src/com/vaadin/demo/SimpleAddressBook.java delete mode 100644 src/com/vaadin/demo/VaadinTunesLayout.java delete mode 100644 src/com/vaadin/demo/colorpicker/ColorPicker.java delete mode 100644 src/com/vaadin/demo/colorpicker/ColorPickerApplication.java delete mode 100644 src/com/vaadin/demo/colorpicker/gwt/ColorPickerWidgetSet.gwt.xml delete mode 100644 src/com/vaadin/demo/colorpicker/gwt/client/ui/GwtColorPicker.java delete mode 100644 src/com/vaadin/demo/colorpicker/gwt/client/ui/VColorPicker.java delete mode 100644 src/com/vaadin/demo/colorpicker/gwt/public/colorpicker/styles.css delete mode 100644 src/com/vaadin/demo/coverflow/Coverflow.java delete mode 100644 src/com/vaadin/demo/coverflow/CoverflowApplication.html delete mode 100644 src/com/vaadin/demo/coverflow/CoverflowApplication.java delete mode 100644 src/com/vaadin/demo/coverflow/gwt/CoverflowWidgetSet.gwt.xml delete mode 100644 src/com/vaadin/demo/coverflow/gwt/client/ui/VCoverflow.java delete mode 100644 src/com/vaadin/demo/coverflow/gwt/flex/Cover.as delete mode 100644 src/com/vaadin/demo/coverflow/gwt/flex/Coverflow.as delete mode 100644 src/com/vaadin/demo/coverflow/gwt/flex/EventHandler.as delete mode 100644 src/com/vaadin/demo/coverflow/gwt/flex/coverflowflash.mxml delete mode 100644 src/com/vaadin/demo/coverflow/gwt/flex/sandy/util/DistortImage.as delete mode 100644 src/com/vaadin/demo/coverflow/gwt/flex/sandy/util/SandyPoint.as delete mode 100644 src/com/vaadin/demo/coverflow/gwt/flex/sandy/util/Triangle.as delete mode 100644 src/com/vaadin/demo/coverflow/gwt/public/coverflowflash.swf delete mode 100644 src/com/vaadin/demo/featurebrowser/AccordionExample.java delete mode 100644 src/com/vaadin/demo/featurebrowser/ButtonExample.java delete mode 100644 src/com/vaadin/demo/featurebrowser/ClientCachingExample.java delete mode 100644 src/com/vaadin/demo/featurebrowser/ComboBoxExample.java delete mode 100644 src/com/vaadin/demo/featurebrowser/EmbeddedBrowserExample.java delete mode 100644 src/com/vaadin/demo/featurebrowser/FeatureBrowser.java delete mode 100644 src/com/vaadin/demo/featurebrowser/FormExample.java delete mode 100644 src/com/vaadin/demo/featurebrowser/GeneratedColumnExample.java delete mode 100644 src/com/vaadin/demo/featurebrowser/JavaScriptAPIExample.java delete mode 100644 src/com/vaadin/demo/featurebrowser/LabelExample.java delete mode 100644 src/com/vaadin/demo/featurebrowser/LayoutExample.java delete mode 100644 src/com/vaadin/demo/featurebrowser/NotificationExample.java delete mode 100644 src/com/vaadin/demo/featurebrowser/RichTextExample.java delete mode 100644 src/com/vaadin/demo/featurebrowser/SelectExample.java delete mode 100644 src/com/vaadin/demo/featurebrowser/TableExample.java delete mode 100644 src/com/vaadin/demo/featurebrowser/TreeExample.java delete mode 100644 src/com/vaadin/demo/featurebrowser/ValueInputExample.java delete mode 100644 src/com/vaadin/demo/featurebrowser/WindowingExample.java delete mode 100644 src/com/vaadin/demo/package.html delete mode 100644 src/com/vaadin/demo/reservation/CalendarDemo.java delete mode 100644 src/com/vaadin/demo/reservation/CalendarField.java delete mode 100644 src/com/vaadin/demo/reservation/GoogleMap.java delete mode 100644 src/com/vaadin/demo/reservation/ReservationApplication.java delete mode 100644 src/com/vaadin/demo/reservation/ResourceNotAvailableException.java delete mode 100644 src/com/vaadin/demo/reservation/ResourceSelectorPanel.java delete mode 100644 src/com/vaadin/demo/reservation/SampleDB.java delete mode 100644 src/com/vaadin/demo/reservation/gwt/ReservationWidgetSet.gwt.xml delete mode 100644 src/com/vaadin/demo/reservation/gwt/client/ui/VCalendarField.java delete mode 100644 src/com/vaadin/demo/reservation/gwt/client/ui/VGoogleMap.java delete mode 100644 src/com/vaadin/demo/reservation/gwt/public/reservr/googlemap/css/googlemap.css delete mode 100755 src/com/vaadin/demo/reservation/gwt/public/reservr/img/calendar-time-selected.gif delete mode 100644 src/com/vaadin/demo/reservation/gwt/public/reservr/img/entry-bg.jpg delete mode 100644 src/com/vaadin/demo/reservation/gwt/public/reservr/img/entry-topleft.jpg delete mode 100644 src/com/vaadin/demo/reservation/gwt/public/reservr/img/event-bg.jpg delete mode 100644 src/com/vaadin/demo/reservation/gwt/public/reservr/styles.css delete mode 100644 src/com/vaadin/demo/reservation/simple/AdminView.java delete mode 100644 src/com/vaadin/demo/reservation/simple/SampleDB.java delete mode 100644 src/com/vaadin/demo/reservation/simple/SimpleReserver.java delete mode 100644 src/com/vaadin/demo/reservation/simple/StdView.java delete mode 100644 src/com/vaadin/demo/sampler/APIResource.java delete mode 100644 src/com/vaadin/demo/sampler/ActiveLink.java delete mode 100644 src/com/vaadin/demo/sampler/CodeLabel.java delete mode 100644 src/com/vaadin/demo/sampler/ExampleUtil.java delete mode 100644 src/com/vaadin/demo/sampler/Feature.java delete mode 100644 src/com/vaadin/demo/sampler/FeatureSet.java delete mode 100644 src/com/vaadin/demo/sampler/FeatureView.java delete mode 100644 src/com/vaadin/demo/sampler/GoogleAnalytics.java delete mode 100644 src/com/vaadin/demo/sampler/ModeSwitch.java delete mode 100644 src/com/vaadin/demo/sampler/NamedExternalResource.java delete mode 100644 src/com/vaadin/demo/sampler/SamplerApplication.java delete mode 100644 src/com/vaadin/demo/sampler/features/accordions/75-AccordionDisabled.png delete mode 100644 src/com/vaadin/demo/sampler/features/accordions/75-AccordionIcons.png delete mode 100644 src/com/vaadin/demo/sampler/features/accordions/AccordionDisabled.java delete mode 100644 src/com/vaadin/demo/sampler/features/accordions/AccordionDisabledExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/accordions/AccordionIcons.java delete mode 100644 src/com/vaadin/demo/sampler/features/accordions/AccordionIconsExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/blueprints/75-ProminentPrimaryAction.png delete mode 100644 src/com/vaadin/demo/sampler/features/blueprints/ProminentPrimaryAction.java delete mode 100644 src/com/vaadin/demo/sampler/features/blueprints/ProminentPrimaryActionExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/buttons/75-ButtonLink.png delete mode 100644 src/com/vaadin/demo/sampler/features/buttons/75-ButtonPush.png delete mode 100644 src/com/vaadin/demo/sampler/features/buttons/75-ButtonSwitch.png delete mode 100644 src/com/vaadin/demo/sampler/features/buttons/ButtonLink.java delete mode 100644 src/com/vaadin/demo/sampler/features/buttons/ButtonLinkExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/buttons/ButtonPush.java delete mode 100644 src/com/vaadin/demo/sampler/features/buttons/ButtonPushExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/buttons/ButtonSwitch.java delete mode 100644 src/com/vaadin/demo/sampler/features/buttons/ButtonSwitchExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/commons/75-Errors.png delete mode 100644 src/com/vaadin/demo/sampler/features/commons/75-Icons.png delete mode 100644 src/com/vaadin/demo/sampler/features/commons/75-Tooltips.png delete mode 100644 src/com/vaadin/demo/sampler/features/commons/75-Validation.png delete mode 100644 src/com/vaadin/demo/sampler/features/commons/Errors.java delete mode 100644 src/com/vaadin/demo/sampler/features/commons/ErrorsExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/commons/Icons.java delete mode 100644 src/com/vaadin/demo/sampler/features/commons/IconsExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/commons/Tooltips.java delete mode 100644 src/com/vaadin/demo/sampler/features/commons/TooltipsExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/commons/Validation.java delete mode 100644 src/com/vaadin/demo/sampler/features/commons/ValidationExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/dates/75-DateInline.png delete mode 100644 src/com/vaadin/demo/sampler/features/dates/75-DateLocale.png delete mode 100644 src/com/vaadin/demo/sampler/features/dates/75-DatePopup.png delete mode 100644 src/com/vaadin/demo/sampler/features/dates/75-DateResolution.png delete mode 100644 src/com/vaadin/demo/sampler/features/dates/DateInline.java delete mode 100644 src/com/vaadin/demo/sampler/features/dates/DateInlineExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/dates/DateLocale.java delete mode 100644 src/com/vaadin/demo/sampler/features/dates/DateLocaleExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/dates/DatePopup.java delete mode 100644 src/com/vaadin/demo/sampler/features/dates/DatePopupExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/dates/DateResolution.java delete mode 100644 src/com/vaadin/demo/sampler/features/dates/DateResolutionExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/form/75-FormBasic.png delete mode 100644 src/com/vaadin/demo/sampler/features/form/75-FormPojo.png delete mode 100644 src/com/vaadin/demo/sampler/features/form/FormBasic.java delete mode 100644 src/com/vaadin/demo/sampler/features/form/FormPojo.java delete mode 100644 src/com/vaadin/demo/sampler/features/form/FormPojoExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/75-ApplicationLayout.png delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/75-CssLayouts.png delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/75-CustomLayouts.png delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/75-ExpandingComponent.png delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/75-GridLayoutBasic.png delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/75-HorizontalLayoutBasic.png delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/75-LayoutAlignment.png delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/75-LayoutMargin.png delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/75-LayoutSpacing.png delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/75-SplitPanelBasic.png delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/75-VerticalLayoutBasic.png delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/75-WebLayout.png delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/ApplicationLayout.java delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/ApplicationLayoutExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/CssLayouts.java delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/CssLayoutsExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/CustomLayouts.java delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/CustomLayoutsExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/ExpandingComponent.java delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/ExpandingComponentExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/GridLayoutBasic.java delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/GridLayoutBasicExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/HorizontalLayoutBasic.java delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/HorizontalLayoutBasicExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/LayoutAlignment.java delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/LayoutAlignmentExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/LayoutMargin.java delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/LayoutMarginExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/LayoutSpacing.java delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/LayoutSpacingExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/SplitPanelBasic.java delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/SplitPanelBasicExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/VerticalLayoutBasic.java delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/VerticalLayoutBasicExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/WebLayout.java delete mode 100644 src/com/vaadin/demo/sampler/features/layouts/WebLayoutExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/link/75-LinkCurrentWindow.png delete mode 100644 src/com/vaadin/demo/sampler/features/link/75-LinkNoDecorations.png delete mode 100644 src/com/vaadin/demo/sampler/features/link/75-LinkSizedWindow.png delete mode 100644 src/com/vaadin/demo/sampler/features/link/LinkCurrentWindow.java delete mode 100644 src/com/vaadin/demo/sampler/features/link/LinkCurrentWindowExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/link/LinkNoDecorations.java delete mode 100644 src/com/vaadin/demo/sampler/features/link/LinkNoDecorationsExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/link/LinkSizedWindow.java delete mode 100644 src/com/vaadin/demo/sampler/features/link/LinkSizedWindowExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/notifications/75-NotificationCustom.png delete mode 100644 src/com/vaadin/demo/sampler/features/notifications/75-NotificationError.png delete mode 100644 src/com/vaadin/demo/sampler/features/notifications/75-NotificationHumanized.png delete mode 100644 src/com/vaadin/demo/sampler/features/notifications/75-NotificationTray.png delete mode 100644 src/com/vaadin/demo/sampler/features/notifications/75-NotificationWarning.png delete mode 100644 src/com/vaadin/demo/sampler/features/notifications/NotificationCustom.java delete mode 100644 src/com/vaadin/demo/sampler/features/notifications/NotificationCustomExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/notifications/NotificationError.java delete mode 100644 src/com/vaadin/demo/sampler/features/notifications/NotificationErrorExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/notifications/NotificationHumanized.java delete mode 100644 src/com/vaadin/demo/sampler/features/notifications/NotificationHumanizedExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/notifications/NotificationTray.java delete mode 100644 src/com/vaadin/demo/sampler/features/notifications/NotificationTrayExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/notifications/NotificationWarning.java delete mode 100644 src/com/vaadin/demo/sampler/features/notifications/NotificationWarningExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/panels/75-PanelBasic.png delete mode 100644 src/com/vaadin/demo/sampler/features/panels/75-PanelLight.png delete mode 100644 src/com/vaadin/demo/sampler/features/panels/PanelBasic.java delete mode 100644 src/com/vaadin/demo/sampler/features/panels/PanelBasicExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/panels/PanelLight.java delete mode 100644 src/com/vaadin/demo/sampler/features/panels/PanelLightExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/selects/75-ComboBoxContains.png delete mode 100644 src/com/vaadin/demo/sampler/features/selects/75-ComboBoxInputPrompt.png delete mode 100644 src/com/vaadin/demo/sampler/features/selects/75-ComboBoxNewItems.png delete mode 100644 src/com/vaadin/demo/sampler/features/selects/75-ComboBoxPlain.png delete mode 100644 src/com/vaadin/demo/sampler/features/selects/75-ComboBoxStartsWith.png delete mode 100644 src/com/vaadin/demo/sampler/features/selects/75-ListSelectMultiple.png delete mode 100644 src/com/vaadin/demo/sampler/features/selects/75-ListSelectSingle.png delete mode 100644 src/com/vaadin/demo/sampler/features/selects/75-NativeSelection.png delete mode 100644 src/com/vaadin/demo/sampler/features/selects/75-TwinColumnSelect.png delete mode 100644 src/com/vaadin/demo/sampler/features/selects/ComboBoxContains.java delete mode 100644 src/com/vaadin/demo/sampler/features/selects/ComboBoxContainsExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/selects/ComboBoxInputPrompt.java delete mode 100644 src/com/vaadin/demo/sampler/features/selects/ComboBoxInputPromptExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/selects/ComboBoxNewItems.java delete mode 100644 src/com/vaadin/demo/sampler/features/selects/ComboBoxNewItemsExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/selects/ComboBoxPlain.java delete mode 100644 src/com/vaadin/demo/sampler/features/selects/ComboBoxPlainExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/selects/ComboBoxStartsWith.java delete mode 100644 src/com/vaadin/demo/sampler/features/selects/ComboBoxStartsWithExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/selects/ListSelectMultiple.java delete mode 100644 src/com/vaadin/demo/sampler/features/selects/ListSelectMultipleExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/selects/ListSelectSingle.java delete mode 100644 src/com/vaadin/demo/sampler/features/selects/ListSelectSingleExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/selects/NativeSelection.java delete mode 100644 src/com/vaadin/demo/sampler/features/selects/NativeSelectionExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/selects/TwinColumnSelect.java delete mode 100644 src/com/vaadin/demo/sampler/features/selects/TwinColumnSelectExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/table/75-TableActions.png delete mode 100644 src/com/vaadin/demo/sampler/features/table/75-TableCellStyling.png delete mode 100644 src/com/vaadin/demo/sampler/features/table/75-TableColumnAlignment.png delete mode 100644 src/com/vaadin/demo/sampler/features/table/75-TableColumnCollapsing.png delete mode 100644 src/com/vaadin/demo/sampler/features/table/75-TableColumnHeaders.png delete mode 100644 src/com/vaadin/demo/sampler/features/table/75-TableColumnReordering.png delete mode 100644 src/com/vaadin/demo/sampler/features/table/75-TableHeaderIcons.png delete mode 100644 src/com/vaadin/demo/sampler/features/table/75-TableLazyLoading.png delete mode 100644 src/com/vaadin/demo/sampler/features/table/75-TableMouseEvents.png delete mode 100644 src/com/vaadin/demo/sampler/features/table/75-TableRowHeaders.png delete mode 100644 src/com/vaadin/demo/sampler/features/table/75-TableRowStyling.png delete mode 100644 src/com/vaadin/demo/sampler/features/table/75-TableSorting.png delete mode 100644 src/com/vaadin/demo/sampler/features/table/TableActions.java delete mode 100644 src/com/vaadin/demo/sampler/features/table/TableCellStyling.java delete mode 100644 src/com/vaadin/demo/sampler/features/table/TableColumnAlignment.java delete mode 100644 src/com/vaadin/demo/sampler/features/table/TableColumnCollapsing.java delete mode 100644 src/com/vaadin/demo/sampler/features/table/TableColumnHeaders.java delete mode 100644 src/com/vaadin/demo/sampler/features/table/TableColumnReordering.java delete mode 100644 src/com/vaadin/demo/sampler/features/table/TableHeaderIcons.java delete mode 100644 src/com/vaadin/demo/sampler/features/table/TableLazyLoading.java delete mode 100644 src/com/vaadin/demo/sampler/features/table/TableMainFeaturesExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/table/TableMouseEvents.java delete mode 100644 src/com/vaadin/demo/sampler/features/table/TableRowHeaders.java delete mode 100644 src/com/vaadin/demo/sampler/features/table/TableRowStyling.java delete mode 100644 src/com/vaadin/demo/sampler/features/table/TableSorting.java delete mode 100644 src/com/vaadin/demo/sampler/features/table/TableStylingExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/tabsheets/75-TabSheetDisabled.png delete mode 100644 src/com/vaadin/demo/sampler/features/tabsheets/75-TabSheetIcons.png delete mode 100644 src/com/vaadin/demo/sampler/features/tabsheets/75-TabSheetScrolling.png delete mode 100644 src/com/vaadin/demo/sampler/features/tabsheets/TabSheetDisabled.java delete mode 100644 src/com/vaadin/demo/sampler/features/tabsheets/TabSheetDisabledExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/tabsheets/TabSheetIcons.java delete mode 100644 src/com/vaadin/demo/sampler/features/tabsheets/TabSheetIconsExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/tabsheets/TabSheetScrolling.java delete mode 100644 src/com/vaadin/demo/sampler/features/tabsheets/TabSheetScrollingExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/text/75-LabelPlain.png delete mode 100644 src/com/vaadin/demo/sampler/features/text/75-LabelPreformatted.png delete mode 100644 src/com/vaadin/demo/sampler/features/text/75-LabelRich.png delete mode 100644 src/com/vaadin/demo/sampler/features/text/75-RichTextEditor.png delete mode 100644 src/com/vaadin/demo/sampler/features/text/75-TextArea.png delete mode 100644 src/com/vaadin/demo/sampler/features/text/75-TextFieldInputPrompt.png delete mode 100644 src/com/vaadin/demo/sampler/features/text/75-TextFieldSecret.png delete mode 100644 src/com/vaadin/demo/sampler/features/text/75-TextFieldSingle.png delete mode 100644 src/com/vaadin/demo/sampler/features/text/LabelPlain.java delete mode 100644 src/com/vaadin/demo/sampler/features/text/LabelPlainExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/text/LabelPreformatted.java delete mode 100644 src/com/vaadin/demo/sampler/features/text/LabelPreformattedExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/text/LabelRich.java delete mode 100644 src/com/vaadin/demo/sampler/features/text/LabelRichExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/text/RichTextEditor.java delete mode 100644 src/com/vaadin/demo/sampler/features/text/TextArea.java delete mode 100644 src/com/vaadin/demo/sampler/features/text/TextAreaExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/text/TextFieldInputPrompt.java delete mode 100644 src/com/vaadin/demo/sampler/features/text/TextFieldInputPromptExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/text/TextFieldSecret.java delete mode 100644 src/com/vaadin/demo/sampler/features/text/TextFieldSecretExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/text/TextFieldSingle.java delete mode 100644 src/com/vaadin/demo/sampler/features/text/TextFieldSingleExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/trees/75-TreeActions.png delete mode 100644 src/com/vaadin/demo/sampler/features/trees/75-TreeMouseEvents.png delete mode 100644 src/com/vaadin/demo/sampler/features/trees/75-TreeMultiSelect.png delete mode 100644 src/com/vaadin/demo/sampler/features/trees/75-TreeSingleSelect.png delete mode 100644 src/com/vaadin/demo/sampler/features/trees/TreeActions.java delete mode 100644 src/com/vaadin/demo/sampler/features/trees/TreeMouseEvents.java delete mode 100644 src/com/vaadin/demo/sampler/features/trees/TreeMouseEventsExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/trees/TreeMultiSelect.java delete mode 100644 src/com/vaadin/demo/sampler/features/trees/TreeMultiSelectExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/trees/TreeSingleSelect.java delete mode 100644 src/com/vaadin/demo/sampler/features/trees/TreeSingleSelectExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/upload/75-UploadBasic.png delete mode 100644 src/com/vaadin/demo/sampler/features/upload/75-UploadWithProgressMonitoring.png delete mode 100644 src/com/vaadin/demo/sampler/features/upload/UploadBasic.java delete mode 100644 src/com/vaadin/demo/sampler/features/upload/UploadBasicExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/upload/UploadWithProgressMonitoring.java delete mode 100644 src/com/vaadin/demo/sampler/features/upload/UploadWithProgressMonitoringExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/windows/75-NativeWindow.png delete mode 100644 src/com/vaadin/demo/sampler/features/windows/75-Subwindow.png delete mode 100644 src/com/vaadin/demo/sampler/features/windows/75-SubwindowAutoSized.png delete mode 100644 src/com/vaadin/demo/sampler/features/windows/75-SubwindowClose.png delete mode 100644 src/com/vaadin/demo/sampler/features/windows/75-SubwindowModal.png delete mode 100644 src/com/vaadin/demo/sampler/features/windows/75-SubwindowPositioned.png delete mode 100644 src/com/vaadin/demo/sampler/features/windows/75-SubwindowSized.png delete mode 100644 src/com/vaadin/demo/sampler/features/windows/NativeWindow.java delete mode 100644 src/com/vaadin/demo/sampler/features/windows/NativeWindowExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/windows/Subwindow.java delete mode 100644 src/com/vaadin/demo/sampler/features/windows/SubwindowAutoSized.java delete mode 100644 src/com/vaadin/demo/sampler/features/windows/SubwindowAutoSizedExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/windows/SubwindowClose.java delete mode 100644 src/com/vaadin/demo/sampler/features/windows/SubwindowCloseExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/windows/SubwindowExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/windows/SubwindowModal.java delete mode 100644 src/com/vaadin/demo/sampler/features/windows/SubwindowModalExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/windows/SubwindowPositioned.java delete mode 100644 src/com/vaadin/demo/sampler/features/windows/SubwindowPositionedExample.java delete mode 100644 src/com/vaadin/demo/sampler/features/windows/SubwindowSized.java delete mode 100644 src/com/vaadin/demo/sampler/features/windows/SubwindowSizedExample.java delete mode 100644 src/com/vaadin/demo/sampler/folder.gif delete mode 100644 src/com/vaadin/demo/sampler/gwt/SamplerWidgetSet.gwt.xml delete mode 100644 src/com/vaadin/demo/sampler/gwt/client/ui/VActiveLink.java delete mode 100644 src/com/vaadin/demo/sampler/gwt/client/ui/VCodeLabel.java delete mode 100644 src/com/vaadin/demo/sampler/gwt/client/ui/VGoogleAnalytics.java delete mode 100644 src/com/vaadin/demo/sampler/gwt/public/prettify/README.txt delete mode 100644 src/com/vaadin/demo/sampler/gwt/public/prettify/prettify.css delete mode 100644 src/com/vaadin/demo/sampler/gwt/public/prettify/prettify.js delete mode 100644 src/com/vaadin/demo/themes/ReindeerThemeStyles.java delete mode 100644 src/com/vaadin/demo/tutorial/addressbook/AddressBookApplication.java delete mode 100644 src/com/vaadin/demo/tutorial/addressbook/data/Person.java delete mode 100644 src/com/vaadin/demo/tutorial/addressbook/data/PersonContainer.java delete mode 100644 src/com/vaadin/demo/tutorial/addressbook/data/SearchFilter.java delete mode 100644 src/com/vaadin/demo/tutorial/addressbook/ui/HelpWindow.java delete mode 100644 src/com/vaadin/demo/tutorial/addressbook/ui/ListView.java delete mode 100644 src/com/vaadin/demo/tutorial/addressbook/ui/NavigationTree.java delete mode 100644 src/com/vaadin/demo/tutorial/addressbook/ui/PersonForm.java delete mode 100644 src/com/vaadin/demo/tutorial/addressbook/ui/PersonList.java delete mode 100644 src/com/vaadin/demo/tutorial/addressbook/ui/SearchView.java delete mode 100644 src/com/vaadin/demo/tutorial/addressbook/ui/SharingOptions.java delete mode 100644 src/com/vaadin/demo/util/SampleCalendarDatabase.java delete mode 100644 src/com/vaadin/demo/util/SampleDatabase.java delete mode 100644 src/com/vaadin/demo/util/SampleDirectory.java rename {src => tests/src}/com/vaadin/automatedtests/ComponentsInTable.java (100%) rename {src => tests/src}/com/vaadin/automatedtests/SimplestApplication.java (100%) rename {src => tests/src}/com/vaadin/automatedtests/featurebrowser/AccordionExample.java (100%) rename {src => tests/src}/com/vaadin/automatedtests/featurebrowser/ButtonExample.java (100%) rename {src => tests/src}/com/vaadin/automatedtests/featurebrowser/ClientCachingExample.java (100%) rename {src => tests/src}/com/vaadin/automatedtests/featurebrowser/ComboBoxExample.java (100%) rename {src => tests/src}/com/vaadin/automatedtests/featurebrowser/EmbeddedBrowserExample.java (100%) rename {src => tests/src}/com/vaadin/automatedtests/featurebrowser/FeatureBrowser.java (100%) rename {src => tests/src}/com/vaadin/automatedtests/featurebrowser/FormExample.java (100%) rename {src => tests/src}/com/vaadin/automatedtests/featurebrowser/GeneratedColumnExample.java (100%) rename {src => tests/src}/com/vaadin/automatedtests/featurebrowser/JavaScriptAPIExample.java (100%) rename {src => tests/src}/com/vaadin/automatedtests/featurebrowser/LabelExample.java (100%) rename {src => tests/src}/com/vaadin/automatedtests/featurebrowser/LayoutExample.java (100%) rename {src => tests/src}/com/vaadin/automatedtests/featurebrowser/NotificationExample.java (100%) rename {src => tests/src}/com/vaadin/automatedtests/featurebrowser/RichTextExample.java (100%) rename {src => tests/src}/com/vaadin/automatedtests/featurebrowser/SelectExample.java (100%) rename {src => tests/src}/com/vaadin/automatedtests/featurebrowser/TableExample.java (100%) rename {src => tests/src}/com/vaadin/automatedtests/featurebrowser/TreeExample.java (100%) rename {src => tests/src}/com/vaadin/automatedtests/featurebrowser/ValueInputExample.java (100%) rename {src => tests/src}/com/vaadin/automatedtests/featurebrowser/WindowingExample.java (100%) rename {src => tests/src}/com/vaadin/automatedtests/robustness/Robustness.java (100%) rename {src => tests/src}/com/vaadin/automatedtests/robustness/RobustnessComplex.java (100%) rename {src => tests/src}/com/vaadin/automatedtests/util/DebugId.java (100%) rename {src => tests/src}/com/vaadin/automatedtests/util/Log.java (100%) rename {src => tests/src}/com/vaadin/automatedtests/util/MultiListener.java (100%) rename {src => tests/src}/com/vaadin/automatedtests/util/RandomComponents.java (100%) rename {src => tests/src}/com/vaadin/automatedtests/util/StatusServlet.java (100%) rename {src => tests/src}/com/vaadin/tests/BasicRandomTest.java (100%) rename {src => tests/src}/com/vaadin/tests/CustomLayoutDemo.java (100%) rename {src => tests/src}/com/vaadin/tests/FocusingComponents.java (100%) rename {src => tests/src}/com/vaadin/tests/LayoutDemo.java (100%) rename {src => tests/src}/com/vaadin/tests/ListenerOrder.java (100%) rename {src => tests/src}/com/vaadin/tests/ModalWindow.java (100%) rename {src => tests/src}/com/vaadin/tests/NativeWindowing.java (100%) rename {src => tests/src}/com/vaadin/tests/OrderedLayoutSwapComponents.java (100%) rename {src => tests/src}/com/vaadin/tests/Parameters.java (100%) rename {src => tests/src}/com/vaadin/tests/PerformanceTestBasicComponentRendering.java (100%) rename {src => tests/src}/com/vaadin/tests/PerformanceTestLabelsAndOrderedLayouts.java (100%) rename {src => tests/src}/com/vaadin/tests/PerformanceTestSubTreeCaching.java (100%) rename {src => tests/src}/com/vaadin/tests/QueryContainerDemo.java (100%) rename {src => tests/src}/com/vaadin/tests/RandomLayoutStress.java (100%) rename {src => tests/src}/com/vaadin/tests/ScrollbarStressTest.java (100%) rename {src => tests/src}/com/vaadin/tests/StressComponentsInTable.java (100%) rename {src => tests/src}/com/vaadin/tests/TableChangingDatasource.java (100%) rename {src => tests/src}/com/vaadin/tests/TableSelectTest.java (100%) rename {src => tests/src}/com/vaadin/tests/TestBench.java (100%) rename {src => tests/src}/com/vaadin/tests/TestCaptionWrapper.java (100%) rename {src => tests/src}/com/vaadin/tests/TestComponentAddAndRecursion.java (100%) rename {src => tests/src}/com/vaadin/tests/TestComponentsAndLayouts.java (100%) rename {src => tests/src}/com/vaadin/tests/TestContainerChanges.java (100%) rename {src => tests/src}/com/vaadin/tests/TestDateField.java (100%) rename {src => tests/src}/com/vaadin/tests/TestForAlignments.java (100%) rename {src => tests/src}/com/vaadin/tests/TestForApplicationLayoutThatUsesWholeBrosersSpace.java (100%) rename {src => tests/src}/com/vaadin/tests/TestForBasicApplicationLayout.java (100%) rename {src => tests/src}/com/vaadin/tests/TestForChildComponentRendering.java (100%) rename {src => tests/src}/com/vaadin/tests/TestForContainerFilterable.java (100%) rename {src => tests/src}/com/vaadin/tests/TestForExpandLayout.java (100%) rename {src => tests/src}/com/vaadin/tests/TestForExpandLayout2.java (100%) rename {src => tests/src}/com/vaadin/tests/TestForExpandLayout3.java (100%) rename {src => tests/src}/com/vaadin/tests/TestForGridLayoutChildComponentRendering.java (100%) rename {src => tests/src}/com/vaadin/tests/TestForMultipleStyleNames.java (100%) rename {src => tests/src}/com/vaadin/tests/TestForNativeWindowing.java (100%) rename {src => tests/src}/com/vaadin/tests/TestForPreconfiguredComponents.java (100%) rename {src => tests/src}/com/vaadin/tests/TestForRichTextEditor.java (100%) rename {src => tests/src}/com/vaadin/tests/TestForStyledUpload.java (100%) rename {src => tests/src}/com/vaadin/tests/TestForTabSheet.java (100%) rename {src => tests/src}/com/vaadin/tests/TestForTablesInitialColumnWidthLogicRendering.java (100%) rename {src => tests/src}/com/vaadin/tests/TestForTrees.java (100%) rename {src => tests/src}/com/vaadin/tests/TestForUpload.java (100%) rename {src => tests/src}/com/vaadin/tests/TestForWindowOpen.java (100%) rename {src => tests/src}/com/vaadin/tests/TestForWindowing.java (100%) rename {src => tests/src}/com/vaadin/tests/TestIFrames.java (100%) rename {src => tests/src}/com/vaadin/tests/TestSelectAndDatefieldInDeepLayouts.java (100%) rename {src => tests/src}/com/vaadin/tests/TestSerialization.java (100%) rename {src => tests/src}/com/vaadin/tests/TestSetVisibleAndCaching.java (100%) rename {src => tests/src}/com/vaadin/tests/TestSizeableIncomponents.java (100%) rename {src => tests/src}/com/vaadin/tests/TestSplitPanel.java (100%) rename {src => tests/src}/com/vaadin/tests/TreeFilesystem.java (100%) rename {src => tests/src}/com/vaadin/tests/TreeFilesystemContainer.java (100%) rename {src => tests/src}/com/vaadin/tests/UpgradingSample.java (100%) rename {src => tests/src}/com/vaadin/tests/UsingCustomNewItemHandlerInSelect.java (100%) rename {src => tests/src}/com/vaadin/tests/UsingObjectsInSelect.java (100%) rename {src => tests/src}/com/vaadin/tests/appengine/GAESyncTest.java (100%) rename {src => tests/src}/com/vaadin/tests/appengine/img1.png (100%) rename {src => tests/src}/com/vaadin/tests/applicationservlet/NoMainWindow.java (100%) rename {src => tests/src}/com/vaadin/tests/applicationservlet/TestStaticFilesLocation.java (100%) rename {src => tests/src}/com/vaadin/tests/book/BookTestApplication.java (100%) rename {src => tests/src}/com/vaadin/tests/book/ChatApplication.java (100%) rename {src => tests/src}/com/vaadin/tests/book/DefaultButtonExample.java (100%) rename {src => tests/src}/com/vaadin/tests/book/EmbeddedButton.java (100%) rename {src => tests/src}/com/vaadin/tests/book/FormExample.java (100%) rename {src => tests/src}/com/vaadin/tests/book/FormExample2.java (100%) rename {src => tests/src}/com/vaadin/tests/book/MyDynamicResource.java (100%) rename {src => tests/src}/com/vaadin/tests/book/MyUploader.java (100%) rename {src => tests/src}/com/vaadin/tests/book/SSNField.java (100%) rename {src => tests/src}/com/vaadin/tests/book/SelectExample.java (100%) rename {src => tests/src}/com/vaadin/tests/book/TabSheetExample.java (100%) rename {src => tests/src}/com/vaadin/tests/book/TableCellStyle.java (100%) rename {src => tests/src}/com/vaadin/tests/book/TableEditable.java (100%) rename {src => tests/src}/com/vaadin/tests/book/TableEditableBean.java (100%) rename {src => tests/src}/com/vaadin/tests/book/TableExample.java (100%) rename {src => tests/src}/com/vaadin/tests/book/TableExample1.java (100%) rename {src => tests/src}/com/vaadin/tests/book/TableExample2.java (100%) rename {src => tests/src}/com/vaadin/tests/book/TableExample3.java (100%) rename {src => tests/src}/com/vaadin/tests/book/TableHuge.java (100%) rename {src => tests/src}/com/vaadin/tests/book/TheButton.java (100%) rename {src => tests/src}/com/vaadin/tests/book/TheButtons.java (100%) rename {src => tests/src}/com/vaadin/tests/book/TheButtons2.java (100%) rename {src => tests/src}/com/vaadin/tests/book/TheButtons3.java (100%) rename {src => tests/src}/com/vaadin/tests/book/WindowOpener.java (100%) rename {src => tests/src}/com/vaadin/tests/book/WindowTestApplication.java (100%) rename {src => tests/src}/com/vaadin/tests/book/images/Earth_small.png (100%) rename {src => tests/src}/com/vaadin/tests/book/images/Earth_symbol.png (100%) rename {src => tests/src}/com/vaadin/tests/book/images/Jupiter_symbol.png (100%) rename {src => tests/src}/com/vaadin/tests/book/images/Mars_symbol.png (100%) rename {src => tests/src}/com/vaadin/tests/book/images/Mercury_small.png (100%) rename {src => tests/src}/com/vaadin/tests/book/images/Mercury_symbol.png (100%) rename {src => tests/src}/com/vaadin/tests/book/images/Neptune_symbol.png (100%) rename {src => tests/src}/com/vaadin/tests/book/images/Saturn_symbol.png (100%) rename {src => tests/src}/com/vaadin/tests/book/images/Uranus_symbol.png (100%) rename {src => tests/src}/com/vaadin/tests/book/images/Venus_small.png (100%) rename {src => tests/src}/com/vaadin/tests/book/images/Venus_symbol.png (100%) rename {src => tests/src}/com/vaadin/tests/book/smiley.jpg (100%) rename {src => tests/src}/com/vaadin/tests/components/AbstractTestCase.java (100%) rename {src => tests/src}/com/vaadin/tests/components/CustomComponentwithUndefinedSize.java (100%) rename {src => tests/src}/com/vaadin/tests/components/HierarchicalContainerSorting.java (100%) rename {src => tests/src}/com/vaadin/tests/components/MultipleDebugIds.java (100%) rename {src => tests/src}/com/vaadin/tests/components/TestBase.java (100%) rename {src => tests/src}/com/vaadin/tests/components/absolutelayout/AbsoluteLayoutClipping.html (100%) rename {src => tests/src}/com/vaadin/tests/components/absolutelayout/AbsoluteLayoutClipping.java (100%) rename {src => tests/src}/com/vaadin/tests/components/abstractfield/AbstractFieldCommitWithInvalidValues.html (100%) rename {src => tests/src}/com/vaadin/tests/components/abstractfield/AbstractFieldCommitWithInvalidValues.java (100%) rename {src => tests/src}/com/vaadin/tests/components/accordion/AccordionInactiveTabSize.java (100%) rename {src => tests/src}/com/vaadin/tests/components/accordion/RemoveTabs.html (100%) rename {src => tests/src}/com/vaadin/tests/components/accordion/RemoveTabs.java (100%) rename {src => tests/src}/com/vaadin/tests/components/beanitemcontainer/BeanItemContainerGenerator.java (100%) rename {src => tests/src}/com/vaadin/tests/components/beanitemcontainer/BeanItemContainerNullValues.java (100%) rename {src => tests/src}/com/vaadin/tests/components/beanitemcontainer/TestBeanItemContainerUsage.html (100%) rename {src => tests/src}/com/vaadin/tests/components/beanitemcontainer/TestBeanItemContainerUsage.java (100%) rename {src => tests/src}/com/vaadin/tests/components/button/ButtonErrorMessage.java (100%) rename {src => tests/src}/com/vaadin/tests/components/button/ButtonUndefinedWidth.html (100%) rename {src => tests/src}/com/vaadin/tests/components/button/ButtonUndefinedWidth.java (100%) rename {src => tests/src}/com/vaadin/tests/components/button/DisabledButtons.html (100%) rename {src => tests/src}/com/vaadin/tests/components/button/DisabledButtons.java (100%) rename {src => tests/src}/com/vaadin/tests/components/button/IE7ButtonWithIcon.html (100%) rename {src => tests/src}/com/vaadin/tests/components/button/IE7ButtonWithIcon.java (100%) rename {src => tests/src}/com/vaadin/tests/components/button/TooltipForDisabledButton.java (100%) rename {src => tests/src}/com/vaadin/tests/components/caption/LargeCaptionIcon.html (100%) rename {src => tests/src}/com/vaadin/tests/components/caption/LargeCaptionIcon.java (100%) rename {src => tests/src}/com/vaadin/tests/components/checkbox/CheckboxCaptionWrapping.html (100%) rename {src => tests/src}/com/vaadin/tests/components/checkbox/CheckboxCaptionWrapping.java (100%) rename {src => tests/src}/com/vaadin/tests/components/checkbox/CheckboxIcon.java (100%) rename {src => tests/src}/com/vaadin/tests/components/combobox/ComboBoxInPopupView.java (100%) rename {src => tests/src}/com/vaadin/tests/components/combobox/ComboBoxItemIcon.html (100%) rename {src => tests/src}/com/vaadin/tests/components/combobox/ComboBoxItemIcon.java (100%) rename {src => tests/src}/com/vaadin/tests/components/combobox/ComboBoxLargeIcons.java (100%) rename {src => tests/src}/com/vaadin/tests/components/combobox/ComboBoxNavigation.html (100%) rename {src => tests/src}/com/vaadin/tests/components/combobox/ComboBoxNavigation.java (100%) rename {src => tests/src}/com/vaadin/tests/components/combobox/ComboBoxValueInput.html (100%) rename {src => tests/src}/com/vaadin/tests/components/combobox/ComboBoxValueInput.java (100%) rename {src => tests/src}/com/vaadin/tests/components/combobox/ComboBoxValueUpdate.java (100%) rename {src => tests/src}/com/vaadin/tests/components/combobox/ComboxBoxErrorMessage.java (100%) rename {src => tests/src}/com/vaadin/tests/components/combobox/fi.gif (100%) rename {src => tests/src}/com/vaadin/tests/components/combobox/se.gif (100%) rename {src => tests/src}/com/vaadin/tests/components/datefield/DateFieldReadOnly.html (100%) rename {src => tests/src}/com/vaadin/tests/components/datefield/DateFieldReadOnly.java (100%) rename {src => tests/src}/com/vaadin/tests/components/datefield/DisabledDateFieldWidth (100%) rename {src => tests/src}/com/vaadin/tests/components/datefield/DisabledDateFieldWidth.java (100%) rename {src => tests/src}/com/vaadin/tests/components/datefield/TestDatefieldYear.html (100%) rename {src => tests/src}/com/vaadin/tests/components/datefield/TestDatefieldYear.java (100%) rename {src => tests/src}/com/vaadin/tests/components/embedded/EmbeddedFlash.java (100%) rename {src => tests/src}/com/vaadin/tests/components/embedded/EmbeddedImageRefresh.java (100%) rename {src => tests/src}/com/vaadin/tests/components/embedded/EmbeddedTooltip.java (100%) rename {src => tests/src}/com/vaadin/tests/components/form/FormCommitWithInvalidValues.html (100%) rename {src => tests/src}/com/vaadin/tests/components/form/FormCommitWithInvalidValues.java (100%) rename {src => tests/src}/com/vaadin/tests/components/form/FormNotGettingSmaller.java (100%) rename {src => tests/src}/com/vaadin/tests/components/form/FormRenderingFlicker.java (100%) rename {src => tests/src}/com/vaadin/tests/components/label/HundredPercentWideLabelResize.html (100%) rename {src => tests/src}/com/vaadin/tests/components/label/HundredPercentWideLabelResize.java (100%) rename {src => tests/src}/com/vaadin/tests/components/label/LabelWrapping.html (100%) rename {src => tests/src}/com/vaadin/tests/components/label/LabelWrapping.java (100%) rename {src => tests/src}/com/vaadin/tests/components/link/LinkIcon.java (100%) rename {src => tests/src}/com/vaadin/tests/components/link/LinkTargetSize.java (100%) create mode 100644 tests/src/com/vaadin/tests/components/loginform/LoginFormTest.java rename {src => tests/src}/com/vaadin/tests/components/optiongroup/OptionGroupMultipleValueChange.java (100%) rename {src => tests/src}/com/vaadin/tests/components/orderedlayout/ReplaceComponentNPE.html (100%) rename {src => tests/src}/com/vaadin/tests/components/orderedlayout/ReplaceComponentNPE.java (100%) rename {src => tests/src}/com/vaadin/tests/components/panel/PanelShouldRemoveActionHandler.java (100%) rename {src => tests/src}/com/vaadin/tests/components/popupview/PopupViewLabelResized.java (100%) rename {src => tests/src}/com/vaadin/tests/components/popupview/PopupViewNullValues.java (100%) rename {src => tests/src}/com/vaadin/tests/components/popupview/PopupViewOffScreen.html (100%) rename {src => tests/src}/com/vaadin/tests/components/popupview/PopupViewOffScreen.java (100%) create mode 100644 tests/src/com/vaadin/tests/components/popupview/PopupViewWithRTE.java rename {src => tests/src}/com/vaadin/tests/components/richtextarea/RichTextAreaSize.html (100%) rename {src => tests/src}/com/vaadin/tests/components/richtextarea/RichTextAreaSize.java (100%) rename {src => tests/src}/com/vaadin/tests/components/select/NullSelectionItemId.java (60%) rename {src => tests/src}/com/vaadin/tests/components/splitpanel/SplitPanelExtraScrollbars.html (100%) rename {src => tests/src}/com/vaadin/tests/components/splitpanel/SplitPanelExtraScrollbars.java (100%) rename {src => tests/src}/com/vaadin/tests/components/splitpanel/SplitPanelSplitterWidth.java (100%) rename {src => tests/src}/com/vaadin/tests/components/splitpanel/SplitPanelWidthOnResize.java (100%) rename {src => tests/src}/com/vaadin/tests/components/table/ClippedComponentsInTable.html (100%) rename {src => tests/src}/com/vaadin/tests/components/table/ClippedComponentsInTable.java (100%) rename {src => tests/src}/com/vaadin/tests/components/table/ColumnCollapsingAndColumnExpansion.html (100%) rename {src => tests/src}/com/vaadin/tests/components/table/ColumnCollapsingAndColumnExpansion.java (100%) rename {src => tests/src}/com/vaadin/tests/components/table/ColumnExpandRatio.html (100%) rename {src => tests/src}/com/vaadin/tests/components/table/ColumnExpandRatio.java (100%) rename {src => tests/src}/com/vaadin/tests/components/table/ColumnExpandWithFixedColumns.html (100%) rename {src => tests/src}/com/vaadin/tests/components/table/ColumnExpandWithFixedColumns.java (100%) rename {src => tests/src}/com/vaadin/tests/components/table/ColumnGeneratorAddingOrder.java (100%) rename {src => tests/src}/com/vaadin/tests/components/table/ColumnWidths.java (100%) rename {src => tests/src}/com/vaadin/tests/components/table/ContainerSizeChange.html (100%) rename {src => tests/src}/com/vaadin/tests/components/table/ContainerSizeChange.java (100%) rename {src => tests/src}/com/vaadin/tests/components/table/LabelEmbeddedClickThroughForTable.html (100%) rename {src => tests/src}/com/vaadin/tests/components/table/LabelEmbeddedClickThroughForTable.java (100%) rename {src => tests/src}/com/vaadin/tests/components/table/MissingScrollbar.html (100%) rename {src => tests/src}/com/vaadin/tests/components/table/MissingScrollbar.java (100%) rename {src => tests/src}/com/vaadin/tests/components/table/ModifyContainerProperty.java (100%) rename {src => tests/src}/com/vaadin/tests/components/table/NotselectablePaintSelections.java (100%) rename {src => tests/src}/com/vaadin/tests/components/table/PropertyValueChange.html (100%) rename {src => tests/src}/com/vaadin/tests/components/table/PropertyValueChange.java (100%) rename {src => tests/src}/com/vaadin/tests/components/table/RowAdditionTest.java (100%) rename {src => tests/src}/com/vaadin/tests/components/table/TableItemIcon.java (100%) rename {src => tests/src}/com/vaadin/tests/components/table/TableLastRowMissing.html (100%) rename {src => tests/src}/com/vaadin/tests/components/table/TableLastRowMissing.java (100%) rename {src => tests/src}/com/vaadin/tests/components/table/TablePageLengthUpdate.html (100%) rename {src => tests/src}/com/vaadin/tests/components/table/TablePageLengthUpdate.java (100%) rename {src => tests/src}/com/vaadin/tests/components/table/TableRowHeight.html (100%) rename {src => tests/src}/com/vaadin/tests/components/table/TableRowHeight.java (100%) rename {src => tests/src}/com/vaadin/tests/components/table/TableRowHeight2.html (100%) rename {src => tests/src}/com/vaadin/tests/components/table/TableRowHeight2.java (100%) rename {src => tests/src}/com/vaadin/tests/components/table/TableRowHeight3.html (100%) rename {src => tests/src}/com/vaadin/tests/components/table/TableRowHeight3.java (100%) rename {src => tests/src}/com/vaadin/tests/components/table/TableVisibleColumnsUpdate.html (100%) rename {src => tests/src}/com/vaadin/tests/components/table/TableVisibleColumnsUpdate.java (100%) rename {src => tests/src}/com/vaadin/tests/components/table/TestCurrentPageFirstItem.java (100%) rename {src => tests/src}/com/vaadin/tests/components/table/TextFieldRelativeWidth.html (100%) rename {src => tests/src}/com/vaadin/tests/components/table/TextFieldRelativeWidth.java (100%) rename {src => tests/src}/com/vaadin/tests/components/table/fi.gif (100%) rename {src => tests/src}/com/vaadin/tests/components/table/se.gif (100%) rename {src => tests/src}/com/vaadin/tests/components/tabsheet/AddAndRemoveTabs.html (100%) rename {src => tests/src}/com/vaadin/tests/components/tabsheet/AddAndRemoveTabs.java (100%) rename {src => tests/src}/com/vaadin/tests/components/tabsheet/PreventTabChange.html (100%) rename {src => tests/src}/com/vaadin/tests/components/tabsheet/PreventTabChange.java (100%) rename {src => tests/src}/com/vaadin/tests/components/tabsheet/RemoveTabs.java (100%) rename {src => tests/src}/com/vaadin/tests/components/tabsheet/RemoveTabsTabsheet.html (100%) rename {src => tests/src}/com/vaadin/tests/components/tabsheet/TabSheetCaptions.html (100%) rename {src => tests/src}/com/vaadin/tests/components/tabsheet/TabSheetCaptions.java (100%) rename {src => tests/src}/com/vaadin/tests/components/tabsheet/TabSheetDisabling.html (100%) rename {src => tests/src}/com/vaadin/tests/components/tabsheet/TabSheetDisabling.java (100%) rename {src => tests/src}/com/vaadin/tests/components/tabsheet/TabSheetIcons.html (100%) rename {src => tests/src}/com/vaadin/tests/components/tabsheet/TabSheetIcons.java (100%) rename {src => tests/src}/com/vaadin/tests/components/tabsheet/TabSheetWithoutTabCaption.html (100%) rename {src => tests/src}/com/vaadin/tests/components/tabsheet/TabSheetWithoutTabCaption.java (100%) rename {src => tests/src}/com/vaadin/tests/components/tabsheet/TabsheetNPE.java (100%) rename {src => tests/src}/com/vaadin/tests/components/tabsheet/TabsheetScrolling.html (100%) rename {src => tests/src}/com/vaadin/tests/components/tabsheet/TabsheetScrolling.java (100%) rename {src => tests/src}/com/vaadin/tests/components/tabsheet/TabsheetTooltip.html (100%) rename {src => tests/src}/com/vaadin/tests/components/tabsheet/TabsheetTooltip.java (100%) rename {src => tests/src}/com/vaadin/tests/components/tabsheet/VerticalScrollbarPosition.html (100%) rename {src => tests/src}/com/vaadin/tests/components/tabsheet/VerticalScrollbarPosition.java (100%) rename {src => tests/src}/com/vaadin/tests/components/textfield/EnterShortcutMaySendInputPromptAsValue.java (100%) rename {src => tests/src}/com/vaadin/tests/components/textfield/IE6Cursor.java (100%) rename {src => tests/src}/com/vaadin/tests/components/textfield/TextFields.html (100%) rename {src => tests/src}/com/vaadin/tests/components/textfield/TextFields.java (100%) rename {src => tests/src}/com/vaadin/tests/components/tree/TreeNodeCaptionWrapping.html (100%) rename {src => tests/src}/com/vaadin/tests/components/tree/TreeNodeCaptionWrapping.java (100%) rename {src => tests/src}/com/vaadin/tests/components/window/CenteredWindowWithUndefinedSize.html (100%) rename {src => tests/src}/com/vaadin/tests/components/window/CenteredWindowWithUndefinedSize.java (100%) rename {src => tests/src}/com/vaadin/tests/components/window/EmbeddedInSubWindow.html (100%) rename {src => tests/src}/com/vaadin/tests/components/window/EmbeddedInSubWindow.java (100%) rename {src => tests/src}/com/vaadin/tests/components/window/FullSizedWindow.java (100%) rename {src => tests/src}/com/vaadin/tests/components/window/SubWindowOrder.java (100%) rename {src => tests/src}/com/vaadin/tests/components/window/SubwindowInvalidLayout.java (100%) rename {src => tests/src}/com/vaadin/tests/components/window/TestTooSmallSubwindowSize.html (100%) rename {src => tests/src}/com/vaadin/tests/components/window/TestTooSmallSubwindowSize.java (100%) rename {src => tests/src}/com/vaadin/tests/components/window/UndefinedWidthSubWindow.html (100%) rename {src => tests/src}/com/vaadin/tests/components/window/UndefinedWidthSubWindow.java (100%) rename {src => tests/src}/com/vaadin/tests/components/window/WindowResizeListener.java (100%) rename {src => tests/src}/com/vaadin/tests/components/window/WindowShouldRemoveActionHandler.html (100%) rename {src => tests/src}/com/vaadin/tests/components/window/WindowShouldRemoveActionHandler.java (100%) rename {src => tests/src}/com/vaadin/tests/components/window/WindowStyleNames.java (100%) rename {src => tests/src}/com/vaadin/tests/containers/BeanItemContainerFilteringTest.java (100%) rename {src => tests/src}/com/vaadin/tests/containers/BeanItemContainerTest.java (100%) rename {src => tests/src}/com/vaadin/tests/containers/IndexedContainerFilteringTest.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/Feature.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/FeatureBrowser.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/FeatureBuffering.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/FeatureButton.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/FeatureContainers.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/FeatureCustomLayout.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/FeatureDateField.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/FeatureEmbedded.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/FeatureForm.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/FeatureGridLayout.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/FeatureItems.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/FeatureLabel.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/FeatureLink.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/FeatureOrderedLayout.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/FeaturePanel.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/FeatureParameters.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/FeatureProperties.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/FeatureSelect.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/FeatureTabSheet.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/FeatureTable.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/FeatureTextField.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/FeatureTree.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/FeatureUpload.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/FeatureUtil.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/FeatureValidators.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/FeatureWindow.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/FeaturesApplication.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/IntroBasic.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/IntroComponents.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/IntroDataHandling.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/IntroDataModel.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/IntroItemContainers.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/IntroLayouts.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/IntroTerminal.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/IntroWelcome.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/PropertyPanel.java (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/components.png (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/icon_demo.png (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/icon_intro.png (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/itmill.gif (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/m-bullet-blue.gif (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/m.gif (100%) rename {src => tests/src}/com/vaadin/tests/featurebrowser/vaadin_spin.swf (100%) rename {src => tests/src}/com/vaadin/tests/layouts/AbsoluteLayoutAddRemove.java (100%) rename {src => tests/src}/com/vaadin/tests/layouts/DeepComponentTrees.java (100%) rename {src => tests/src}/com/vaadin/tests/layouts/FormLayoutWithInvisibleComponent.java (100%) rename {src => tests/src}/com/vaadin/tests/layouts/GridLayoutExpandRatioModification.java (100%) rename {src => tests/src}/com/vaadin/tests/layouts/GridLayoutInsidePanel.java (100%) rename {src => tests/src}/com/vaadin/tests/layouts/GridLayoutInsidePanel2.java (100%) rename {src => tests/src}/com/vaadin/tests/layouts/HiddenHorizontalLayout.java (100%) rename {src => tests/src}/com/vaadin/tests/layouts/OrderedLayoutBasics.java (100%) rename {src => tests/src}/com/vaadin/tests/layouts/OrderedLayoutCSSCompatibility.java (100%) rename {src => tests/src}/com/vaadin/tests/layouts/TestAbsoluteLayout.java (100%) rename {src => tests/src}/com/vaadin/tests/layouts/TestLayoutPerformance.java (100%) rename {src => tests/src}/com/vaadin/tests/layouts/VerticalLayoutExpandRatioModification.java (100%) rename {src => tests/src}/com/vaadin/tests/layouts/VerticalLayoutWithRelativeSizeComponents.java (100%) rename {src => tests/src}/com/vaadin/tests/m.gif (100%) rename {src => tests/src}/com/vaadin/tests/resources/ResourceDownload.java (100%) rename {src => tests/src}/com/vaadin/tests/robustness/Robustness.java (100%) rename {src => tests/src}/com/vaadin/tests/robustness/RobustnessSimple.java (100%) rename {src => tests/src}/com/vaadin/tests/themes/ButtonsTest.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1225.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1230.java (82%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket124.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1245.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1362Login.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1365.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1368.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1397.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1435.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1444.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1465ModalNotification.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1506.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1506_Panel.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1506_TestContainer.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1506_TestContainer2.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1519.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1572.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1581.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1589.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1598.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket161.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1632.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1659.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1663.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1673.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1710.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1737.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1767.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1772.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1775.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1804.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1805.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1806.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1811.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1819.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1834PanelScrolling.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1857.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1868.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1869.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1878.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1900.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1902.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1904.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1916.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1919.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1921.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1923.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1924ThemeChanging.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1925.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1934.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1939.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1940.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1953.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1966.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1966_2.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1966_3.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1969.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1970.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1972.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1973.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1973_2.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1975.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1982.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1983.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1986.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1991.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket1995.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket20.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2001.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2002.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2007.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2009.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2011.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2014.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2021.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2022.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2023.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2024.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2026.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2029.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2032.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2033.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2037.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2038.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2040.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2042.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2043.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2048.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2051.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2053.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2060.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2061.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2061b.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2061c.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2062.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2083.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2090.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2095.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2098.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2099.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2101.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2103.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2104.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2106.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2107.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2117.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2119.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2125.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2126.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2151.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2157.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2178.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2179.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2180.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2181.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2186.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2204.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2208.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2209.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2209OL.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2209OL2.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2215.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2221.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2222.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2227OrderedlayoutInTable.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2231.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2232.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2234.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2235.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2240.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2242.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2244.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2245.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2267.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2271.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2279.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2282.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2283.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2287.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2289.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2292.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2294.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2296.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2297.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2303.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2304.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2310.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2319.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2323.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2325.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2329.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2337.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2339.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2341.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2344.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2347.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2364.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2365.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2398.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2404.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2405.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2406.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2407.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2411.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2415.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2420.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2425.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2426.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2431.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2432.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2434.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2436.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2440.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2526.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2742.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2901.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket2998.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket3146.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket34.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket677.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket695.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket736.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket846.java (100%) rename {src => tests/src}/com/vaadin/tests/tickets/Ticket932.java (100%) rename {src => tests/src}/com/vaadin/tests/util/LogPrintWriter.java (100%) rename {src => tests/src}/com/vaadin/tests/util/LoremIpsum.java (100%) rename {src => tests/src}/com/vaadin/tests/util/RandomComponents.java (100%) rename {src => tests/src}/com/vaadin/tests/util/TestClickListener.java (100%) rename {src => tests/src}/com/vaadin/tests/vaadin_spin.swf (100%) rename {src => tests/src}/com/vaadin/tests/validation/RequiredErrorMessage.java (100%) rename {src => tests/src}/com/vaadin/tests/validation/RequiredIndicatorForReadOnly.java (100%) rename {src => tests/src}/com/vaadin/tests/validation/TestValidators.java (100%) diff --git a/src/com/vaadin/demo/Calc.java b/src/com/vaadin/demo/Calc.java deleted file mode 100644 index d2a0d3e25a..0000000000 --- a/src/com/vaadin/demo/Calc.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.vaadin.demo; - -import com.vaadin.ui.Button; -import com.vaadin.ui.GridLayout; -import com.vaadin.ui.Label; -import com.vaadin.ui.Window; - -// Calculator is created by extending Application-class. Application is -// deployed by adding ApplicationServlet to web.xml and this class as -// "application" parameter to the servlet. -@SuppressWarnings("serial") -public class Calc extends com.vaadin.Application { - - // Calculation data model is automatically stored in the user session - private double current = 0.0; - private double stored = 0.0; - private char lastOperationRequested = 'C'; - - // User interface components - private final Label display = new Label("0.0"); - private final GridLayout layout = new GridLayout(4, 5); - - // Application initialization creates UI and connects it to business logic - @Override - public void init() { - - // Place the layout to the browser main window - setMainWindow(new Window("Calculator Application", layout)); - - // Create and add the components to the layout - layout.addComponent(display, 0, 0, 3, 0); - for (String caption : new String[] { "7", "8", "9", "/", "4", "5", "6", - "*", "1", "2", "3", "-", "0", "=", "C", "+" }) { - Button button = new Button(caption, new Button.ClickListener() { - public void buttonClick(Button.ClickEvent event) { - - // On button click, calculate and show the result - display.setValue(calculate(event.getButton())); - } - }); - layout.addComponent(button); - } - } - - // Calculator "business logic" implemented here to keep the example minimal - private double calculate(Button buttonClicked) { - char requestedOperation = buttonClicked.getCaption().charAt(0); - if ('0' <= requestedOperation && requestedOperation <= '9') { - current = current * 10 - + Double.parseDouble("" + requestedOperation); - return current; - } - switch (lastOperationRequested) { - case '+': - stored += current; - break; - case '-': - stored -= current; - break; - case '/': - stored /= current; - break; - case '*': - stored *= current; - break; - case 'C': - stored = current; - break; - } - lastOperationRequested = requestedOperation; - current = 0.0; - if (requestedOperation == 'C') { - stored = 0.0; - } - return stored; - } -} diff --git a/src/com/vaadin/demo/HelloWorld.java b/src/com/vaadin/demo/HelloWorld.java deleted file mode 100644 index 4a1042709d..0000000000 --- a/src/com/vaadin/demo/HelloWorld.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.vaadin.demo; - -import com.vaadin.ui.Label; -import com.vaadin.ui.Window; - -@SuppressWarnings("serial") -public class HelloWorld extends com.vaadin.Application { - - /** - * Init is invoked on application load (when a user accesses the application - * for the first time). - */ - @Override - public void init() { - - // Main window is the primary browser window - final Window main = new Window("Hello window"); - setMainWindow(main); - - // "Hello world" text is added to window as a Label component - main.addComponent(new Label("Hello World!")); - } -} diff --git a/src/com/vaadin/demo/PortletDemo.java b/src/com/vaadin/demo/PortletDemo.java deleted file mode 100644 index 6e3c3d6756..0000000000 --- a/src/com/vaadin/demo/PortletDemo.java +++ /dev/null @@ -1,155 +0,0 @@ -/** - * - */ -package com.vaadin.demo; - -import java.util.Iterator; -import java.util.Map; - -import javax.portlet.ActionRequest; -import javax.portlet.ActionResponse; -import javax.portlet.PortletMode; -import javax.portlet.PortletRequest; -import javax.portlet.PortletURL; -import javax.portlet.RenderRequest; -import javax.portlet.RenderResponse; -import javax.portlet.WindowState; - -import com.vaadin.Application; -import com.vaadin.terminal.ExternalResource; -import com.vaadin.terminal.gwt.server.PortletApplicationContext; -import com.vaadin.terminal.gwt.server.PortletApplicationContext.PortletListener; -import com.vaadin.ui.Label; -import com.vaadin.ui.Link; -import com.vaadin.ui.TextField; -import com.vaadin.ui.Window; -import com.vaadin.ui.Window.Notification; - -/** - * @author marc - * - */ -@SuppressWarnings("serial") -public class PortletDemo extends Application { - - Window main = new Window(); - TextField tf = new TextField("Some value"); - Label userInfo = new Label(); - Link portletEdit = new Link(); - Link portletMax = new Link(); - Link someAction = null; - - @Override - public void init() { - main = new Window(); - setMainWindow(main); - - userInfo.setCaption("User info"); - userInfo.setContentMode(Label.CONTENT_PREFORMATTED); - main.addComponent(userInfo); - - tf.setEnabled(false); - tf.setImmediate(true); - main.addComponent(tf); - - portletEdit.setEnabled(false); - main.addComponent(portletEdit); - portletMax.setEnabled(false); - main.addComponent(portletMax); - - if (getContext() instanceof PortletApplicationContext) { - PortletApplicationContext ctx = (PortletApplicationContext) getContext(); - ctx.addPortletListener(this, new DemoPortletListener()); - } else { - getMainWindow().showNotification("Not inited via Portal!", - Notification.TYPE_ERROR_MESSAGE); - } - - } - - private class DemoPortletListener implements PortletListener { - - public void handleActionRequest(ActionRequest request, - ActionResponse response) { - - main.addComponent(new Label("Action received")); - - } - - @SuppressWarnings("unchecked") - public void handleRenderRequest(RenderRequest request, - RenderResponse response) { - // Portlet up-and-running, enable stuff - portletEdit.setEnabled(true); - portletMax.setEnabled(true); - - // Editable if we're in editmode - tf.setEnabled((request.getPortletMode() == PortletMode.EDIT)); - - // Show notification about current mode and state - getMainWindow().showNotification( - "Portlet status", - "Mode: " + request.getPortletMode() + " State: " - + request.getWindowState(), - Notification.TYPE_WARNING_MESSAGE); - - // Display current user info - Map uinfo = (Map) request.getAttribute(PortletRequest.USER_INFO); - if (uinfo != null) { - String s = ""; - for (Iterator it = uinfo.keySet().iterator(); it.hasNext();) { - Object key = it.next(); - Object val = uinfo.get(key); - s += key + ": " + val + "\n"; - } - if (request.isUserInRole("administrator")) { - s += "(administrator)"; - } - userInfo.setValue(s); - } else { - userInfo.setValue("-"); - } - - // Create Edit/Done link (actionUrl) - PortletURL url = response.createActionURL(); - try { - url - .setPortletMode((request.getPortletMode() == PortletMode.VIEW ? PortletMode.EDIT - : PortletMode.VIEW)); - portletEdit.setResource(new ExternalResource(url.toString())); - portletEdit - .setCaption((request.getPortletMode() == PortletMode.VIEW ? "Edit" - : "Done")); - } catch (Exception e) { - portletEdit.setEnabled(false); - } - // Create Maximize/Normal link (actionUrl) - url = response.createActionURL(); - try { - url - .setWindowState((request.getWindowState() == WindowState.NORMAL ? WindowState.MAXIMIZED - : WindowState.NORMAL)); - portletMax.setResource(new ExternalResource(url.toString())); - portletMax - .setCaption((request.getWindowState() == WindowState.NORMAL ? "Maximize" - : "Back to normal")); - } catch (Exception e) { - portletMax.setEnabled(false); - } - - if (someAction == null) { - url = response.createActionURL(); - try { - someAction = new Link("An action", new ExternalResource(url - .toString())); - main.addComponent(someAction); - } catch (Exception e) { - // Oops - System.err.println("Could not create someAction: " + e); - } - - } - - } - } -} diff --git a/src/com/vaadin/demo/SimpleAddressBook.java b/src/com/vaadin/demo/SimpleAddressBook.java deleted file mode 100644 index 22f9c171ed..0000000000 --- a/src/com/vaadin/demo/SimpleAddressBook.java +++ /dev/null @@ -1,143 +0,0 @@ -package com.vaadin.demo; - -import com.vaadin.Application; -import com.vaadin.data.Property; -import com.vaadin.data.Property.ValueChangeEvent; -import com.vaadin.data.util.IndexedContainer; -import com.vaadin.ui.Button; -import com.vaadin.ui.Form; -import com.vaadin.ui.HorizontalLayout; -import com.vaadin.ui.SplitPanel; -import com.vaadin.ui.Table; -import com.vaadin.ui.TextField; -import com.vaadin.ui.VerticalLayout; -import com.vaadin.ui.Window; -import com.vaadin.ui.Button.ClickEvent; - -@SuppressWarnings("serial") -public class SimpleAddressBook extends Application { - - private static String[] fields = { "First Name", "Last Name", "Company", - "Mobile Phone", "Work Phone", "Home Phone", "Work Email", - "Home Email", "Street", "Zip", "City", "State", "Country" }; - private static String[] visibleCols = new String[] { "Last Name", - "First Name", "Company" }; - - private Table contactList = new Table(); - private Form contactEditor = new Form(); - private HorizontalLayout bottomLeftCorner = new HorizontalLayout(); - private Button contactRemovalButton; - private IndexedContainer addressBookData = createDummyData(); - - @Override - public void init() { - initLayout(); - initContactAddRemoveButtons(); - initAddressList(); - initFilteringControls(); - } - - private void initLayout() { - SplitPanel splitPanel = new SplitPanel( - SplitPanel.ORIENTATION_HORIZONTAL); - setMainWindow(new Window("Address Book", splitPanel)); - VerticalLayout left = new VerticalLayout(); - left.setSizeFull(); - left.addComponent(contactList); - contactList.setSizeFull(); - left.setExpandRatio(contactList, 1); - splitPanel.addComponent(left); - splitPanel.addComponent(contactEditor); - contactEditor.setSizeFull(); - contactEditor.getLayout().setMargin(true); - contactEditor.setImmediate(true); - bottomLeftCorner.setWidth("100%"); - left.addComponent(bottomLeftCorner); - } - - private void initContactAddRemoveButtons() { - // New item button - bottomLeftCorner.addComponent(new Button("+", - new Button.ClickListener() { - public void buttonClick(ClickEvent event) { - Object id = contactList.addItem(); - contactList.setValue(id); - } - })); - - // Remove item button - contactRemovalButton = new Button("-", new Button.ClickListener() { - public void buttonClick(ClickEvent event) { - contactList.removeItem(contactList.getValue()); - contactList.select(null); - } - }); - contactRemovalButton.setVisible(false); - bottomLeftCorner.addComponent(contactRemovalButton); - } - - private String[] initAddressList() { - contactList.setContainerDataSource(addressBookData); - contactList.setVisibleColumns(visibleCols); - contactList.setSelectable(true); - contactList.setImmediate(true); - contactList.addListener(new Property.ValueChangeListener() { - public void valueChange(ValueChangeEvent event) { - Object id = contactList.getValue(); - contactEditor.setItemDataSource(id == null ? null : contactList - .getItem(id)); - contactRemovalButton.setVisible(id != null); - } - }); - return visibleCols; - } - - private void initFilteringControls() { - for (final String pn : visibleCols) { - final TextField sf = new TextField(); - bottomLeftCorner.addComponent(sf); - sf.setWidth("100%"); - sf.setValue(pn); - sf.setImmediate(true); - bottomLeftCorner.setExpandRatio(sf, 1); - sf.addListener(new Property.ValueChangeListener() { - public void valueChange(ValueChangeEvent event) { - addressBookData.removeContainerFilters(pn); - if (sf.toString().length() > 0 && !pn.equals(sf.toString())) { - addressBookData.addContainerFilter(pn, sf.toString(), - true, false); - } - getMainWindow().showNotification( - "" + addressBookData.size() + " matches found"); - } - }); - } - } - - private static IndexedContainer createDummyData() { - - String[] fnames = { "Peter", "Alice", "Joshua", "Mike", "Olivia", - "Nina", "Alex", "Rita", "Dan", "Umberto", "Henrik", "Rene", - "Lisa", "Marge" }; - String[] lnames = { "Smith", "Gordon", "Simpson", "Brown", "Clavel", - "Simons", "Verne", "Scott", "Allison", "Gates", "Rowling", - "Barks", "Ross", "Schneider", "Tate" }; - - IndexedContainer ic = new IndexedContainer(); - - for (String p : fields) { - ic.addContainerProperty(p, String.class, ""); - } - - for (int i = 0; i < 1000; i++) { - Object id = ic.addItem(); - ic.getContainerProperty(id, "First Name").setValue( - fnames[(int) (fnames.length * Math.random())]); - ic.getContainerProperty(id, "Last Name").setValue( - lnames[(int) (lnames.length * Math.random())]); - } - - return ic; - } - -} diff --git a/src/com/vaadin/demo/VaadinTunesLayout.java b/src/com/vaadin/demo/VaadinTunesLayout.java deleted file mode 100644 index e9066d8993..0000000000 --- a/src/com/vaadin/demo/VaadinTunesLayout.java +++ /dev/null @@ -1,334 +0,0 @@ -package com.vaadin.demo; - -import com.vaadin.Application; -import com.vaadin.terminal.ThemeResource; -import com.vaadin.ui.Button; -import com.vaadin.ui.ComboBox; -import com.vaadin.ui.Embedded; -import com.vaadin.ui.HorizontalLayout; -import com.vaadin.ui.Label; -import com.vaadin.ui.NativeButton; -import com.vaadin.ui.NativeSelect; -import com.vaadin.ui.Slider; -import com.vaadin.ui.SplitPanel; -import com.vaadin.ui.Table; -import com.vaadin.ui.VerticalLayout; -import com.vaadin.ui.Window; -import com.vaadin.ui.Window.Notification; - -/** - * Sample application layout, similar (almost identical) to Apple iTunes. - * - * @author IT Mill Ltd. - * - */ -@SuppressWarnings("serial") -public class VaadinTunesLayout extends Application { - - @Override - public void init() { - - /* - * We'll build the whole UI here, since the application will not contain - * any logic. Otherwise it would be more practical to separate parts of - * the UI into different classes and methods. - */ - - // Main (browser) window, needed in all Vaadin applications - VerticalLayout rootLayout = new VerticalLayout(); - final Window root = new Window("VaadinTunes", rootLayout); - - /* - * We'll attach the window to the browser view already here, so we won't - * forget it later. - */ - setMainWindow(root); - - root - .showNotification( - "This is an example of how you can do layouts in Vaadin.
It is not a working sound player.", - Notification.TYPE_HUMANIZED_MESSAGE); - - // Our root window contains one VerticalLayout, let's make - // sure it's 100% sized, and remove unwanted margins - rootLayout.setSizeFull(); - rootLayout.setMargin(false); - - // Top area, containing playback and volume controls, play status, view - // modes and search - HorizontalLayout top = new HorizontalLayout(); - top.setWidth("100%"); - top.setMargin(false, true, false, true); // Enable horizontal margins - top.setSpacing(true); - - // Let's attach that one straight away too - root.addComponent(top); - - // Create the placeholders for all the components in the top area - HorizontalLayout playback = new HorizontalLayout(); - HorizontalLayout volume = new HorizontalLayout(); - HorizontalLayout status = new HorizontalLayout(); - HorizontalLayout viewmodes = new HorizontalLayout(); - ComboBox search = new ComboBox(); - - // Add the components and align them properly - top.addComponent(playback); - top.addComponent(volume); - top.addComponent(status); - top.addComponent(viewmodes); - top.addComponent(search); - top.setComponentAlignment(playback, "middle"); - top.setComponentAlignment(volume, "middle"); - top.setComponentAlignment(status, "middle center"); - top.setComponentAlignment(viewmodes, "middle"); - top.setComponentAlignment(search, "middle"); - - /* - * We want our status area to expand if the user resizes the root - * window, and we want it to accommodate as much space as there is - * available. All other components in the top layout should stay fixed - * sized, so we don't need to specify any expand ratios for them (they - * will automatically revert to zero after the following line). - */ - top.setExpandRatio(status, 1.0F); - - // Playback controls - Button prev = new NativeButton("Previous"); - Button play = new NativeButton("Play/pause"); - Button next = new NativeButton("Next"); - playback.addComponent(prev); - playback.addComponent(play); - playback.addComponent(next); - // Set spacing between the buttons - playback.setSpacing(true); - - // Volume controls - Button mute = new NativeButton("mute"); - Slider vol = new Slider(); - vol.setOrientation(Slider.ORIENTATION_HORIZONTAL); - vol.setWidth("100px"); - Button max = new NativeButton("max"); - volume.addComponent(mute); - volume.addComponent(vol); - volume.addComponent(max); - - // Status area - status.setWidth("80%"); - status.setSpacing(true); - - Button toggleVisualization = new NativeButton("Mode"); - Label timeFromStart = new Label("0:00"); - - // We'll need another layout to show currently playing track and - // progress - VerticalLayout trackDetails = new VerticalLayout(); - trackDetails.setWidth("100%"); - Label track = new Label("Track Name"); - Label album = new Label("Album Name - Artist"); - track.setWidth(null); - album.setWidth(null); - Slider progress = new Slider(); - progress.setOrientation(Slider.ORIENTATION_HORIZONTAL); - progress.setWidth("100%"); - trackDetails.addComponent(track); - trackDetails.addComponent(album); - trackDetails.addComponent(progress); - trackDetails.setComponentAlignment(track, "center"); - trackDetails.setComponentAlignment(album, "center"); - - Label timeToEnd = new Label("-4:46"); - Button jumpToTrack = new NativeButton("Show"); - - // Place all components to the status layout and align them properly - status.addComponent(toggleVisualization); - status.setComponentAlignment(toggleVisualization, "middle"); - status.addComponent(timeFromStart); - status.setComponentAlignment(timeFromStart, "bottom"); - status.addComponent(trackDetails); - status.addComponent(timeToEnd); - status.setComponentAlignment(timeToEnd, "bottom"); - status.addComponent(jumpToTrack); - status.setComponentAlignment(jumpToTrack, "middle"); - - // Then remember to specify the expand ratio - status.setExpandRatio(trackDetails, 1.0F); - - // View mode buttons - Button viewAsTable = new NativeButton("Table"); - Button viewAsGrid = new NativeButton("Grid"); - Button coverflow = new NativeButton("Coverflow"); - viewmodes.addComponent(viewAsTable); - viewmodes.addComponent(viewAsGrid); - viewmodes.addComponent(coverflow); - - /* - * That covers the top bar. Now let's move on to the sidebar and track - * listing - */ - - // We'll need one splitpanel to separate the sidebar and track listing - SplitPanel bottom = new SplitPanel(SplitPanel.ORIENTATION_HORIZONTAL); - root.addComponent(bottom); - - // The splitpanel is by default 100% x 100%, but we'll need to adjust - // our main window layout to accomodate the height - ((VerticalLayout) root.getContent()).setExpandRatio(bottom, 1.0F); - - // Give the sidebar less space than the listing - bottom.setSplitPosition(200, SplitPanel.UNITS_PIXELS); - - // Let's add some content to the sidebar - // First, we need a layout to but all components in - VerticalLayout sidebar = new VerticalLayout(); - sidebar.setSizeFull(); - bottom.setFirstComponent(sidebar); - - /* - * Then we need some labels and buttons, and an album cover image The - * labels and buttons go into their own vertical layout, since we want - * the 'sidebar' layout to be expanding (cover image in the bottom). - * VerticalLayout is by default 100% wide. - */ - VerticalLayout selections = new VerticalLayout(); - Label library = new Label("Library"); - Button music = new NativeButton("Music"); - music.setWidth("100%"); - - Label store = new Label("Store"); - Button vaadinTunesStore = new NativeButton("VaadinTunes Store"); - vaadinTunesStore.setWidth("100%"); - Button purchased = new NativeButton("Purchased"); - purchased.setWidth("100%"); - - Label playlists = new Label("Playlists"); - Button genius = new NativeButton("Geniues"); - genius.setWidth("100%"); - Button recent = new NativeButton("Recently Added"); - recent.setWidth("100%"); - - // Lets add them to the 'selections' layout - selections.addComponent(library); - selections.addComponent(music); - selections.addComponent(store); - selections.addComponent(vaadinTunesStore); - selections.addComponent(purchased); - selections.addComponent(playlists); - selections.addComponent(genius); - selections.addComponent(recent); - - // Then add the selections to the sidebar, and set it expanding - sidebar.addComponent(selections); - sidebar.setExpandRatio(selections, 1.0F); - - // Then comes the cover artwork (we'll add the actual image in the - // themeing section) - Embedded cover = new Embedded("Currently Playing"); - sidebar.addComponent(cover); - - /* - * And lastly, we need the track listing table It should fill the whole - * left side of our bottom layout - */ - Table listing = new Table(); - listing.setSizeFull(); - listing.setSelectable(true); - bottom.setSecondComponent(listing); - - // Add the table headers - listing.addContainerProperty("Name", String.class, ""); - listing.addContainerProperty("Time", String.class, "0:00"); - listing.addContainerProperty("Artist", String.class, ""); - listing.addContainerProperty("Album", String.class, ""); - listing.addContainerProperty("Genre", String.class, ""); - listing.addContainerProperty("Rating", NativeSelect.class, - new NativeSelect()); - - // Lets populate the table with random data - String[] tracks = new String[] { "Red Flag", "Millstone", - "Not The Sun", "Breath", "Here We Are", "Deep Heaven", - "Her Voice Resides", "Natural Tan", "End It All", "Kings", - "Daylight Slaving", "Mad Man", "Resolve", "Teargas", - "African Air", "Passing Bird" }; - String[] times = new String[] { "4:12", "6:03", "5:43", "4:32", "3:42", - "4:45", "2:56", "9:34", "2:10", "3:44", "5:49", "6:30", "5:18", - "7:42", "3:13", "2:52" }; - String[] artists = new String[] { "Billy Talent", "Brand New", - "Breaking Benjamin", "Becoming The Archetype", - "Bullet For My Valentine", "Chasing Victory", "Chimaira", - "Danko Jones", "Deadlock", "Deftones", "From Autumn To Ashes", - "Haste The Day", "Four Year Strong", "In Flames", "Kemopetrol", - "John Legend" }; - String[] albums = new String[] { "Once Again", "The Caitiff Choir", - "The Devil And God", "Light Grenades", "Dicthonomy", - "Back In Black", "Dreamer", "Come Clarity", "Year Zero", - "Frames", "Fortress", "Phobia", "The Poison", "Manifesto", - "White Pony", "The Big Dirty" }; - String[] genres = new String[] { "Rock", "Metal", "Hardcore", "Indie", - "Pop", "Alternative", "Blues", "Jazz", "Hip Hop", - "Electronica", "Punk", "Hard Rock", "Dance", "R'n'B", "Gospel", - "Country" }; - for (int i = 0; i < 1000; i++) { - NativeSelect s = new NativeSelect(); - s.addItem("1 star"); - s.addItem("2 stars"); - s.addItem("3 stars"); - s.addItem("4 stars"); - s.addItem("5 stars"); - s.select(i % 5 + " stars"); - final int index = i % 16; - listing.addItem(new Object[] { tracks[index], times[index], - artists[index], albums[index], genres[index], s }, i); - } - - // We'll align the track time column to right as well - listing.setColumnAlignment("Time", Table.ALIGN_RIGHT); - - // TODO the footer - - // Now what's left to do? Themeing of course. - setTheme("vaadintunes"); - - /* - * Let's give a namespace to our application window. This way, if - * someone uses the same theme for different applications, we don't get - * unwanted style conflicts. - */ - root.setStyleName("tTunes"); - - top.setStyleName("top"); - top.setHeight("75px"); // Same as the background image height - - playback.setStyleName("playback"); - playback.setMargin(false, true, false, false); // Add right-side margin - play.setStyleName("play"); - next.setStyleName("next"); - prev.setStyleName("prev"); - playback.setComponentAlignment(prev, "middle"); - playback.setComponentAlignment(next, "middle"); - - volume.setStyleName("volume"); - mute.setStyleName("mute"); - max.setStyleName("max"); - vol.setWidth("78px"); - - status.setStyleName("status"); - status.setMargin(true); - status.setHeight("46px"); // Height of the background image - - toggleVisualization.setStyleName("toggle-vis"); - jumpToTrack.setStyleName("jump"); - - viewAsTable.setStyleName("viewmode-table"); - viewAsGrid.setStyleName("viewmode-grid"); - coverflow.setStyleName("viewmode-coverflow"); - - sidebar.setStyleName("sidebar"); - - music.setStyleName("selected"); - - cover.setSource(new ThemeResource("images/album-cover.jpg")); - // Because this is an image, it will retain it's aspect ratio - cover.setWidth("100%"); - } - -} diff --git a/src/com/vaadin/demo/colorpicker/ColorPicker.java b/src/com/vaadin/demo/colorpicker/ColorPicker.java deleted file mode 100644 index f423815060..0000000000 --- a/src/com/vaadin/demo/colorpicker/ColorPicker.java +++ /dev/null @@ -1,66 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.colorpicker; - -import java.util.Map; - -import com.vaadin.demo.colorpicker.gwt.client.ui.VColorPicker; -import com.vaadin.terminal.PaintException; -import com.vaadin.terminal.PaintTarget; -import com.vaadin.ui.AbstractField; -import com.vaadin.ui.ClientWidget; - -@SuppressWarnings("serial") -@ClientWidget(VColorPicker.class) -public class ColorPicker extends AbstractField { - - public ColorPicker() { - super(); - setValue(new String("white")); - } - - /** The property value of the field is a String. */ - @Override - public Class getType() { - return String.class; - } - - /** Set the currently selected color. */ - public void setColor(String newcolor) { - // Sets the color name as the property of the component. - // Setting the property will automatically cause repainting of - // the component with paintContent(). - setValue(newcolor); - } - - /** Retrieve the currently selected color. */ - public String getColor() { - return (String) getValue(); - } - - /** Paint (serialize) the component for the client. */ - @Override - public void paintContent(PaintTarget target) throws PaintException { - // Superclass writes any common attributes in the paint target. - super.paintContent(target); - - // Add the currently selected color as a variable in the paint - // target. - target.addVariable(this, "colorname", getColor()); - } - - /** Deserialize changes received from client. */ - @SuppressWarnings("unchecked") - @Override - public void changeVariables(Object source, Map variables) { - // Sets the currently selected color - if (variables.containsKey("colorname") && !isReadOnly()) { - final String newValue = (String) variables.get("colorname"); - // Changing the property of the component will - // trigger a ValueChangeEvent - setValue(newValue, true); - } - } -} diff --git a/src/com/vaadin/demo/colorpicker/ColorPickerApplication.java b/src/com/vaadin/demo/colorpicker/ColorPickerApplication.java deleted file mode 100644 index f604702a24..0000000000 --- a/src/com/vaadin/demo/colorpicker/ColorPickerApplication.java +++ /dev/null @@ -1,56 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.colorpicker; - -import com.vaadin.data.Property.ValueChangeEvent; -import com.vaadin.data.Property.ValueChangeListener; -import com.vaadin.ui.Button; -import com.vaadin.ui.Label; -import com.vaadin.ui.Window; -import com.vaadin.ui.Button.ClickEvent; - -/** - * Demonstration application that shows how to use a simple custom client-side - * GWT component, the ColorPicker. - */ -@SuppressWarnings("serial") -public class ColorPickerApplication extends com.vaadin.Application { - Window main = new Window("Color Picker Demo"); - - /* The custom component. */ - ColorPicker colorselector = new ColorPicker(); - - /* Another component. */ - Label colorname; - - @Override - public void init() { - setMainWindow(main); - - // Listen for value change events in the custom component, - // triggered when user clicks a button to select another color. - colorselector.addListener(new ValueChangeListener() { - public void valueChange(ValueChangeEvent event) { - // Provide some server-side feedback - colorname.setValue("Selected color: " - + colorselector.getColor()); - } - }); - main.addComponent(colorselector); - - // Add another component to give feedback from server-side code - colorname = new Label("Selected color: " + colorselector.getColor()); - main.addComponent(colorname); - - // Server-side manipulation of the component state - final Button button = new Button("Set to white"); - button.addListener(new Button.ClickListener() { - public void buttonClick(ClickEvent event) { - colorselector.setColor("white"); - } - }); - main.addComponent(button); - } -} diff --git a/src/com/vaadin/demo/colorpicker/gwt/ColorPickerWidgetSet.gwt.xml b/src/com/vaadin/demo/colorpicker/gwt/ColorPickerWidgetSet.gwt.xml deleted file mode 100644 index 27ddc1d60f..0000000000 --- a/src/com/vaadin/demo/colorpicker/gwt/ColorPickerWidgetSet.gwt.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/src/com/vaadin/demo/colorpicker/gwt/client/ui/GwtColorPicker.java b/src/com/vaadin/demo/colorpicker/gwt/client/ui/GwtColorPicker.java deleted file mode 100644 index 83c74d4fe4..0000000000 --- a/src/com/vaadin/demo/colorpicker/gwt/client/ui/GwtColorPicker.java +++ /dev/null @@ -1,105 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.colorpicker.gwt.client.ui; - -import com.google.gwt.user.client.DOM; -import com.google.gwt.user.client.Element; -import com.google.gwt.user.client.ui.Button; -import com.google.gwt.user.client.ui.ClickListener; -import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.Grid; -import com.google.gwt.user.client.ui.HorizontalPanel; -import com.google.gwt.user.client.ui.Label; -import com.google.gwt.user.client.ui.Widget; - -/** - * A regular GWT component without integration with Vaadin. - */ -@SuppressWarnings("deprecation") -public class GwtColorPicker extends Composite implements ClickListener { - - /** Currently selected color name to give client-side feedback to the user. */ - protected Label currentcolor = new Label(); - - public GwtColorPicker() { - // Create a 4x4 grid of buttons with names for 16 colors - final Grid grid = new Grid(4, 4); - final String[] colors = new String[] { "aqua", "black", "blue", - "fuchsia", "gray", "green", "lime", "maroon", "navy", "olive", - "purple", "red", "silver", "teal", "white", "yellow" }; - int colornum = 0; - for (int i = 0; i < 4; i++) { - for (int j = 0; j < 4; j++, colornum++) { - // Create a button for each color - final Button button = new Button(colors[colornum]); - button.addClickListener(this); - - // Put the button in the Grid layout - grid.setWidget(i, j, button); - - // Set the button background colors. - DOM.setStyleAttribute(button.getElement(), "background", - colors[colornum]); - - // For dark colors, the button label must be in white. - if ("black navy maroon blue purple".indexOf(colors[colornum]) != -1) { - DOM - .setStyleAttribute(button.getElement(), "color", - "white"); - } - } - } - - // Create a panel with the color grid and currently selected color - // indicator - final HorizontalPanel panel = new HorizontalPanel(); - panel.add(grid); - panel.add(currentcolor); - - // Set the class of the color selection feedback box to allow CSS - // styling. - // We need to obtain the DOM element for the current color label. - // This assumes that the element of the HorizontalPanel is - // the parent of the label element. Notice that the element has no - // parent - // before the widget has been added to the horizontal panel. - final Element panelcell = DOM.getParent(currentcolor.getElement()); - DOM.setElementProperty(panelcell, "className", - "colorpicker-currentcolorbox"); - - // Set initial color. This will be overridden with the value read from - // server. - setColor("white"); - - // Composite GWT widgets must call initWidget(). - initWidget(panel); - } - - /** Handles click on a color button. */ - public void onClick(Widget sender) { - // Use the button label as the color name to set - setColor(((Button) sender).getText()); - } - - /** Sets the currently selected color. */ - public void setColor(String newcolor) { - // Give client-side feedback by changing the color name in the label - currentcolor.setText(newcolor); - - // Obtain the DOM elements. This assumes that the element - // of the HorizontalPanel is the parent of the label element. - final Element nameelement = currentcolor.getElement(); - final Element cell = DOM.getParent(nameelement); - - // Give feedback by changing the background color - DOM.setStyleAttribute(cell, "background", newcolor); - DOM.setStyleAttribute(nameelement, "background", newcolor); - if ("black navy maroon blue purple".indexOf(newcolor) != -1) { - DOM.setStyleAttribute(nameelement, "color", "white"); - } else { - DOM.setStyleAttribute(nameelement, "color", "black"); - } - } -} diff --git a/src/com/vaadin/demo/colorpicker/gwt/client/ui/VColorPicker.java b/src/com/vaadin/demo/colorpicker/gwt/client/ui/VColorPicker.java deleted file mode 100644 index e225dbe268..0000000000 --- a/src/com/vaadin/demo/colorpicker/gwt/client/ui/VColorPicker.java +++ /dev/null @@ -1,82 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.colorpicker.gwt.client.ui; - -import com.vaadin.terminal.gwt.client.ApplicationConnection; -import com.vaadin.terminal.gwt.client.Paintable; -import com.vaadin.terminal.gwt.client.UIDL; - -public class VColorPicker extends GwtColorPicker implements Paintable { - - /** Set the CSS class name to allow styling. */ - public static final String CLASSNAME = "example-colorpicker"; - - /** Component identifier in UIDL communications. */ - String uidlId; - - /** Reference to the server connection object. */ - ApplicationConnection client; - - /** - * The constructor should first call super() to initialize the component and - * then handle any initialization relevant to Vaadin. - */ - public VColorPicker() { - // The superclass has a lot of relevant initialization - super(); - - // This method call of the Paintable interface sets the component - // style name in DOM tree - setStyleName(CLASSNAME); - } - - /** - * This method must be implemented to update the client-side component from - * UIDL data received from server. - * - * This method is called when the page is loaded for the first time, and - * every time UI changes in the component are received from the server. - */ - public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { - // This call should be made first. Ensure correct implementation, - // and let the containing layout manage caption, etc. - if (client.updateComponent(this, uidl, true)) { - return; - } - - // Save reference to server connection object to be able to send - // user interaction later - this.client = client; - - // Save the UIDL identifier for the component - uidlId = uidl.getId(); - - // Get value received from server and actualize it in the GWT component - setColor(uidl.getStringVariable("colorname")); - } - - /** Override the method to communicate the new value to server. */ - @Override - public void setColor(String newcolor) { - // Ignore if no change - if (newcolor.equals(currentcolor.getText())) { - return; - } - - // Let the original implementation to do whatever it needs to do - super.setColor(newcolor); - - // Updating the state to the server can not be done before - // the server connection is known, i.e., before updateFromUIDL() - // has been called. - if (uidlId == null || client == null) { - return; - } - - // Communicate the user interaction parameters to server. This call will - // initiate an AJAX request to the server. - client.updateVariable(uidlId, "colorname", newcolor, true); - } -} diff --git a/src/com/vaadin/demo/colorpicker/gwt/public/colorpicker/styles.css b/src/com/vaadin/demo/colorpicker/gwt/public/colorpicker/styles.css deleted file mode 100644 index 4c3455ae53..0000000000 --- a/src/com/vaadin/demo/colorpicker/gwt/public/colorpicker/styles.css +++ /dev/null @@ -1,26 +0,0 @@ -/* Set style for the color picker table. - This assumes that the Grid layout is rendered as a HTML .*/ -table.example-colorpicker { - border-collapse: collapse; - border: 0px; -} - -/* Set color picker button style. - This does not make assumptions about the HTML element tree as it only uses - the logical class names.*/ -.example-colorpicker .gwt-Button { - height: 60px; - width: 60px; - border: none; - padding: 0px; -} - -/* Set style for the right-hand box that shows the currently selected color. - While this may work for other implementations of the HorizontalPanel as well, - it somewhat assumes that the layout is rendered as a table where cells - are
elements. */ -.colorpicker-currentcolorbox { - width: 240px; - text-align: center; - vertical-align: middle !important; -} diff --git a/src/com/vaadin/demo/coverflow/Coverflow.java b/src/com/vaadin/demo/coverflow/Coverflow.java deleted file mode 100644 index 6d274ca054..0000000000 --- a/src/com/vaadin/demo/coverflow/Coverflow.java +++ /dev/null @@ -1,108 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.coverflow; - -import com.vaadin.demo.coverflow.gwt.client.ui.VCoverflow; -import com.vaadin.terminal.PaintException; -import com.vaadin.terminal.PaintTarget; -import com.vaadin.ui.AbstractSelect; -import com.vaadin.ui.ClientWidget; - -@SuppressWarnings( { "serial", "unchecked" }) -@ClientWidget(VCoverflow.class) -public class Coverflow extends AbstractSelect { - - private String backgroundGradientStart = "FFFFFF"; - private String backgroundGradientEnd = "EEEEEE"; - private boolean scrollbarVisibility = true; - - /** - * Paints the uidl - * - * @param PaintTarget - * target - * @throws PaintException - */ - @Override - public void paintContent(PaintTarget target) throws PaintException { - // Superclass writes any common attributes in the paint target. - super.paintContent(target); - - target.addAttribute("backgroundGradientStart", backgroundGradientStart); - target.addAttribute("backgroundGradientEnd", backgroundGradientEnd); - target.addAttribute("scrollbarVisibility", scrollbarVisibility); - } - - /** - * The user can specify a background gradient for the coverflow. The input - * values are RGB values for the start and end gradients. - * - * @param int startR - * @param int startG - * @param int startB - * @param int endR - * @param int endG - * @param int endB - */ - public void setBackgroundColor(int startR, int startG, int startB, - int endR, int endG, int endB) { - backgroundGradientStart = ""; - backgroundGradientEnd = ""; - - // Convert all integers to hexadecimal format and make sure they are two - // characters long (in other words, add a zero in front if the value is - // less than 16 => 0x0F) - if (startR < 16) { - backgroundGradientStart += "0"; - } - backgroundGradientStart += Integer.toHexString(Math.max(Math.min( - startR, 255), 0)); - - if (startG < 16) { - backgroundGradientStart += "0"; - } - backgroundGradientStart += Integer.toHexString(Math.max(Math.min( - startG, 255), 0)); - - if (startB < 16) { - backgroundGradientStart += "0"; - } - backgroundGradientStart += Integer.toHexString(Math.max(Math.min( - startB, 255), 0)); - - if (endR < 16) { - backgroundGradientEnd += "0"; - } - backgroundGradientEnd += Integer.toHexString(Math.max(Math.min(endR, - 255), 0)); - - if (endG < 16) { - backgroundGradientEnd += "0"; - } - backgroundGradientEnd += Integer.toHexString(Math.max(Math.min(endG, - 255), 0)); - - if (endB < 16) { - backgroundGradientEnd += "0"; - } - backgroundGradientEnd += Integer.toHexString(Math.max(Math.min(endB, - 255), 0)); - - requestRepaint(); - } - - /** - * The user can toggle the visibility of the scrollbar - * - * @param boolean visible - */ - public void setScrollbarVisibility(boolean visible) { - if (scrollbarVisibility != visible) { - scrollbarVisibility = visible; - requestRepaint(); - } - } - -} diff --git a/src/com/vaadin/demo/coverflow/CoverflowApplication.html b/src/com/vaadin/demo/coverflow/CoverflowApplication.html deleted file mode 100644 index 1149357aa5..0000000000 --- a/src/com/vaadin/demo/coverflow/CoverflowApplication.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - - - - - -
- - - - - - -
- -package com.vaadin.demo.coverflow;
-
-import java.io.BufferedReader;
-import java.io.FileInputStream;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.io.StringReader;
-import java.net.URL;
-import java.nio.CharBuffer;
-
-import com.vaadin.data.Property;
-import com.vaadin.terminal.Resource;
-import com.vaadin.terminal.Sizeable;
-import com.vaadin.terminal.ThemeResource;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Embedded;
-import com.vaadin.ui.ExpandLayout;
-import com.vaadin.ui.Label;
-import com.vaadin.ui.Window;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Layout.AlignmentHandler;
-
-public class CoverflowApplication extends com.vaadin.Application {
-
-  Coverflow covers = new Coverflow();
-
-  public void init() {
-
-    setMainWindow(new Window("Coverflow", createMainLayout()));
-
-    setTheme("black");
-
-    addSlidesToCoverflow();
-  }
-
-  private ExpandLayout createMainLayout() {
-
-    // Initialize coverflow component
-    covers.setHeight(150);
-    covers.setWidth(100, Sizeable.UNITS_PERCENTAGE);
-    covers.setBackgroundColor(000100100100);
-
-    // Initialize visible slide viewer
-    final Embedded visibleSlide = new Embedded();
-    visibleSlide.setHeight(100, Sizeable.UNITS_PERCENTAGE);
-
-    // Listen to coverflow changes as change slides when needed
-    covers.addListener(new Property.ValueChangeListener() {
-      public void valueChange(Property.ValueChangeEvent event) {
-        visibleSlide.setSource((Resourcecovers.getValue());
-      }
-    });
-
-    // Show sources button
-    Button showSrc = new Button("src"new Button.ClickListener() {
-      public void buttonClick(ClickEvent event) {
-        Window srcWindow = new Window("Source code");
-        srcWindow.setWidth(700);
-        srcWindow.setHeight(500);
-        Label l = new Label(getSourceCodeForThisClass(),
-            Label.CONTENT_XHTML);
-        srcWindow.addComponent(l);
-        getMainWindow().addWindow(srcWindow);
-      }
-    });
-
-    // Initialize main layout
-    ExpandLayout layout = new ExpandLayout(
-        ExpandLayout.ORIENTATION_VERTICAL);
-    layout.addComponent(showSrc);
-    layout.setComponentAlignment(showSrc, AlignmentHandler.ALIGNMENT_RIGHT,
-        AlignmentHandler.ALIGNMENT_TOP);
-    layout.addComponent(visibleSlide);
-    layout.setComponentAlignment(visibleSlide,
-        AlignmentHandler.ALIGNMENT_HORIZONTAL_CENTER,
-        AlignmentHandler.ALIGNMENT_TOP);
-    layout.addComponent(covers);
-    layout.setComponentAlignment(covers,
-        AlignmentHandler.ALIGNMENT_HORIZONTAL_CENTER,
-        AlignmentHandler.ALIGNMENT_TOP);
-    layout.expand(visibleSlide);
-    layout.setSizeFull();
-
-    return layout;
-  }
-
-  private String getSourceCodeForThisClass() {
-    String code = "Could not find source-file";
-    try {
-      InputStream is = this.getClass().getResource(
-          "CoverflowApplication.html").openStream();
-      BufferedReader r = new BufferedReader(new InputStreamReader(is));
-      StringBuffer buf = new StringBuffer();
-      String line;
-      while ((line = r.readLine()) != null) {
-        buf.append(line);
-      }
-      code = buf.toString();
-    catch (IOException ignored) {
-    }
-    return code;
-  }
-
-  private void addSlidesToCoverflow() {
-    for (int i = 1; i <= 22; i++) {
-      String head = "../../../IMAGES/";
-      String tail = "slideshow-example.0" ((i < 10"0" ""+ i
-          ".jpg";
-      ThemeResource slide = new ThemeResource(head + tail);
-      covers.addItem(slide);
-      covers.setItemIcon(slide,
-          new ThemeResource(head + "thumbs/" + tail));
-    }
-  }
-}
- -
-
- - - - - \ No newline at end of file diff --git a/src/com/vaadin/demo/coverflow/CoverflowApplication.java b/src/com/vaadin/demo/coverflow/CoverflowApplication.java deleted file mode 100644 index 850737f544..0000000000 --- a/src/com/vaadin/demo/coverflow/CoverflowApplication.java +++ /dev/null @@ -1,116 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.coverflow; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; - -import com.vaadin.data.Property; -import com.vaadin.terminal.Resource; -import com.vaadin.terminal.ThemeResource; -import com.vaadin.ui.Alignment; -import com.vaadin.ui.Button; -import com.vaadin.ui.Embedded; -import com.vaadin.ui.Label; -import com.vaadin.ui.Panel; -import com.vaadin.ui.VerticalLayout; -import com.vaadin.ui.Window; -import com.vaadin.ui.Button.ClickEvent; - -@SuppressWarnings("serial") -public class CoverflowApplication extends com.vaadin.Application { - - Coverflow covers = new Coverflow(); - - @Override - public void init() { - - setMainWindow(new Window("Coverflow", createMainLayout())); - - setTheme("coverflow"); - - addSlidesToCoverflow(); - } - - private VerticalLayout createMainLayout() { - - // Initialize coverflow component - covers.setHeight("150px"); - covers.setWidth("100%"); - covers.setBackgroundColor(0, 0, 0, 100, 100, 100); - - // Initialize visible slide viewer - Panel slidePanel = new Panel(); - slidePanel.setStyleName(Panel.STYLE_LIGHT); - slidePanel.setSizeFull(); - final Embedded visibleSlide = new Embedded(); - visibleSlide.setHeight("480px"); - slidePanel.addComponent(visibleSlide); - ((VerticalLayout) slidePanel.getContent()).setComponentAlignment( - visibleSlide, "center"); - - // Listen to coverflow changes as change slides when needed - covers.addListener(new Property.ValueChangeListener() { - public void valueChange(Property.ValueChangeEvent event) { - visibleSlide.setSource((Resource) covers.getValue()); - } - }); - - // Show sources button - Button showSrc = new Button("Show source", new Button.ClickListener() { - public void buttonClick(ClickEvent event) { - Window srcWindow = new Window("Source code"); - srcWindow.setWidth("700px"); - srcWindow.setHeight("500px"); - Label l = new Label(getSourceCodeForThisClass(), - Label.CONTENT_XHTML); - srcWindow.addComponent(l); - getMainWindow().addWindow(srcWindow); - } - }); - showSrc.setStyleName(Button.STYLE_LINK); - // Initialize main layout - VerticalLayout layout = new VerticalLayout(); - layout.addComponent(showSrc); - layout.setComponentAlignment(showSrc, Alignment.TOP_RIGHT); - layout.addComponent(slidePanel); - layout.addComponent(covers); - layout.setExpandRatio(slidePanel, 1); - layout.setSizeFull(); - - return layout; - } - - private String getSourceCodeForThisClass() { - String code = "Could not find source-file"; - try { - InputStream is = this.getClass().getResource( - "CoverflowApplication.html").openStream(); - BufferedReader r = new BufferedReader(new InputStreamReader(is)); - StringBuffer buf = new StringBuffer(); - String line; - while ((line = r.readLine()) != null) { - buf.append(line); - } - code = buf.toString(); - } catch (IOException ignored) { - } - return code; - } - - private void addSlidesToCoverflow() { - for (int i = 0; i < 20; i++) { - String head = "images/"; - String tail = "slideshow-example.0" + ((i < 10) ? "0" : "") + i - + ".jpg"; - ThemeResource slide = new ThemeResource(head + tail); - covers.addItem(slide); - covers.setItemIcon(slide, - new ThemeResource(head + "thumbs/" + tail)); - } - } -} diff --git a/src/com/vaadin/demo/coverflow/gwt/CoverflowWidgetSet.gwt.xml b/src/com/vaadin/demo/coverflow/gwt/CoverflowWidgetSet.gwt.xml deleted file mode 100644 index 21e8f26236..0000000000 --- a/src/com/vaadin/demo/coverflow/gwt/CoverflowWidgetSet.gwt.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/com/vaadin/demo/coverflow/gwt/client/ui/VCoverflow.java b/src/com/vaadin/demo/coverflow/gwt/client/ui/VCoverflow.java deleted file mode 100644 index fb54a1445c..0000000000 --- a/src/com/vaadin/demo/coverflow/gwt/client/ui/VCoverflow.java +++ /dev/null @@ -1,334 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.coverflow.gwt.client.ui; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.HTML; -import com.vaadin.terminal.gwt.client.ApplicationConnection; -import com.vaadin.terminal.gwt.client.Paintable; -import com.vaadin.terminal.gwt.client.UIDL; - -public class VCoverflow extends Composite implements Paintable { - private String uidlId; - protected ApplicationConnection client; - private ArrayList> coverList = new ArrayList>(); - - private Object _selected; - private boolean flashInited = false; - private HTML flash; - private boolean scrollbarVisibility = true; - private String backgroundGradientStart; - private String backgroundGradientEnd; - private boolean colorChanged = false; - private boolean sbVisibilityChanged = false; - private HashMap keyMap = new HashMap(); - - /** - * Constructor - */ - public VCoverflow() { - flash = new HTML(); - - initWidget(flash); - } - - /** - * This method accepts parses the uidl sent by the server - * - * @param UIDL - * uidl - * @param ApplicationConnection - * client - */ - public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { - // Store variables - uidlId = uidl.getId(); - this.client = client; - String tempColor; - - if (client.updateComponent(this, uidl, true)) { - return; - } - - // Has the scrollbar's visibility status changed? - if (uidl.hasAttribute("scrollbarVisibility")) { - boolean tempVis = uidl.getBooleanAttribute("scrollbarVisibility"); - if (scrollbarVisibility != tempVis) { - scrollbarVisibility = tempVis; - sbVisibilityChanged = true; - } - } - - // Has the start gradient changed? - if (uidl.hasAttribute("backgroundGradientStart")) { - tempColor = uidl.getStringAttribute("backgroundGradientStart") - .toString(); - if (tempColor != backgroundGradientStart) { - backgroundGradientStart = tempColor; - colorChanged = true; - } - } - - // Has the end gradient changed? - if (uidl.hasAttribute("backgroundGradientEnd")) { - tempColor = uidl.getStringAttribute("backgroundGradientEnd") - .toString(); - if (tempColor != backgroundGradientEnd) { - backgroundGradientEnd = tempColor; - colorChanged = true; - } - } - - final UIDL images = uidl.getChildUIDL(0); - - // Check which covers should be removed. This array list contains all - // current - // covers. We remove from this list all covers which are sent with the - // repainted - // uidl. All remaining covers in this list should be "old" ones and are - // should - // be deleted. - - ArrayList> newList = new ArrayList>(); - - // Iterate through all option elements - for (final Iterator i = images.getChildIterator(); i.hasNext();) { - final UIDL imgUidl = (UIDL) i.next(); - - // Make sure all required attributes exist - if (imgUidl.hasAttribute("caption") && imgUidl.hasAttribute("key") - && imgUidl.hasAttribute("icon")) { - HashMap set = new HashMap(); - - // Update the key map - keyMap.put(imgUidl.getStringAttribute("caption"), imgUidl - .getStringAttribute("key")); - - // Get information - - set.put("icon", client.translateVaadinUri(imgUidl - .getStringAttribute("icon"))); - set.put("caption", imgUidl.getStringAttribute("caption")); - - newList.add(set); - - // Is the current cover selected? - if (imgUidl.hasAttribute("selected")) { - _selected = imgUidl.getStringAttribute("caption"); - } - } - } - - // Deleted items - ArrayList> intersectList = new ArrayList>(); - intersectList.addAll(coverList); - intersectList.removeAll(newList); - - if (flashInited) { - for (int i = 0; i < intersectList.size(); i++) { - HashMap cover = intersectList.get(i); - removeCover(uidlId, cover.get("caption")); - } - } - - // Added items - intersectList = new ArrayList>(); - intersectList.addAll(newList); - intersectList.removeAll(coverList); - - if (flashInited) { - for (int i = 0; i < intersectList.size(); i++) { - HashMap cover = intersectList.get(i); - addCover(uidlId, cover.get("caption"), cover.get("icon")); - } - } - - coverList = newList; - - // Has the flash been initialized? - if (!flashInited) { - colorChanged = false; - setFlash(); - initializeMethods(uidlId); - } - - // Inform flash of the selected cover - if (_selected != null && flashInited) { - selectCover(uidlId, _selected.toString()); - } - - if (colorChanged && flashInited) { - setBackgroundColor(uidlId, backgroundGradientStart, - backgroundGradientEnd); - colorChanged = false; - } - - if (sbVisibilityChanged && flashInited) { - toggleScrollbarVisibility(uidlId, scrollbarVisibility); - sbVisibilityChanged = false; - } - - } - - /** - * Inform the server which cover is selected - * - * @param String - * coverKey - */ - public void setCover(String coverId) { - if (uidlId == null || client == null) { - return; - } - - client.updateVariable(uidlId, "selected", new String[] { keyMap - .get(coverId) }, true); - } - - /** - * Initialize the native javascript functions needed for the flash <-> GWT - * communication - * - * @param String - * id - */ - public native void initializeMethods(String id) /*-{ - var app = this; - - if($wnd.vaadin.coverflow == null) - var coverflow = []; - else - var coverflow = $wnd.vaadin.coverflow; - - coverflow['getCovers_' + id] = function() { - app.@com.vaadin.demo.coverflow.gwt.client.ui.VCoverflow::getCovers()(); - }; - - coverflow['setCurrent_' + id] = function(selected) { - app.@com.vaadin.demo.coverflow.gwt.client.ui.VCoverflow::setCover(Ljava/lang/String;)(selected); - }; - - $wnd.vaadin.coverflow = coverflow; - }-*/; - - /** - * This function sends all covers to the flash. We cannot do this directly - * in the updateFromUIDL method, because we cannot be sure if the flash has - * been loaded into the browser. The flash will call for this method when - * it's ready. - */ - public void getCovers() { - // Loop through all stored covers - for (int i = 0; i < coverList.size(); i++) { - HashMap set = coverList.get(i); - - try { - // Add the cover - addCover(uidlId, set.get("caption"), set.get("icon")); - } catch (Exception e) { - // Do not add covers lacking obligatory data - } - } - // The flash calls for this method, therefore we can be sure that the - // flash has been loaded - // into the browser. - flashInited = true; - - // Set selected cover - if (_selected != null) { - selectCover(uidlId, _selected.toString()); - } - } - - /** - * This function is a native javascript function which adds covers to the - * actual flash. This method works as a bridge between GWT and flash. - * - * @param id - * @param key - * @param caption - * @param icon - */ - public native void addCover(String id, String caption, String icon) /*-{ - try { - $doc['fxcoverflow' + id].addCover(caption.toString(), icon.toString()); - } - catch(e) { - $wnd.alert(e.message); - } - - }-*/; - - /** - * This function tells the flash which cover should be selected. - * - * @param id - * @param key - */ - public native void selectCover(String id, String key) /*-{ - $doc["fxcoverflow" + id].selectCover(key.toString()); - }-*/; - - public native void setBackgroundColor(String id, String startGradient, - String endGradient) /*-{ - $doc["fxcoverflow" + id].setBackgroundColor("0x" + startGradient.toString(), "0x" + endGradient.toString()); - }-*/; - - public native void toggleScrollbarVisibility(String id, boolean visibility) /*-{ - $doc["fxcoverflow" + id].toggleScrollbarVisibility(visibility); - }-*/; - - public native void removeCover(String id, String key) /*-{ - $doc["fxcoverflow" + id].removeCover(key); - }-*/; - - /** - * Set the HTML coding of the flash movie. This isn't done until the - * updateFromUIDL method is called for the first time. The reason is that we - * use an id from the UIDL to uniquely identify all instances of this - * widget. - */ - private void setFlash() { - String html = "" - + "" - + "" - + "" - + "" - + "" + ""; - flash.setHTML(html); - } -} \ No newline at end of file diff --git a/src/com/vaadin/demo/coverflow/gwt/flex/Cover.as b/src/com/vaadin/demo/coverflow/gwt/flex/Cover.as deleted file mode 100644 index 61b08ead48..0000000000 --- a/src/com/vaadin/demo/coverflow/gwt/flex/Cover.as +++ /dev/null @@ -1,392 +0,0 @@ -package { - import flash.events.Event; - import flash.display.Loader; - import flash.display.DisplayObject; - import flash.system.LoaderContext; - import flash.display.Bitmap; - import flash.display.BitmapData; - import flash.net.URLRequest; - import mx.controls.Alert; - - import flash.system.Security; - import flash.system.ApplicationDomain; - - import mx.controls.Image; - import mx.core.UIComponent; - import flash.geom.Matrix; - import flash.display.Sprite; - import flash.display.Shape; - import flash.display.Graphics; - import flash.display.GradientType; - import flash.geom.Rectangle; - import flash.geom.Point; - - import sandy.util.*; - - public class Cover extends UIComponent { - // Cover information - private var _caption:String; - private var _uri:String; - private var _imageLoaded:Boolean = false; - - // Actual content information - private var _bitmapData:BitmapData; - private var _bitmap:Bitmap; - private var _img:Image; - private var _distortedShape:Shape; - private var _reflectionBitmap:Bitmap; - private var _reflectionShape:Shape; - - - // Distort information - private var _realAngle:Number = -1; - private var _realScale:Number = -1; - private var _angle:Number = 0; - private var _scale:Number = 1; - private static const perspectiveConstant:Number = .15; - - - // Position information - private var _x:int; - private var _y:int; - - /** - * Constructor - */ - public function Cover(caption:String, uri:String) { - super(); - - // Set this element's size to 100% x 100% - super.percentHeight = 100; - super.percentWidth = 100; - - // Store input data - this._caption = caption; - this._uri = uri; - - // Initialize default image - this._img = new Image(); - this._img.percentHeight = 100; - this._img.percentWidth = 100; - this._bitmapData = new BitmapData(100,100,false, 0xffff0000); - - _distortedShape = new Shape(); - addChild(_distortedShape); - - _reflectionShape = new Shape(); - addChild(_reflectionShape); - - // Create the default image - this._img.source = this.getBitmap(); - - addChildAt(_img, 0); - } - - /** - * Load an image if it hasn't been loaded yet - */ - public function loadImage():void { - if(!_imageLoaded) { - // Create a loader to load the image - var request:URLRequest = new URLRequest(this._uri); - var imageLoader:Loader = new Loader(); - - // Check for restrictions - var imgLdrContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain); - imgLdrContext.checkPolicyFile = true; - - // Set an event listener - imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, imgLoaded); - - // Load the image - imageLoader.load(request, imgLdrContext); - } - } - - /** - * Event handler for image load completion - * @param Event event - */ - private function imgLoaded(event:Event):void { - // Check if we got the image - try { - removeChild(_img); - this._bitmapData = Bitmap(event.currentTarget.content).bitmapData; - - // Set new source for the image - this._img.source = this.getBitmap(); - addChildAt(_img, 0); - - _imageLoaded = true; - invalidateDisplayList(); - } - catch(error:Error) { - // An error occured - Alert.show(error.toString()); - } - } - - /** - * Measure the size of the image - */ - override protected function measure():void { - if(_img != null) - { - measuredHeight = _img.getExplicitOrMeasuredHeight(); - measuredWidth = _img.getExplicitOrMeasuredWidth(); - } - } - - /** - * Update the image on the display - */ - override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void { - // Do this if and only iff the angle or the scale has changed. Otherwise we do not - // want to re-draw the image, only move it. - if(_img && (_realAngle != _angle || _realScale != _scale)) - { - var contentWidth:Number = _img.getExplicitOrMeasuredWidth(); - var contentHeight:Number= _img.getExplicitOrMeasuredHeight(); - - _img.setActualSize(contentWidth,contentHeight); - - _realAngle = _angle; - _realScale = _scale; - - // Distort the image - distortImage(_bitmap, _distortedShape, false); - - // Create a reflection - createReflectionBitmap(_bitmap); - } - } - - /** - * This function distorts the target according to its angle - * @param Bitmap bm - The bitmap of the object which is being distorted - * @param Shape target - The target where the distorted image is stored - * @param Boolean refelection - Is this target a reflection? - */ - private function distortImage(bm:Bitmap, target:Shape, reflection:Boolean):void { - // Turn the angle into a value between 0 and 1 - var k:Number = (Math.abs(_angle)/90); - k = Math.sqrt(k); - - var vShear:Number = (_angle >= 0)? k*-perspectiveConstant : k*perspectiveConstant; - var verticalOffset:Number; - - // How much is the width of the image scaled - var hScale:Number = 1 - k; - - // How much lower/higher are the corners "further away" than the one "closer" - verticalOffset = (_img.getExplicitOrMeasuredHeight()*vShear); - - // Is this image a reflection? If yes, then the vertical offset distortion is made in another direction - if(reflection) - verticalOffset *= -1; - - // Initialize the distortion class - var distort:DistortImage = new DistortImage(); - distort.container = target; - distort.target = bm; - distort.smooth = true; - distort.initialize( 5, 5, null ); - - // Distort the images to the left - if(_angle > 0) { - distort.setTransform( - 0,0, - _img.getExplicitOrMeasuredWidth()*hScale,-verticalOffset, - _img.getExplicitOrMeasuredWidth()*hScale,_img.getExplicitOrMeasuredHeight()+verticalOffset, - 0,_img.getExplicitOrMeasuredHeight() - ); - } - // Distort the images to the right - else if(_angle < 0) { - distort.setTransform( - 0,verticalOffset, - _img.getExplicitOrMeasuredWidth()*hScale,0, - _img.getExplicitOrMeasuredWidth()*hScale,_img.getExplicitOrMeasuredHeight(), - 0,_img.getExplicitOrMeasuredHeight()-verticalOffset - ); - } - distort.render(); - - // We use the original image as a reference, but do not want to show it on the screen - _img.visible = false; - - // Align the distorted image correctly - var m:Matrix = target.transform.matrix; - m.tx = 0 - _img.width/2* hScale; - target.transform.matrix = m; - } - - /** - * This function creates a reflection of the target object - * @param DisplayObject target - */ - private function createReflectionBitmap(target:DisplayObject):void { - // Size of the fade - var fadeSize:Number = 0.4; - - // Create a rectangle - var box:Rectangle = new Rectangle(0, 0, target.width, target.height); - - // Create a matrix for the gradient - var gradientMatrix: Matrix = new Matrix(); - // Create a shape object for the gradient - var gradientShape: Shape = new Shape(); - // Apply a gradient on the matrix - gradientMatrix.createGradientBox(target.width, target.height * fadeSize, Math.PI/2, 0, target.height * (1.0 - fadeSize)); - - // Fill the shape with the gradient - gradientShape.graphics.beginGradientFill(GradientType.LINEAR, [0xFFFFFF, 0xFFFFFF], [0, 1], [0, 255], gradientMatrix); - gradientShape.graphics.drawRect(0, target.height * (1.0 - fadeSize), target.width, target.height * fadeSize); - gradientShape.graphics.endFill(); - - // Bitmap representation of the gradient - var gradientBm:BitmapData = new BitmapData(target.width, target.height, true, 0x00000000); - gradientBm.draw(gradientShape, new Matrix()); - - var targetBm:BitmapData = new BitmapData(target.width, target.height, true, 0x00000000); - targetBm.fillRect(box, 0x00000000); - targetBm.draw(target, new Matrix()); - - var reflectionData:BitmapData = new BitmapData(target.width, target.height, true, 0x00000000); - reflectionData.fillRect(box, 0x00000000); - reflectionData.copyPixels(targetBm, box, new Point(), gradientBm); - - // Store the reflection - _reflectionBitmap = new Bitmap(reflectionData); - - // Move the reflection to its correct position - var m:Matrix = _distortedShape.transform.matrix; - m.d = -1; - m.ty = _distortedShape.height*2; - _reflectionShape.transform.matrix = m; - - // Distort the reflection - distortImage(_reflectionBitmap, _reflectionShape, true); - - // Set a transparancy for the reflection - _reflectionShape.alpha = 0.4; - - } - - /** - * Get name - * @return String - */ - public function get caption():String { - return this._caption; - } - - /** - * Set name - * @param String name - */ - public function set caption(caption:String):void { - this._caption = caption; - } - - /** - * Get uri - * @return String - */ - public function get uri():String { - return this._uri; - } - - /** - * Set uri - * @param String uri - */ - public function set uri(uri:String):void { - this._uri = uri; - } - - /** - * Get the bitmap - * @return Bitmap - */ - public function getBitmap():Bitmap { - this._bitmap = new Bitmap(this._bitmapData); - return this._bitmap; - } - - /** - * Get the bitmap data - * @return BitmapData - */ - public function getBitmapData():BitmapData { - return this._bitmapData; - } - - /** - * Set the angle of the cover - * @param Number angle - */ - public function set angle(angle:Number):void { - this._angle = angle; - invalidateDisplayList(); - } - - /** - * Get the angle of the cover - * @return Number - */ - public function get angle():Number { - return this._angle; - } - - /** - * Set the x position of the cover - * @param Number x - */ - public function set xPos(x:Number):void { - this._x = x; - } - - /** - * Get the x position of the cover - * @return Number - */ - public function get xPos():Number { - return this._x; - } - - /** - * Set the y position of the cover - * @param Number y - */ - public function set yPos(y:Number):void { - this._y = y; - } - - /** - * Get the y position of the cover - * @return Number - */ - public function get yPos():Number { - return this._y; - } - - /** - * Set the scale of the cover - * @param Number scale - */ - public function set scale(scale:Number):void { - this._scale = scale; - } - - /** - * Get the scale position of the cover - * @return Number - */ - public function get scale():Number { - return this._scale; - } - - } -} - \ No newline at end of file diff --git a/src/com/vaadin/demo/coverflow/gwt/flex/Coverflow.as b/src/com/vaadin/demo/coverflow/gwt/flex/Coverflow.as deleted file mode 100644 index 130556a894..0000000000 --- a/src/com/vaadin/demo/coverflow/gwt/flex/Coverflow.as +++ /dev/null @@ -1,598 +0,0 @@ -package { - import flash.events.Event; - import flash.events.MouseEvent; - import flash.utils.Dictionary; - import flash.geom.Matrix; - - import mx.controls.Alert; - import mx.controls.Image; - import mx.controls.HScrollBar; - import mx.core.UIComponent; - import mx.core.Application; - import mx.effects.AnimateProperty; - import mx.effects.easing.Quadratic; - import flash.external.ExternalInterface; - import mx.events.ScrollEvent; - - public class Coverflow extends UIComponent { - // The scrollbar - private var _scrollbar:HScrollBar; - - // _coverList is an array containing all the coverflow objects - private var _coverList:Array = new Array(); - - // Which element is selected - private var _selected:int = -1; - - // Which element is currently being showed - private var _current:Number = 0; - - // How much space (in pixels) is there between each cover - private var _coverSpacing:int = 40; - - // A map between covers and their positions in the coverflow - private var _coverMap:Dictionary; - - // The angle in which the child covers are distorted - private static const _angle:int = 35; - - // The size of the child covers. The default value is 0.8 which means that - // the child covers are 80% of their maximum size - private static const _childScale:Number = 0.8; - - // All covers are scaled to the maximum. These two variables tell us how - // big a cover can be in maximum - private var _maxWidth:int; - private var _maxHeight:int; - - // An object which takes care of animations - private var _animation:AnimateProperty; - - // An object for event handling - private var _eventHandler:EventHandler = new EventHandler(); - - // The unique identifier of this instance of the widget - private var _pid:String; - - // Has the cover list's content changed? - private var _listChanged:Boolean = false; - - /** - * Constructor - */ - public function Coverflow():void { - super(); - - // Initialize the scrollbar - _scrollbar = new HScrollBar(); - _scrollbar.x = 0; - // Add an action listener to the scrollbar which detects when the - // scrollbar's position has been changed. This event should also - // change the selected cover's value - _scrollbar.addEventListener(ScrollEvent.SCROLL, function ():void { selectedCover = Math.round(_scrollbar.scrollPosition); }); - - // Maximize the size of the component - this.percentHeight = 100; - this.percentWidth = 100; - - } - - /** - * This function is called when the flash has finished loading. This - * function will intialize the communication interface between flash - * and GWT. - */ - private function init():void { - // Are we even able to initialize a external communication interface? - if (ExternalInterface.available) { - // These two methods are made available for javascript (they - // can be directly called within javascript code) - ExternalInterface.addCallback("addCover", this.addCover); - ExternalInterface.addCallback("selectCover", this.externalSetCover); - ExternalInterface.addCallback("setBackgroundColor", this.setBackgroundColor); - ExternalInterface.addCallback("toggleScrollbarVisibility", this.toggleScrollbarVisibility); - ExternalInterface.addCallback("removeCover", this.removeCover); - - // Try to call a javascript function - try { - // The function we want to call is getCovers. It tells javascript - // that the flash is now ready to accept information of the covers. - // The name of the function we're about to call is dynamic, meaning - // it is unique for every instance of this widget - ExternalInterface.call("vaadin.coverflow['getCovers_" + _pid + "']"); - } catch (error:SecurityError) { - Alert.show("A SecurityError occurred: " + error.message + "\n"); - } catch (error:Error) { - Alert.show("An Error occurred: " + error.message + "\n"); - } - } else { - Alert.show("External interface is not available for this container."); - } - } - - /** - * Adds a new cover to the coverflow list - * @param String name - * @param String uri - */ - private function addCover(name:String, uri:String):void { - // Create an instance of the cover object - var cover:Cover = new Cover(name.toString(), uri.toString()); - - // Mark the list as being modified - _listChanged = true; - - // Load the image - cover.loadImage(); - // Add the cover to our array - _coverList.push(cover); - commitProperties(); - } - - /** - * Measure the size of this component - */ - override protected function measure():void { - super.measure(); - - // What is the maximum size of a cover? It is either 3/4 of the height of the component - // or 1/3 of the width - which ever is smaller. - _maxHeight = _maxWidth = Math.round(Math.min(this.width/3,this.height/4*3)); - } - - /** - * Creates the child elements (covers) - */ - override protected function createChildren():void { - super.createChildren(); - - for(var i:int = 0; i < _coverList.lenght; i++) - addChild(_coverList[i]); - - invalidateDisplayList(); - } - - /** - * Something has changed - */ - override protected function commitProperties():void { - // Remove all old covers - for(i = numChildren-1;i>=0;i--) { - removeChildAt(numChildren-1); - } - - // Create a new mapping between the covers and their position - _coverMap = new Dictionary(true); - - // Loop through the coverlist array - for(var i:int = 0;i<_coverList.length;i++) { - var cover:Cover = _coverList[i]; - // Make sure the cover is loaded - cover.loadImage(); - - // Add an event listener to the cover. We want to know when - // a cover is being clicked. - cover.addEventListener(MouseEvent.CLICK,selectEvent,false,0,true); - // Add the cover to the flash movie - addChildAt(cover,i); - - // Add this cover to the map - _coverMap[cover] = i; - } - - // Add the scrollbar on top of all other elements - addChild(_scrollbar); - - // Update the scrollbar's details - invalidateScrollbar(); - - // update screen - invalidateDisplayList(); - } - - /** - * This function draws the actual content of the flash movie - */ - override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void { - if(_selected < 0) { - selectedCover = 0; - return; - } - - // Measure the size of the component - measure(); - // Update the scrollbar's details - invalidateScrollbar(); - - // Check if there are any new covers added to our array - if(_listChanged) { - _eventHandler.dispatchEvent(new Event(EventHandler.DATA_CHANGED)); - _listChanged = false; - } - - // If no covers exist, then do nothing - if(_coverList.length == 0) - return; - - - var cover:Cover; - var index:int = 0; - var m:Matrix; - - // Loop through all covers - for(var i:int=0; i < _coverList.length; i++) { - cover = _coverList[i]; - - // Calculate in which layer position the cover should be - index = (i <= Math.floor(_current))? i : _coverList.length-1-i; - - // Set the real size of the cover - cover.setActualSize(cover.getExplicitOrMeasuredWidth(),cover.getExplicitOrMeasuredHeight()); - - // Calculate in which angle the cover should be at this specific moment - calculateAngle(cover, i); - - // Set the covers layer position - setChildIndex(cover,index); - - // Calculate the cover's size (scale) - calculateScale(cover, i); - - // ...and finally calculate its position (horizontal position, that is) - calculatePosition(cover, i); - - // Resize the cover according to its scale value - m = cover.transform.matrix; - m.a = m.d = cover.scale; - cover.transform.matrix = m; - - // Move the cover to its correct position - cover.move(cover.xPos, cover.yPos); - - } - // Set selected cover on top of all other covers - setChildIndex(_coverList[Math.floor(_current)],_coverList.length-1); - } - - /** - * This function calulcates the position of a cover at any given moment. - * @param Cover c - Which cover is being processed - * @param int index - what is the cover's index (horizontal order number) - */ - private function calculatePosition(c:Cover, index:int):void { - // All covers are aligned so, that their bottom is at 3/4's height of the - // actual flash movie - c.yPos = Math.round(unscaledHeight/4*3-c.getExplicitOrMeasuredHeight()*c.scale); - - // Calculate the position difference between the currently selected item and - // this items index - var diff:Number = _current-index; - - // We want to know the previous and next positions of the item - var prevPos:Number; - var nextPos:Number; - - // We are currently processing a cover which comes from the left to the center (selected) - if(index == Math.floor(_current)) { - // Calculate the previous position - prevPos = unscaledWidth/2 - _maxWidth/2 - _coverSpacing; - // The next position is in the center of the screen - nextPos = unscaledWidth/2; - // Now calculate in which state of the animation we are - c.xPos = nextPos-diff*(nextPos-prevPos); - } - // Same as above, except now we come from right to center - else if(index == Math.ceil(_current)) { - prevPos = unscaledWidth/2; - nextPos = unscaledWidth/2 +_maxWidth/2 + _coverSpacing; - c.xPos = prevPos-diff*(nextPos-prevPos); - } - // Child covers to the left - else if(index < Math.floor(_current)){ - c.xPos = unscaledWidth/2 - _maxWidth/2 - diff*_coverSpacing; - } - // ..and child covers to the right - else { - c.xPos = unscaledWidth/2 +_maxWidth/2 - diff*_coverSpacing; - } - } - - /** - * Calulcates the angle of a cover at any given moment - * @param Cover c - * @param int index - */ - private function calculateAngle(c:Cover, index:int):void { - // This function has the same principle as the the function above - - var diff:Number; - - if(index == Math.floor(_current)) { - diff = _current-Math.floor(_current); - c.angle = _angle*diff; - } - else if(index == Math.ceil(_current)) { - diff = _current-Math.ceil(_current); - c.angle = _angle*diff; - } - else if(index < Math.floor(_current)) - c.angle = _angle; - else - c.angle = -_angle; - } - - /** - * Calculates the size (scale) of a cover at any given moment - * @param Cover c - * @param int index - */ - private function calculateScale(c:Cover, index:int):void { - // Almost same as calculatePosition, except that now we are - // calculating the scaled size of the cover - - var diff:Number = _current-index; - var scalePrev:Number; - var scaleNext:Number; - - if(index == Math.floor(_current)) { - scalePrev = maxScale(c.width, c.height)*_childScale; - scaleNext = maxScale(c.width, c.height); - c.scale = scaleNext-diff*(scaleNext-scalePrev); - } - else if(index == Math.ceil(_current)) { - scalePrev = maxScale(c.width, c.height); - scaleNext = maxScale(c.width, c.height)*_childScale; - c.scale = scalePrev-diff*(scaleNext-scalePrev); - } - else - c.scale = maxScale(c.width, c.height)*_childScale; - - - } - - /** - * Calculate the maximum scale of a cover - * @param Number w - The actual width of the cover - * @param Number h - The actual height of the cover - * @return Number - */ - private function maxScale(w:Number, h:Number):Number { - // The width of the cover is bigger than the height. This means that - // the width will be the restricting factor of this cover's size. - // Therefore we calculate the maximum size of this cover (result given - // as a scale) - if(w > h) - return _maxWidth/w; - - // Height is bigger than width. Same logic as above. - else - return _maxHeight/h; - } - - /** - * What happens when a user clicks on a cover? - * @param MouseEvent e - */ - private function selectEvent(e:MouseEvent):void { - // Use the mapping between the covers and their positions to - // find out which is the index of the cover that was clicked. - // Set this index as the new selected cover. - selectedCover = _coverMap[e.currentTarget]; - } - - /** - * Set the selected cover - * @param int index - */ - public function set selectedCover(index:int):void { - // The selected cover is already selected. Do nothing - if(index == _selected) - return; - - // Validate the index, make sure it's within the coverList's range - if(index >= 0 && index < _coverList.length) { - _selected = index; - - // Animate the changes - animateChange(); - } - } - - /** - * Returns the selected cover - * @return int - */ - public function get selectedCover():int { - return _selected; - } - - /** - * Set the current cover (which cover is actually being shown at this very moment. - * Note that the value can be a decimal value, because the selected cover can be for - * example 3.2, which means that it has moved 20% between the positions 3 and 4. - * @param Number i - */ - public function set current(i:Number):void { - // If ExternalInterface is available and the current cover - // is same as the currently selected cover (in other words, - // the animation has finished), then send the selected cover's - // key to GWT which will then forward it to the server. - if (ExternalInterface.available && i == _selected) { - ExternalInterface.call("vaadin.coverflow['setCurrent_" + _pid + "']",_coverList[_selected].caption); - - // Send an event which notifies the scrollbar that the selected cover has changed. - _eventHandler.dispatchEvent(new Event(EventHandler.CURRENT_CHANGED)); - } - - // Update value - _current = i; - // Update display - invalidateDisplayList(); - } - - /** - * Get the value of current - * @return Number - */ - public function get current():Number { - return _current; - } - - /** - * This is a function where an external source can set the selected cover - * (in our case, it could be another widget which is connected to our - * coverflow). - * - * @param String index - */ - private function externalSetCover(id:String):void { - var cover:Cover; - for(var i:int=0; i < _coverList.length; i++) { - cover = _coverList[i]; - - if(cover.caption == id) { - selectedCover = i; - break; - } - } - } - - /** - * With this function we can remove any cover from the cover flow in run time - * - * @param String id - */ - private function removeCover(id:String):void { - var cover:Cover; - - // Loop through all covers and search the correct one - for(var i:int=0; i < _coverList.length; i++) { - cover = _coverList[i]; - - // If the cover's name matches with the given id, then delete it - if(cover.caption == id) { - // First we will however check if we are removing the last - // which is also currently selected - if(i == _coverList.length-1 && i == _selected) { - // Select the previous cover - selectedCover = i-1; - - // Jump to the end of the animation - if(_animation != null && _animation.isPlaying) - _animation.end(); - } - - // Mark the list as having changes - _listChanged = true; - - // Remove the cover from the list - _coverList.splice(i,1); - - // Update - commitProperties(); - break; - } - } - } - - /** - * Gives a references to the event handler - * @return EventHandler - */ - public function get eventHandler():EventHandler { - return _eventHandler; - } - - /** - * Tells us how many covers there are currently added - * @return int - */ - public function get coverCount():int { - return _coverList.length; - } - - /** - * Sets the unique identifier of this widget. This is used to create - * the dynamic function names in the external interface calls. - * @param String p - */ - public function set pid(p:String):void { - if(_pid == null) { - _pid = p; - init(); - } - } - - /** - * Set the background color of the coverflow - * @param String gradientStart - * @param String gradientEnd - */ - public function setBackgroundColor(gradientStart:String, gradientEnd:String):void { - Application.application.setStyle('backgroundGradientColors', [gradientStart, gradientEnd]); - } - - /** - * Make sure the scrollbar is up-to-date, both in size and position wise - */ - private function invalidateScrollbar():void { - _scrollbar.width = unscaledWidth; - _scrollbar.y = unscaledHeight-_scrollbar.getExplicitOrMeasuredHeight()/2; - _scrollbar.maxScrollPosition = coverCount-1; - _scrollbar.scrollPosition = _selected; - _scrollbar.pageSize = 1; - _scrollbar.invalidateDisplayList(); - } - - /** - * Change the visibility status of the scrollbar - * @param String visibility - */ - public function toggleScrollbarVisibility(visibility:String):void { - // Input is a string, because javascript can call directly on this function - if(visibility == "false") - _scrollbar.visible = false; - else - _scrollbar.visible = true; - } - - /** - * Animate the state changes - */ - private function animateChange():void { - // If there already is an animation in process, stop it (jump to the end) and start the new one. - if(_animation != null && _animation.isPlaying) - _animation.end(); - - // Set up a new animation. We want the "current" value go to the "_selected" value - _animation = new AnimateProperty(this); - _animation.property = "current"; - _animation.toValue = _selected; - _animation.target = this; - - // What is the duration of the animation? We don't want the animation to go too fast or too slow. - // An animation where the selected cover is changed with only one position should be relatively - // slow, so that we actually can se an animation. Therefore we've set a minimum length of the - // animation to 400 ms. If we jump over several covers, then we want the animation to be a - // bit longer, so that the animation would be smoother. Therefore we reserve 200ms between every - // cover change. Select which ever is bigger, 400ms or difference between current and selected - // cover * 200ms. - var duration:int = Math.max(400,Math.abs(Math.ceil(_current)-_selected)*200); - - // If we do long jumps (for example by using the slider), we don't want the animation to go - // too long. Therefore we're setting a maximum length for the animation, in this case 2 seconds. - duration = Math.min(2000,duration); - _animation.duration = duration; - - // We don't want the animation to be linear, we want it to slow down in the end - _animation.easingFunction = mx.effects.easing.Quadratic.easeOut; - - // Start the animation - _animation.play(); - } - - } - - -} - \ No newline at end of file diff --git a/src/com/vaadin/demo/coverflow/gwt/flex/EventHandler.as b/src/com/vaadin/demo/coverflow/gwt/flex/EventHandler.as deleted file mode 100644 index f9d25be24d..0000000000 --- a/src/com/vaadin/demo/coverflow/gwt/flex/EventHandler.as +++ /dev/null @@ -1,16 +0,0 @@ -package { - import flash.events.EventDispatcher; - import flash.events.Event; - - /** - * This is a simple class created for event handling. Basically it just - * dispatches some custom events related to state changes within the coverflow. - */ - public class EventHandler extends EventDispatcher { - // Events - public static var DATA_CHANGED:String = "data_changed"; - public static var CURRENT_CHANGED:String = "current_changed"; - - - } -} \ No newline at end of file diff --git a/src/com/vaadin/demo/coverflow/gwt/flex/coverflowflash.mxml b/src/com/vaadin/demo/coverflow/gwt/flex/coverflowflash.mxml deleted file mode 100644 index 612e8ba52f..0000000000 --- a/src/com/vaadin/demo/coverflow/gwt/flex/coverflowflash.mxml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - diff --git a/src/com/vaadin/demo/coverflow/gwt/flex/sandy/util/DistortImage.as b/src/com/vaadin/demo/coverflow/gwt/flex/sandy/util/DistortImage.as deleted file mode 100644 index 101e9e217c..0000000000 --- a/src/com/vaadin/demo/coverflow/gwt/flex/sandy/util/DistortImage.as +++ /dev/null @@ -1,306 +0,0 @@ -/* -# ***** BEGIN LICENSE BLOCK ***** -Copyright the original author or authors. -Licensed under the MOZILLA PUBLIC LICENSE, Version 1.1 (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.mozilla.org/MPL/MPL-1.1.html -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. - -# ***** END LICENSE BLOCK ***** -*/ - - -/* -**************************** -* From a first idea and first implementation of Andre Michelle www.andre-michelle.com -* @version 2.0 -* @author Thomas Pfeiffer - kiroukou - http://www.thomas-pfeiffer.info -* @author Richard Lester - RichL -* @author Didier Brun - foxy - http://www.foxaweb.com -* @author Alex Uhlmann -* @website: http://sandy.media-box.net -* @description: Tesselate a movieclip into several triangles to allow free transform distorsion. -*/ -package sandy.util -{ - import flash.display.BitmapData; - import flash.display.DisplayObject; - import flash.display.Shape; - import flash.display.Sprite; - import flash.geom.Matrix; - import flash.geom.Rectangle; - - public class DistortImage - { - public var smooth : Boolean; - // -- texture to distort - public var texture:BitmapData; - // -- container Sprite or Shape : the display object containing the distorted picture drawn via graphics. - - private var _container:Object; - public function get container() : Object - { - return _container; - } - - public function set container( value : Object ) : void - { - if( ( value is Shape ) || ( value is Sprite ) ) - { - _container = value; - } - else - { - throw new Error('container must be flash.display.Shape or flash.display.Sprite'); - } - } - - // -- target Object : either a BitmapData or a sprite - public var target:Object; - // -- arrays of differents datas types - public var points:Array; - - ///////////////////////// - /// PRIVATE PROPERTIES // - ///////////////////////// - private var offsetRect:Rectangle; - private var _w:Number; - private var _h:Number; - private var _xMin:Number; - private var _xMax:Number; - private var _yMin:Number - private var _yMax:Number; - // -- picture segmentation properties - private var _hseg:Number; - private var _vseg:Number; - private var _hsLen:Number; - private var _vsLen:Number; - private var _tri:Array; - private var _aMcs:Array; - - public function DistortImage() - { - smooth = true; - } - - /* - * @param vseg Number : the vertical precision - * @param hseg Number : the horizontal precision - * @param offsetRect Rectangle : optional, the real bounds to use. - * @throws: An error if target property isn't a BitmapData or a DisplayObject - */ - public function initialize( vseg: Number, hseg: Number, offsetRect: Rectangle = null ) : void - { - if( target is BitmapData ) - { - texture = target as BitmapData; - _w = texture.width; - _h = texture.height; - } - else if( target is DisplayObject ) - { - renderVector( offsetRect ); - } - else - { - throw new Error('target must be flash.display.BitmapData or flash.display.DisplayObject'); - } - _vseg = vseg || 0; - _hseg = hseg || 0; - - // -- - _aMcs = new Array(); - points = new Array(); - _tri = new Array(); - // -- - __init(); - } - - public function render() : void - { - __render(); - } - - /** - * setTransform - * - * @param x0 Number the horizontal coordinate of the first point - * @param y0 Number the vertical coordinate of the first point - * @param x1 Number the horizontal coordinate of the second point - * @param y1 Number the vertical coordinate of the second point - * @param x2 Number the horizontal coordinate of the third point - * @param y2 Number the vertical coordinate of the third point - * @param x3 Number the horizontal coordinate of the fourth point - * @param y3 Number the vertical coordinate of the fourth point - * - * @description : Distort the bitmap to adjust it to those points. - */ - public function setTransform( x0:Number , y0:Number , - x1:Number , y1:Number , - x2:Number , y2:Number , - x3:Number , y3:Number ): void - { - var w:Number = _w; - var h:Number = _h; - var dx30:Number = x3 - x0; - var dy30:Number = y3 - y0; - var dx21:Number = x2 - x1; - var dy21:Number = y2 - y1; - var l:int = points.length; - while( --l > -1 ) - { - var point:SandyPoint = points[ l ]; - var gx:Number = ( point.x - _xMin ) / w; - var gy:Number = ( point.y - _yMin ) / h; - var bx:Number = x0 + gy * ( dx30 ); - var by:Number = y0 + gy * ( dy30 ); - - point.sx = bx + gx * ( ( x1 + gy * ( dx21 ) ) - bx ); - point.sy = by + gx * ( ( y1 + gy * ( dy21 ) ) - by ); - } - __render(); - } - - - - ///////////////////////// - /// PRIVATE METHODS /// - ///////////////////////// - - private function renderVector( offsetRect: Rectangle = null ) : void - { - var vector : DisplayObject = target as DisplayObject; - if( offsetRect != null ) - { - texture = new BitmapData( offsetRect.width , offsetRect.height, true, 0x00000000 ); - } - else - { - texture = new BitmapData( vector.width , vector.height, true, 0x00000000 ); - offsetRect = new Rectangle( 0, 0, texture.width, texture.height ); - } - - var m : Matrix = new Matrix(); - m.translate( offsetRect.x * -1, offsetRect.y * -1 ); - texture.draw( vector, m ); - container.transform.matrix.translate( vector.transform.matrix.tx, vector.transform.matrix.ty ); - _w = offsetRect.width; - _h = offsetRect.height; - } - - private function __init(): void - { - points = new Array(); - _tri = new Array(); - var ix:int, iy:int; - var w2: Number = _w / 2; - var h2: Number = _h / 2; - _xMin = _yMin = 0; - _xMax = _w; _yMax = _h; - _hsLen = _w / ( _hseg + 1 ); - _vsLen = _h / ( _vseg + 1 ); - var x:Number, y:Number; - var p0:SandyPoint, p1:SandyPoint, p2:SandyPoint; - - // -- we create the points - for ( ix = 0 ; ix < _hseg + 2 ; ix++ ) - { - for ( iy = 0 ; iy < _vseg + 2 ; iy++ ) - { - x = ix * _hsLen; - y = iy * _vsLen; - points.push( new SandyPoint( x, y, x, y ) ); - } - } - // -- we create the triangles - for ( ix = 0 ; ix < _vseg + 1 ; ix++ ) - { - for ( iy = 0 ; iy < _hseg + 1 ; iy++ ) - { - p0 = points[ iy + ix * ( _hseg + 2 ) ]; - p1 = points[ iy + ix * ( _hseg + 2 ) + 1 ]; - p2 = points[ iy + ( ix + 1 ) * ( _hseg + 2 ) ]; - __addTriangle( p0, p1, p2 ); - // -- - p0 = points[ iy + ( ix + 1 ) * ( _vseg + 2 ) + 1 ]; - p1 = points[ iy + ( ix + 1 ) * ( _vseg + 2 ) ]; - p2 = points[ iy + ix * ( _vseg + 2 ) + 1 ]; - __addTriangle( p0, p1, p2 ); - } - } - } - - private function __addTriangle( p0:SandyPoint, p1:SandyPoint, p2:SandyPoint ):void - { - var u0:Number, v0:Number, u1:Number, v1:Number, u2:Number, v2:Number; - var tMat:Matrix = new Matrix(); - // -- - u0 = p0.x; v0 = p0.y; - u1 = p1.x; v1 = p1.y; - u2 = p2.x; v2 = p2.y; - tMat.tx = -v0*(_w / (v1 - v0)); - tMat.ty = -u0*(_h / (u2 - u0)); - tMat.a = tMat.d = 0; - tMat.b = _h / (u2 - u0); - tMat.c = _w / (v1 - v0); - // -- - _tri.push( new Triangle( p0, p1, p2, tMat ) ); - } - - private function __render(): void - { - var vertices: Array; - var p0:SandyPoint, p1:SandyPoint, p2:SandyPoint; - var x0:Number, y0:Number; - var ih:Number = 1/_h, iw:Number = 1/_w; - var c:Object = container; c.graphics.clear(); - var a:Triangle; - var sM:Matrix = new Matrix(); - var tM:Matrix = new Matrix(); - //-- - var l:int = _tri.length; - while( --l > -1 ) - { - a = _tri[ l ]; - p0 = a.p0; - p1 = a.p1; - p2 = a.p2; - tM = a.tMat; - // -- - sM.a = ( p1.sx - ( x0 = p0.sx ) ) * iw; - sM.b = ( p1.sy - ( y0 = p0.sy ) ) * iw; - sM.c = ( p2.sx - x0 ) * ih; - sM.d = ( p2.sy - y0 ) * ih; - sM.tx = x0; - sM.ty = y0; - // -- - sM = __concat( sM, tM ); - - c.graphics.beginBitmapFill( texture, sM, false, smooth ); - c.graphics.moveTo( x0, y0 ); - c.graphics.lineTo( p1.sx, p1.sy ); - c.graphics.lineTo( p2.sx, p2.sy ); - c.graphics.endFill(); - } - } - - private function __concat( m1:Matrix, m2:Matrix ):Matrix - { - //Relies on the original triangles being right angled with p0 being the right angle. - //Therefore a = d = zero (before and after invert) - var mat : Matrix = new Matrix(); - mat.a = m1.c * m2.b; - mat.b = m1.d * m2.b; - mat.c = m1.a * m2.c; - mat.d = m1.b * m2.c; - mat.tx = m1.a * m2.tx + m1.c * m2.ty + m1.tx; - mat.ty = m1.b * m2.tx + m1.d * m2.ty + m1.ty; - return mat; - } - } -} diff --git a/src/com/vaadin/demo/coverflow/gwt/flex/sandy/util/SandyPoint.as b/src/com/vaadin/demo/coverflow/gwt/flex/sandy/util/SandyPoint.as deleted file mode 100644 index 7d5c52ca0c..0000000000 --- a/src/com/vaadin/demo/coverflow/gwt/flex/sandy/util/SandyPoint.as +++ /dev/null @@ -1,17 +0,0 @@ -package sandy.util -{ - import flash.geom.Point; - - public class SandyPoint extends Point - { - public var sx : Number; - public var sy : Number; - - public function SandyPoint( x : Number, y : Number, sx : Number, sy : Number ) - { - super( x, y ); - this.sx = sx; - this.sy = sy; - } - } -} \ No newline at end of file diff --git a/src/com/vaadin/demo/coverflow/gwt/flex/sandy/util/Triangle.as b/src/com/vaadin/demo/coverflow/gwt/flex/sandy/util/Triangle.as deleted file mode 100644 index 8f08fb6c76..0000000000 --- a/src/com/vaadin/demo/coverflow/gwt/flex/sandy/util/Triangle.as +++ /dev/null @@ -1,20 +0,0 @@ -package sandy.util -{ - import flash.geom.Matrix; - - public class Triangle - { - public var p0 : SandyPoint; - public var p1 : SandyPoint; - public var p2 : SandyPoint; - public var tMat : Matrix; - - public function Triangle( p0 : SandyPoint, p1 : SandyPoint, p2 : SandyPoint, tMat : Matrix ) - { - this.p0 = p0; - this.p1 = p1 - this.p2 = p2; - this.tMat = tMat; - } - } -} \ No newline at end of file diff --git a/src/com/vaadin/demo/coverflow/gwt/public/coverflowflash.swf b/src/com/vaadin/demo/coverflow/gwt/public/coverflowflash.swf deleted file mode 100644 index 9735f5f0d31d1ebe744b8c80e4a072c042c41b43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203769 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

rIS>XW^-i;4~S-@M{^*f-6 zFkK5c{ix@1_Q|Q7gDhaeRs{HO>P4SD49{H;$7aMKSMvm4>FDMl>slOJ1Ou_g2kJjg zF}!6a@Ln$Vr@7acUAU}+{~xOAPxTF;v2NVN_vA9Uyk49T6`mZH)`1*DCP<+n>dW- zrR{VDdlT?DiY#HUvMRGOvq~z}?JCj2q7jlY z#WD0uGc!HYboX=%xB5^w-SGRL*{aRV>Zw2fS$hATX6*0Vo&9!%?*rfX0vk&<<}$Xy z#`wY*8)Jiwp|T1|KETHK!1y-!zO?VX$jr);O7{G_`+ZVn94{l@i+J(kMP$T#*2!x$ z0i6CsGK#s`@#aq?F0URDXdd_qREk#w1M2DHrf{=e$6Hv(d%f#;t5O|@%{mVEs^cxF zI{sT`B1ZSgw-IqQ=<4=$HafN*Ev9eC%2Ux)ceMFpm}|Zvb1KL|`^zmW0}+Q% zUY!%h8^X{#3*?psGW8B?U*!D-GV=ZycO$zn{4tEk>Hs@u{0ZP&9l#?I{7kpGU7lyh zn@y|8%G`MF**I+zVDP#45Cp}0hK^zkSi4jQYUp0Cjyxx~;>m=+KQL<$!%q z=75l!94B9R2CC@A4g@#MJ?8^L^Sro=<}$j@gMQng%c=u7hBnciL?S0>yC2OPzuw3p zm+tDD@djn=whP#S1?-{b?!(P{ZK$0H^%<3hUnF+I2;GT%^*JTs>A(ZleS8CgOK_vA zp=XHwwQL_ScXi+l$LxACXDyi>f{~ja&+QTP9YSUki|iKkO+tFJV6<))xXfgCy*}Bk zyzB`-32lCeXO{wU&&Tycc=o>DasYaWH+_~@F)(&`-hxNnHn$*NPYd_mZVc=2_?HFo zy9>E?Gkvxj!#X_vr9F-p66)2--t-4T>j#31ZW1u3A`_#^M*?mr7|k7Vmw6gNSs2eP ziZ?Ey^K&o6l`XVvS>p6levq30%Iny@?nJ1_UwJroY7^1DyY#gTLkDOi(GivOP7h?X z?j+|s2dQMV7W^14T#S5lGOlBHyVV8pf->8!w#RYOS6_^y{-C}TFRdWy0yLqU- z0-=2rdNrOt&7lLvwH`cW4r&OfPV0D3CD6+rU%E_>hJH$y=_$64#r9Dw{h4513;0ZM z7l8G@b#v;HIDVHoLjcpEq()wRvLhFz@zO2S#&cR&_yp&;RUw&NaN#2>mx^ z>-KPz8OJU&aBJG26-qW}1&0mV5hdfXWD9mgUt_Y8!*UVE#6{gkG~Eac#Fl=w{i~$+ic9gd!c(?7)vk5I#@g z^Ax^B;Y$?0Na0G-_@~7Br5#8Z2F&j-rtU_=i&!#!P%&jRxxhIfSUKlK{JxH+jA$zH zq8`p}Hwel6}Iz563idZCWVlBZ*u(jgd-p~_44;^wt&l2+^6sBtOQu-F=e=;jIX2syoVLkc- z@}2-iR+|B5VO6XIc6`jIRh7REgK)E7^J_xvcRf9th*vleDLUoUXu2GLI5Y#Kbw<&p zjUMZWUU$3Md6n(A;?&OsDUG*nSUhZ#9BOhHl2X1=G#gNe~=?$PKP!*Wbg; z`akqXH(J$QAEt>ffZSle7yO8@U^y$u^!+}ec|EWOy-YT)R>e)L%*s@^nE(yj_E69? z*#_~php-krq=4t%u!a`$575FjwqD^mGlLoZv$Jyc`7Jsr$B4yG@O0RrE2=;Wx>Xy{ z>x4!cQ12F8b&{J7Xub#Y6txKHs9Z~)`;?;-5^u*{?uT3(;x5kPI>md0>cB5Zs%7~U z*U5+;MoW`>7&8@-D#$fb=c2{-)cI(;#sh8bsS6ZZ6K`)H-APN9PiQydG>y$Ecm)?m zGF_Wwl7a0_(kc1d$<@RGJSLxdKHB~c6~Iq*_FzLB0+suk#&=W##cP7F$6S1Et` zH|nvC&|`w@UFflgTxW^p?=;QnnWsQ4R$X2`JigÜdenZsw$i^AiWQ{VlhE72WD z(*#y-w|iI@nt02j60)CTCL=(zx8i@ma|#fLuu??ug$;jL#Qb!de!r_tr?wEajx<=_ zgRLxx;&xIOoruR8K|`}}+U4$p(`@&!ZX2gvZWE_nZY$1k+U15Y;xwD#)a~#D&MGcq zbc%U`!g5k;iT_u~1~sF=DXo^Noe@58T8-AdtY^!ou$R+o9NrzSMgl&6_v z0xN$l6@8I^%ne2B$ArvRLi(uCa#V2XU(qg1TeR)NczS!B1@h|lcs_U5jnhn?d0#l| z#)KbT;?*4{Q2L|z;4T)-eH1VJ*mbw$&Zox4l*5AQMC}SRdY}eT&Z_$E=dC@obaXj})ycEvITW9**W!Xl&^(7xymQ;wVQ+&!1 z0TN9M=GQBLqB{I^%=8sQ zLKfFt|IATuV-f?vjHcGkI9h;o=XS*F@lFMXe>6e>PI$!S?gH@_cXfmKi@8QY^}OIE zvuSvh4{7oQEt)(-!*%*eM01P-&9MN)^Y1%r=LQSCOSxZnn)7!_ui)NM`S1UgY48>wg1$c zwExo;keytP?3CWfM(gy`i0o9z@bFb2tDXxh@B7r}P+CnRtfAF!gw!wMdF8pVdH^2p z_|z|vi0Sc+OIpt{1?Tu!9tA3{i|W@9xm`U5 z2k?6J236lfAZ-JvwxZ?!a+f-p-k$>DMs+F{IBfu;I-N?I0g%^3^%;uH9FV`?e}C2e)%OR0(pdwrg=WKV zlR5{$R>ah~1Be5j1-KgZIe6zzb>0A?c>Vxt)#u@{I;JidfGyolg?12@3n61&OkITa zzc2urVKM%^2rr-Ws4p?nUnclh2;EoV*Q+jpat5idQTkE+mhhueU?Mer>Zwem3_V4ql9WnJiXy1goh5F!q5E>^z=Vr{c4M*Z&7#SZB z$cOa1oql&9iL3e{u_)Yv#G=qYiEmaQ@vU+aSNA6IJ9YX+Byo*{#I@8RzsRSKaq36J zPCEyn4E`8??@>PiLQnhDJY^X0E2{;P8b$c!)lVtC6ZkKzc2P<<61=V-f6Ia^{7V%RY4;YB}$iQ?T-_Pu&G{&I_x%5&Mn(V1HS> z1@@Q4{;_|j0`~8gW5204_P5vRml6BTj_!JoII;<)!XAi5Xa@UqNEFIf(gydf;Ia2K!+w6=Lca#6<^y zl>5~$iNJ%zb%%)S4pZ(C`u&Q2k0OyD_BX(8MP%_NM1D|#$nE7s?&wWqeVu-l94Jx}< zu^((ZZ-s5=O|UIg!1mK}Y&&~n``tSII%3=9z_#1cr$OI2$#kYui1e<0knXw_(p@(} zy1N3>yUUT@(;MkK>+~Cl^j-(jpE;WNG-CUCKiGEP3fu0RVEb7GZ1ez4tjD{Ob&1lt1@usv9g?V;Y--c_f!dGX_)1KT5n?I%jOR&+Tmb2R!>3*xfQyMsG^brA&@1rXzLhW{;xq=mdV;69k_3zT$9*#G#v9yUA8pmo=H* zr^!}VJDQBXN3dC8%VEu3p`w>lDEX(T{GLxrJ_;>7QkeS74cw z<+z^ejcZe#J_2z)?ZEYnwOR8Q>Uc!;Y=3Kr|L|>sE`XQ~zXC-JE4Zq)0 z=Ol12&!v=S>GwIHM^NV_a3f)U0u|clDP;jtc(tF7J$b8+J$aLky;6b3YvnXv?@i<2 zI(;LzIRR6z47ZyA~+yuHx8r%oS(XpZ!j&>ZE(u1F!* zv{UPMfE?u1g$bH_7ZE$XK);LW_eE^@(fv?#`c@R3z6nL6ynQJeQ%=#?-V~+k^sz|M zI0r@Jy;j3d=m*U+w?gyGP0$=)0nLf!Xg=K=&3o(gafs$52bz<;<`{sL=SvB;!IOY_ z=oM<_SE({5R6gUaEX)4m z7P9O=`loS51sZ3T(>SX)jrZ5-6OhK)4jSip>jV$~4xfKO>G9%S7B-=;PiTDVn^@}G z*pJUF}3zr5Z4)b#%9yAn%X?eD#7vDEec z@@~XZFY^85^~6$b@qY52il=7uhs*w0YD9nU9gL+$_Lny*o*La>-k5l5Y=3$C{HbXS zm(=WNYEdLLDVo|CO+6D#&5otUM^i6EQuBkUnbFiIvDCBC)QD)RCz4tdOU;RFdKgY)oy$;WED;p)etS3!yL}-v5A^S7E?B zUyk&G-bnvNo&Gc;-R?lTgOE<*2!EHx`6l|^Ouz3T`V0F(f8wpspLi4WJ1U^Rs2u$l zdZYhfojwWCU+lH^ovgFyxDD;)1zvc7PP)PSc-vq^mP}>K8ehB}5(`ElwTFP-AI>}e_GiW`BJ zzf)7=BicuI8Wz+?3G0N_7H0Erh1U!8;8_z%nc`J;CX|m8%5z?TZ;|k1z)G9APlz}_ z{0;ppAP#TAyy@WmRbG$e;oo#Kn*!eYwnwvKp>1Gy0ex!G?O$dCjEt2Qme7F(vX`py zxsx0-k%1;@26hL@;O@X~jjR^o!L^4p-n_9}B)3~5%)_Ao@za%-Wrp-m0qUn*ZVW%1 z45g53uF&&6J<5D10VVNJk_t6@H4!q^e1dL(m1osMGF}8NAFiv3 zN74JcVe;tr>-71^3TrBj*R@_Zj92CXE^p`^-h4q{;6)}{=*<`Pc6@Q2U1Y&5@}WBY zdCXZ)MK(EEv?H9F;*>pFcA7W@vV zs~$Qzx!G%ZwR_Q9KlE?(7cl!hujTaabEWaWa|aH zz##KJWTC+oCF{!&sCvNVYWPE;ozAe?2rV4eZP&gKDm1K+fVVpfWxyp+3lNcjXR)KO zuzeVe0|;w8MbK6Z#sn5aLp4Pcf1;XTDP|h9v7>#+dQLd*p{e=hu!l^=kMkFr z$N9P3R*|8H2eE@gQP6ocDYrX;C;DYgC^nCexv>I#Unn%1?+Y4Ev1T6Mt87iqO^7if zFoZ;GmNZEd(Lu0b#)UI?^ zJ$N5BlZbYxsG0l*o=yimq4-YCZxUai5D_m!Ye})~Jv{|r3hYZ?_+Nn>-^|q9K=ghL zDRE{7C9e6J;~bJhHx6G88|fcF(hs;IYurw_dtW>t544Zxi7CQBvOP^3ioe9iB?VM3oFbV6%QM4z);K@R)&F(M_ zI@zBu;yt*c#;0oyG{Rx>WlT*v>bvf--&UjnyAxD#JLmO$B@MIbBsh^oM#7KO_-aKXIb`$cM3>TW;40DYT$9ssP8(4KHY40Gm{tflEA41Kb5Ze0OYRx+ZF zs$86IEn9Kb-mMc2WQp565eXAVmZO8Ikpp!38v5cl+qUXf?k1 zAPiLYi2e{|UI9i#d-LijN486AXyz!S7C6$Feppz-T&(X)5P`+kLkaFduMh&6D|sdQ zVkUY75B~_XI24I*KiOqKK@{pP6q&Ao$JUED7e9&U^hB%JNp`wQ`Xo%a4S-Vfnkb&S z{!H|szjaV^R)h_+b3QL0Qv2*7b=VwIKdRGjAaCp!J-vB%efV*gx;~uQj6AYAoY{%b zo#D&|Oy3aBd>C$UsUL%!@4Qe(?CiBs1hCw)P~0R1fS6>=|X*2Srp|e}o+OBalLLf#%7s!i*=G zdm%_D=8hzCUnSapM6TT=BT8z0Ytip2ZbAoNiCx55heQDup6C*GXV`#OMt2u!wc%yH zL6*$I+ckwE-qJbeZ&E&t<+jIKk0#Lez+q7k1mF8^>n=xq+kJoZ;^W~zitLV$G@g)fJOdJRv74n~D!u_2A<9828VY!rCO)X;VXEa}juG^P zh%*&Fv1D~GzAFyF*{}S9N}a@;7;?GeiPRk2f8g7jPb4^oFdqCNhrjqV5w9P@P2jF` zPr31~iF7jI;ytcY377b=>vX~;+~+!zaCz@@olW3

Gl{5AXUm;d1k?a|xH^aUBso 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 T(iN93Ump2Wg6qElUb&_o--$S4 diff --git a/src/com/vaadin/demo/featurebrowser/AccordionExample.java b/src/com/vaadin/demo/featurebrowser/AccordionExample.java deleted file mode 100644 index 68cd94faf7..0000000000 --- a/src/com/vaadin/demo/featurebrowser/AccordionExample.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.vaadin.demo.featurebrowser; - -import com.vaadin.ui.Accordion; -import com.vaadin.ui.CustomComponent; -import com.vaadin.ui.Label; -import com.vaadin.ui.TextField; -import com.vaadin.ui.VerticalLayout; - -/** - * Accordion is a derivative of TabSheet, a vertical tabbed layout that places - * the tab contents between the vertical tabs. - */ -@SuppressWarnings("serial") -public class AccordionExample extends CustomComponent { - public AccordionExample() { - // Create a new accordion - final Accordion accordion = new Accordion(); - setCompositionRoot(accordion); - - // Add a few tabs to the accordion. - for (int i = 0; i < 5; i++) { - // Create a root component for a accordion tab - VerticalLayout layout = new VerticalLayout(); - // The accordion tab label is taken from the caption of the root - // component. Notice that layouts can have a caption too. - layout.setCaption("Tab " + (i + 1)); - - accordion.addComponent(layout); - - // Add some components in each accordion tab - Label label = new Label("These are the contents of Tab " + (i + 1) - + "."); - layout.addComponent(label); - - TextField textfield = new TextField("Some text field"); - layout.addComponent(textfield); - } - } -} diff --git a/src/com/vaadin/demo/featurebrowser/ButtonExample.java b/src/com/vaadin/demo/featurebrowser/ButtonExample.java deleted file mode 100644 index f67d6f4c7b..0000000000 --- a/src/com/vaadin/demo/featurebrowser/ButtonExample.java +++ /dev/null @@ -1,140 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.featurebrowser; - -import com.vaadin.terminal.ExternalResource; -import com.vaadin.terminal.ThemeResource; -import com.vaadin.ui.Button; -import com.vaadin.ui.CheckBox; -import com.vaadin.ui.CustomComponent; -import com.vaadin.ui.HorizontalLayout; -import com.vaadin.ui.Label; -import com.vaadin.ui.Link; -import com.vaadin.ui.Panel; -import com.vaadin.ui.VerticalLayout; -import com.vaadin.ui.Button.ClickEvent; - -/** - * Shows a few variations of Buttons and Links. - * - * @author IT Mill Ltd. - */ -@SuppressWarnings("serial") -public class ButtonExample extends CustomComponent implements - Button.ClickListener { - - public ButtonExample() { - - final VerticalLayout main = new VerticalLayout(); - main.setMargin(true); - setCompositionRoot(main); - - final HorizontalLayout horiz = new HorizontalLayout(); - horiz.setWidth("100%"); - main.addComponent(horiz); - final Panel basic = new Panel("Basic buttons"); - basic.setStyleName(Panel.STYLE_LIGHT); - horiz.addComponent(basic); - - final Panel bells = new Panel("w/ bells & whistles"); - bells.setStyleName(Panel.STYLE_LIGHT); - horiz.addComponent(bells); - - Button b = new Button("Basic button"); - b.addListener(this); - basic.addComponent(b); - - b = new Button("Button w/ icon + tooltip"); - b.addListener(this); - b.setIcon(new ThemeResource("icons/ok.png")); - b.setDescription("This button does nothing, fast"); - bells.addComponent(b); - - b = new CheckBox("CheckBox - a switch-button"); - b.setImmediate(true); // checkboxes are not immediate by default - b.addListener(this); - basic.addComponent(b); - - b = new CheckBox("CheckBox w/ icon + tooltip"); - b.setImmediate(true); // checkboxes are not immediate by default - b.addListener(this); - b.setIcon(new ThemeResource("icons/ok.png")); - b.setDescription("This is a CheckBox"); - bells.addComponent(b); - - b = new Button("Link-style button"); - b.addListener(this); - b.setStyleName(Button.STYLE_LINK); - basic.addComponent(b); - - b = new Button("Link button w/ icon + tooltip"); - b.addListener(this); - b.setStyleName(Button.STYLE_LINK); - b.setIcon(new ThemeResource("icons/ok.png")); - b.setDescription("Link-style, icon+tootip, no caption"); - bells.addComponent(b); - - b = new Button(); - b.addListener(this); - b.setStyleName(Button.STYLE_LINK); - b.setIcon(new ThemeResource("icons/ok.png")); - b.setDescription("Link-style, icon+tootip, no caption"); - basic.addComponent(b); - - final Panel links = new Panel("Links"); - links.setStyleName(Panel.STYLE_LIGHT); - main.addComponent(links); - final Label desc = new Label( - "The main difference between a Link and" - + " a link-styled Button is that the Link works client-" - + " side, whereas the Button works server side.
This means" - + " that the Button triggers some event on the server," - + " while the Link is a normal web-link.

Note that for" - + " opening new windows, the Link might be a safer " - + " choice, since popup-blockers might interfer with " - + " server-initiated window opening."); - desc.setContentMode(Label.CONTENT_XHTML); - links.addComponent(desc); - Link l = new Link("Vaadin home", new ExternalResource( - "http://www.vaadin.com")); - l.setDescription("Link without target name, opens in this window"); - links.addComponent(l); - - l = new Link("Vaadin home (new window)", new ExternalResource( - "http://www.vaadin.com")); - l.setTargetName("_blank"); - l.setDescription("Link with target name, opens in new window"); - links.addComponent(l); - - l = new Link("Vaadin home (new window, less decor)", - new ExternalResource("http://www.vaadin.com")); - l.setTargetName("_blank"); - l.setTargetBorder(Link.TARGET_BORDER_MINIMAL); - l.setTargetName("_blank"); - l - .setDescription("Link with target name and BORDER_MINIMAL, opens in new window with less decor"); - links.addComponent(l); - - l = new Link("Vaadin home (new 200x200 window, no decor, icon)", - new ExternalResource("http://www.vaadin.com"), "_blank", 200, - 200, Link.TARGET_BORDER_NONE); - l.setTargetName("_blank"); - l - .setDescription("Link with target name and BORDER_NONE, opens in new window with no decor"); - l.setIcon(new ThemeResource("icons/ok.png")); - links.addComponent(l); - - } - - public void buttonClick(ClickEvent event) { - final Button b = event.getButton(); - getWindow().showNotification( - "Clicked" - + (b instanceof CheckBox ? ", value: " - + event.getButton().getValue() : "")); - - } - -} diff --git a/src/com/vaadin/demo/featurebrowser/ClientCachingExample.java b/src/com/vaadin/demo/featurebrowser/ClientCachingExample.java deleted file mode 100644 index ad840c84c3..0000000000 --- a/src/com/vaadin/demo/featurebrowser/ClientCachingExample.java +++ /dev/null @@ -1,72 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.featurebrowser; - -import com.vaadin.terminal.PaintException; -import com.vaadin.terminal.PaintTarget; -import com.vaadin.ui.CustomComponent; -import com.vaadin.ui.Label; -import com.vaadin.ui.Layout; -import com.vaadin.ui.TabSheet; -import com.vaadin.ui.VerticalLayout; - -/** - * This example is a (simple) demonstration of client-side caching. The content - * in one tab is intentionally made very slow to produce server-side. When the - * user changes to this tab for the first time, there will be a 3 second wait - * before the content shows up, but the second time it shows up immediately - * since the content has not changed and is cached client-side. - * - * @author IT Mill Ltd. - */ -@SuppressWarnings("serial") -public class ClientCachingExample extends CustomComponent { - - private static final String msg = "This example is a (simple) demonstration of client-side caching." - + " The content in one tab is intentionally made very slow to" - + " 'produce' server-side. When you changes to this tab for the" - + " first time, there will be a 3 second wait before the content" - + " shows up, but the second time it shows up immediately since the" - + " content has not changed and is cached client-side."; - - public ClientCachingExample() { - - final VerticalLayout main = new VerticalLayout(); - main.setMargin(true); - setCompositionRoot(main); - - main.addComponent(new Label(msg)); - - final TabSheet ts = new TabSheet(); - main.addComponent(ts); - - Layout layout = new VerticalLayout(); - layout.setMargin(true); - Label l = new Label("This is a normal label, quick to render."); - l.setCaption("A normal label"); - layout.addComponent(l); - - ts.addTab(layout, "Normal", null); - - layout = new VerticalLayout(); - layout.setMargin(true); - l = new Label("Slow label - until cached client side.") { - @Override - public void paintContent(PaintTarget target) throws PaintException { - try { - Thread.sleep(3000); - } catch (final Exception e) { - // IGNORED - } - super.paintContent(target); - } - - }; - l.setCaption("A slow label"); - layout.addComponent(l); - ts.addTab(layout, "Slow", null); - - } -} diff --git a/src/com/vaadin/demo/featurebrowser/ComboBoxExample.java b/src/com/vaadin/demo/featurebrowser/ComboBoxExample.java deleted file mode 100644 index 60ccd23f27..0000000000 --- a/src/com/vaadin/demo/featurebrowser/ComboBoxExample.java +++ /dev/null @@ -1,71 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.featurebrowser; - -import java.util.Random; - -import com.vaadin.ui.ComboBox; -import com.vaadin.ui.CustomComponent; -import com.vaadin.ui.VerticalLayout; -import com.vaadin.ui.AbstractSelect.Filtering; - -/** - * - */ -@SuppressWarnings("serial") -public class ComboBoxExample extends CustomComponent { - - private static final String[] firstnames = new String[] { "John", "Mary", - "Joe", "Sarah", "Jeff", "Jane", "Peter", "Marc", "Robert", "Paula", - "Lenny", "Kenny", "Nathan", "Nicole", "Laura", "Jos", "Josie", - "Linus" }; - - private static final String[] lastnames = new String[] { "Torvalds", - "Smith", "Adams", "Black", "Wilson", "Richards", "Thompson", - "McGoff", "Halas", "Jones", "Beck", "Sheridan", "Picard", "Hill", - "Fielding", "Einstein" }; - - public ComboBoxExample() { - final VerticalLayout main = new VerticalLayout(); - main.setMargin(true); - setCompositionRoot(main); - - // starts-with filter - final ComboBox s1 = new ComboBox("Select with starts-with filter"); - s1.setFilteringMode(Filtering.FILTERINGMODE_STARTSWITH); - s1.setWidth("20em"); - Random r = new Random(5); - for (int i = 0; i < 105; i++) { - s1 - .addItem(firstnames[(int) (r.nextDouble() * (firstnames.length - 1))] - + " " - + lastnames[(int) (r.nextDouble() * (lastnames.length - 1))]); - } - s1.setImmediate(true); - main.addComponent(s1); - - // contains filter - final ComboBox s2 = new ComboBox("Select with contains filter"); - s2.setFilteringMode(Filtering.FILTERINGMODE_CONTAINS); - s2.setWidth("20em"); - for (int i = 0; i < 500; i++) { - s2 - .addItem(firstnames[(int) (r.nextDouble() * (firstnames.length - 1))] - + " " - + lastnames[(int) (r.nextDouble() * (lastnames.length - 1))]); - } - s2.setImmediate(true); - main.addComponent(s2); - - // initially empty - final ComboBox s3 = new ComboBox("Initially empty; enter your own"); - s3.setWidth("20em"); - s3.setImmediate(true); - s3.setNewItemsAllowed(true); - main.addComponent(s3); - - } - -} diff --git a/src/com/vaadin/demo/featurebrowser/EmbeddedBrowserExample.java b/src/com/vaadin/demo/featurebrowser/EmbeddedBrowserExample.java deleted file mode 100644 index 641838dfdd..0000000000 --- a/src/com/vaadin/demo/featurebrowser/EmbeddedBrowserExample.java +++ /dev/null @@ -1,89 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.featurebrowser; - -import java.net.MalformedURLException; -import java.net.URL; - -import com.vaadin.data.Property.ValueChangeEvent; -import com.vaadin.terminal.ExternalResource; -import com.vaadin.ui.Embedded; -import com.vaadin.ui.Select; -import com.vaadin.ui.VerticalLayout; -import com.vaadin.ui.Window.Notification; - -/** - * Demonstrates the use of Embedded and "suggesting" Select by creating a simple - * web-browser. Note: does not check for recursion. - * - * @author IT Mill Ltd. - * @see com.vaadin.ui.Window - */ -@SuppressWarnings("serial") -public class EmbeddedBrowserExample extends VerticalLayout implements - Select.ValueChangeListener { - - // Default URL to open. - private static final String DEFAULT_URL = "http://www.vaadin.com/"; - - // The embedded page - Embedded emb = new Embedded(); - - public EmbeddedBrowserExample() { - this(new String[] { DEFAULT_URL, "http://www.vaadin.com/learn", - "http://www.vaadin.com/api", "http://www.vaadin.com/book" }); - } - - public EmbeddedBrowserExample(String[] urls) { - setSizeFull(); - - // create the address combobox - final Select select = new Select(); - // allow input - select.setNewItemsAllowed(true); - // no empty selection - select.setNullSelectionAllowed(false); - // no 'go' -button clicking necessary - select.setImmediate(true); - // add some pre-configured URLs - for (int i = 0; i < urls.length; i++) { - select.addItem(urls[i]); - } - // add to layout - addComponent(select); - // add listener and select initial URL - select.addListener(this); - select.setValue(urls[0]); - - select.setWidth("100%"); - - // configure the embedded and add to layout - emb.setType(Embedded.TYPE_BROWSER); - emb.setSizeFull(); - addComponent(emb); - // make the embedded as large as possible - setExpandRatio(emb, 1); - - } - - public void valueChange(ValueChangeEvent event) { - final String url = (String) event.getProperty().getValue(); - if (url != null) { - try { - // the selected url has changed, let's go there - @SuppressWarnings("unused") - URL u = new URL(url); - emb.setSource(new ExternalResource(url)); - - } catch (MalformedURLException e) { - getWindow().showNotification("Invalid address", - e.getMessage() + " (example: http://www.vaadin.com)", - Notification.TYPE_WARNING_MESSAGE); - } - - } - - } -} diff --git a/src/com/vaadin/demo/featurebrowser/FeatureBrowser.java b/src/com/vaadin/demo/featurebrowser/FeatureBrowser.java deleted file mode 100644 index 5b9e769015..0000000000 --- a/src/com/vaadin/demo/featurebrowser/FeatureBrowser.java +++ /dev/null @@ -1,383 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.featurebrowser; - -import java.util.HashMap; -import java.util.Iterator; - -import com.vaadin.data.Item; -import com.vaadin.data.Property; -import com.vaadin.data.Property.ValueChangeEvent; -import com.vaadin.data.util.HierarchicalContainer; -import com.vaadin.data.util.IndexedContainer; -import com.vaadin.terminal.ExternalResource; -import com.vaadin.terminal.ThemeResource; -import com.vaadin.ui.AbstractSelect; -import com.vaadin.ui.Alignment; -import com.vaadin.ui.Button; -import com.vaadin.ui.Component; -import com.vaadin.ui.Embedded; -import com.vaadin.ui.HorizontalLayout; -import com.vaadin.ui.Label; -import com.vaadin.ui.Layout; -import com.vaadin.ui.Select; -import com.vaadin.ui.SplitPanel; -import com.vaadin.ui.TabSheet; -import com.vaadin.ui.Table; -import com.vaadin.ui.Tree; -import com.vaadin.ui.VerticalLayout; -import com.vaadin.ui.Window; -import com.vaadin.ui.Button.ClickEvent; - -/** - * - * @author IT Mill Ltd. - * @see com.vaadin.ui.Window - */ -@SuppressWarnings("serial") -public class FeatureBrowser extends com.vaadin.Application implements - Select.ValueChangeListener { - - // Property IDs - private static final Object PROPERTY_ID_CATEGORY = "Category"; - private static final Object PROPERTY_ID_NAME = "Name"; - private static final Object PROPERTY_ID_DESC = "Description"; - private static final Object PROPERTY_ID_CLASS = "Class"; - private static final Object PROPERTY_ID_VIEWED = "Viewed"; - - // Global components - private Tree tree; - private Table table; - private TabSheet ts; - - // Example "cache" - private final HashMap, Component> exampleInstances = new HashMap, Component>(); - private String section; - - // List of examples - private static final Object[][] demos = new Object[][] { - // Category, Name, Desc, Class, Viewed - // Getting started: Labels - { "Getting started", "Labels", "Some variations of Labels", - LabelExample.class }, - // Getting started: Buttons - { "Getting started", "Buttons and links", - "Various Buttons and Links", ButtonExample.class }, - // Getting started: Fields - { "Getting started", "Basic value input", - "TextFields, DateFields, and such", ValueInputExample.class }, - // - { "Getting started", "RichText", "Rich text editing", - RichTextExample.class }, - // Getting started: Selects - { "Getting started", "Choices, choices", - "Some variations of simple selects", SelectExample.class }, - // Layouts - { "Layouts", "Basic layouts", "Laying out components", - LayoutExample.class }, - // Layouts - { "Layouts", "Accordion", "Play the Accordion!", - AccordionExample.class }, - // Wrangling data: ComboBox - { "Wrangling data", "ComboBox", "ComboBox - the swiss army select", - ComboBoxExample.class }, - // Wrangling data: Table - { - "Wrangling data", - "Table (\"grid\")", - "Table with bells, whistles, editmode and actions (contextmenu)", - TableExample.class }, - // Wrangling data: Form - { "Wrangling data", "Form", "Every application needs forms", - FormExample.class }, - // Wrangling data: Tree - { "Wrangling data", "Tree", "A hierarchy of things", - TreeExample.class }, - // Misc: Notifications - { "Misc", "Notifications", "Notifications can improve usability", - NotificationExample.class }, - // Misc: Caching - { "Misc", "Client caching", "Demonstrating of client-side caching", - ClientCachingExample.class }, - // Misc: Embedded - { "Misc", "Embedding", - "Embedding resources - another site in this case", - EmbeddedBrowserExample.class }, - // Windowing - { "Misc", "Windowing", "About windowing", WindowingExample.class }, - // JavaScript API - { "Misc", "JavaScript API", "JavaScript to Vaadin communication", - JavaScriptAPIExample.class }, - // END - }; - - @Override - public void init() { - - // Need to set a theme for ThemeResources to work - setTheme("example"); - - // Create new window for the application and give the window a visible. - final Window main = new Window("Vaadin 6"); - // set as main window - setMainWindow(main); - - final SplitPanel split = new SplitPanel( - SplitPanel.ORIENTATION_HORIZONTAL); - split.setSplitPosition(200, SplitPanel.UNITS_PIXELS); - main.setContent(split); - - final HashMap sectionIds = new HashMap(); - final HierarchicalContainer container = createContainer(); - final Object rootId = container.addItem(); - Item item = container.getItem(rootId); - Property p = item.getItemProperty(PROPERTY_ID_NAME); - p.setValue("All examples"); - for (int i = 0; i < demos.length; i++) { - final Object[] demo = demos[i]; - final String section = (String) demo[0]; - Object sectionId; - if (sectionIds.containsKey(section)) { - sectionId = sectionIds.get(section); - } else { - sectionId = container.addItem(); - sectionIds.put(section, sectionId); - container.setParent(sectionId, rootId); - item = container.getItem(sectionId); - p = item.getItemProperty(PROPERTY_ID_NAME); - p.setValue(section); - } - final Object id = container.addItem(); - container.setParent(id, sectionId); - initItem(container.getItem(id), demo); - - } - - tree = new Tree(); - tree.setDebugId("FeatureBrowser: Main Tree"); - tree.setSelectable(true); - tree.setMultiSelect(false); - tree.setNullSelectionAllowed(false); - tree.setContainerDataSource(container); - tree.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY); - tree.setItemCaptionPropertyId(PROPERTY_ID_NAME); - tree.addListener(this); - tree.setImmediate(true); - tree.expandItemsRecursively(rootId); - for (Iterator i = container.getItemIds().iterator(); i.hasNext();) { - Object id = i.next(); - if (container.getChildren(id) == null) { - tree.setChildrenAllowed(id, false); - } - } - - split.addComponent(tree); - - final SplitPanel split2 = new SplitPanel(); - split2.setSplitPosition(200, SplitPanel.UNITS_PIXELS); - split.addComponent(split2); - - table = new Table(); - table.setDebugId("FeatureBrowser: Main Table"); - table.setSizeFull(); - table.setColumnReorderingAllowed(true); - table.setColumnCollapsingAllowed(true); - table.setSelectable(true); - table.setMultiSelect(false); - table.setNullSelectionAllowed(false); - try { - table.setContainerDataSource((IndexedContainer) container.clone()); - } catch (final Exception e) { - e.printStackTrace(System.err); - } - // Hide some columns - table.setVisibleColumns(new Object[] { PROPERTY_ID_CATEGORY, - PROPERTY_ID_NAME, PROPERTY_ID_DESC, PROPERTY_ID_VIEWED }); - table.addListener(this); - table.setImmediate(true); - split2.addComponent(table); - - final VerticalLayout exp = new VerticalLayout(); - exp.setSizeFull(); - exp.setMargin(true); - split2.addComponent(exp); - - final HorizontalLayout wbLayout = new HorizontalLayout(); - Button b = new Button("Open in sub-window", new Button.ClickListener() { - public void buttonClick(ClickEvent event) { - Component component = (Component) ts.getComponentIterator() - .next(); - String caption = ts.getTab(component).getCaption(); - try { - component = component.getClass().newInstance(); - } catch (Exception e) { - // Could not create - return; - } - Window w = new Window(caption); - w.setWidth("640px"); - if (Layout.class.isAssignableFrom(component.getClass())) { - w.setContent((Layout) component); - } else { - // w.getLayout().getSize().setSizeFull(); - w.addComponent(component); - } - getMainWindow().addWindow(w); - } - }); - b.setStyleName(Button.STYLE_LINK); - wbLayout.addComponent(b); - b = new Button("Open in native window", new Button.ClickListener() { - public void buttonClick(ClickEvent event) { - Component component = (Component) ts.getComponentIterator() - .next(); - final String caption = ts.getTab(component).getCaption(); - Window w = getWindow(caption); - if (w == null) { - try { - component = component.getClass().newInstance(); - } catch (final Exception e) { - // Could not create - return; - } - w = new Window(caption); - w.setName(caption); - if (Layout.class.isAssignableFrom(component.getClass())) { - w.setContent((Layout) component); - } else { - // w.getLayout().getSize().setSizeFull(); - w.addComponent(component); - } - addWindow(w); - } - getMainWindow().open(new ExternalResource(w.getURL()), caption); - } - }); - b.setStyleName(Button.STYLE_LINK); - wbLayout.addComponent(b); - - exp.addComponent(wbLayout); - exp.setComponentAlignment(wbLayout, Alignment.TOP_RIGHT); - - ts = new TabSheet(); - ts.setSizeFull(); - ts.addTab(new Label(""), "Choose example", null); - exp.addComponent(ts); - exp.setExpandRatio(ts, 1); - - final Label status = new Label( - "30 Seconds to Vaadin" - + " | Book of Vaadin"); - status.setContentMode(Label.CONTENT_XHTML); - exp.addComponent(status); - exp.setComponentAlignment(status, Alignment.MIDDLE_RIGHT); - - // select initial section ("All") - tree.setValue(rootId); - - getMainWindow() - .showNotification( - "Welcome", - "Choose an example to begin.

And remember to experiment!", - Window.Notification.TYPE_TRAY_NOTIFICATION); - } - - private void initItem(Item item, Object[] data) { - int p = 0; - Property prop = item.getItemProperty(PROPERTY_ID_CATEGORY); - prop.setValue(data[p++]); - prop = item.getItemProperty(PROPERTY_ID_NAME); - prop.setValue(data[p++]); - prop = item.getItemProperty(PROPERTY_ID_DESC); - prop.setValue(data[p++]); - prop = item.getItemProperty(PROPERTY_ID_CLASS); - prop.setValue(data[p++]); - } - - private HierarchicalContainer createContainer() { - final HierarchicalContainer c = new HierarchicalContainer(); - c.addContainerProperty(PROPERTY_ID_CATEGORY, String.class, null); - c.addContainerProperty(PROPERTY_ID_NAME, String.class, ""); - c.addContainerProperty(PROPERTY_ID_DESC, String.class, ""); - c.addContainerProperty(PROPERTY_ID_CLASS, Class.class, null); - c.addContainerProperty(PROPERTY_ID_VIEWED, Embedded.class, null); - return c; - } - - public void valueChange(ValueChangeEvent event) { - if (event.getProperty() == tree) { - final Object id = tree.getValue(); - if (id == null) { - return; - } - final Item item = tree.getItem(id); - // - String newSection; - if (tree.isRoot(id)) { - newSection = ""; // show all sections - } else if (tree.hasChildren(id)) { - newSection = (String) item.getItemProperty(PROPERTY_ID_NAME) - .getValue(); - } else { - newSection = (String) item - .getItemProperty(PROPERTY_ID_CATEGORY).getValue(); - } - - table.setValue(null); - final IndexedContainer c = (IndexedContainer) table - .getContainerDataSource(); - - if (newSection != null && !newSection.equals(section)) { - c.removeAllContainerFilters(); - c.addContainerFilter(PROPERTY_ID_CATEGORY, newSection, false, - true); - } - section = newSection; - if (!tree.hasChildren(id)) { - // Example, not section - // update table selection - table.setValue(id); - } - - } else if (event.getProperty() == table) { - if (table.getValue() != null) { - table.removeListener(this); - tree.setValue(table.getValue()); - table.addListener(this); - final Item item = table.getItem(table.getValue()); - final Class c = (Class) item.getItemProperty( - PROPERTY_ID_CLASS).getValue(); - final Component component = getComponent(c); - if (component != null) { - final String caption = (String) item.getItemProperty( - PROPERTY_ID_NAME).getValue(); - ts.removeAllComponents(); - ts.addTab(component, caption, null); - } - // update "viewed" state - final Property p = item.getItemProperty(PROPERTY_ID_VIEWED); - if (p.getValue() == null) { - p.setValue(new Embedded("", new ThemeResource( - "icons/ok.png"))); - } - table.requestRepaint(); - } - } - - } - - private Component getComponent(Class componentClass) { - if (!exampleInstances.containsKey(componentClass)) { - try { - final Component c = (Component) componentClass.newInstance(); - exampleInstances.put(componentClass, c); - } catch (final Exception e) { - return null; - } - } - return exampleInstances.get(componentClass); - } - -} diff --git a/src/com/vaadin/demo/featurebrowser/FormExample.java b/src/com/vaadin/demo/featurebrowser/FormExample.java deleted file mode 100644 index 52a2a98d80..0000000000 --- a/src/com/vaadin/demo/featurebrowser/FormExample.java +++ /dev/null @@ -1,230 +0,0 @@ -package com.vaadin.demo.featurebrowser; - -import com.vaadin.data.Item; -import com.vaadin.data.Validator; -import com.vaadin.data.Validator.InvalidValueException; -import com.vaadin.data.util.BeanItem; -import com.vaadin.ui.Button; -import com.vaadin.ui.Component; -import com.vaadin.ui.CustomComponent; -import com.vaadin.ui.DefaultFieldFactory; -import com.vaadin.ui.Field; -import com.vaadin.ui.Form; -import com.vaadin.ui.HorizontalLayout; -import com.vaadin.ui.TextField; -import com.vaadin.ui.VerticalLayout; -import com.vaadin.ui.Button.ClickEvent; -import com.vaadin.ui.Button.ClickListener; - -/** - * This example demonstrates the most important features of the Form component: - * binding Form to a JavaBean so that form fields are automatically generated - * from the bean properties, creation of custom field editors using a - * FieldFactory, customizing the form without FieldFactory, buffering - * (commit/discard) and validation. Please note that the example is quite a bit - * more complex than real use, as it tries to demonstrate more features than - * needed in general case. - */ -@SuppressWarnings("serial") -public class FormExample extends CustomComponent { - - static final String cities[] = { "Amsterdam", "Berlin", "Helsinki", - "Hong Kong", "London", "Luxemburg", "New York", "Oslo", "Paris", - "Rome", "Stockholm", "Tokyo", "Turku" }; - - /** Compose the demo. */ - public FormExample() { - - // Example data model - final Address dataModel = new Address(); - Button peekDataModelState = new Button("Show the data model state", - new Button.ClickListener() { - - public void buttonClick(ClickEvent event) { - getWindow().showNotification( - dataModel.getAddressAsText()); - } - }); - - // Example form - final AddressForm form = new AddressForm("Contact Information"); - form.setDataSource(dataModel); - form - .setDescription("Please enter valid name and address. Fields marked with * are required. " - + "If you try to commit with invalid values, a form error message is displayed. " - + "(Address is required but failing to give it a value does not display an error.)"); - - // Layout the example - VerticalLayout root = new VerticalLayout(); - root.setMargin(true); - root.setSpacing(true); - root.addComponent(form); - root.addComponent(peekDataModelState); - setCompositionRoot(root); - } - - public static class AddressForm extends Form { - public AddressForm(String caption) { - - setCaption(caption); - - // Use custom field factory to modify the defaults on how the - // components are created - setFormFieldFactory(new MyFieldFactory()); - - // Add Commit and Discard controls to the form. - - Button commit = new Button("Save", new ClickListener() { - - public void buttonClick(ClickEvent event) { - try { - commit(); - } catch (InvalidValueException e) { - // Failed to commit. The validation errors are - // automatically shown to the user. - } - } - - }); - - Button discard = new Button("Reset", this, "discard"); - HorizontalLayout footer = new HorizontalLayout(); - footer.addComponent(commit); - footer.addComponent(discard); - setFooter(footer); - } - - public void setDataSource(Address dataModel) { - - // Set the form to edit given datamodel by converting pojo used as - // the datamodel to Item - setItemDataSource(new BeanItem(dataModel)); - - // Ensure that the fields are shown in correct order as the - // datamodel does not force any specific order. - setVisibleItemProperties(new String[] { "name", "streetAddress", - "postalCode", "city" }); - - // For examples sake, customize some of the form fields directly - // here. The alternative way is to use custom field factory as shown - // above. - getField("name").setRequired(true); - getField("name").setDescription("Please enter name"); - getField("name").setRequiredError("Name is missing"); - getField("streetAddress").setRequired(true); // No error message - getField("streetAddress").setDescription( - "Please enter street adderss."); - getField("postalCode").setRequired(true); // No error message - getField("postalCode").setDescription( - "Please enter postal code. Example: 12345."); - replaceWithSelect("city", cities, cities).setNewItemsAllowed(true); - getField("city") - .setDescription( - "Select city from list or type it. City field is not required."); - - // Set the form to act immediately on user input. This is - // automatically transports data between the client and the server - // to do server-side validation. - setImmediate(true); - - // Enable buffering so that commit() must be called for the form - // before input is written to the data. (Form input is not written - // immediately through to the underlying object.) - setWriteThrough(false); - } - } - - /** - * This is example on how to customize field creation. Any kind of field - * components could be created on the fly. - */ - static class MyFieldFactory extends DefaultFieldFactory { - - @Override - public Field createField(Item item, Object propertyId, - Component uiContext) { - - Field field = super.createField(item, propertyId, uiContext); - - if ("postalCode".equals(propertyId)) { - ((TextField) field).setColumns(5); - field.addValidator(new PostalCodeValidator()); - } - - return field; - } - - } - - /** - * This is an example of how to create a custom validator for automatic - * input validation. - */ - static class PostalCodeValidator implements Validator { - - public boolean isValid(Object value) { - if (value == null || !(value instanceof String)) { - return false; - } - - return ((String) value).matches("[0-9]{5}"); - } - - public void validate(Object value) throws InvalidValueException { - if (!isValid(value)) { - throw new InvalidValueException( - "Postal code must be a five digit number."); - } - } - } - - /** - * Contact information data model created as POJO. Note that in many cases - * it would be a good idea to implement Item -interface for the datamodel to - * make it directly bindable to form (without BeanItem wrapper) - */ - public static class Address { - String name = ""; - String streetAddress = ""; - String postalCode = ""; - String city; - - public String getAddressAsText() { - return name + "\n" + streetAddress + "\n" + postalCode + " " - + (city == null ? "" : city); - } - - public void setName(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - public void setStreetAddress(String address) { - streetAddress = address; - } - - public String getStreetAddress() { - return streetAddress; - } - - public void setPostalCode(String postalCode) { - this.postalCode = postalCode; - } - - public String getPostalCode() { - return postalCode; - } - - public void setCity(String city) { - this.city = city; - } - - public String getCity() { - return city; - } - } - -} diff --git a/src/com/vaadin/demo/featurebrowser/GeneratedColumnExample.java b/src/com/vaadin/demo/featurebrowser/GeneratedColumnExample.java deleted file mode 100644 index 0ce1afb511..0000000000 --- a/src/com/vaadin/demo/featurebrowser/GeneratedColumnExample.java +++ /dev/null @@ -1,559 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.featurebrowser; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.GregorianCalendar; - -import com.vaadin.data.Container; -import com.vaadin.data.Item; -import com.vaadin.data.Property; -import com.vaadin.data.Container.Indexed; -import com.vaadin.data.util.BeanItem; -import com.vaadin.ui.AbstractField; -import com.vaadin.ui.CheckBox; -import com.vaadin.ui.Component; -import com.vaadin.ui.CustomComponent; -import com.vaadin.ui.DefaultFieldFactory; -import com.vaadin.ui.Field; -import com.vaadin.ui.Label; -import com.vaadin.ui.Table; -import com.vaadin.ui.VerticalLayout; -import com.vaadin.ui.Button.ClickEvent; -import com.vaadin.ui.Button.ClickListener; - -/** - * This example demonstrates the use of generated columns in a table. Generated - * columns can be used for formatting values or calculating them from other - * columns (or properties of the items). - * - * For the data model, we use POJOs bound to a custom Container with BeanItem - * items. - * - * @author magi - */ -@SuppressWarnings("serial") -public class GeneratedColumnExample extends CustomComponent { - /** - * The business model: fill-up at a gas station. - */ - public class FillUp { - Date date; - double quantity; - double total; - - public FillUp() { - } - - public FillUp(int day, int month, int year, double quantity, - double total) { - date = new GregorianCalendar(year, month - 1, day).getTime(); - this.quantity = quantity; - this.total = total; - } - - /** Calculates price per unit of quantity (€/l). */ - public double price() { - if (quantity != 0.0) { - return total / quantity; - } else { - return 0.0; - } - } - - /** Calculates average daily consumption between two fill-ups. */ - public double dailyConsumption(FillUp other) { - double difference_ms = date.getTime() - other.date.getTime(); - double days = difference_ms / 1000 / 3600 / 24; - if (days < 0.5) { - days = 1.0; // Avoid division by zero if two fill-ups on the - // same day. - } - return quantity / days; - } - - /** Calculates average daily consumption between two fill-ups. */ - public double dailyCost(FillUp other) { - return price() * dailyConsumption(other); - } - - // Getters and setters - - public Date getDate() { - return date; - } - - public void setDate(Date date) { - this.date = date; - } - - public double getQuantity() { - return quantity; - } - - public void setQuantity(double quantity) { - this.quantity = quantity; - } - - public double getTotal() { - return total; - } - - public void setTotal(double total) { - this.total = total; - } - }; - - /** - * This is a custom container that allows adding BeanItems inside it. The - * BeanItem objects must be bound to an object. The item ID is an Integer - * from 0 to 99. - * - * Most of the interface methods are implemented with just dummy - * implementations, as they are not needed in this example. - */ - public class MySimpleIndexedContainer implements Container, Indexed { - ArrayList items; - Object itemtemplate; - - public MySimpleIndexedContainer(Object itemtemplate) { - this.itemtemplate = itemtemplate; - items = new ArrayList(); // Yeah this is just a test - } - - public boolean addContainerProperty(Object propertyId, Class type, - Object defaultValue) throws UnsupportedOperationException { - throw new UnsupportedOperationException(); - } - - public Item addItem(Object itemId) throws UnsupportedOperationException { - throw new UnsupportedOperationException(); - } - - public Object addItem() throws UnsupportedOperationException { - throw new UnsupportedOperationException(); - } - - /** - * This addItem method is specific for this container and allows adding - * BeanItem objects. The BeanItems must be bound to MyBean objects. - */ - public void addItem(BeanItem item) throws UnsupportedOperationException { - items.add(item); - } - - public boolean containsId(Object itemId) { - if (itemId instanceof Integer) { - int pos = ((Integer) itemId).intValue(); - if (pos >= 0 && pos < items.size()) { - return items.get(pos) != null; - } - } - return false; - } - - /** - * The Table will call this method to get the property objects for the - * columns. It uses the property objects to determine the data types of - * the columns. - */ - public Property getContainerProperty(Object itemId, Object propertyId) { - if (itemId instanceof Integer) { - int pos = ((Integer) itemId).intValue(); - if (pos >= 0 && pos < items.size()) { - Item item = items.get(pos); - - // The BeanItem provides the property objects for the items. - return item.getItemProperty(propertyId); - } - } - return null; - } - - /** Table calls this to get the column names. */ - public Collection getContainerPropertyIds() { - Item item = new BeanItem(itemtemplate); - - // The BeanItem knows how to get the property names from the bean. - return item.getItemPropertyIds(); - } - - public Item getItem(Object itemId) { - if (itemId instanceof Integer) { - int pos = ((Integer) itemId).intValue(); - if (pos >= 0 && pos < items.size()) { - return items.get(pos); - } - } - return null; - } - - public Collection getItemIds() { - ArrayList ids = new ArrayList(items.size()); - for (int i = 0; i < items.size(); i++) { - ids.add(Integer.valueOf(i)); - } - return ids; - } - - public Class getType(Object propertyId) { - return BeanItem.class; - } - - public boolean removeAllItems() throws UnsupportedOperationException { - throw new UnsupportedOperationException(); - } - - public boolean removeContainerProperty(Object propertyId) - throws UnsupportedOperationException { - throw new UnsupportedOperationException(); - } - - public boolean removeItem(Object itemId) - throws UnsupportedOperationException { - throw new UnsupportedOperationException(); - } - - public int size() { - return items.size(); - } - - public Object addItemAt(int index) throws UnsupportedOperationException { - // TODO Auto-generated method stub - return null; - } - - public Item addItemAt(int index, Object newItemId) - throws UnsupportedOperationException { - // TODO Auto-generated method stub - return null; - } - - public Object getIdByIndex(int index) { - return Integer.valueOf(index); - } - - public int indexOfId(Object itemId) { - return ((Integer) itemId).intValue(); - } - - public Object addItemAfter(Object previousItemId) - throws UnsupportedOperationException { - // TODO Auto-generated method stub - return null; - } - - public Item addItemAfter(Object previousItemId, Object newItemId) - throws UnsupportedOperationException { - // TODO Auto-generated method stub - return null; - } - - public Object firstItemId() { - return new Integer(0); - } - - public boolean isFirstId(Object itemId) { - return ((Integer) itemId).intValue() == 0; - } - - public boolean isLastId(Object itemId) { - return ((Integer) itemId).intValue() == (items.size() - 1); - } - - public Object lastItemId() { - return new Integer(items.size() - 1); - } - - public Object nextItemId(Object itemId) { - int pos = indexOfId(itemId); - if (pos >= items.size() - 1) { - return null; - } - return getIdByIndex(pos + 1); - } - - public Object prevItemId(Object itemId) { - int pos = indexOfId(itemId); - if (pos <= 0) { - return null; - } - return getIdByIndex(pos - 1); - } - } - - /** Formats the dates in a column containing Date objects. */ - class DateColumnGenerator implements Table.ColumnGenerator { - /** - * Generates the cell containing the Date value. The column is - * irrelevant in this use case. - */ - public Component generateCell(Table source, Object itemId, - Object columnId) { - Property prop = source.getItem(itemId).getItemProperty(columnId); - if (prop.getType().equals(Date.class)) { - Label label = new Label(String.format("%tF", - new Object[] { (Date) prop.getValue() })); - label.addStyleName("column-type-date"); - return label; - } - - return null; - } - } - - /** Formats the value in a column containing Double objects. */ - class ValueColumnGenerator implements Table.ColumnGenerator { - String format; /* Format string for the Double values. */ - - /** Creates double value column formatter with the given format string. */ - public ValueColumnGenerator(String format) { - this.format = format; - } - - /** - * Generates the cell containing the Double value. The column is - * irrelevant in this use case. - */ - public Component generateCell(Table source, Object itemId, - Object columnId) { - Property prop = source.getItem(itemId).getItemProperty(columnId); - if (prop.getType().equals(Double.class)) { - Label label = new Label(String.format(format, - new Object[] { (Double) prop.getValue() })); - - // Set styles for the column: one indicating that it's a value - // and a more - // specific one with the column name in it. This assumes that - // the column - // name is proper for CSS. - label.addStyleName("column-type-value"); - label.addStyleName("column-" + (String) columnId); - return label; - } - return null; - } - } - - /** Table column generator for calculating price column. */ - class PriceColumnGenerator implements Table.ColumnGenerator { - public Component generateCell(Table source, Object itemId, - Object columnId) { - // Retrieve the item. - BeanItem item = (BeanItem) source.getItem(itemId); - - // Retrieves the underlying POJO from the item. - FillUp fillup = (FillUp) item.getBean(); - - // Do the business logic - double price = fillup.price(); - - // Create the generated component for displaying the calcucated - // value. - Label label = new Label(String.format("%1.2f €", - new Object[] { new Double(price) })); - - // We set the style here. You can't use a CellStyleGenerator for - // generated columns. - label.addStyleName("column-price"); - return label; - } - } - - /** Table column generator for calculating consumption column. */ - class ConsumptionColumnGenerator implements Table.ColumnGenerator { - /** - * Generates a cell containing value calculated from the item. - */ - public Component generateCell(Table source, Object itemId, - Object columnId) { - Indexed indexedSource = (Indexed) source.getContainerDataSource(); - - // Can not calculate consumption for the first item. - if (indexedSource.isFirstId(itemId)) { - Label label = new Label("N/A"); - label.addStyleName("column-consumption"); - return label; - } - - // Index of the previous item. - Object prevItemId = indexedSource.prevItemId(itemId); - - // Retrieve the POJOs. - FillUp fillup = (FillUp) ((BeanItem) indexedSource.getItem(itemId)) - .getBean(); - FillUp prev = (FillUp) ((BeanItem) source.getItem(prevItemId)) - .getBean(); - - // Do the business logic - return generateCell(fillup, prev); - } - - public Component generateCell(FillUp fillup, FillUp prev) { - double consumption = fillup.dailyConsumption(prev); - - // Generate the component for displaying the calculated value. - Label label = new Label(String.format("%3.2f l", - new Object[] { new Double(consumption) })); - - // We set the style here. You can't use a CellStyleGenerator for - // generated columns. - label.addStyleName("column-consumption"); - return label; - } - } - - /** Table column generator for calculating daily cost column. */ - class DailyCostColumnGenerator extends ConsumptionColumnGenerator { - @Override - public Component generateCell(FillUp fillup, FillUp prev) { - double dailycost = fillup.dailyCost(prev); - - // Generate the component for displaying the calculated value. - Label label = new Label(String.format("%3.2f €", - new Object[] { new Double(dailycost) })); - - // We set the style here. You can't use a CellStyleGenerator for - // generated columns. - label.addStyleName("column-dailycost"); - return label; - } - } - - /** - * Custom field factory that sets the fields as immediate. - */ - public class ImmediateFieldFactory extends DefaultFieldFactory { - @Override - public Field createField(Container container, Object itemId, - Object propertyId, Component uiContext) { - // Let the DefaultFieldFactory create the fields - Field field = super.createField(container, itemId, propertyId, - uiContext); - - // ...and just set them as immediate - ((AbstractField) field).setImmediate(true); - - return field; - } - } - - public GeneratedColumnExample() { - final Table table = new Table(); - - // Define table columns. These include also the column for the generated - // column, because we want to set the column label to something - // different than the property ID. - table - .addContainerProperty("date", Date.class, null, "Date", null, - null); - table.addContainerProperty("quantity", Double.class, null, - "Quantity (l)", null, null); - table.addContainerProperty("price", Double.class, null, "Price (€/l)", - null, null); - table.addContainerProperty("total", Double.class, null, "Total (€)", - null, null); - table.addContainerProperty("consumption", Double.class, null, - "Consumption (l/day)", null, null); - table.addContainerProperty("dailycost", Double.class, null, - "Daily Cost (€/day)", null, null); - - // Define the generated columns and their generators. - table.addGeneratedColumn("date", new DateColumnGenerator()); - table - .addGeneratedColumn("quantity", new ValueColumnGenerator( - "%.2f l")); - table.addGeneratedColumn("price", new PriceColumnGenerator()); - table.addGeneratedColumn("total", new ValueColumnGenerator("%.2f €")); - table.addGeneratedColumn("consumption", - new ConsumptionColumnGenerator()); - table.addGeneratedColumn("dailycost", new DailyCostColumnGenerator()); - - // Create a data source and bind it to the table. - MySimpleIndexedContainer data = new MySimpleIndexedContainer( - new FillUp()); - table.setContainerDataSource(data); - - // Generated columns are automatically placed after property columns, so - // we have to set the order of the columns explicitly. - table.setVisibleColumns(new Object[] { "date", "quantity", "price", - "total", "consumption", "dailycost" }); - - // Add some data. - data.addItem(new BeanItem(new FillUp(19, 2, 2005, 44.96, 51.21))); - data.addItem(new BeanItem(new FillUp(30, 3, 2005, 44.91, 53.67))); - data.addItem(new BeanItem(new FillUp(20, 4, 2005, 42.96, 49.06))); - data.addItem(new BeanItem(new FillUp(23, 5, 2005, 47.37, 55.28))); - data.addItem(new BeanItem(new FillUp(6, 6, 2005, 35.34, 41.52))); - data.addItem(new BeanItem(new FillUp(30, 6, 2005, 16.07, 20.00))); - data.addItem(new BeanItem(new FillUp(2, 7, 2005, 36.40, 36.19))); - data.addItem(new BeanItem(new FillUp(6, 7, 2005, 39.17, 50.90))); - data.addItem(new BeanItem(new FillUp(27, 7, 2005, 43.43, 53.03))); - data.addItem(new BeanItem(new FillUp(17, 8, 2005, 20, 29.18))); - data.addItem(new BeanItem(new FillUp(30, 8, 2005, 46.06, 59.09))); - data.addItem(new BeanItem(new FillUp(22, 9, 2005, 46.11, 60.36))); - data.addItem(new BeanItem(new FillUp(14, 10, 2005, 41.51, 50.19))); - data.addItem(new BeanItem(new FillUp(12, 11, 2005, 35.24, 40.00))); - data.addItem(new BeanItem(new FillUp(28, 11, 2005, 45.26, 53.27))); - - // Have a check box that allows the user to make the quantity - // and total columns editable. - final CheckBox editable = new CheckBox( - "Edit the input values - calculated columns are regenerated"); - editable.setImmediate(true); - editable.addListener(new ClickListener() { - public void buttonClick(ClickEvent event) { - table.setEditable(editable.booleanValue()); - - // The columns may not be generated when we want to have them - // editable. - if (editable.booleanValue()) { - table.removeGeneratedColumn("quantity"); - table.removeGeneratedColumn("total"); - } else { - // In non-editable mode we want to show the formatted - // values. - table.addGeneratedColumn("quantity", - new ValueColumnGenerator("%.2f l")); - table.addGeneratedColumn("total", new ValueColumnGenerator( - "%.2f €")); - } - // The visible columns are affected by removal and addition of - // generated columns so we have to redefine them. - table.setVisibleColumns(new Object[] { "date", "quantity", - "price", "total", "consumption", "dailycost" }); - } - }); - - // Use a custom field factory to set the edit fields as immediate. - // This is used when the table is in editable mode. - table.setTableFieldFactory(new ImmediateFieldFactory()); - - // Setting the table itself as immediate has no relevance in this - // example, - // because it is relevant only if the table is selectable and we want to - // get the selection changes immediately. - table.setImmediate(true); - - table.setHeight("300px"); - - VerticalLayout layout = new VerticalLayout(); - layout.setMargin(true); - layout - .addComponent(new Label( - "Table with column generators that format and calculate cell values.")); - layout.addComponent(table); - layout.addComponent(editable); - layout.addComponent(new Label( - "Columns displayed in blue are calculated from Quantity and Total. " - + "Others are simply formatted.")); - layout.setExpandRatio(table, 1); - layout.setSizeUndefined(); - setCompositionRoot(layout); - // setSizeFull(); - } -} diff --git a/src/com/vaadin/demo/featurebrowser/JavaScriptAPIExample.java b/src/com/vaadin/demo/featurebrowser/JavaScriptAPIExample.java deleted file mode 100644 index 70ff20daac..0000000000 --- a/src/com/vaadin/demo/featurebrowser/JavaScriptAPIExample.java +++ /dev/null @@ -1,98 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.featurebrowser; - -import java.util.Date; - -import com.vaadin.terminal.PaintException; -import com.vaadin.terminal.PaintTarget; -import com.vaadin.ui.Alignment; -import com.vaadin.ui.Button; -import com.vaadin.ui.CustomComponent; -import com.vaadin.ui.Label; -import com.vaadin.ui.TextField; -import com.vaadin.ui.VerticalLayout; -import com.vaadin.ui.Button.ClickEvent; - -/** - * An example using a RichTextArea to edit a Label in XHTML-mode. - * - */ -@SuppressWarnings("serial") -public class JavaScriptAPIExample extends CustomComponent { - - public static final String txt = "

For advanced client side programmers Vaadin offers a simple method which can be used to force sync client with server. This may be needed for example if another part of a mashup changes things on server.

(more examples will be added here as the APIs are made public)

javascript:vaadin.forceSync();"; - - private final VerticalLayout main; - private final Label l; - private final TextField editor = new TextField(); - - public JavaScriptAPIExample() { - // main layout - main = new VerticalLayout(); - main.setMargin(true); - setCompositionRoot(main); - editor.setRows(7); - editor.setColumns(50); - // Add the label - l = new Label(txt); - l.setContentMode(Label.CONTENT_XHTML); - main.addComponent(l); - // Edit button with inline click-listener - Button b = new Button("Edit", new Button.ClickListener() { - public void buttonClick(ClickEvent event) { - // swap Label <-> RichTextArea - if (main.getComponentIterator().next() == l) { - editor.setValue(l.getValue()); - main.replaceComponent(l, editor); - event.getButton().setCaption("Save"); - } else { - l.setValue(editor.getValue()); - main.replaceComponent(editor, l); - event.getButton().setCaption("Edit"); - } - } - }); - main.addComponent(b); - main.setComponentAlignment(b, Alignment.MIDDLE_RIGHT); - - // - Label l = new Label( - "This label will update it's server-side value AFTER it's rendered to the client-side. " - + "The client will be synchronized on reload, when you click a button, " - + "or when vaadin.forceSync() is called.") { - - @Override - public void paintContent(PaintTarget target) throws PaintException { - - super.paintContent(target); - Delay d = new Delay(this); - d.start(); - } - - }; - main.addComponent(l); - - } - - private class Delay extends Thread { - Label label; - - public Delay(Label l) { - label = l; - } - - @Override - public void run() { - try { - Thread.sleep(500); - label.setValue(new Date().toString()); - } catch (Exception e) { - e.printStackTrace(); - } - } - - } -} diff --git a/src/com/vaadin/demo/featurebrowser/LabelExample.java b/src/com/vaadin/demo/featurebrowser/LabelExample.java deleted file mode 100644 index 0e89cbd77d..0000000000 --- a/src/com/vaadin/demo/featurebrowser/LabelExample.java +++ /dev/null @@ -1,78 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.featurebrowser; - -import com.vaadin.ui.CustomComponent; -import com.vaadin.ui.GridLayout; -import com.vaadin.ui.Label; -import com.vaadin.ui.Panel; - -/** - * Shows a few variations of Labels, including the effects of XHTML- and - * pre-formatted mode. - * - * @author IT Mill Ltd. - */ -@SuppressWarnings("serial") -public class LabelExample extends CustomComponent { - - private static final String xhtml = "This text has HTML formatting.
" - + "A plain Label will show the markup, while a XHTML-mode" - + " Label will show the formatted text."; - - private static final String pre = "This text has linebreaks.\n\n" - + "They will show up in a preformatted Label,\n" - + "but not in a \"plain\" Label.\n\n" - + " This is an indented row. \n Same indentation here."; - - public LabelExample() { - final GridLayout g = new GridLayout(2, 4); - g.setMargin(true); - setCompositionRoot(g); - g.setWidth("100%"); - - // plain w/o caption - Panel p = getExpamplePanel("Plain"); - Label l = new Label("A plain label without caption."); - p.addComponent(l); - g.addComponent(p); - // plain w/ caption - p = getExpamplePanel("Plain w/ caption + tooltip"); - l = new Label("A plain label with caption."); - l.setCaption("Label caption"); - l.setDescription("This is a description (tooltip) for the label."); - p.addComponent(l); - g.addComponent(p); - // plain w/ xhtml - p = getExpamplePanel("Plain w/ XHTML content"); - l = new Label(xhtml); - p.addComponent(l); - g.addComponent(p); - // xhtml w/ xhtml - p = getExpamplePanel("XHTML-mode w/ XHTML content"); - l = new Label(xhtml); - l.setContentMode(Label.CONTENT_XHTML); - p.addComponent(l); - g.addComponent(p); - // plain w/ preformatted - p = getExpamplePanel("Plain w/ preformatted content"); - l = new Label(pre); - p.addComponent(l); - g.addComponent(p); - // preformatted w/ preformatted - p = getExpamplePanel("Preformatted-mode w/ preformatted content"); - l = new Label(pre); - l.setContentMode(Label.CONTENT_PREFORMATTED); - p.addComponent(l); - g.addComponent(p); - - } - - private Panel getExpamplePanel(String caption) { - Panel p = new Panel(caption); - p.addStyleName(Panel.STYLE_LIGHT); - return p; - } -} diff --git a/src/com/vaadin/demo/featurebrowser/LayoutExample.java b/src/com/vaadin/demo/featurebrowser/LayoutExample.java deleted file mode 100644 index 34152c9c86..0000000000 --- a/src/com/vaadin/demo/featurebrowser/LayoutExample.java +++ /dev/null @@ -1,89 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.featurebrowser; - -import com.vaadin.ui.CustomComponent; -import com.vaadin.ui.GridLayout; -import com.vaadin.ui.HorizontalLayout; -import com.vaadin.ui.Label; -import com.vaadin.ui.Panel; -import com.vaadin.ui.TabSheet; -import com.vaadin.ui.VerticalLayout; - -/** - * A few examples of layout possibilities. - * - * @author IT Mill Ltd. - */ -@SuppressWarnings("serial") -public class LayoutExample extends CustomComponent { - - public LayoutExample() { - - final VerticalLayout main = new VerticalLayout(); - main.setMargin(true); - setCompositionRoot(main); - - final GridLayout g = new GridLayout(2, 5); - g.setWidth("100%"); - main.addComponent(g); - - // panel - Panel p = new Panel("This is a normal panel"); - Label l = new Label("A normal panel."); - p.addComponent(l); - g.addComponent(p); - // lightpanel - p = new Panel("This is a light panel"); - p.setStyleName(Panel.STYLE_LIGHT); - l = new Label("A light-style panel."); - p.addComponent(l); - g.addComponent(p); - - TabSheet ts = new TabSheet(); - g.addComponent(ts, 0, 1, 1, 1); - - VerticalLayout ol = new VerticalLayout(); - ol.setMargin(true); - ol.addComponent(new Label("Component 1")); - ol.addComponent(new Label("Component 2")); - ol.addComponent(new Label("Component 3")); - ts.addTab(ol, "Vertical OrderedLayout", null); - - HorizontalLayout hl = new HorizontalLayout(); - hl.setMargin(true); - hl.addComponent(new Label("Component 1")); - hl.addComponent(new Label("Component 2")); - hl.addComponent(new Label("Component 3")); - ts.addTab(hl, "Horizontal OrderedLayout", null); - - final GridLayout gl = new GridLayout(3, 3); - gl.setMargin(true); - gl.addComponent(new Label("Component 1.1")); - gl.addComponent(new Label("Component 1.2")); - gl.addComponent(new Label("Component 1.3")); - gl.addComponent(new Label("Component 2.2"), 1, 1); - gl.addComponent(new Label("Component 3.1"), 0, 2); - gl.addComponent(new Label("Component 3.3"), 2, 2); - ts.addTab(gl, "GridLayout", null); - - /*- TODO spitpanel removed for now - do we need it here? - ts = new TabSheet(); - ts.setHeight(150); - g.addComponent(ts, 0, 2, 1, 2); - - SplitPanel sp = new SplitPanel(); - sp.addComponent(new Label("Component 1")); - sp.addComponent(new Label("Component 2")); - ts.addTab(sp, "Vertical SplitPanel", null); - - sp = new SplitPanel(SplitPanel.ORIENTATION_HORIZONTAL); - sp.addComponent(new Label("Component 1")); - sp.addComponent(new Label("Component 2")); - ts.addTab(sp, "Horizontal SplitPanel", null); - -*/ - - } -} diff --git a/src/com/vaadin/demo/featurebrowser/NotificationExample.java b/src/com/vaadin/demo/featurebrowser/NotificationExample.java deleted file mode 100644 index 73b94c5577..0000000000 --- a/src/com/vaadin/demo/featurebrowser/NotificationExample.java +++ /dev/null @@ -1,96 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.featurebrowser; - -import com.vaadin.data.Item; -import com.vaadin.ui.AbstractSelect; -import com.vaadin.ui.Alignment; -import com.vaadin.ui.Button; -import com.vaadin.ui.CustomComponent; -import com.vaadin.ui.NativeSelect; -import com.vaadin.ui.RichTextArea; -import com.vaadin.ui.TextField; -import com.vaadin.ui.VerticalLayout; -import com.vaadin.ui.Window; -import com.vaadin.ui.Button.ClickEvent; -import com.vaadin.ui.Button.ClickListener; - -/** - * Demonstrates the use of Notifications. - * - * @author IT Mill Ltd. - * @see com.vaadin.ui.Window - */ -@SuppressWarnings("serial") -public class NotificationExample extends CustomComponent { - - // Dropdown select for notification type, using the native dropdown - NativeSelect type; - // Textfield for the notification caption - TextField caption; - // Textfield for the notification content - TextField message; - - /** - * Default constructor; We're subclassing CustomComponent, so we need to - * choose a root component and set it as composition root. - */ - public NotificationExample() { - // Main layout - final VerticalLayout main = new VerticalLayout(); - main.setSizeUndefined(); - main.setSpacing(true); - main.setMargin(true); // use theme-specific margin - setCompositionRoot(main); - - // Create the 'type' dropdown select. - type = new NativeSelect("Notification type"); - main.addComponent(type); - // no empty selection allowed - type.setNullSelectionAllowed(false); - // we want a different caption than the value - type.addContainerProperty("caption", String.class, null); - type.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY); - type.setItemCaptionPropertyId("caption"); - // add some content (items) using the Container API - Item i = type.addItem(new Integer( - Window.Notification.TYPE_HUMANIZED_MESSAGE)); - i.getItemProperty("caption").setValue("Humanized message"); - i = type.addItem(new Integer(Window.Notification.TYPE_WARNING_MESSAGE)); - i.getItemProperty("caption").setValue("Warning message"); - i = type.addItem(new Integer(Window.Notification.TYPE_ERROR_MESSAGE)); - i.getItemProperty("caption").setValue("Error message"); - i = type - .addItem(new Integer(Window.Notification.TYPE_TRAY_NOTIFICATION)); - i.getItemProperty("caption").setValue("Tray notification"); - // set the initially selected item - type.setValue(new Integer(Window.Notification.TYPE_HUMANIZED_MESSAGE)); - - // Notification caption - caption = new TextField("Caption"); - main.addComponent(caption); - caption.setColumns(20); - caption.setValue("Brown Fox!"); - - // Notification message - message = new RichTextArea(); - main.addComponent(message); - message.setCaption("Message"); - message.setValue("A quick one jumped over the lazy dog."); - - // Button to show the notification - final Button b = new Button("Show notification", new ClickListener() { - // this is an inline ClickListener - public void buttonClick(ClickEvent event) { - // show the notification - getWindow().showNotification((String) caption.getValue(), - (String) message.getValue(), - ((Integer) type.getValue()).intValue()); - } - }); - main.addComponent(b); - main.setComponentAlignment(b, Alignment.MIDDLE_RIGHT); - } -} diff --git a/src/com/vaadin/demo/featurebrowser/RichTextExample.java b/src/com/vaadin/demo/featurebrowser/RichTextExample.java deleted file mode 100644 index eb5b2e4279..0000000000 --- a/src/com/vaadin/demo/featurebrowser/RichTextExample.java +++ /dev/null @@ -1,64 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.featurebrowser; - -import com.vaadin.ui.Alignment; -import com.vaadin.ui.Button; -import com.vaadin.ui.CustomComponent; -import com.vaadin.ui.Label; -import com.vaadin.ui.RichTextArea; -import com.vaadin.ui.VerticalLayout; -import com.vaadin.ui.Button.ClickEvent; - -/** - * An example using a RichTextArea to edit a Label in XHTML-mode. - * - */ -@SuppressWarnings("serial") -public class RichTextExample extends CustomComponent { - - public static final String txt = "

RichText editor example

" - + "To edit this text, press the Edit button below." - + "
" - + "See the Book of Vaadin " - + "for more information."; - - private final VerticalLayout main; - private final Label l; - private final RichTextArea editor = new RichTextArea(); - private final Button b; - - public RichTextExample() { - // main layout - main = new VerticalLayout(); - main.setMargin(true); - setCompositionRoot(main); - - editor.setWidth("100%"); - - // Add the label - l = new Label(txt); - l.setContentMode(Label.CONTENT_XHTML); - main.addComponent(l); - // Edit button with inline click-listener - b = new Button("Edit", new Button.ClickListener() { - public void buttonClick(ClickEvent event) { - // swap Label <-> RichTextArea - if (main.getComponentIterator().next() == l) { - editor.setValue(l.getValue()); - main.replaceComponent(l, editor); - b.setCaption("Save"); - } else { - l.setValue(editor.getValue()); - main.replaceComponent(editor, l); - b.setCaption("Edit"); - } - } - }); - main.addComponent(b); - main.setComponentAlignment(b, Alignment.MIDDLE_RIGHT); - } - -} diff --git a/src/com/vaadin/demo/featurebrowser/SelectExample.java b/src/com/vaadin/demo/featurebrowser/SelectExample.java deleted file mode 100644 index 38183a946b..0000000000 --- a/src/com/vaadin/demo/featurebrowser/SelectExample.java +++ /dev/null @@ -1,103 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.featurebrowser; - -import com.vaadin.data.Property.ValueChangeEvent; -import com.vaadin.ui.AbstractSelect; -import com.vaadin.ui.ComboBox; -import com.vaadin.ui.CustomComponent; -import com.vaadin.ui.Field; -import com.vaadin.ui.HorizontalLayout; -import com.vaadin.ui.ListSelect; -import com.vaadin.ui.NativeSelect; -import com.vaadin.ui.OptionGroup; -import com.vaadin.ui.Panel; -import com.vaadin.ui.TwinColSelect; -import com.vaadin.ui.VerticalLayout; - -/** - * Shows some basic fields for value input; TextField, DateField, Slider... - * - * @author IT Mill Ltd. - */ -@SuppressWarnings("serial") -public class SelectExample extends CustomComponent { - - // listener that shows a value change notification - private final Field.ValueChangeListener listener = new Field.ValueChangeListener() { - public void valueChange(ValueChangeEvent event) { - getWindow().showNotification("" + event.getProperty().getValue()); - } - }; - - public SelectExample() { - final VerticalLayout main = new VerticalLayout(); - main.setMargin(true); - setCompositionRoot(main); - - final HorizontalLayout horiz = new HorizontalLayout(); - horiz.setWidth("100%"); - main.addComponent(horiz); - final Panel single = new Panel("Single selects"); - single.setStyleName(Panel.STYLE_LIGHT); - horiz.addComponent(single); - final Panel multi = new Panel("Multi selects"); - multi.setStyleName(Panel.STYLE_LIGHT); - horiz.addComponent(multi); - - // radio button group - AbstractSelect sel = new OptionGroup("OptionGroup"); - initSelect(sel); - single.addComponent(sel); - // checkbox group - sel = new OptionGroup("OptionGroup"); - sel.setMultiSelect(true); // TODO: throws if set after listener - why? - initSelect(sel); - multi.addComponent(sel); - // single-select list - sel = new ListSelect("ListSelect"); - ((ListSelect) sel).setColumns(15); - initSelect(sel); - single.addComponent(sel); - // multi-select list - sel = new ListSelect("ListSelect"); - ((ListSelect) sel).setColumns(15); - sel.setMultiSelect(true); - initSelect(sel); - multi.addComponent(sel); - // native-style dropdows - sel = new NativeSelect("NativeSelect"); - ((NativeSelect) sel).setColumns(15); - initSelect(sel); - single.addComponent(sel); - // combobox - sel = new ComboBox("ComboBox"); - ((ComboBox) sel).setWidth("15em"); - initSelect(sel); - single.addComponent(sel); - // "twin column" select - sel = new TwinColSelect("TwinColSelect"); - sel.setWidth("100%"); - ((TwinColSelect) sel).setColumns(15); - initSelect(sel); - multi.addComponent(sel); - } - - /* - * Initialize select with some values, make immediate and add listener. - */ - private void initSelect(AbstractSelect sel) { - for (int i = 1; i <= 5; i++) { - sel.addItem("Item " + i); - } - // select one item - sel.select("Item 1"); - - // make immediate, add listener - sel.setImmediate(true); - sel.addListener(listener); - } - -} diff --git a/src/com/vaadin/demo/featurebrowser/TableExample.java b/src/com/vaadin/demo/featurebrowser/TableExample.java deleted file mode 100644 index 808762724b..0000000000 --- a/src/com/vaadin/demo/featurebrowser/TableExample.java +++ /dev/null @@ -1,300 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.featurebrowser; - -import java.util.Iterator; -import java.util.Random; -import java.util.Set; - -import com.vaadin.data.Item; -import com.vaadin.data.Property; -import com.vaadin.event.Action; -import com.vaadin.ui.Button; -import com.vaadin.ui.CheckBox; -import com.vaadin.ui.CustomComponent; -import com.vaadin.ui.HorizontalLayout; -import com.vaadin.ui.TabSheet; -import com.vaadin.ui.Table; -import com.vaadin.ui.VerticalLayout; -import com.vaadin.ui.Button.ClickEvent; - -/** - * Table example. - * - * @author IT Mill Ltd. - */ -@SuppressWarnings("serial") -public class TableExample extends CustomComponent implements Action.Handler, - Button.ClickListener { - - // Actions - private static final Action ACTION_SAVE = new Action("Save"); - private static final Action ACTION_DELETE = new Action("Delete"); - private static final Action ACTION_HIRE = new Action("Hire"); - // Action sets - private static final Action[] ACTIONS_NOHIRE = new Action[] { ACTION_SAVE, - ACTION_DELETE }; - private static final Action[] ACTIONS_HIRE = new Action[] { ACTION_HIRE, - ACTION_SAVE, ACTION_DELETE }; - // Properties - private static final Object PROPERTY_SPECIES = "Species"; - private static final Object PROPERTY_TYPE = "Type"; - private static final Object PROPERTY_KIND = "Kind"; - private static final Object PROPERTY_HIRED = "Hired"; - - // "global" components - Table source; - Table saved; - Button saveSelected; - Button hireSelected; - Button deleteSelected; - Button deselect; - - public TableExample() { - VerticalLayout margin = new VerticalLayout(); - margin.setMargin(true); - - TabSheet root = new TabSheet(); - setCompositionRoot(margin); - margin.addComponent(root); - - // main layout - final VerticalLayout main = new VerticalLayout(); - main.setCaption("Basic Table"); - main.setMargin(true); - root.addTab(main); - - // "source" table with bells & whistlesenabled - source = new Table("All creatures"); - source.setPageLength(7); - source.setWidth("550px"); - source.setColumnCollapsingAllowed(true); - source.setColumnReorderingAllowed(true); - source.setSelectable(true); - source.setMultiSelect(true); - source.setRowHeaderMode(Table.ROW_HEADER_MODE_ID); - fillTable(source); - source.addActionHandler(this); - main.addComponent(source); - - // x-selected button row - final HorizontalLayout horiz = new HorizontalLayout(); - - horiz.setMargin(false, false, true, false); - main.addComponent(horiz); - saveSelected = new Button("Save selected"); - saveSelected.setStyleName(Button.STYLE_LINK); - saveSelected.addListener(this); - horiz.addComponent(saveSelected); - hireSelected = new Button("Hire selected"); - hireSelected.setStyleName(Button.STYLE_LINK); - hireSelected.addListener(this); - horiz.addComponent(hireSelected); - deleteSelected = new Button("Delete selected"); - deleteSelected.setStyleName(Button.STYLE_LINK); - deleteSelected.addListener(this); - horiz.addComponent(deleteSelected); - deselect = new Button("Deselect all"); - deselect.setStyleName(Button.STYLE_LINK); - deselect.addListener(this); - horiz.addComponent(deselect); - final CheckBox editmode = new CheckBox("Editmode "); - editmode.addListener(new CheckBox.ClickListener() { - public void buttonClick(ClickEvent event) { - source.setEditable(((Boolean) event.getButton().getValue()) - .booleanValue()); - } - }); - editmode.setImmediate(true); - horiz.addComponent(editmode); - - // "saved" table, minimalistic - saved = new Table("Saved creatures"); - saved.setPageLength(5); - saved.setWidth("550px"); - saved.setSelectable(false); - saved.setColumnHeaderMode(Table.COLUMN_HEADER_MODE_HIDDEN); - saved.setRowHeaderMode(Table.ROW_HEADER_MODE_ID); - initProperties(saved); - saved.addActionHandler(this); - main.addComponent(saved); - - final CheckBox b = new CheckBox("Modify saved creatures"); - b.addListener(new CheckBox.ClickListener() { - public void buttonClick(ClickEvent event) { - saved.setEditable(((Boolean) event.getButton().getValue()) - .booleanValue()); - } - }); - b.setImmediate(true); - main.addComponent(b); - - GeneratedColumnExample gencols = new GeneratedColumnExample(); - gencols.setCaption("Generated Columns"); - root.addComponent(gencols); - } - - // set up the properties (columns) - private void initProperties(Table table) { - table.addContainerProperty(PROPERTY_SPECIES, String.class, ""); - table.addContainerProperty(PROPERTY_TYPE, String.class, ""); - table.addContainerProperty(PROPERTY_KIND, String.class, ""); - table - .addContainerProperty(PROPERTY_HIRED, Boolean.class, - Boolean.FALSE); - } - - // fill the table with some random data - private void fillTable(Table table) { - initProperties(table); - - final String[] sp = new String[] { "Fox", "Dog", "Cat", "Moose", - "Penguin", "Cow" }; - final String[] ty = new String[] { "Quick", "Lazy", "Sleepy", - "Fidgety", "Crazy", "Kewl" }; - final String[] ki = new String[] { "Jumping", "Walking", "Sleeping", - "Skipping", "Dancing" }; - - Random r = new Random(5); - - for (int i = 0; i < 100; i++) { - final String s = sp[(int) (r.nextDouble() * sp.length)]; - final String t = ty[(int) (r.nextDouble() * ty.length)]; - final String k = ki[(int) (r.nextDouble() * ki.length)]; - table.addItem(new Object[] { s, t, k, Boolean.FALSE }, new Integer( - i)); - } - - } - - // Called for each item (row), returns valid actions for that item - public Action[] getActions(Object target, Object sender) { - if (sender == source) { - final Item item = source.getItem(target); - // save, delete, and hire if not already hired - if (item != null - && item.getItemProperty(PROPERTY_HIRED).getValue() == Boolean.FALSE) { - return ACTIONS_HIRE; - } else { - return ACTIONS_NOHIRE; - } - } else { - // "saved" table only has one action - return new Action[] { ACTION_DELETE }; - } - } - - // called when an action is invoked on an item (row) - public void handleAction(Action action, Object sender, Object target) { - if (sender == source) { - Item item = source.getItem(target); - if (action == ACTION_HIRE) { - // set HIRED property to true - item.getItemProperty(PROPERTY_HIRED).setValue(Boolean.TRUE); - if (saved.containsId(target)) { - item = saved.getItem(target); - item.getItemProperty(PROPERTY_HIRED).setValue(Boolean.TRUE); - } - getWindow().showNotification("Hired", "" + item); - - } else if (action == ACTION_SAVE) { - if (saved.containsId(target)) { - // let's not save twice - getWindow().showNotification("Already saved", "" + item); - return; - } - // "manual" copy of the item properties we want - final Item added = saved.addItem(target); - Property p = added.getItemProperty(PROPERTY_SPECIES); - p.setValue(item.getItemProperty(PROPERTY_SPECIES).getValue()); - p = added.getItemProperty(PROPERTY_TYPE); - p.setValue(item.getItemProperty(PROPERTY_TYPE).getValue()); - p = added.getItemProperty(PROPERTY_KIND); - p.setValue(item.getItemProperty(PROPERTY_KIND).getValue()); - p = added.getItemProperty(PROPERTY_HIRED); - p.setValue(item.getItemProperty(PROPERTY_HIRED).getValue()); - getWindow().showNotification("Saved", "" + item); - } else { - // ACTION_DELETE - getWindow().showNotification("Deleted ", "" + item); - source.removeItem(target); - } - - } else { - // sender==saved - if (action == ACTION_DELETE) { - final Item item = saved.getItem(target); - getWindow().showNotification("Deleted", "" + item); - saved.removeItem(target); - } - } - } - - @SuppressWarnings("unchecked") - public void buttonClick(ClickEvent event) { - final Button b = event.getButton(); - if (b == deselect) { - source.setValue(null); - } else if (b == saveSelected) { - // loop each selected and copy to "saved" table - final Set selected = (Set) source.getValue(); - int s = 0; - for (final Iterator it = selected.iterator(); it.hasNext();) { - final Object id = it.next(); - if (!saved.containsId(id)) { - final Item item = source.getItem(id); - final Item added = saved.addItem(id); - // "manual" copy of the properties we want - Property p = added.getItemProperty(PROPERTY_SPECIES); - p.setValue(item.getItemProperty(PROPERTY_SPECIES) - .getValue()); - p = added.getItemProperty(PROPERTY_TYPE); - p.setValue(item.getItemProperty(PROPERTY_TYPE).getValue()); - p = added.getItemProperty(PROPERTY_KIND); - p.setValue(item.getItemProperty(PROPERTY_KIND).getValue()); - p = added.getItemProperty(PROPERTY_HIRED); - p.setValue(item.getItemProperty(PROPERTY_HIRED).getValue()); - s++; - } - } - getWindow().showNotification("Saved " + s); - - } else if (b == hireSelected) { - // loop each selected and set property HIRED to true - int s = 0; - final Set selected = (Set) source.getValue(); - for (final Iterator it = selected.iterator(); it.hasNext();) { - final Object id = it.next(); - Item item = source.getItem(id); - final Property p = item.getItemProperty(PROPERTY_HIRED); - if (p.getValue() == Boolean.FALSE) { - p.setValue(Boolean.TRUE); - s++; - } - if (saved.containsId(id)) { - // also update "saved" table - item = saved.getItem(id); - item.getItemProperty(PROPERTY_HIRED).setValue(Boolean.TRUE); - } - } - getWindow().showNotification("Hired " + s); - - } else { - // loop trough selected and delete - int s = 0; - final Set selected = (Set) source.getValue(); - for (final Iterator it = selected.iterator(); it.hasNext();) { - final Object id = it.next(); - if (source.containsId(id)) { - s++; - source.removeItem(id); - } - } - getWindow().showNotification("Deleted " + s); - } - - } - -} diff --git a/src/com/vaadin/demo/featurebrowser/TreeExample.java b/src/com/vaadin/demo/featurebrowser/TreeExample.java deleted file mode 100644 index a440cbb25c..0000000000 --- a/src/com/vaadin/demo/featurebrowser/TreeExample.java +++ /dev/null @@ -1,163 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.featurebrowser; - -import com.vaadin.data.Item; -import com.vaadin.data.Property; -import com.vaadin.data.Property.ValueChangeEvent; -import com.vaadin.event.Action; -import com.vaadin.ui.AbstractSelect; -import com.vaadin.ui.CustomComponent; -import com.vaadin.ui.HorizontalLayout; -import com.vaadin.ui.Label; -import com.vaadin.ui.Panel; -import com.vaadin.ui.TextField; -import com.vaadin.ui.Tree; - -/** - * Demonstrates basic Tree -functionality. Actions are used for add/remove item - * functionality, and a ValueChangeListener reacts to both the Tree and the - * TextField. - */ -@SuppressWarnings("serial") -public class TreeExample extends CustomComponent implements Action.Handler, - Tree.ValueChangeListener { - - private static final Action ADD = new Action("Add item"); - private static final Action DELETE = new Action("Delete item"); - private static final Action[] actions = new Action[] { ADD, DELETE }; - - // Id for the caption property - private static final Object CAPTION_PROPERTY = "caption"; - - private static final String desc = "Try both right- and left-click!"; - - Tree tree; - TextField editor; - - public TreeExample() { - final HorizontalLayout main = new HorizontalLayout(); - main.setWidth("100%"); - main.setMargin(true); - setCompositionRoot(main); - - // Panel w/ Tree - Panel p = new Panel("Select item"); - p.setStyleName(Panel.STYLE_LIGHT); - p.setWidth("250px"); - // Description - p.addComponent(new Label(desc)); - // Tree with a few items - tree = new Tree(); - tree.setImmediate(true); - // we'll use a property for caption instead of the item id ("value"), - // so that multiple items can have the same caption - tree.addContainerProperty(CAPTION_PROPERTY, String.class, ""); - tree.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY); - tree.setItemCaptionPropertyId(CAPTION_PROPERTY); - for (int i = 1; i <= 3; i++) { - final Object id = addCaptionedItem("Section " + i, null); - tree.expandItem(id); - addCaptionedItem("Team A", id); - addCaptionedItem("Team B", id); - } - // listen for selections - tree.addListener(this); - // "context menu" - tree.addActionHandler(this); - p.addComponent(tree); - main.addComponent(p); - - // Panel w/ TextField ("editor") - p = new Panel("Edit item caption"); - p.setStyleName(Panel.STYLE_LIGHT); - editor = new TextField(); - // make immediate, instead of adding an "apply" button - editor.setImmediate(true); - editor.setEnabled(false); - editor.setColumns(15); - p.addComponent(editor); - main.addComponent(p); - main.setExpandRatio(p, 1); - } - - public Action[] getActions(Object target, Object sender) { - // We can provide different actions for each target (item), but we'll - // use the same actions all the time. - return actions; - } - - public void handleAction(Action action, Object sender, Object target) { - if (action == DELETE) { - tree.removeItem(target); - } else { - // Add - final Object id = addCaptionedItem("New Item", target); - tree.expandItem(target); - tree.setValue(id); - editor.focus(); - } - } - - public void valueChange(ValueChangeEvent event) { - final Object id = tree.getValue(); // selected item id - if (event.getProperty() == tree) { - // a Tree item was (un) selected - if (id == null) { - // no selecteion, disable TextField - editor.removeListener(this); - editor.setValue(""); - editor.setEnabled(false); - } else { - // item selected - // first remove previous listener - editor.removeListener(this); - // enable TextField and update value - editor.setEnabled(true); - final Item item = tree.getItem(id); - editor.setValue(item.getItemProperty(CAPTION_PROPERTY) - .getValue()); - // listen for TextField changes - editor.addListener(this); - editor.focus(); - } - } else { - // TextField - if (id != null) { - final Item item = tree.getItem(id); - final Property p = item.getItemProperty(CAPTION_PROPERTY); - p.setValue(editor.getValue()); - tree.requestRepaint(); - } - - } - } - - /** - * Helper to add an item with specified caption and (optional) parent. - * - * @param caption - * The item caption - * @param parent - * The (optional) parent item id - * @return the created item's id - */ - private Object addCaptionedItem(String caption, Object parent) { - // add item, let tree decide id - final Object id = tree.addItem(); - // get the created item - final Item item = tree.getItem(id); - // set our "caption" property - final Property p = item.getItemProperty(CAPTION_PROPERTY); - p.setValue(caption); - if (parent != null) { - tree.setChildrenAllowed(parent, true); - tree.setParent(id, parent); - tree.setChildrenAllowed(id, false); - } - return id; - } - -} diff --git a/src/com/vaadin/demo/featurebrowser/ValueInputExample.java b/src/com/vaadin/demo/featurebrowser/ValueInputExample.java deleted file mode 100644 index 81afe67eaf..0000000000 --- a/src/com/vaadin/demo/featurebrowser/ValueInputExample.java +++ /dev/null @@ -1,147 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.featurebrowser; - -import com.vaadin.data.Property.ValueChangeEvent; -import com.vaadin.ui.CustomComponent; -import com.vaadin.ui.DateField; -import com.vaadin.ui.Field; -import com.vaadin.ui.HorizontalLayout; -import com.vaadin.ui.InlineDateField; -import com.vaadin.ui.Panel; -import com.vaadin.ui.Slider; -import com.vaadin.ui.TextField; -import com.vaadin.ui.VerticalLayout; -import com.vaadin.ui.Window.Notification; - -/** - * Shows some basic fields for value input; TextField, DateField, Slider... - * - * @author IT Mill Ltd. - */ -@SuppressWarnings("serial") -public class ValueInputExample extends CustomComponent { - - public ValueInputExample() { - final VerticalLayout main = new VerticalLayout(); - main.setMargin(true); - setCompositionRoot(main); - - // listener that shows a value change notification - final Field.ValueChangeListener listener = new Field.ValueChangeListener() { - public void valueChange(ValueChangeEvent event) { - getWindow().showNotification("Received", - "
" + event.getProperty().getValue() + "
", - Notification.TYPE_WARNING_MESSAGE); - } - }; - - // TextField - HorizontalLayout horiz = new HorizontalLayout(); - horiz.setWidth("100%"); - main.addComponent(horiz); - Panel left = new Panel("TextField"); - left.setStyleName(Panel.STYLE_LIGHT); - horiz.addComponent(left); - Panel right = new Panel("multiline"); - right.setStyleName(Panel.STYLE_LIGHT); - horiz.addComponent(right); - // basic TextField - TextField tf = new TextField("Basic"); - tf.setColumns(15); - tf.setImmediate(true); - tf.addListener(listener); - left.addComponent(tf); - // multiline TextField a.k.a TextArea - tf = new TextField("Area"); - tf.setColumns(15); - tf.setRows(5); - tf.setImmediate(true); - tf.addListener(listener); - right.addComponent(tf); - - // DateFields - horiz = new HorizontalLayout(); - horiz.setWidth("100%"); - main.addComponent(horiz); - left = new Panel("DateField"); - left.setStyleName(Panel.STYLE_LIGHT); - horiz.addComponent(left); - right = new Panel("inline"); - right.setStyleName(Panel.STYLE_LIGHT); - horiz.addComponent(right); - // default - DateField df = new DateField("Day resolution"); - df.addListener(listener); - df.setImmediate(true); - df.setResolution(DateField.RESOLUTION_DAY); - left.addComponent(df); - // minute - df = new DateField("Minute resolution"); - df.addListener(listener); - df.setImmediate(true); - df.setResolution(DateField.RESOLUTION_MIN); - left.addComponent(df); - // year - df = new DateField("Year resolution"); - df.addListener(listener); - df.setImmediate(true); - df.setResolution(DateField.RESOLUTION_YEAR); - left.addComponent(df); - // msec - df = new DateField("Millisecond resolution"); - df.addListener(listener); - df.setImmediate(true); - df.setResolution(DateField.RESOLUTION_MSEC); - left.addComponent(df); - // Inline - df = new InlineDateField(); - df.addListener(listener); - df.setImmediate(true); - right.addComponent(df); - - // Slider - left = new Panel("Slider"); - left.setStyleName(Panel.STYLE_LIGHT); - main.addComponent(left); - // int slider - Slider slider = new Slider(0, 100); - slider.setWidth("300px"); - // slider.setSize(300); - slider.setImmediate(true); - slider.addListener(new Slider.ValueChangeListener() { - public void valueChange(ValueChangeEvent event) { - // update caption when value changes - final Slider s = (Slider) event.getProperty(); - s.setCaption("Value: " + s.getValue()); - } - }); - try { - slider.setValue(20); - } catch (final Exception e) { - e.printStackTrace(System.err); - } - left.addComponent(slider); - // double slider - slider = new Slider(0.0, 1.0, 1); - slider.setOrientation(Slider.ORIENTATION_VERTICAL); - slider.setImmediate(true); - slider.addListener(new Slider.ValueChangeListener() { - public void valueChange(ValueChangeEvent event) { - // update caption when value changes - final Slider s = (Slider) event.getProperty(); - s.setCaption("Value: " + s.getValue()); - } - }); - try { - slider.setValue(0.5); - } catch (final Exception e) { - e.printStackTrace(System.err); - } - left.addComponent(slider); - - } - -} diff --git a/src/com/vaadin/demo/featurebrowser/WindowingExample.java b/src/com/vaadin/demo/featurebrowser/WindowingExample.java deleted file mode 100644 index db91da6b84..0000000000 --- a/src/com/vaadin/demo/featurebrowser/WindowingExample.java +++ /dev/null @@ -1,113 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.featurebrowser; - -import java.net.URL; - -import com.vaadin.terminal.ExternalResource; -import com.vaadin.ui.Button; -import com.vaadin.ui.CustomComponent; -import com.vaadin.ui.Label; -import com.vaadin.ui.VerticalLayout; -import com.vaadin.ui.Window; -import com.vaadin.ui.Button.ClickEvent; - -/** - * @author marc - * - */ -@SuppressWarnings("serial") -public class WindowingExample extends CustomComponent { - - public static final String txt = "

There are two main types of windows: application-level windows, and " - + "\"sub windows\".

A sub window is rendered as a \"inline\" popup window" - + " within the (native) browser window to which it was added. You can create" - + " a sub window by creating a new Window and adding it to a application-level window, for instance" - + " your main window.

In contrast, you create a application-level window by" - + " creating a new Window and adding it to the Application. Application-level" - + " windows are not shown by default - you need to open a browser window for" - + " the url representing the window. You can think of the application-level" - + " windows as separate views into your application - and a way to create a" - + " \"native\" browser window.

Depending on your needs, it's also" - + " possible to create a new window instance (with it's own internal state)" - + " for each new (native) browser window, or you can share the same instance" - + " (and state) between several browser windows (the latter is most useful" - + " for read-only views).

"; - - private URL windowUrl = null; - - public WindowingExample() { - final VerticalLayout main = new VerticalLayout(); - main.setMargin(true); - setCompositionRoot(main); - - final Label l = new Label(txt); - l.setContentMode(Label.CONTENT_XHTML); - main.addComponent(l); - - Button b = new Button("Create a new subwindow", - new Button.ClickListener() { - public void buttonClick(ClickEvent event) { - final Window w = new Window("Subwindow"); - w.setWidth("50%"); - final Label l = new Label(txt); - l.setContentMode(Label.CONTENT_XHTML); - w.addComponent(l); - getApplication().getMainWindow().addWindow(w); - } - }); - b.setStyleName(Button.STYLE_LINK); - main.addComponent(b); - b = new Button("Create a new modal window", new Button.ClickListener() { - public void buttonClick(ClickEvent event) { - final Window w = new Window("Modal window"); - w.setWidth("50%"); - w.setModal(true); - final Label l = new Label(txt); - l.setContentMode(Label.CONTENT_XHTML); - w.addComponent(l); - getApplication().getMainWindow().addWindow(w); - } - }); - b.setStyleName(Button.STYLE_LINK); - main.addComponent(b); - b = new Button("Open a application-level window, with shared state", - new Button.ClickListener() { - public void buttonClick(ClickEvent event) { - if (windowUrl == null) { - final Window w = new Window("Subwindow"); - final Label l = new Label(txt); - l.setContentMode(Label.CONTENT_XHTML); - w.addComponent(l); - getApplication().addWindow(w); - windowUrl = w.getURL(); - } - getApplication().getMainWindow().open( - new ExternalResource(windowUrl), "_new"); - } - }); - b.setStyleName(Button.STYLE_LINK); - main.addComponent(b); - b = new Button( - "Create a new application-level window, with it's own state", - new Button.ClickListener() { - public void buttonClick(ClickEvent event) { - final Window w = new Window("Subwindow"); - getApplication().addWindow(w); - final Label l = new Label( - "Each opened window has its own" - + " name, and is accessed trough its own uri."); - l.setCaption("Window " + w.getName()); - w.addComponent(l); - getApplication().getMainWindow().open( - new ExternalResource(w.getURL()), "_new"); - } - }); - b.setStyleName(Button.STYLE_LINK); - main.addComponent(b); - - } - -} diff --git a/src/com/vaadin/demo/package.html b/src/com/vaadin/demo/package.html deleted file mode 100644 index 38ccd7654a..0000000000 --- a/src/com/vaadin/demo/package.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - -

Provides several fully functional Vaadin example applications. These -highlight certain aspects of the Vaadin and how it can be -used to produce simple, elegant yet powerful user interface driven -applications.

- -
    -
  • HelloWorld is the classic example which only prints the -text "Hello, World!" on the screen.
  • -
  • Calc implements a calculator application which -demonstrates how to build a bit more complicated user interface and how the -application can interact with the user through that interface.
  • -
- - - diff --git a/src/com/vaadin/demo/reservation/CalendarDemo.java b/src/com/vaadin/demo/reservation/CalendarDemo.java deleted file mode 100644 index 4fc7dab44a..0000000000 --- a/src/com/vaadin/demo/reservation/CalendarDemo.java +++ /dev/null @@ -1,121 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.reservation; - -import java.sql.SQLException; -import java.util.Calendar; -import java.util.Date; - -import com.vaadin.data.Property.ValueChangeEvent; -import com.vaadin.data.Property.ValueChangeListener; -import com.vaadin.data.util.QueryContainer; -import com.vaadin.demo.util.SampleCalendarDatabase; -import com.vaadin.ui.DateField; -import com.vaadin.ui.HorizontalLayout; -import com.vaadin.ui.Window; - -/** - * This example shows how the CalendarField can use Containers. A QueryContainer - * is used to bind SQL table rows to the calendar. Demonstrates: how to create - * com.vaadin.data.Container and set it as datasource for - * com.vaadin.ui.Component.CalendarField - * - * @author IT Mill Ltd. - * @since 4.0.0 - * - */ -@SuppressWarnings("serial") -public class CalendarDemo extends com.vaadin.Application { - - // Database provided with sample data - private SampleCalendarDatabase sampleDatabase; - - // The calendar UI component - private CalendarField from; - private CalendarField to; - - /** - * Initialize Application. Demo components are added to main window. - */ - @Override - public void init() { - final Window main = new Window("Calendar demo"); - setMainWindow(main); - - main.setContent(new HorizontalLayout()); - - // create the calendar component and add to layout - from = new CalendarField(); - main.addComponent(from); - from.setResolution(DateField.RESOLUTION_HOUR); - from.setImmediate(true); - - to = new CalendarField(); - main.addComponent(to); - to.setResolution(DateField.RESOLUTION_HOUR); - to.setEnabled(false); - to.setImmediate(true); - - from.addListener(new ValueChangeListener() { - public void valueChange(ValueChangeEvent event) { - final Date fd = (Date) from.getValue(); - final Date td = (Date) to.getValue(); - if (fd == null) { - to.setValue(null); - to.setEnabled(false); - return; - } else { - to.setEnabled(true); - } - to.setMinimumDate(fd); - if (td == null || td.before(fd)) { - to.setValue(fd); - } - } - }); - - // initialize the sample database and set as calendar datasource - sampleDatabase = new SampleCalendarDatabase(); - - initCalendars(); - - // Don't allow dates before today - from.setMinimumDate(Calendar.getInstance().getTime()); - - } - - /** - * Populates table component with all rows from calendar table. - */ - private void initCalendars() { - try { - final QueryContainer qc = new QueryContainer("SELECT * FROM " - + SampleCalendarDatabase.DB_TABLE_NAME, sampleDatabase - .getConnection()); - from.setContainerDataSource(qc); - to.setContainerDataSource(qc); - } catch (final SQLException e) { - e.printStackTrace(); - } - /* - * // Calendar will use the first date property as start if you do not - * // explicitly specify the property id. Our start -property will be - * the // first one, so it's intentionally left out. // Start is the - * only mandatory property, but you'll probably want to // specify title - * as well. - * from.setItemEndPropertyId(SampleCalendarDatabase.PROPERTY_ID_END); - * from - * .setItemTitlePropertyId(SampleCalendarDatabase.PROPERTY_ID_TITLE); - * from - * .setItemNotimePropertyId(SampleCalendarDatabase.PROPERTY_ID_NOTIME); - * - * to.setItemEndPropertyId(SampleCalendarDatabase.PROPERTY_ID_END); - * to.setItemTitlePropertyId(SampleCalendarDatabase.PROPERTY_ID_TITLE); - * to - * .setItemNotimePropertyId(SampleCalendarDatabase.PROPERTY_ID_NOTIME); - */ - } - -} diff --git a/src/com/vaadin/demo/reservation/CalendarField.java b/src/com/vaadin/demo/reservation/CalendarField.java deleted file mode 100644 index 9676cd79ee..0000000000 --- a/src/com/vaadin/demo/reservation/CalendarField.java +++ /dev/null @@ -1,327 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.reservation; - -import java.text.SimpleDateFormat; -import java.util.Collection; -import java.util.Date; -import java.util.Iterator; - -import com.vaadin.data.Container; -import com.vaadin.data.Item; -import com.vaadin.data.Property; -import com.vaadin.demo.reservation.gwt.client.ui.VCalendarField; -import com.vaadin.terminal.PaintException; -import com.vaadin.terminal.PaintTarget; -import com.vaadin.ui.ClientWidget; -import com.vaadin.ui.DateField; - -// TODO send one month at a time, do lazyLoading -// TODO check date limit when updating variables -// TODO Allow item selection -@SuppressWarnings("serial") -@ClientWidget(VCalendarField.class) -public class CalendarField extends DateField implements Container.Viewer { - - private static final String TAGNAME = "calendarfield"; - - private Date minDate; - private Date maxDate; - - private Container dataSource; - private Object itemStyleNamePropertyId; - private Object itemStartPropertyId; - private Object itemEndPropertyId; - private Object itemTitlePropertyId; - private Object itemDescriptionPropertyId; - private Object itemNotimePropertyId; - - public CalendarField() { - super(); - init(); - } - - public CalendarField(Property dataSource) throws IllegalArgumentException { - super(dataSource); - init(); - } - - public CalendarField(String caption, Date value) { - super(caption, value); - init(); - } - - public CalendarField(String caption, Property dataSource) { - super(caption, dataSource); - init(); - } - - public CalendarField(String caption) { - super(caption); - init(); - } - - public void init() { - super.setResolution(RESOLUTION_HOUR); - - } - - /** - * Sets the resolution of the CalendarField. Only RESOLUTION_DAY and - * RESOLUTION_HOUR are supported. - * - * @param resolution - * the resolution to set. - * @see com.vaadin.ui.DateField#setResolution(int) - */ - @Override - public void setResolution(int resolution) { - if (resolution != RESOLUTION_DAY && resolution != RESOLUTION_HOUR) { - throw new IllegalArgumentException(); - } - super.setResolution(resolution); - } - - public void setMinimumDate(Date date) { - minDate = date; - requestRepaint(); - } - - public Date getMinimumDate() { - return minDate; - } - - public void setMaximumDate(Date date) { - maxDate = date; - requestRepaint(); - } - - public Date getMaximumDate() { - return maxDate; - } - - public Container getContainerDataSource() { - return dataSource; - } - - public void setContainerDataSource(Container newDataSource) { - if (newDataSource == null || checkDataSource(newDataSource)) { - dataSource = newDataSource; - } else { - // TODO error message - throw new IllegalArgumentException(); - } - requestRepaint(); - } - - private boolean checkDataSource(Container dataSource) { - - // Check old propertyIds - if (itemEndPropertyId != null) { - final Class c = dataSource.getType(itemEndPropertyId); - if (!Date.class.isAssignableFrom(c)) { - itemEndPropertyId = null; - } - } - if (itemNotimePropertyId != null) { - final Class c = dataSource.getType(itemNotimePropertyId); - if (!Boolean.class.isAssignableFrom(c)) { - itemNotimePropertyId = null; - } - } - if (itemStartPropertyId != null) { - final Class c = dataSource.getType(itemStartPropertyId); - if (Date.class.isAssignableFrom(c)) { - // All we _really_ need is one date - return true; - } else { - itemStartPropertyId = null; - } - } - // We need at least one Date - final Collection ids = dataSource.getContainerPropertyIds(); - for (final Iterator it = ids.iterator(); it.hasNext();) { - final Object id = it.next(); - final Class c = dataSource.getType(id); - if (Date.class.isAssignableFrom(c)) { - itemStartPropertyId = id; - return true; - } - } - - return false; - } - - public Object getItemStyleNamePropertyId() { - return itemStyleNamePropertyId; - } - - public void setItemStyleNamePropertyId(Object propertyId) { - itemStyleNamePropertyId = propertyId; - } - - public Object getItemStartPropertyId() { - return itemStartPropertyId; - } - - public void setItemStartPropertyId(Object propertyId) { - // TODO nullcheck for property id - if (dataSource != null - && !Date.class.isAssignableFrom(dataSource.getType(propertyId))) { - // TODO error message - throw new IllegalArgumentException(); - } - itemStartPropertyId = propertyId; - } - - public Object getItemEndPropertyId() { - return itemEndPropertyId; - } - - public void setItemEndPropertyId(Object propertyId) { - // TODO nullcheck for property id - if (dataSource != null - && !Date.class.isAssignableFrom(dataSource.getType(propertyId))) { - // TODO error message - throw new IllegalArgumentException(); - } - itemEndPropertyId = propertyId; - } - - public Object getItemTitlePropertyId() { - return itemTitlePropertyId; - } - - public void setItemTitlePropertyId(Object propertyId) { - itemTitlePropertyId = propertyId; - } - - public Object getItemDescriptionPropertyId() { - return itemDescriptionPropertyId; - } - - public void setItemDescriptionPropertyId(Object propertyId) { - itemDescriptionPropertyId = propertyId; - } - - public Object getitemNotimePropertyId() { - return itemNotimePropertyId; - } - - public void setItemNotimePropertyId(Object propertyId) { - // TODO nullcheck for property id - if (dataSource != null - && !Boolean.class.isAssignableFrom(dataSource - .getType(propertyId))) { - // TODO error message - throw new IllegalArgumentException(); - } - itemNotimePropertyId = propertyId; - } - - /** - * Paints the content of this component. - * - * @param target - * the Paint Event. - * @throws PaintException - * if the paint operation failed. - */ - @SuppressWarnings("deprecation") - @Override - public void paintContent(PaintTarget target) throws PaintException { - super.paintContent(target); - - if (minDate != null) { - target.addAttribute("min", String.valueOf(minDate.getTime())); - } - if (maxDate != null) { - target.addAttribute("max", String.valueOf(maxDate.getTime())); - } - - if (dataSource != null) { - target.startTag("items"); - - // TODO send one month now, the rest via lazyloading - int month = new Date().getMonth(); - final Object value = getValue(); - if (value != null && value instanceof Date) { - month = ((Date) value).getMonth(); - } - - for (final Iterator it = dataSource.getItemIds().iterator(); it - .hasNext();) { - final Object itemId = it.next(); - final Item item = dataSource.getItem(itemId); - Property p = item.getItemProperty(itemStartPropertyId); - Date start = (Date) p.getValue(); - Date end = start; // assume same day - if (itemEndPropertyId != null) { - p = item.getItemProperty(itemEndPropertyId); - end = (Date) p.getValue(); - if (end == null) { - end = start; - } else if (end.before(start)) { - final Date tmp = start; - start = end; - end = tmp; - } - } - - // TODO half-done lazyloading logic (hence broken) - - if (start != null) { - if ((start.getMonth() <= month || end.getMonth() >= month)) { - target.startTag("item"); - // TODO different id? - target.addAttribute("id", itemId.hashCode()); - if (itemStyleNamePropertyId != null) { - p = item.getItemProperty(itemStyleNamePropertyId); - final String styleName = (String) p.getValue(); - target.addAttribute("styleName", styleName); - } - SimpleDateFormat sdf = new SimpleDateFormat( - "d MM yyyy HH:mm:ss Z"); - - target.addAttribute("Z", start.getTimezoneOffset()); - - target.addAttribute("start", "" + sdf.format(start)); - - if (end != start) { - target.addAttribute("end", "" + sdf.format(end)); - } - if (itemTitlePropertyId != null) { - p = item.getItemProperty(itemTitlePropertyId); - final Object val = p.getValue(); - if (val != null) { - target.addAttribute("title", val.toString()); - } - } - if (itemDescriptionPropertyId != null) { - p = item.getItemProperty(itemDescriptionPropertyId); - final Object val = p.getValue(); - if (val != null) { - target.addAttribute("description", val - .toString()); - } - } - if (itemNotimePropertyId != null) { - p = item.getItemProperty(itemNotimePropertyId); - final Object val = p.getValue(); - if (val != null) { - target.addAttribute("notime", ((Boolean) val) - .booleanValue()); - } - } - - target.endTag("item"); - } - } - } - - target.endTag("items"); - } - } -} diff --git a/src/com/vaadin/demo/reservation/GoogleMap.java b/src/com/vaadin/demo/reservation/GoogleMap.java deleted file mode 100644 index 746982db9b..0000000000 --- a/src/com/vaadin/demo/reservation/GoogleMap.java +++ /dev/null @@ -1,194 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.reservation; - -import java.awt.geom.Point2D; -import java.util.Collection; -import java.util.Iterator; - -import com.vaadin.data.Container; -import com.vaadin.data.Item; -import com.vaadin.data.Property; -import com.vaadin.data.util.IndexedContainer; -import com.vaadin.demo.reservation.gwt.client.ui.VGoogleMap; -import com.vaadin.terminal.PaintException; -import com.vaadin.terminal.PaintTarget; -import com.vaadin.terminal.Sizeable; -import com.vaadin.ui.AbstractComponent; -import com.vaadin.ui.ClientWidget; - -@SuppressWarnings("serial") -@ClientWidget(VGoogleMap.class) -public class GoogleMap extends AbstractComponent implements Sizeable, - Container.Viewer { - private final String TAG_MARKERS = "markers"; - private final String TAG_MARKER = "marker"; - private int zoomLevel = 15; - private Point2D.Double mapCenter; - - private Container dataSource; - private Object itemMarkerHtmlPropertyId = new Object(); - private Object itemMarkerXPropertyId = new Object(); - private Object itemMarkerYPropertyId = new Object(); - - @Override - public void paintContent(PaintTarget target) throws PaintException { - super.paintContent(target); - // Add size info as variables - if (getHeight() > -1) { - target.addVariable(this, "height", getHeight() - + UNIT_SYMBOLS[getHeightUnits()]); - } - if (getWidth() > -1) { - target.addVariable(this, "width", getWidth() - + UNIT_SYMBOLS[getWidthUnits()]); - } - if (null != mapCenter) { - target.addAttribute("centerX", mapCenter.getX()); - target.addAttribute("centerY", mapCenter.getY()); - } - target.addAttribute("zoom", zoomLevel); - - if (dataSource != null) { - target.startTag(TAG_MARKERS); - final Collection itemIds = dataSource.getItemIds(); - for (final Iterator it = itemIds.iterator(); it.hasNext();) { - final Object itemId = it.next(); - final Item item = dataSource.getItem(itemId); - Property p = item.getItemProperty(getItemMarkerXPropertyId()); - final Double x = (Double) (p != null ? p.getValue() : null); - p = item.getItemProperty(getItemMarkerYPropertyId()); - final Double y = (Double) (p != null ? p.getValue() : null); - if (x == null || y == null) { - continue; - } - target.startTag(TAG_MARKER); - target.addAttribute("x", x.doubleValue()); - target.addAttribute("y", y.doubleValue()); - p = item.getItemProperty(getItemMarkerHtmlPropertyId()); - final String h = (String) (p != null ? p.getValue() : null); - target.addAttribute("html", h); - target.endTag(TAG_MARKER); - } - target.endTag(TAG_MARKERS); - } - } - - public void setZoomLevel(int zoomLevel) { - this.zoomLevel = zoomLevel; - requestRepaint(); - } - - public int getZoomLevel() { - return zoomLevel; - } - - public void setMapCenter(Point2D.Double center) { - mapCenter = center; - } - - public Point2D.Double getMapCenter() { - return mapCenter; - } - - // Container.Viewer methods: - - public Container getContainerDataSource() { - return dataSource; - } - - public void setContainerDataSource(Container newDataSource) { - - dataSource = newDataSource; - - requestRepaint(); - } - - // Item methods - - public Object getItemMarkerHtmlPropertyId() { - return itemMarkerHtmlPropertyId; - } - - public void setItemMarkerHtmlPropertyId(Object itemMarkerHtmlPropertyId) { - this.itemMarkerHtmlPropertyId = itemMarkerHtmlPropertyId; - requestRepaint(); - } - - public Object getItemMarkerXPropertyId() { - return itemMarkerXPropertyId; - } - - public void setItemMarkerXPropertyId(Object itemMarkerXPropertyId) { - this.itemMarkerXPropertyId = itemMarkerXPropertyId; - requestRepaint(); - } - - public Object getItemMarkerYPropertyId() { - return itemMarkerYPropertyId; - } - - public void setItemMarkerYPropertyId(Object itemMarkerYPropertyId) { - this.itemMarkerYPropertyId = itemMarkerYPropertyId; - requestRepaint(); - } - - // Marker add - - public Object addMarker(String html, Point2D.Double location) { - if (location == null) { - throw new IllegalArgumentException("Location must be non-null"); - } - if (dataSource == null) { - initDataSource(); - } - final Object markerId = dataSource.addItem(); - if (markerId == null) { - return null; - } - final Item marker = dataSource.getItem(markerId); - Property p = marker.getItemProperty(getItemMarkerXPropertyId()); - p.setValue(new Double(location.x)); - p = marker.getItemProperty(getItemMarkerYPropertyId()); - p.setValue(new Double(location.y)); - p = marker.getItemProperty(getItemMarkerHtmlPropertyId()); - p.setValue(html); - - requestRepaint(); - - return markerId; - } - - public void removeMarker(Object markerId) { - if (dataSource != null) { - dataSource.removeItem(markerId); - requestRepaint(); - } - } - - public Item getMarkerItem(Object markerId) { - if (dataSource != null) { - return dataSource.getItem(markerId); - } else { - return null; - } - } - - // dataSource init helper: - private void initDataSource() { - dataSource = new IndexedContainer(); - dataSource.addContainerProperty(itemMarkerHtmlPropertyId, String.class, - null); - dataSource.addContainerProperty(itemMarkerXPropertyId, Double.class, - new Double(0)); - dataSource.addContainerProperty(itemMarkerYPropertyId, Double.class, - new Double(0)); - } - - public void clear() { - setContainerDataSource(null); - } - -} \ No newline at end of file diff --git a/src/com/vaadin/demo/reservation/ReservationApplication.java b/src/com/vaadin/demo/reservation/ReservationApplication.java deleted file mode 100644 index 1b9777dcb2..0000000000 --- a/src/com/vaadin/demo/reservation/ReservationApplication.java +++ /dev/null @@ -1,342 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.reservation; - -import java.awt.geom.Point2D; -import java.util.Calendar; -import java.util.Date; -import java.util.Iterator; -import java.util.LinkedList; - -import com.vaadin.Application; -import com.vaadin.data.Container; -import com.vaadin.data.Item; -import com.vaadin.data.Property.ValueChangeEvent; -import com.vaadin.data.Property.ValueChangeListener; -import com.vaadin.ui.Alignment; -import com.vaadin.ui.Button; -import com.vaadin.ui.HorizontalLayout; -import com.vaadin.ui.Label; -import com.vaadin.ui.Panel; -import com.vaadin.ui.TabSheet; -import com.vaadin.ui.Table; -import com.vaadin.ui.TextField; -import com.vaadin.ui.VerticalLayout; -import com.vaadin.ui.Window; -import com.vaadin.ui.TabSheet.SelectedTabChangeEvent; -import com.vaadin.ui.Window.Notification; - -@SuppressWarnings("serial") -public class ReservationApplication extends Application { - - private SampleDB db; - - ResourceSelectorPanel resourcePanel; - - private CalendarField reservedFrom; - - private static final long DEFAULT_GAP_MILLIS = 3600000; // (almost) one - - // hour - private long currentGapMillis = DEFAULT_GAP_MILLIS; // current length of - - // reservation - private CalendarField reservedTo; - - private Label resourceName; - - private TextField description; - - private Button reservationButton; - - private Table allTable; - - private GoogleMap map; - - @Override - public void init() { - // - db = new SampleDB(getProperty("jdbcUrl")); - - VerticalLayout mainLayout = new VerticalLayout(); - mainLayout.setSizeFull(); - mainLayout.setMargin(true); - - final Window mainWindow = new Window("Reservr ", mainLayout); - setMainWindow(mainWindow); - setTheme("reservr"); - - Label logo = new Label("Reservr"); - logo.setStyleName("logo"); - mainLayout.addComponent(logo); - - Label slogan = new Label("Representational vehicles on-the-road"); - slogan.setStyleName("slogan"); - mainLayout.addComponent(slogan); - - final TabSheet mainTabs = new TabSheet(); - mainTabs.setSizeFull(); - mainLayout.addComponent(mainTabs); - mainLayout.setExpandRatio(mainTabs, 1); - - final VerticalLayout reservationTab = new VerticalLayout(); - reservationTab.setWidth("100%"); - mainTabs.addTab(reservationTab, "Make reservation", null); - - resourcePanel = new ResourceSelectorPanel("Resources"); - resourcePanel.setResourceContainer(db.getResources(null)); - resourcePanel.addListener( - ResourceSelectorPanel.SelectedResourcesChangedEvent.class, - this, "selectedResourcesChanged"); - reservationTab.addComponent(resourcePanel); - - HorizontalLayout reservationLayout = new HorizontalLayout(); - final Panel reservationPanel = new Panel("Reservation", - reservationLayout); - reservationPanel.addStyleName(Panel.STYLE_LIGHT); - reservationLayout.setMargin(true); - reservationTab.addComponent(reservationPanel); - - final VerticalLayout infoLayout = new VerticalLayout(); - infoLayout.setSpacing(true); - infoLayout.setSizeUndefined(); - infoLayout.setMargin(false, true, false, false); - reservationPanel.addComponent(infoLayout); - resourceName = new Label("From the list above"); - resourceName.setCaption("Choose resource"); - infoLayout.addComponent(resourceName); - description = new TextField(); - description.setWidth("250px"); - description.setRows(5); - infoLayout.addComponent(description); - reservationButton = new Button("Make reservation", this, - "makeReservation"); - infoLayout.addComponent(reservationButton); - infoLayout.setComponentAlignment(reservationButton, - Alignment.MIDDLE_CENTER); - - map = new GoogleMap(); - map.setWidth("250px"); - map.setHeight("250px"); - map.setItemMarkerHtmlPropertyId(SampleDB.Resource.PROPERTY_ID_NAME); - map.setItemMarkerXPropertyId(SampleDB.Resource.PROPERTY_ID_LOCATIONX); - map.setItemMarkerYPropertyId(SampleDB.Resource.PROPERTY_ID_LOCATIONY); - map.setContainerDataSource(db.getResources(null)); - infoLayout.addComponent(map); - - final Calendar from = Calendar.getInstance(); - from.add(Calendar.HOUR, 1); - from.set(Calendar.MINUTE, 0); - from.set(Calendar.SECOND, 0); - from.set(Calendar.MILLISECOND, 0); - reservedFrom = new CalendarField("From"); - reservedFrom.setMinimumDate(from.getTime()); - reservedFrom.setValue(from.getTime()); - reservedFrom.setImmediate(true); - initCalendarFieldPropertyIds(reservedFrom); - reservationPanel.addComponent(reservedFrom); - - final Label arrowLabel = new Label("»"); - arrowLabel.setContentMode(Label.CONTENT_XHTML); - arrowLabel.setStyleName("arrow"); - reservationPanel.addComponent(arrowLabel); - - final Calendar to = Calendar.getInstance(); - to.setTime(from.getTime()); - to.add(Calendar.MILLISECOND, (int) DEFAULT_GAP_MILLIS); - reservedTo = new CalendarField("To"); - reservedTo.setMinimumDate(to.getTime()); - reservedTo.setValue(to.getTime()); - reservedTo.setImmediate(true); - initCalendarFieldPropertyIds(reservedTo); - reservationPanel.addComponent(reservedTo); - - reservedFrom.addListener(new ValueChangeListener() { - public void valueChange(ValueChangeEvent event) { - final Date fd = (Date) reservedFrom.getValue(); - if (fd == null) { - reservedTo.setValue(null); - reservedTo.setEnabled(false); - refreshSelectedResources(true); - return; - } else { - reservedTo.setEnabled(true); - } - reservedTo.setMinimumDate(new Date(fd.getTime() - + DEFAULT_GAP_MILLIS)); - final Calendar to = Calendar.getInstance(); - to.setTime(fd); - to.add(Calendar.MILLISECOND, (int) currentGapMillis); - reservedTo.setValue(to.getTime()); - refreshSelectedResources(true); - } - }); - reservedTo.addListener(new ValueChangeListener() { - public void valueChange(ValueChangeEvent event) { - final Date from = (Date) reservedFrom.getValue(); - final Date to = (Date) reservedTo.getValue(); - currentGapMillis = to.getTime() - from.getTime(); - if (currentGapMillis <= 0) { - final Calendar t = Calendar.getInstance(); - t.setTime(from); - t.add(Calendar.MILLISECOND, (int) DEFAULT_GAP_MILLIS); - reservedTo.setValue(t.getTime()); - } - refreshSelectedResources(true); - } - }); - - allTable = new Table(); - allTable.setSizeFull(); - allTable.setColumnCollapsingAllowed(true); - allTable.setColumnReorderingAllowed(true); - mainTabs.addTab(allTable, "All reservations", null); - mainTabs.addListener(new TabSheet.SelectedTabChangeListener() { - public void selectedTabChange(SelectedTabChangeEvent event) { - refreshReservations(); - } - }); - - resourcePanel.selectFirstCategory(); - refreshReservations(); - refreshSelectedResources(true); - } - - public void makeReservation() { - try { - final Item resource = getActiveResource(); - if (resource != null) { - db.addReservation(resource, 0, (Date) reservedFrom.getValue(), - (Date) reservedTo.getValue(), (String) description - .getValue()); - getMainWindow() - .showNotification( - "Success!", - "You have reserved the resource for the selected period.", - Notification.TYPE_WARNING_MESSAGE); - refreshReservations(); - refreshSelectedResources(false); - } else { - getMainWindow().showNotification("Oops!", - "Please select a resource (or category) to reserve.", - Notification.TYPE_WARNING_MESSAGE); - } - } catch (final ResourceNotAvailableException e) { - getMainWindow() - .showNotification( - "Not available!", - "The selected resource is already reserved for the selected period.", - Notification.TYPE_ERROR_MESSAGE); - refreshReservations(); - } - } - - private Item getActiveResource() throws ResourceNotAvailableException { - final LinkedList rids = resourcePanel.getSelectedResources(); - if (rids != null && rids.size() > 0) { - for (final Iterator it = rids.iterator(); it.hasNext();) { - final Item resource = it.next(); - final int id = ((Integer) resource.getItemProperty( - SampleDB.Resource.PROPERTY_ID_ID).getValue()) - .intValue(); - if (db.isAvailableResource(id, (Date) reservedFrom.getValue(), - (Date) reservedTo.getValue())) { - return resource; - } - } - throw new ResourceNotAvailableException("No available resources"); - } else { - return null; - } - } - - private void refreshReservations() { - final Container reservations = db.getReservations(resourcePanel - .getSelectedResources()); - reservedFrom.setContainerDataSource(reservations); - reservedTo.setContainerDataSource(reservations); - final Container allReservations = db.getReservations(null); - allTable.setContainerDataSource(allReservations); - if (allReservations != null && allReservations.size() > 0) { - allTable.setVisibleColumns(new Object[] { - SampleDB.Reservation.PROPERTY_ID_RESERVED_FROM, - SampleDB.Reservation.PROPERTY_ID_RESERVED_TO, - SampleDB.Resource.PROPERTY_ID_NAME, - SampleDB.Resource.PROPERTY_ID_DESCRIPTION, - SampleDB.Reservation.PROPERTY_ID_DESCRIPTION }); - allTable.setColumnHeaders(new String[] { "From", "To", "Resource", - "Description", "Message" }); - } - } - - private void refreshSelectedResources(boolean alertIfNotAvailable) { - Item resource = null; - try { - resource = getActiveResource(); - } catch (final ResourceNotAvailableException e) { - if (alertIfNotAvailable) { - getMainWindow().showNotification("Not available", - "Please choose another resource or time period.", - Notification.TYPE_HUMANIZED_MESSAGE); - } - refreshReservations(); - return; - } - map.clear(); - if (resource == null) { - resourceName.setCaption("Choose resource above"); - resourceName.setValue(""); - map.setContainerDataSource(db.getResources(null)); - map.setZoomLevel(1); - - } else { - // Display active resource name + desc - String name = (String) resource.getItemProperty( - SampleDB.Resource.PROPERTY_ID_NAME).getValue(); - String desc = (String) resource.getItemProperty( - SampleDB.Resource.PROPERTY_ID_DESCRIPTION).getValue(); - resourceName.setCaption(name); - resourceName.setValue(desc); - // Put all resources on map (may be many if category was selected) - final LinkedList srs = resourcePanel.getSelectedResources(); - for (final Iterator it = srs.iterator(); it.hasNext();) { - resource = it.next(); - name = (String) resource.getItemProperty( - SampleDB.Resource.PROPERTY_ID_NAME).getValue(); - desc = (String) resource.getItemProperty( - SampleDB.Resource.PROPERTY_ID_DESCRIPTION).getValue(); - final Double x = (Double) resource.getItemProperty( - SampleDB.Resource.PROPERTY_ID_LOCATIONX).getValue(); - final Double y = (Double) resource.getItemProperty( - SampleDB.Resource.PROPERTY_ID_LOCATIONY).getValue(); - if (x != null && y != null) { - map.addMarker(name + "
" + desc, new Point2D.Double(x - .doubleValue(), y.doubleValue())); - - } - - } - map.setZoomLevel((srs.size() == 1 ? 14 : 9)); - } - - } - - private void initCalendarFieldPropertyIds(CalendarField cal) { - cal.setItemStyleNamePropertyId(SampleDB.Resource.PROPERTY_ID_STYLENAME); - cal - .setItemStartPropertyId(SampleDB.Reservation.PROPERTY_ID_RESERVED_FROM); - cal.setItemEndPropertyId(SampleDB.Reservation.PROPERTY_ID_RESERVED_TO); - cal.setItemTitlePropertyId(SampleDB.Resource.PROPERTY_ID_NAME); - cal - .setItemDescriptionPropertyId(SampleDB.Reservation.PROPERTY_ID_DESCRIPTION); - } - - public void selectedResourcesChanged( - ResourceSelectorPanel.SelectedResourcesChangedEvent event) { - refreshReservations(); - refreshSelectedResources(true); - } - -} diff --git a/src/com/vaadin/demo/reservation/ResourceNotAvailableException.java b/src/com/vaadin/demo/reservation/ResourceNotAvailableException.java deleted file mode 100644 index edb52f8a56..0000000000 --- a/src/com/vaadin/demo/reservation/ResourceNotAvailableException.java +++ /dev/null @@ -1,12 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.reservation; - -@SuppressWarnings("serial") -public class ResourceNotAvailableException extends Exception { - public ResourceNotAvailableException(String message) { - super(message); - } -} diff --git a/src/com/vaadin/demo/reservation/ResourceSelectorPanel.java b/src/com/vaadin/demo/reservation/ResourceSelectorPanel.java deleted file mode 100644 index 2b4047722a..0000000000 --- a/src/com/vaadin/demo/reservation/ResourceSelectorPanel.java +++ /dev/null @@ -1,142 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.reservation; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; - -import com.vaadin.data.Container; -import com.vaadin.data.Item; -import com.vaadin.ui.Button; -import com.vaadin.ui.HorizontalLayout; -import com.vaadin.ui.Layout; -import com.vaadin.ui.Panel; -import com.vaadin.ui.VerticalLayout; -import com.vaadin.ui.Button.ClickEvent; - -@SuppressWarnings("serial") -public class ResourceSelectorPanel extends Panel implements - Button.ClickListener { - private final HashMap categoryLayouts = new HashMap(); - private final HashMap> categoryResources = new HashMap>(); - - // private Container allResources; - private LinkedList selectedResources = null; - - public ResourceSelectorPanel(String caption) { - super(caption, new HorizontalLayout()); - addStyleName(Panel.STYLE_LIGHT); - setSizeUndefined(); - setWidth("100%"); - } - - public void setResourceContainer(Container resources) { - removeAllComponents(); - categoryLayouts.clear(); - categoryResources.clear(); - if (resources != null && resources.size() > 0) { - for (final Iterator it = resources.getItemIds().iterator(); it - .hasNext();) { - final Item resource = resources.getItem(it.next()); - // final Integer id = (Integer) resource.getItemProperty( - // SampleDB.Resource.PROPERTY_ID_ID).getValue(); - final String category = (String) resource.getItemProperty( - SampleDB.Resource.PROPERTY_ID_CATEGORY).getValue(); - final String name = (String) resource.getItemProperty( - SampleDB.Resource.PROPERTY_ID_NAME).getValue(); - final String description = (String) resource.getItemProperty( - SampleDB.Resource.PROPERTY_ID_DESCRIPTION).getValue(); - final Button rButton = new Button(name, this); - rButton.setStyleName("link"); - rButton.setDescription(description); - rButton.setData(resource); - Layout resourceLayout = categoryLayouts.get(category); - LinkedList resourceList = categoryResources.get(category); - if (resourceLayout == null) { - resourceLayout = new VerticalLayout(); - resourceLayout.setSizeUndefined(); - resourceLayout.setMargin(true); - addComponent(resourceLayout); - categoryLayouts.put(category, resourceLayout); - resourceList = new LinkedList(); - categoryResources.put(category, resourceList); - final Button cButton = new Button(category + " (any)", this); - cButton.setStyleName("important-link"); - cButton.setData(category); - resourceLayout.addComponent(cButton); - } - resourceLayout.addComponent(rButton); - resourceList.add(resource); - } - } - } - - // Selects one initial category, in practice randomly - public void selectFirstCategory() { - try { - final String catId = categoryResources.keySet().iterator().next(); - final LinkedList res = categoryResources.get(catId); - final Layout l = categoryLayouts.get(catId); - final Button catB = (Button) l.getComponentIterator().next(); - setSelectedResources(res); - catB.setStyleName("selected-link"); - } catch (final Exception e) { - e.printStackTrace(System.err); - } - } - - private void setSelectedResources(LinkedList resources) { - selectedResources = resources; - fireEvent(new SelectedResourcesChangedEvent()); - } - - public LinkedList getSelectedResources() { - return selectedResources; - } - - public void buttonClick(ClickEvent event) { - final Object source = event.getSource(); - if (source instanceof Button) { - final Object data = ((Button) source).getData(); - resetStyles(); - if (data instanceof Item) { - final LinkedList rlist = new LinkedList(); - rlist.add((Item) data); - setSelectedResources(rlist); - } else { - final String category = (String) data; - final LinkedList resources = categoryResources - .get(category); - setSelectedResources(resources); - } - ((Button) source).setStyleName("selected-link"); - } - - } - - private void resetStyles() { - for (final Iterator it = categoryLayouts.values().iterator(); it - .hasNext();) { - final Layout lo = it.next(); - for (final Iterator bit = lo.getComponentIterator(); bit - .hasNext();) { - final Button b = (Button) bit.next(); - if (b.getData() instanceof Item) { - b.setStyleName("link"); - } else { - b.setStyleName("important-link"); - } - } - } - - } - - public class SelectedResourcesChangedEvent extends Event { - public SelectedResourcesChangedEvent() { - super(ResourceSelectorPanel.this); - } - } -} diff --git a/src/com/vaadin/demo/reservation/SampleDB.java b/src/com/vaadin/demo/reservation/SampleDB.java deleted file mode 100644 index 59eb7ef010..0000000000 --- a/src/com/vaadin/demo/reservation/SampleDB.java +++ /dev/null @@ -1,559 +0,0 @@ -/* -@ITMillApache2LicenseForJavaFiles@ - */ - -package com.vaadin.demo.reservation; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.Calendar; -import java.util.Collection; -import java.util.Date; -import java.util.Iterator; -import java.util.List; - -import com.vaadin.data.Container; -import com.vaadin.data.Item; -import com.vaadin.data.util.QueryContainer; - -public class SampleDB { - public class User { - public static final String TABLE = "USER"; - public static final String PROPERTY_ID_ID = TABLE + "_ID"; - public static final String PROPERTY_ID_FULLNAME = TABLE + "_FULLNAME"; - public static final String PROPERTY_ID_EMAIL = TABLE + "_EMAIL"; - public static final String PROPERTY_ID_PASSWORD = TABLE + "_PASSWORD"; - public static final String PROPERTY_ID_DELETED = TABLE + "_DELETED"; - } - - public class Resource { - public static final String TABLE = "RESOURCE"; - public static final String PROPERTY_ID_ID = TABLE + "_ID"; - public static final String PROPERTY_ID_STYLENAME = TABLE + "_STYLENAME"; - public static final String PROPERTY_ID_NAME = TABLE + "_NAME"; - public static final String PROPERTY_ID_DESCRIPTION = TABLE - + "_DESCRIPTION"; - public static final String PROPERTY_ID_LOCATIONX = TABLE - + "_LOCATION_X"; - public static final String PROPERTY_ID_LOCATIONY = TABLE - + "_LOCATION_Y"; - public static final String PROPERTY_ID_CATEGORY = TABLE + "_CATEGORY"; - public static final String PROPERTY_ID_DELETED = TABLE + "_DELETED"; - } - - public class Reservation { - public static final String TABLE = "RESERVATION"; - public static final String PROPERTY_ID_ID = TABLE + "_ID"; - public static final String PROPERTY_ID_DESCRIPTION = TABLE - + "_DESCRIPTION"; - public static final String PROPERTY_ID_RESOURCE_ID = TABLE - + "_RESOURCE_ID"; - public static final String PROPERTY_ID_RESERVED_BY_ID = TABLE - + "_RESERVED_BY_USER_ID"; - public static final String PROPERTY_ID_RESERVED_FROM = TABLE - + "_RESERVED_FROM"; - public static final String PROPERTY_ID_RESERVED_TO = TABLE - + "_RESERVED_TO"; - } - - private static final String DEFAULT_JDBC_URL = "jdbc:hsqldb:mem:reservation.db"; - private static Object dbMutex = new Object(); - - private static final String CREATE_TABLE_USER = "CREATE TABLE " - + User.TABLE + " (" + " " + User.PROPERTY_ID_ID - + " INTEGER IDENTITY" + ", " + User.PROPERTY_ID_FULLNAME - + " VARCHAR(100) NOT NULL" + ", " + User.PROPERTY_ID_EMAIL - + " VARCHAR(50) NOT NULL" + ", " + User.PROPERTY_ID_PASSWORD - + " VARCHAR(20) NOT NULL" + ", " + User.PROPERTY_ID_DELETED - + " BOOLEAN DEFAULT false NOT NULL" + ", UNIQUE(" - + User.PROPERTY_ID_FULLNAME + "), UNIQUE(" + User.PROPERTY_ID_EMAIL - + ") )"; - private static final String CREATE_TABLE_RESOURCE = "CREATE TABLE " - + Resource.TABLE + " (" + " " + Resource.PROPERTY_ID_ID - + " INTEGER IDENTITY" + ", " + Resource.PROPERTY_ID_STYLENAME - + " VARCHAR(20) NOT NULL" + ", " + Resource.PROPERTY_ID_NAME - + " VARCHAR(30) NOT NULL" + ", " + Resource.PROPERTY_ID_DESCRIPTION - + " VARCHAR(100)" + ", " + Resource.PROPERTY_ID_LOCATIONX - + " DOUBLE" + ", " + Resource.PROPERTY_ID_LOCATIONY + " DOUBLE" - + ", " + Resource.PROPERTY_ID_CATEGORY + " VARCHAR(30)" + ", " - + Resource.PROPERTY_ID_DELETED + " BOOLEAN DEFAULT false NOT NULL" - + ", UNIQUE(" + Resource.PROPERTY_ID_NAME + "))"; - private static final String CREATE_TABLE_RESERVATION = "CREATE TABLE " - + Reservation.TABLE + " (" + " " + Reservation.PROPERTY_ID_ID - + " INTEGER IDENTITY" + ", " + Reservation.PROPERTY_ID_RESOURCE_ID - + " INTEGER" + ", " + Reservation.PROPERTY_ID_RESERVED_BY_ID - + " INTEGER" + ", " + Reservation.PROPERTY_ID_RESERVED_FROM - + " TIMESTAMP NOT NULL" + ", " - + Reservation.PROPERTY_ID_RESERVED_TO + " TIMESTAMP NOT NULL" - + ", " + Reservation.PROPERTY_ID_DESCRIPTION + " VARCHAR(100)" - + ", FOREIGN KEY (" + Reservation.PROPERTY_ID_RESOURCE_ID - + ") REFERENCES " + Resource.TABLE + "(" + Resource.PROPERTY_ID_ID - + "), FOREIGN KEY (" + Reservation.PROPERTY_ID_RESERVED_BY_ID - + ") REFERENCES " + User.TABLE + "(" + User.PROPERTY_ID_ID + "))"; - - private static Connection connection = null; - - /** - * Create database. - * - * @param jdbcUrl - */ - public SampleDB(String jdbcUrl) { - if (jdbcUrl == null || jdbcUrl.equals("")) { - jdbcUrl = DEFAULT_JDBC_URL; - } - // connect to SQL database - connect(jdbcUrl); - - } - - private synchronized void dropTables() { - try { - update("DROP TABLE " + Reservation.TABLE); - } catch (final SQLException IGNORED) { - // IGNORED, assuming it was not there - } - try { - update("DROP TABLE " + Resource.TABLE); - } catch (final SQLException IGNORED) { - // IGNORED, assuming it was not there - } - try { - update("DROP TABLE " + User.TABLE); - } catch (final SQLException IGNORED) { - // IGNORED, assuming it was not there - } - } - - /** - * Connect to SQL database. In this sample we use HSQLDB and an toolkit - * named database in implicitly created into system memory. - * - */ - private synchronized void connect(String dbUrl) { - if (connection == null) { - try { - Class.forName("org.hsqldb.jdbcDriver").newInstance(); - connection = DriverManager.getConnection(dbUrl); - } catch (final Exception e) { - throw new RuntimeException(e); - } - - dropTables(); - // initialize SQL database - createTables(); - - // test by executing sample JDBC query - testDatabase(); - - generateResources(); - generateDemoUser(); - generateReservations(); - - } - } - - /** - * use for SQL commands CREATE, DROP, INSERT and UPDATE - * - * @param expression - * @throws SQLException - */ - private synchronized void update(String expression) throws SQLException { - Statement st = null; - st = connection.createStatement(); - final int i = st.executeUpdate(expression); - if (i == -1) { - System.out.println("SampleDatabase error : " + expression); - } - st.close(); - } - - /** - * Create test table and few rows. Issue note: using capitalized column - * names as HSQLDB returns column names in capitalized form with this demo. - * - */ - private synchronized void createTables() { - try { - String stmt = null; - stmt = CREATE_TABLE_RESOURCE; - update(stmt); - } catch (final SQLException e) { - if (e.toString().indexOf("Table already exists") == -1) { - throw new RuntimeException(e); - } - } - try { - String stmt = null; - stmt = CREATE_TABLE_USER; - update(stmt); - } catch (final SQLException e) { - if (e.toString().indexOf("Table already exists") == -1) { - throw new RuntimeException(e); - } - } - try { - String stmt = null; - stmt = CREATE_TABLE_RESERVATION; - update(stmt); - } catch (final SQLException e) { - if (e.toString().indexOf("Table already exists") == -1) { - throw new RuntimeException(e); - } - } - } - - /** - * Test database connection with simple SELECT command. - * - */ - private synchronized String testDatabase() { - String result = null; - try { - final Statement stmt = connection.createStatement( - ResultSet.TYPE_SCROLL_INSENSITIVE, - ResultSet.CONCUR_UPDATABLE); - final ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM " - + Resource.TABLE); - rs.next(); - result = "rowcount for table test is " + rs.getObject(1).toString(); - stmt.close(); - } catch (final SQLException e) { - throw new RuntimeException(e); - } - return result; - } - - public Connection getConnection() { - return connection; - } - - public Container getCategories() { - // TODO where deleted=? - final String q = "SELECT DISTINCT(" + Resource.PROPERTY_ID_CATEGORY - + ") FROM " + Resource.TABLE + " ORDER BY " - + Resource.PROPERTY_ID_CATEGORY; - try { - return new QueryContainer(q, connection, - ResultSet.TYPE_SCROLL_INSENSITIVE, - ResultSet.CONCUR_READ_ONLY); - } catch (final SQLException e) { - throw new RuntimeException(e); - } - - } - - public Container getResources(String category) { - // TODO where deleted=? - String q = "SELECT * FROM " + Resource.TABLE; - if (category != null) { - q += " WHERE " + Resource.PROPERTY_ID_CATEGORY + "='" + category - + "'"; // FIXME -> - // PreparedStatement! - } - - try { - return new QueryContainer(q, connection, - ResultSet.TYPE_SCROLL_INSENSITIVE, - ResultSet.CONCUR_READ_ONLY); - } catch (final SQLException e) { - throw new RuntimeException(e); - } - - } - - public Container getReservations(List resources) { - // TODO where reserved_by=? - // TODO where from=? - // TODO where to=? - // TODO where deleted=? - String q = "SELECT * FROM " + Reservation.TABLE + "," + Resource.TABLE; - q += " WHERE " + Reservation.PROPERTY_ID_RESOURCE_ID + "=" - + Resource.PROPERTY_ID_ID; - if (resources != null && resources.size() > 0) { - final StringBuffer s = new StringBuffer(); - for (final Iterator it = resources.iterator(); it.hasNext();) { - if (s.length() > 0) { - s.append(","); - } - s.append(((Item) it.next()) - .getItemProperty(Resource.PROPERTY_ID_ID)); - } - q += " HAVING " + Reservation.PROPERTY_ID_RESOURCE_ID + " IN (" + s - + ")"; - } - q += " ORDER BY " + Reservation.PROPERTY_ID_RESERVED_FROM; - try { - final QueryContainer qc = new QueryContainer(q, connection, - ResultSet.TYPE_SCROLL_INSENSITIVE, - ResultSet.CONCUR_READ_ONLY); - if (qc.size() < 1) { - return null; - } else { - return qc; - } - } catch (final SQLException e) { - throw new RuntimeException(e); - } - } - - public synchronized void addReservation(Item resource, int reservedById, - Date reservedFrom, Date reservedTo, String description) { - if (reservedFrom.after(reservedTo)) { - final Date tmp = reservedTo; - reservedTo = reservedFrom; - reservedFrom = tmp; - } - final int resourceId = ((Integer) resource.getItemProperty( - Resource.PROPERTY_ID_ID).getValue()).intValue(); - final String q = "INSERT INTO " + Reservation.TABLE + " (" - + Reservation.PROPERTY_ID_RESOURCE_ID + "," - + Reservation.PROPERTY_ID_RESERVED_BY_ID + "," - + Reservation.PROPERTY_ID_RESERVED_FROM + "," - + Reservation.PROPERTY_ID_RESERVED_TO + "," - + Reservation.PROPERTY_ID_DESCRIPTION + ")" - + "VALUES (?,?,?,?,?)"; - synchronized (dbMutex) { - try { - if (!isAvailableResource(resourceId, reservedFrom, reservedTo)) { - throw new ResourceNotAvailableException( - "The resource is not available at that time."); - } - final PreparedStatement p = connection.prepareStatement(q); - p.setInt(1, resourceId); - p.setInt(2, reservedById); - p.setTimestamp(3, - new java.sql.Timestamp(reservedFrom.getTime())); - p.setTimestamp(4, new java.sql.Timestamp(reservedTo.getTime())); - p.setString(5, description); - p.execute(); - } catch (final Exception e) { - throw new RuntimeException(e); - } - } - } - - public boolean isAvailableResource(int resourceId, Date reservedFrom, - Date reservedTo) { - // TODO where deleted=? - if (reservedFrom.after(reservedTo)) { - final Date tmp = reservedTo; - reservedTo = reservedFrom; - reservedFrom = tmp; - } - final String checkQ = "SELECT count(*) FROM " + Reservation.TABLE - + " WHERE " + Reservation.PROPERTY_ID_RESOURCE_ID + "=? AND ((" - + Reservation.PROPERTY_ID_RESERVED_FROM + ">=? AND " - + Reservation.PROPERTY_ID_RESERVED_FROM + "? AND " - + Reservation.PROPERTY_ID_RESERVED_TO + "<=?) OR (" - + Reservation.PROPERTY_ID_RESERVED_FROM + "<=? AND " - + Reservation.PROPERTY_ID_RESERVED_TO + ">=?)" + ")"; - try { - final PreparedStatement p = connection.prepareStatement(checkQ); - p.setInt(1, resourceId); - p.setTimestamp(2, new java.sql.Timestamp(reservedFrom.getTime())); - p.setTimestamp(3, new java.sql.Timestamp(reservedTo.getTime())); - p.setTimestamp(4, new java.sql.Timestamp(reservedFrom.getTime())); - p.setTimestamp(5, new java.sql.Timestamp(reservedTo.getTime())); - p.setTimestamp(6, new java.sql.Timestamp(reservedFrom.getTime())); - p.setTimestamp(7, new java.sql.Timestamp(reservedTo.getTime())); - p.execute(); - final ResultSet rs = p.getResultSet(); - if (rs.next() && rs.getInt(1) > 0) { - return false; - } - } catch (final Exception e) { - throw new RuntimeException(e); - } - return true; - } - - public Container getUsers() { - // TODO where deleted=? - final String q = "SELECT * FROM " + User.TABLE + " ORDER BY " - + User.PROPERTY_ID_FULLNAME; - try { - final QueryContainer qc = new QueryContainer(q, connection, - ResultSet.TYPE_SCROLL_INSENSITIVE, - ResultSet.CONCUR_READ_ONLY); - return qc; - } catch (final SQLException e) { - throw new RuntimeException(e); - } - } - - @SuppressWarnings("deprecation") - public synchronized void generateReservations() { - final int days = 30; - final String descriptions[] = { "Picking up guests from airport", - "Sightseeing with the guests", - "Moving new servers from A to B", "Shopping", - "Customer meeting", "Guests arriving at harbour", - "Moving furniture", "Taking guests to see town" }; - final Container cat = getCategories(); - final Collection cIds = cat.getItemIds(); - for (final Iterator it = cIds.iterator(); it.hasNext();) { - final Object id = it.next(); - final Item ci = cat.getItem(id); - final String c = (String) ci.getItemProperty( - Resource.PROPERTY_ID_CATEGORY).getValue(); - final Container resources = getResources(c); - final Collection rIds = resources.getItemIds(); - final Calendar cal = Calendar.getInstance(); - cal.set(Calendar.MINUTE, 0); - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); - final int hourNow = new Date().getHours(); - // cal.add(Calendar.DAY_OF_MONTH, -days); - for (int i = 0; i < days; i++) { - int r = 3; - for (final Iterator rit = rIds.iterator(); rit.hasNext() - && r > 0; r--) { - final Object rid = rit.next(); - final Item resource = resources.getItem(rid); - final int s = hourNow - 6 - + (int) Math.round(Math.random() * 6.0); - final int e = s + 1 + (int) Math.round(Math.random() * 4.0); - final Date start = new Date(cal.getTimeInMillis()); - start.setHours(s); - final Date end = new Date(cal.getTimeInMillis()); - end.setHours(e); - addReservation(resource, 0, start, end, - descriptions[(int) Math.floor(Math.random() - * descriptions.length)]); - } - cal.add(Calendar.DATE, 1); - } - } - - } - - public synchronized void generateResources() { - - final Object[][] resources = { - // Turku - { "01", "01 Ford Mondeo", "w/ company logo", "Turku", - new Double(60.510857), new Double(22.275424) }, - { "02", "02 Citroen Jumper", - "w/ company logo. 12m3 storage space.", "Turku", - new Double(60.452171), new Double(22.2995) }, - { "03", "03 Saab 93", "Cabriolet. Keys from the rental desk.", - "Turku", new Double(60.4507), new Double(22.295551) }, - { "04", "04 Volvo S60", "Key from the rental desk.", "Turku", - new Double(60.434722), new Double(22.224398) }, - { "05", "05 Smart fourtwo", "Cabrio. Keys from infodesk.", - "Turku", new Double(60.508970), new Double(22.264790) }, - // Helsinki - { "06", "06 Smart fourtwo", "Cabrio. Keys from infodesk.", - "Helsinki", new Double(60.17175), new Double(24.939029) }, - { "07", "07 Smart fourtwo", "Cabrio. Keys from infodesk.", - "Helsinki", new Double(60.17175), new Double(24.939029) }, - { "08", "08 Smart fourtwo", "Cabrio. Keys from infodesk.", - "Helsinki", new Double(60.166579), - new Double(24.953899) }, - { "09", "09 Volvo S60", "Keys from infodesk.", "Helsinki", - new Double(60.317832), new Double(24.967289) }, - { "10", "10 Saab 93", "Keys from infodesk.", "Helsinki", - new Double(60.249193), new Double(25.045921) }, - // Silicon Valley - { "11", "11 Ford Mustang", "Keys from Acme clerk.", - "Silicon Valley", new Double(37.615853), - new Double(-122.386384) }, - { "12", "12 Ford Fusion", "Keys from infodesk.", - "Silicon Valley", new Double(37.365028), - new Double(-121.922654) }, - { "13", "13 Land Rover", "Keys from infodesk.", - "Silicon Valley", new Double(37.365028), - new Double(-121.922654) }, - { "14", "14 Land Rover", "Keys from infodesk.", - "Silicon Valley", new Double(37.365028), - new Double(-121.922654) }, - { "15", "15 Ford Mustang", "GT Cal Special. Keys from guard.", - "Silicon Valley", new Double(37.403812), - new Double(-121.977425) }, - { "16", "16 Ford Focus", "Keys from guard.", "Silicon Valley", - new Double(37.403812), new Double(-121.977425) }, - // Paris - { "17", "17 Peugeot 308", "Keys from infodesk.", "Paris", - new Double(48.844756), new Double(2.372784) }, - { "18", "18 Citroen C6", "Keys from rental desk.", "Paris", - new Double(49.007253), new Double(2.545025) }, - { "19", "19 Citroen C6", "Keys from infodesk.", "Paris", - new Double(48.729061), new Double(2.368087) }, - { "20", "20 Peugeot 308", "Keys from ticket sales.", "Paris", - new Double(48.880931), new Double(2.356988) }, - { "21", "21 Peugeot 308", "Keys from ticket sales.", "Paris", - new Double(48.876479), new Double(2.358161) }, - // STHLM - { "22", "22 Volvo S60", "Keys from infodesk.", "Stockholm", - new Double(59.350414), new Double(18.106574) }, - { "23", "23 Saab 93", "Keys from infodesk.", "Stockholm", - new Double(59.355905), new Double(17.946784) }, - { "24", "24 Smart fourtwo", "Keys from infodesk.", "Stockholm", - new Double(59.315939), new Double(18.095904) }, - { "25", "25 Smart fourtwo", "Keys from infodesk.", "Stockholm", - new Double(59.330716), new Double(18.058702) }, - // Boston - /* - * { "26", "26 Ford Mustang", "Keys from infodesk.", "Boston", new - * Double(42.366588), new Double(-71.020955) }, { "27", "27 Smart - * fourtwo", "Keys from infodesk.", "Boston", new Double(42.365419), new - * Double(-71.061748) }, { "28", "28 Volvo S60", "Keys from Seaport - * Hotel reception.", "Boston", new Double(42.34811), new - * Double(-71.041127) }, { "29", "29 Smart fourtwo", "Keys from Seaport - * Hotel reception.", "Boston", new Double(42.348072), new - * Double(-71.041315) }, - */ - - }; - - final String q = "INSERT INTO " + Resource.TABLE + "(" - + Resource.PROPERTY_ID_STYLENAME + "," - + Resource.PROPERTY_ID_NAME + "," - + Resource.PROPERTY_ID_DESCRIPTION + "," - + Resource.PROPERTY_ID_CATEGORY + "," - + Resource.PROPERTY_ID_LOCATIONX + "," - + Resource.PROPERTY_ID_LOCATIONY + ")" - + " VALUES (?,?,?,?,?,?)"; - try { - final PreparedStatement stmt = connection.prepareStatement(q); - for (int i = 0; i < resources.length; i++) { - int j = 0; - stmt.setString(j + 1, (String) resources[i][j++]); - stmt.setString(j + 1, (String) resources[i][j++]); - stmt.setString(j + 1, (String) resources[i][j++]); - stmt.setString(j + 1, (String) resources[i][j++]); - stmt.setDouble(j + 1, ((Double) resources[i][j++]) - .doubleValue()); - stmt.setDouble(j + 1, ((Double) resources[i][j++]) - .doubleValue()); - stmt.execute(); - } - } catch (final SQLException e) { - throw new RuntimeException(e); - } - } - - public synchronized void generateDemoUser() { - final String q = "INSERT INTO USER (" + User.PROPERTY_ID_FULLNAME + "," - + User.PROPERTY_ID_EMAIL + "," + User.PROPERTY_ID_PASSWORD - + ") VALUES (?,?,?)"; - try { - final PreparedStatement stmt = connection.prepareStatement(q); - stmt.setString(1, "Demo User"); - stmt.setString(2, "demo.user@vaadin.com"); - stmt.setString(3, "demo"); - stmt.execute(); - } catch (final SQLException e) { - throw new RuntimeException(e); - } - - } - -} diff --git a/src/com/vaadin/demo/reservation/gwt/ReservationWidgetSet.gwt.xml b/src/com/vaadin/demo/reservation/gwt/ReservationWidgetSet.gwt.xml deleted file mode 100644 index 4f38e07f26..0000000000 --- a/src/com/vaadin/demo/reservation/gwt/ReservationWidgetSet.gwt.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - " - + "" - + "" - + "" - + "
" + + "" + + "
" + "" + "
" @@ -163,7 +171,7 @@ public class LoginForm extends CustomComponent { + "
" + "
Password
" + "
" - + "
" + "") + + "
Login
" + "") .getBytes(); } @@ -194,9 +202,13 @@ public class LoginForm extends CustomComponent { */ public class LoginEvent extends Event { - private Map params; + /** + * + */ + private static final long serialVersionUID = 1L; + private Map params; - private LoginEvent(Map params) { + private LoginEvent(Map params) { super(LoginForm.this); this.params = params; } @@ -209,7 +221,7 @@ public class LoginForm extends CustomComponent { */ public String getLoginParameter(String name) { if (params.containsKey(name)) { - return (String) params.get(name); + return params.get(name); } else { return null; } @@ -231,6 +243,9 @@ public class LoginForm extends CustomComponent { private static final Method ON_LOGIN_METHOD; + private static final String UNDEFINED_HEIGHT = "140px"; + private static final String UNDEFINED_WIDTH = "200px"; + static { try { ON_LOGIN_METHOD = LoginListener.class.getDeclaredMethod("onLogin", @@ -260,4 +275,28 @@ public class LoginForm extends CustomComponent { removeListener(LoginEvent.class, listener, ON_LOGIN_METHOD); } + @Override + public void setWidth(float width, int unit) { + super.setWidth(width, unit); + if (iframe != null) { + if (width < 0) { + iframe.setWidth(UNDEFINED_WIDTH); + } else { + iframe.setWidth("100%"); + } + } + } + + @Override + public void setHeight(float height, int unit) { + super.setHeight(height, unit); + if (iframe != null) { + if (height < 0) { + iframe.setHeight(UNDEFINED_HEIGHT); + } else { + iframe.setHeight("100%"); + } + } + } + } diff --git a/src/com/vaadin/automatedtests/ComponentsInTable.java b/tests/src/com/vaadin/automatedtests/ComponentsInTable.java similarity index 100% rename from src/com/vaadin/automatedtests/ComponentsInTable.java rename to tests/src/com/vaadin/automatedtests/ComponentsInTable.java diff --git a/src/com/vaadin/automatedtests/SimplestApplication.java b/tests/src/com/vaadin/automatedtests/SimplestApplication.java similarity index 100% rename from src/com/vaadin/automatedtests/SimplestApplication.java rename to tests/src/com/vaadin/automatedtests/SimplestApplication.java diff --git a/src/com/vaadin/automatedtests/featurebrowser/AccordionExample.java b/tests/src/com/vaadin/automatedtests/featurebrowser/AccordionExample.java similarity index 100% rename from src/com/vaadin/automatedtests/featurebrowser/AccordionExample.java rename to tests/src/com/vaadin/automatedtests/featurebrowser/AccordionExample.java diff --git a/src/com/vaadin/automatedtests/featurebrowser/ButtonExample.java b/tests/src/com/vaadin/automatedtests/featurebrowser/ButtonExample.java similarity index 100% rename from src/com/vaadin/automatedtests/featurebrowser/ButtonExample.java rename to tests/src/com/vaadin/automatedtests/featurebrowser/ButtonExample.java diff --git a/src/com/vaadin/automatedtests/featurebrowser/ClientCachingExample.java b/tests/src/com/vaadin/automatedtests/featurebrowser/ClientCachingExample.java similarity index 100% rename from src/com/vaadin/automatedtests/featurebrowser/ClientCachingExample.java rename to tests/src/com/vaadin/automatedtests/featurebrowser/ClientCachingExample.java diff --git a/src/com/vaadin/automatedtests/featurebrowser/ComboBoxExample.java b/tests/src/com/vaadin/automatedtests/featurebrowser/ComboBoxExample.java similarity index 100% rename from src/com/vaadin/automatedtests/featurebrowser/ComboBoxExample.java rename to tests/src/com/vaadin/automatedtests/featurebrowser/ComboBoxExample.java diff --git a/src/com/vaadin/automatedtests/featurebrowser/EmbeddedBrowserExample.java b/tests/src/com/vaadin/automatedtests/featurebrowser/EmbeddedBrowserExample.java similarity index 100% rename from src/com/vaadin/automatedtests/featurebrowser/EmbeddedBrowserExample.java rename to tests/src/com/vaadin/automatedtests/featurebrowser/EmbeddedBrowserExample.java diff --git a/src/com/vaadin/automatedtests/featurebrowser/FeatureBrowser.java b/tests/src/com/vaadin/automatedtests/featurebrowser/FeatureBrowser.java similarity index 100% rename from src/com/vaadin/automatedtests/featurebrowser/FeatureBrowser.java rename to tests/src/com/vaadin/automatedtests/featurebrowser/FeatureBrowser.java diff --git a/src/com/vaadin/automatedtests/featurebrowser/FormExample.java b/tests/src/com/vaadin/automatedtests/featurebrowser/FormExample.java similarity index 100% rename from src/com/vaadin/automatedtests/featurebrowser/FormExample.java rename to tests/src/com/vaadin/automatedtests/featurebrowser/FormExample.java diff --git a/src/com/vaadin/automatedtests/featurebrowser/GeneratedColumnExample.java b/tests/src/com/vaadin/automatedtests/featurebrowser/GeneratedColumnExample.java similarity index 100% rename from src/com/vaadin/automatedtests/featurebrowser/GeneratedColumnExample.java rename to tests/src/com/vaadin/automatedtests/featurebrowser/GeneratedColumnExample.java diff --git a/src/com/vaadin/automatedtests/featurebrowser/JavaScriptAPIExample.java b/tests/src/com/vaadin/automatedtests/featurebrowser/JavaScriptAPIExample.java similarity index 100% rename from src/com/vaadin/automatedtests/featurebrowser/JavaScriptAPIExample.java rename to tests/src/com/vaadin/automatedtests/featurebrowser/JavaScriptAPIExample.java diff --git a/src/com/vaadin/automatedtests/featurebrowser/LabelExample.java b/tests/src/com/vaadin/automatedtests/featurebrowser/LabelExample.java similarity index 100% rename from src/com/vaadin/automatedtests/featurebrowser/LabelExample.java rename to tests/src/com/vaadin/automatedtests/featurebrowser/LabelExample.java diff --git a/src/com/vaadin/automatedtests/featurebrowser/LayoutExample.java b/tests/src/com/vaadin/automatedtests/featurebrowser/LayoutExample.java similarity index 100% rename from src/com/vaadin/automatedtests/featurebrowser/LayoutExample.java rename to tests/src/com/vaadin/automatedtests/featurebrowser/LayoutExample.java diff --git a/src/com/vaadin/automatedtests/featurebrowser/NotificationExample.java b/tests/src/com/vaadin/automatedtests/featurebrowser/NotificationExample.java similarity index 100% rename from src/com/vaadin/automatedtests/featurebrowser/NotificationExample.java rename to tests/src/com/vaadin/automatedtests/featurebrowser/NotificationExample.java diff --git a/src/com/vaadin/automatedtests/featurebrowser/RichTextExample.java b/tests/src/com/vaadin/automatedtests/featurebrowser/RichTextExample.java similarity index 100% rename from src/com/vaadin/automatedtests/featurebrowser/RichTextExample.java rename to tests/src/com/vaadin/automatedtests/featurebrowser/RichTextExample.java diff --git a/src/com/vaadin/automatedtests/featurebrowser/SelectExample.java b/tests/src/com/vaadin/automatedtests/featurebrowser/SelectExample.java similarity index 100% rename from src/com/vaadin/automatedtests/featurebrowser/SelectExample.java rename to tests/src/com/vaadin/automatedtests/featurebrowser/SelectExample.java diff --git a/src/com/vaadin/automatedtests/featurebrowser/TableExample.java b/tests/src/com/vaadin/automatedtests/featurebrowser/TableExample.java similarity index 100% rename from src/com/vaadin/automatedtests/featurebrowser/TableExample.java rename to tests/src/com/vaadin/automatedtests/featurebrowser/TableExample.java diff --git a/src/com/vaadin/automatedtests/featurebrowser/TreeExample.java b/tests/src/com/vaadin/automatedtests/featurebrowser/TreeExample.java similarity index 100% rename from src/com/vaadin/automatedtests/featurebrowser/TreeExample.java rename to tests/src/com/vaadin/automatedtests/featurebrowser/TreeExample.java diff --git a/src/com/vaadin/automatedtests/featurebrowser/ValueInputExample.java b/tests/src/com/vaadin/automatedtests/featurebrowser/ValueInputExample.java similarity index 100% rename from src/com/vaadin/automatedtests/featurebrowser/ValueInputExample.java rename to tests/src/com/vaadin/automatedtests/featurebrowser/ValueInputExample.java diff --git a/src/com/vaadin/automatedtests/featurebrowser/WindowingExample.java b/tests/src/com/vaadin/automatedtests/featurebrowser/WindowingExample.java similarity index 100% rename from src/com/vaadin/automatedtests/featurebrowser/WindowingExample.java rename to tests/src/com/vaadin/automatedtests/featurebrowser/WindowingExample.java diff --git a/src/com/vaadin/automatedtests/robustness/Robustness.java b/tests/src/com/vaadin/automatedtests/robustness/Robustness.java similarity index 100% rename from src/com/vaadin/automatedtests/robustness/Robustness.java rename to tests/src/com/vaadin/automatedtests/robustness/Robustness.java diff --git a/src/com/vaadin/automatedtests/robustness/RobustnessComplex.java b/tests/src/com/vaadin/automatedtests/robustness/RobustnessComplex.java similarity index 100% rename from src/com/vaadin/automatedtests/robustness/RobustnessComplex.java rename to tests/src/com/vaadin/automatedtests/robustness/RobustnessComplex.java diff --git a/src/com/vaadin/automatedtests/util/DebugId.java b/tests/src/com/vaadin/automatedtests/util/DebugId.java similarity index 100% rename from src/com/vaadin/automatedtests/util/DebugId.java rename to tests/src/com/vaadin/automatedtests/util/DebugId.java diff --git a/src/com/vaadin/automatedtests/util/Log.java b/tests/src/com/vaadin/automatedtests/util/Log.java similarity index 100% rename from src/com/vaadin/automatedtests/util/Log.java rename to tests/src/com/vaadin/automatedtests/util/Log.java diff --git a/src/com/vaadin/automatedtests/util/MultiListener.java b/tests/src/com/vaadin/automatedtests/util/MultiListener.java similarity index 100% rename from src/com/vaadin/automatedtests/util/MultiListener.java rename to tests/src/com/vaadin/automatedtests/util/MultiListener.java diff --git a/src/com/vaadin/automatedtests/util/RandomComponents.java b/tests/src/com/vaadin/automatedtests/util/RandomComponents.java similarity index 100% rename from src/com/vaadin/automatedtests/util/RandomComponents.java rename to tests/src/com/vaadin/automatedtests/util/RandomComponents.java diff --git a/src/com/vaadin/automatedtests/util/StatusServlet.java b/tests/src/com/vaadin/automatedtests/util/StatusServlet.java similarity index 100% rename from src/com/vaadin/automatedtests/util/StatusServlet.java rename to tests/src/com/vaadin/automatedtests/util/StatusServlet.java diff --git a/src/com/vaadin/tests/BasicRandomTest.java b/tests/src/com/vaadin/tests/BasicRandomTest.java similarity index 100% rename from src/com/vaadin/tests/BasicRandomTest.java rename to tests/src/com/vaadin/tests/BasicRandomTest.java diff --git a/src/com/vaadin/tests/CustomLayoutDemo.java b/tests/src/com/vaadin/tests/CustomLayoutDemo.java similarity index 100% rename from src/com/vaadin/tests/CustomLayoutDemo.java rename to tests/src/com/vaadin/tests/CustomLayoutDemo.java diff --git a/src/com/vaadin/tests/FocusingComponents.java b/tests/src/com/vaadin/tests/FocusingComponents.java similarity index 100% rename from src/com/vaadin/tests/FocusingComponents.java rename to tests/src/com/vaadin/tests/FocusingComponents.java diff --git a/src/com/vaadin/tests/LayoutDemo.java b/tests/src/com/vaadin/tests/LayoutDemo.java similarity index 100% rename from src/com/vaadin/tests/LayoutDemo.java rename to tests/src/com/vaadin/tests/LayoutDemo.java diff --git a/src/com/vaadin/tests/ListenerOrder.java b/tests/src/com/vaadin/tests/ListenerOrder.java similarity index 100% rename from src/com/vaadin/tests/ListenerOrder.java rename to tests/src/com/vaadin/tests/ListenerOrder.java diff --git a/src/com/vaadin/tests/ModalWindow.java b/tests/src/com/vaadin/tests/ModalWindow.java similarity index 100% rename from src/com/vaadin/tests/ModalWindow.java rename to tests/src/com/vaadin/tests/ModalWindow.java diff --git a/src/com/vaadin/tests/NativeWindowing.java b/tests/src/com/vaadin/tests/NativeWindowing.java similarity index 100% rename from src/com/vaadin/tests/NativeWindowing.java rename to tests/src/com/vaadin/tests/NativeWindowing.java diff --git a/src/com/vaadin/tests/OrderedLayoutSwapComponents.java b/tests/src/com/vaadin/tests/OrderedLayoutSwapComponents.java similarity index 100% rename from src/com/vaadin/tests/OrderedLayoutSwapComponents.java rename to tests/src/com/vaadin/tests/OrderedLayoutSwapComponents.java diff --git a/src/com/vaadin/tests/Parameters.java b/tests/src/com/vaadin/tests/Parameters.java similarity index 100% rename from src/com/vaadin/tests/Parameters.java rename to tests/src/com/vaadin/tests/Parameters.java diff --git a/src/com/vaadin/tests/PerformanceTestBasicComponentRendering.java b/tests/src/com/vaadin/tests/PerformanceTestBasicComponentRendering.java similarity index 100% rename from src/com/vaadin/tests/PerformanceTestBasicComponentRendering.java rename to tests/src/com/vaadin/tests/PerformanceTestBasicComponentRendering.java diff --git a/src/com/vaadin/tests/PerformanceTestLabelsAndOrderedLayouts.java b/tests/src/com/vaadin/tests/PerformanceTestLabelsAndOrderedLayouts.java similarity index 100% rename from src/com/vaadin/tests/PerformanceTestLabelsAndOrderedLayouts.java rename to tests/src/com/vaadin/tests/PerformanceTestLabelsAndOrderedLayouts.java diff --git a/src/com/vaadin/tests/PerformanceTestSubTreeCaching.java b/tests/src/com/vaadin/tests/PerformanceTestSubTreeCaching.java similarity index 100% rename from src/com/vaadin/tests/PerformanceTestSubTreeCaching.java rename to tests/src/com/vaadin/tests/PerformanceTestSubTreeCaching.java diff --git a/src/com/vaadin/tests/QueryContainerDemo.java b/tests/src/com/vaadin/tests/QueryContainerDemo.java similarity index 100% rename from src/com/vaadin/tests/QueryContainerDemo.java rename to tests/src/com/vaadin/tests/QueryContainerDemo.java diff --git a/src/com/vaadin/tests/RandomLayoutStress.java b/tests/src/com/vaadin/tests/RandomLayoutStress.java similarity index 100% rename from src/com/vaadin/tests/RandomLayoutStress.java rename to tests/src/com/vaadin/tests/RandomLayoutStress.java diff --git a/src/com/vaadin/tests/ScrollbarStressTest.java b/tests/src/com/vaadin/tests/ScrollbarStressTest.java similarity index 100% rename from src/com/vaadin/tests/ScrollbarStressTest.java rename to tests/src/com/vaadin/tests/ScrollbarStressTest.java diff --git a/src/com/vaadin/tests/StressComponentsInTable.java b/tests/src/com/vaadin/tests/StressComponentsInTable.java similarity index 100% rename from src/com/vaadin/tests/StressComponentsInTable.java rename to tests/src/com/vaadin/tests/StressComponentsInTable.java diff --git a/src/com/vaadin/tests/TableChangingDatasource.java b/tests/src/com/vaadin/tests/TableChangingDatasource.java similarity index 100% rename from src/com/vaadin/tests/TableChangingDatasource.java rename to tests/src/com/vaadin/tests/TableChangingDatasource.java diff --git a/src/com/vaadin/tests/TableSelectTest.java b/tests/src/com/vaadin/tests/TableSelectTest.java similarity index 100% rename from src/com/vaadin/tests/TableSelectTest.java rename to tests/src/com/vaadin/tests/TableSelectTest.java diff --git a/src/com/vaadin/tests/TestBench.java b/tests/src/com/vaadin/tests/TestBench.java similarity index 100% rename from src/com/vaadin/tests/TestBench.java rename to tests/src/com/vaadin/tests/TestBench.java diff --git a/src/com/vaadin/tests/TestCaptionWrapper.java b/tests/src/com/vaadin/tests/TestCaptionWrapper.java similarity index 100% rename from src/com/vaadin/tests/TestCaptionWrapper.java rename to tests/src/com/vaadin/tests/TestCaptionWrapper.java diff --git a/src/com/vaadin/tests/TestComponentAddAndRecursion.java b/tests/src/com/vaadin/tests/TestComponentAddAndRecursion.java similarity index 100% rename from src/com/vaadin/tests/TestComponentAddAndRecursion.java rename to tests/src/com/vaadin/tests/TestComponentAddAndRecursion.java diff --git a/src/com/vaadin/tests/TestComponentsAndLayouts.java b/tests/src/com/vaadin/tests/TestComponentsAndLayouts.java similarity index 100% rename from src/com/vaadin/tests/TestComponentsAndLayouts.java rename to tests/src/com/vaadin/tests/TestComponentsAndLayouts.java diff --git a/src/com/vaadin/tests/TestContainerChanges.java b/tests/src/com/vaadin/tests/TestContainerChanges.java similarity index 100% rename from src/com/vaadin/tests/TestContainerChanges.java rename to tests/src/com/vaadin/tests/TestContainerChanges.java diff --git a/src/com/vaadin/tests/TestDateField.java b/tests/src/com/vaadin/tests/TestDateField.java similarity index 100% rename from src/com/vaadin/tests/TestDateField.java rename to tests/src/com/vaadin/tests/TestDateField.java diff --git a/src/com/vaadin/tests/TestForAlignments.java b/tests/src/com/vaadin/tests/TestForAlignments.java similarity index 100% rename from src/com/vaadin/tests/TestForAlignments.java rename to tests/src/com/vaadin/tests/TestForAlignments.java diff --git a/src/com/vaadin/tests/TestForApplicationLayoutThatUsesWholeBrosersSpace.java b/tests/src/com/vaadin/tests/TestForApplicationLayoutThatUsesWholeBrosersSpace.java similarity index 100% rename from src/com/vaadin/tests/TestForApplicationLayoutThatUsesWholeBrosersSpace.java rename to tests/src/com/vaadin/tests/TestForApplicationLayoutThatUsesWholeBrosersSpace.java diff --git a/src/com/vaadin/tests/TestForBasicApplicationLayout.java b/tests/src/com/vaadin/tests/TestForBasicApplicationLayout.java similarity index 100% rename from src/com/vaadin/tests/TestForBasicApplicationLayout.java rename to tests/src/com/vaadin/tests/TestForBasicApplicationLayout.java diff --git a/src/com/vaadin/tests/TestForChildComponentRendering.java b/tests/src/com/vaadin/tests/TestForChildComponentRendering.java similarity index 100% rename from src/com/vaadin/tests/TestForChildComponentRendering.java rename to tests/src/com/vaadin/tests/TestForChildComponentRendering.java diff --git a/src/com/vaadin/tests/TestForContainerFilterable.java b/tests/src/com/vaadin/tests/TestForContainerFilterable.java similarity index 100% rename from src/com/vaadin/tests/TestForContainerFilterable.java rename to tests/src/com/vaadin/tests/TestForContainerFilterable.java diff --git a/src/com/vaadin/tests/TestForExpandLayout.java b/tests/src/com/vaadin/tests/TestForExpandLayout.java similarity index 100% rename from src/com/vaadin/tests/TestForExpandLayout.java rename to tests/src/com/vaadin/tests/TestForExpandLayout.java diff --git a/src/com/vaadin/tests/TestForExpandLayout2.java b/tests/src/com/vaadin/tests/TestForExpandLayout2.java similarity index 100% rename from src/com/vaadin/tests/TestForExpandLayout2.java rename to tests/src/com/vaadin/tests/TestForExpandLayout2.java diff --git a/src/com/vaadin/tests/TestForExpandLayout3.java b/tests/src/com/vaadin/tests/TestForExpandLayout3.java similarity index 100% rename from src/com/vaadin/tests/TestForExpandLayout3.java rename to tests/src/com/vaadin/tests/TestForExpandLayout3.java diff --git a/src/com/vaadin/tests/TestForGridLayoutChildComponentRendering.java b/tests/src/com/vaadin/tests/TestForGridLayoutChildComponentRendering.java similarity index 100% rename from src/com/vaadin/tests/TestForGridLayoutChildComponentRendering.java rename to tests/src/com/vaadin/tests/TestForGridLayoutChildComponentRendering.java diff --git a/src/com/vaadin/tests/TestForMultipleStyleNames.java b/tests/src/com/vaadin/tests/TestForMultipleStyleNames.java similarity index 100% rename from src/com/vaadin/tests/TestForMultipleStyleNames.java rename to tests/src/com/vaadin/tests/TestForMultipleStyleNames.java diff --git a/src/com/vaadin/tests/TestForNativeWindowing.java b/tests/src/com/vaadin/tests/TestForNativeWindowing.java similarity index 100% rename from src/com/vaadin/tests/TestForNativeWindowing.java rename to tests/src/com/vaadin/tests/TestForNativeWindowing.java diff --git a/src/com/vaadin/tests/TestForPreconfiguredComponents.java b/tests/src/com/vaadin/tests/TestForPreconfiguredComponents.java similarity index 100% rename from src/com/vaadin/tests/TestForPreconfiguredComponents.java rename to tests/src/com/vaadin/tests/TestForPreconfiguredComponents.java diff --git a/src/com/vaadin/tests/TestForRichTextEditor.java b/tests/src/com/vaadin/tests/TestForRichTextEditor.java similarity index 100% rename from src/com/vaadin/tests/TestForRichTextEditor.java rename to tests/src/com/vaadin/tests/TestForRichTextEditor.java diff --git a/src/com/vaadin/tests/TestForStyledUpload.java b/tests/src/com/vaadin/tests/TestForStyledUpload.java similarity index 100% rename from src/com/vaadin/tests/TestForStyledUpload.java rename to tests/src/com/vaadin/tests/TestForStyledUpload.java diff --git a/src/com/vaadin/tests/TestForTabSheet.java b/tests/src/com/vaadin/tests/TestForTabSheet.java similarity index 100% rename from src/com/vaadin/tests/TestForTabSheet.java rename to tests/src/com/vaadin/tests/TestForTabSheet.java diff --git a/src/com/vaadin/tests/TestForTablesInitialColumnWidthLogicRendering.java b/tests/src/com/vaadin/tests/TestForTablesInitialColumnWidthLogicRendering.java similarity index 100% rename from src/com/vaadin/tests/TestForTablesInitialColumnWidthLogicRendering.java rename to tests/src/com/vaadin/tests/TestForTablesInitialColumnWidthLogicRendering.java diff --git a/src/com/vaadin/tests/TestForTrees.java b/tests/src/com/vaadin/tests/TestForTrees.java similarity index 100% rename from src/com/vaadin/tests/TestForTrees.java rename to tests/src/com/vaadin/tests/TestForTrees.java diff --git a/src/com/vaadin/tests/TestForUpload.java b/tests/src/com/vaadin/tests/TestForUpload.java similarity index 100% rename from src/com/vaadin/tests/TestForUpload.java rename to tests/src/com/vaadin/tests/TestForUpload.java diff --git a/src/com/vaadin/tests/TestForWindowOpen.java b/tests/src/com/vaadin/tests/TestForWindowOpen.java similarity index 100% rename from src/com/vaadin/tests/TestForWindowOpen.java rename to tests/src/com/vaadin/tests/TestForWindowOpen.java diff --git a/src/com/vaadin/tests/TestForWindowing.java b/tests/src/com/vaadin/tests/TestForWindowing.java similarity index 100% rename from src/com/vaadin/tests/TestForWindowing.java rename to tests/src/com/vaadin/tests/TestForWindowing.java diff --git a/src/com/vaadin/tests/TestIFrames.java b/tests/src/com/vaadin/tests/TestIFrames.java similarity index 100% rename from src/com/vaadin/tests/TestIFrames.java rename to tests/src/com/vaadin/tests/TestIFrames.java diff --git a/src/com/vaadin/tests/TestSelectAndDatefieldInDeepLayouts.java b/tests/src/com/vaadin/tests/TestSelectAndDatefieldInDeepLayouts.java similarity index 100% rename from src/com/vaadin/tests/TestSelectAndDatefieldInDeepLayouts.java rename to tests/src/com/vaadin/tests/TestSelectAndDatefieldInDeepLayouts.java diff --git a/src/com/vaadin/tests/TestSerialization.java b/tests/src/com/vaadin/tests/TestSerialization.java similarity index 100% rename from src/com/vaadin/tests/TestSerialization.java rename to tests/src/com/vaadin/tests/TestSerialization.java diff --git a/src/com/vaadin/tests/TestSetVisibleAndCaching.java b/tests/src/com/vaadin/tests/TestSetVisibleAndCaching.java similarity index 100% rename from src/com/vaadin/tests/TestSetVisibleAndCaching.java rename to tests/src/com/vaadin/tests/TestSetVisibleAndCaching.java diff --git a/src/com/vaadin/tests/TestSizeableIncomponents.java b/tests/src/com/vaadin/tests/TestSizeableIncomponents.java similarity index 100% rename from src/com/vaadin/tests/TestSizeableIncomponents.java rename to tests/src/com/vaadin/tests/TestSizeableIncomponents.java diff --git a/src/com/vaadin/tests/TestSplitPanel.java b/tests/src/com/vaadin/tests/TestSplitPanel.java similarity index 100% rename from src/com/vaadin/tests/TestSplitPanel.java rename to tests/src/com/vaadin/tests/TestSplitPanel.java diff --git a/src/com/vaadin/tests/TreeFilesystem.java b/tests/src/com/vaadin/tests/TreeFilesystem.java similarity index 100% rename from src/com/vaadin/tests/TreeFilesystem.java rename to tests/src/com/vaadin/tests/TreeFilesystem.java diff --git a/src/com/vaadin/tests/TreeFilesystemContainer.java b/tests/src/com/vaadin/tests/TreeFilesystemContainer.java similarity index 100% rename from src/com/vaadin/tests/TreeFilesystemContainer.java rename to tests/src/com/vaadin/tests/TreeFilesystemContainer.java diff --git a/src/com/vaadin/tests/UpgradingSample.java b/tests/src/com/vaadin/tests/UpgradingSample.java similarity index 100% rename from src/com/vaadin/tests/UpgradingSample.java rename to tests/src/com/vaadin/tests/UpgradingSample.java diff --git a/src/com/vaadin/tests/UsingCustomNewItemHandlerInSelect.java b/tests/src/com/vaadin/tests/UsingCustomNewItemHandlerInSelect.java similarity index 100% rename from src/com/vaadin/tests/UsingCustomNewItemHandlerInSelect.java rename to tests/src/com/vaadin/tests/UsingCustomNewItemHandlerInSelect.java diff --git a/src/com/vaadin/tests/UsingObjectsInSelect.java b/tests/src/com/vaadin/tests/UsingObjectsInSelect.java similarity index 100% rename from src/com/vaadin/tests/UsingObjectsInSelect.java rename to tests/src/com/vaadin/tests/UsingObjectsInSelect.java diff --git a/src/com/vaadin/tests/appengine/GAESyncTest.java b/tests/src/com/vaadin/tests/appengine/GAESyncTest.java similarity index 100% rename from src/com/vaadin/tests/appengine/GAESyncTest.java rename to tests/src/com/vaadin/tests/appengine/GAESyncTest.java diff --git a/src/com/vaadin/tests/appengine/img1.png b/tests/src/com/vaadin/tests/appengine/img1.png similarity index 100% rename from src/com/vaadin/tests/appengine/img1.png rename to tests/src/com/vaadin/tests/appengine/img1.png diff --git a/src/com/vaadin/tests/applicationservlet/NoMainWindow.java b/tests/src/com/vaadin/tests/applicationservlet/NoMainWindow.java similarity index 100% rename from src/com/vaadin/tests/applicationservlet/NoMainWindow.java rename to tests/src/com/vaadin/tests/applicationservlet/NoMainWindow.java diff --git a/src/com/vaadin/tests/applicationservlet/TestStaticFilesLocation.java b/tests/src/com/vaadin/tests/applicationservlet/TestStaticFilesLocation.java similarity index 100% rename from src/com/vaadin/tests/applicationservlet/TestStaticFilesLocation.java rename to tests/src/com/vaadin/tests/applicationservlet/TestStaticFilesLocation.java diff --git a/src/com/vaadin/tests/book/BookTestApplication.java b/tests/src/com/vaadin/tests/book/BookTestApplication.java similarity index 100% rename from src/com/vaadin/tests/book/BookTestApplication.java rename to tests/src/com/vaadin/tests/book/BookTestApplication.java diff --git a/src/com/vaadin/tests/book/ChatApplication.java b/tests/src/com/vaadin/tests/book/ChatApplication.java similarity index 100% rename from src/com/vaadin/tests/book/ChatApplication.java rename to tests/src/com/vaadin/tests/book/ChatApplication.java diff --git a/src/com/vaadin/tests/book/DefaultButtonExample.java b/tests/src/com/vaadin/tests/book/DefaultButtonExample.java similarity index 100% rename from src/com/vaadin/tests/book/DefaultButtonExample.java rename to tests/src/com/vaadin/tests/book/DefaultButtonExample.java diff --git a/src/com/vaadin/tests/book/EmbeddedButton.java b/tests/src/com/vaadin/tests/book/EmbeddedButton.java similarity index 100% rename from src/com/vaadin/tests/book/EmbeddedButton.java rename to tests/src/com/vaadin/tests/book/EmbeddedButton.java diff --git a/src/com/vaadin/tests/book/FormExample.java b/tests/src/com/vaadin/tests/book/FormExample.java similarity index 100% rename from src/com/vaadin/tests/book/FormExample.java rename to tests/src/com/vaadin/tests/book/FormExample.java diff --git a/src/com/vaadin/tests/book/FormExample2.java b/tests/src/com/vaadin/tests/book/FormExample2.java similarity index 100% rename from src/com/vaadin/tests/book/FormExample2.java rename to tests/src/com/vaadin/tests/book/FormExample2.java diff --git a/src/com/vaadin/tests/book/MyDynamicResource.java b/tests/src/com/vaadin/tests/book/MyDynamicResource.java similarity index 100% rename from src/com/vaadin/tests/book/MyDynamicResource.java rename to tests/src/com/vaadin/tests/book/MyDynamicResource.java diff --git a/src/com/vaadin/tests/book/MyUploader.java b/tests/src/com/vaadin/tests/book/MyUploader.java similarity index 100% rename from src/com/vaadin/tests/book/MyUploader.java rename to tests/src/com/vaadin/tests/book/MyUploader.java diff --git a/src/com/vaadin/tests/book/SSNField.java b/tests/src/com/vaadin/tests/book/SSNField.java similarity index 100% rename from src/com/vaadin/tests/book/SSNField.java rename to tests/src/com/vaadin/tests/book/SSNField.java diff --git a/src/com/vaadin/tests/book/SelectExample.java b/tests/src/com/vaadin/tests/book/SelectExample.java similarity index 100% rename from src/com/vaadin/tests/book/SelectExample.java rename to tests/src/com/vaadin/tests/book/SelectExample.java diff --git a/src/com/vaadin/tests/book/TabSheetExample.java b/tests/src/com/vaadin/tests/book/TabSheetExample.java similarity index 100% rename from src/com/vaadin/tests/book/TabSheetExample.java rename to tests/src/com/vaadin/tests/book/TabSheetExample.java diff --git a/src/com/vaadin/tests/book/TableCellStyle.java b/tests/src/com/vaadin/tests/book/TableCellStyle.java similarity index 100% rename from src/com/vaadin/tests/book/TableCellStyle.java rename to tests/src/com/vaadin/tests/book/TableCellStyle.java diff --git a/src/com/vaadin/tests/book/TableEditable.java b/tests/src/com/vaadin/tests/book/TableEditable.java similarity index 100% rename from src/com/vaadin/tests/book/TableEditable.java rename to tests/src/com/vaadin/tests/book/TableEditable.java diff --git a/src/com/vaadin/tests/book/TableEditableBean.java b/tests/src/com/vaadin/tests/book/TableEditableBean.java similarity index 100% rename from src/com/vaadin/tests/book/TableEditableBean.java rename to tests/src/com/vaadin/tests/book/TableEditableBean.java diff --git a/src/com/vaadin/tests/book/TableExample.java b/tests/src/com/vaadin/tests/book/TableExample.java similarity index 100% rename from src/com/vaadin/tests/book/TableExample.java rename to tests/src/com/vaadin/tests/book/TableExample.java diff --git a/src/com/vaadin/tests/book/TableExample1.java b/tests/src/com/vaadin/tests/book/TableExample1.java similarity index 100% rename from src/com/vaadin/tests/book/TableExample1.java rename to tests/src/com/vaadin/tests/book/TableExample1.java diff --git a/src/com/vaadin/tests/book/TableExample2.java b/tests/src/com/vaadin/tests/book/TableExample2.java similarity index 100% rename from src/com/vaadin/tests/book/TableExample2.java rename to tests/src/com/vaadin/tests/book/TableExample2.java diff --git a/src/com/vaadin/tests/book/TableExample3.java b/tests/src/com/vaadin/tests/book/TableExample3.java similarity index 100% rename from src/com/vaadin/tests/book/TableExample3.java rename to tests/src/com/vaadin/tests/book/TableExample3.java diff --git a/src/com/vaadin/tests/book/TableHuge.java b/tests/src/com/vaadin/tests/book/TableHuge.java similarity index 100% rename from src/com/vaadin/tests/book/TableHuge.java rename to tests/src/com/vaadin/tests/book/TableHuge.java diff --git a/src/com/vaadin/tests/book/TheButton.java b/tests/src/com/vaadin/tests/book/TheButton.java similarity index 100% rename from src/com/vaadin/tests/book/TheButton.java rename to tests/src/com/vaadin/tests/book/TheButton.java diff --git a/src/com/vaadin/tests/book/TheButtons.java b/tests/src/com/vaadin/tests/book/TheButtons.java similarity index 100% rename from src/com/vaadin/tests/book/TheButtons.java rename to tests/src/com/vaadin/tests/book/TheButtons.java diff --git a/src/com/vaadin/tests/book/TheButtons2.java b/tests/src/com/vaadin/tests/book/TheButtons2.java similarity index 100% rename from src/com/vaadin/tests/book/TheButtons2.java rename to tests/src/com/vaadin/tests/book/TheButtons2.java diff --git a/src/com/vaadin/tests/book/TheButtons3.java b/tests/src/com/vaadin/tests/book/TheButtons3.java similarity index 100% rename from src/com/vaadin/tests/book/TheButtons3.java rename to tests/src/com/vaadin/tests/book/TheButtons3.java diff --git a/src/com/vaadin/tests/book/WindowOpener.java b/tests/src/com/vaadin/tests/book/WindowOpener.java similarity index 100% rename from src/com/vaadin/tests/book/WindowOpener.java rename to tests/src/com/vaadin/tests/book/WindowOpener.java diff --git a/src/com/vaadin/tests/book/WindowTestApplication.java b/tests/src/com/vaadin/tests/book/WindowTestApplication.java similarity index 100% rename from src/com/vaadin/tests/book/WindowTestApplication.java rename to tests/src/com/vaadin/tests/book/WindowTestApplication.java diff --git a/src/com/vaadin/tests/book/images/Earth_small.png b/tests/src/com/vaadin/tests/book/images/Earth_small.png similarity index 100% rename from src/com/vaadin/tests/book/images/Earth_small.png rename to tests/src/com/vaadin/tests/book/images/Earth_small.png diff --git a/src/com/vaadin/tests/book/images/Earth_symbol.png b/tests/src/com/vaadin/tests/book/images/Earth_symbol.png similarity index 100% rename from src/com/vaadin/tests/book/images/Earth_symbol.png rename to tests/src/com/vaadin/tests/book/images/Earth_symbol.png diff --git a/src/com/vaadin/tests/book/images/Jupiter_symbol.png b/tests/src/com/vaadin/tests/book/images/Jupiter_symbol.png similarity index 100% rename from src/com/vaadin/tests/book/images/Jupiter_symbol.png rename to tests/src/com/vaadin/tests/book/images/Jupiter_symbol.png diff --git a/src/com/vaadin/tests/book/images/Mars_symbol.png b/tests/src/com/vaadin/tests/book/images/Mars_symbol.png similarity index 100% rename from src/com/vaadin/tests/book/images/Mars_symbol.png rename to tests/src/com/vaadin/tests/book/images/Mars_symbol.png diff --git a/src/com/vaadin/tests/book/images/Mercury_small.png b/tests/src/com/vaadin/tests/book/images/Mercury_small.png similarity index 100% rename from src/com/vaadin/tests/book/images/Mercury_small.png rename to tests/src/com/vaadin/tests/book/images/Mercury_small.png diff --git a/src/com/vaadin/tests/book/images/Mercury_symbol.png b/tests/src/com/vaadin/tests/book/images/Mercury_symbol.png similarity index 100% rename from src/com/vaadin/tests/book/images/Mercury_symbol.png rename to tests/src/com/vaadin/tests/book/images/Mercury_symbol.png diff --git a/src/com/vaadin/tests/book/images/Neptune_symbol.png b/tests/src/com/vaadin/tests/book/images/Neptune_symbol.png similarity index 100% rename from src/com/vaadin/tests/book/images/Neptune_symbol.png rename to tests/src/com/vaadin/tests/book/images/Neptune_symbol.png diff --git a/src/com/vaadin/tests/book/images/Saturn_symbol.png b/tests/src/com/vaadin/tests/book/images/Saturn_symbol.png similarity index 100% rename from src/com/vaadin/tests/book/images/Saturn_symbol.png rename to tests/src/com/vaadin/tests/book/images/Saturn_symbol.png diff --git a/src/com/vaadin/tests/book/images/Uranus_symbol.png b/tests/src/com/vaadin/tests/book/images/Uranus_symbol.png similarity index 100% rename from src/com/vaadin/tests/book/images/Uranus_symbol.png rename to tests/src/com/vaadin/tests/book/images/Uranus_symbol.png diff --git a/src/com/vaadin/tests/book/images/Venus_small.png b/tests/src/com/vaadin/tests/book/images/Venus_small.png similarity index 100% rename from src/com/vaadin/tests/book/images/Venus_small.png rename to tests/src/com/vaadin/tests/book/images/Venus_small.png diff --git a/src/com/vaadin/tests/book/images/Venus_symbol.png b/tests/src/com/vaadin/tests/book/images/Venus_symbol.png similarity index 100% rename from src/com/vaadin/tests/book/images/Venus_symbol.png rename to tests/src/com/vaadin/tests/book/images/Venus_symbol.png diff --git a/src/com/vaadin/tests/book/smiley.jpg b/tests/src/com/vaadin/tests/book/smiley.jpg similarity index 100% rename from src/com/vaadin/tests/book/smiley.jpg rename to tests/src/com/vaadin/tests/book/smiley.jpg diff --git a/src/com/vaadin/tests/components/AbstractTestCase.java b/tests/src/com/vaadin/tests/components/AbstractTestCase.java similarity index 100% rename from src/com/vaadin/tests/components/AbstractTestCase.java rename to tests/src/com/vaadin/tests/components/AbstractTestCase.java diff --git a/src/com/vaadin/tests/components/CustomComponentwithUndefinedSize.java b/tests/src/com/vaadin/tests/components/CustomComponentwithUndefinedSize.java similarity index 100% rename from src/com/vaadin/tests/components/CustomComponentwithUndefinedSize.java rename to tests/src/com/vaadin/tests/components/CustomComponentwithUndefinedSize.java diff --git a/src/com/vaadin/tests/components/HierarchicalContainerSorting.java b/tests/src/com/vaadin/tests/components/HierarchicalContainerSorting.java similarity index 100% rename from src/com/vaadin/tests/components/HierarchicalContainerSorting.java rename to tests/src/com/vaadin/tests/components/HierarchicalContainerSorting.java diff --git a/src/com/vaadin/tests/components/MultipleDebugIds.java b/tests/src/com/vaadin/tests/components/MultipleDebugIds.java similarity index 100% rename from src/com/vaadin/tests/components/MultipleDebugIds.java rename to tests/src/com/vaadin/tests/components/MultipleDebugIds.java diff --git a/src/com/vaadin/tests/components/TestBase.java b/tests/src/com/vaadin/tests/components/TestBase.java similarity index 100% rename from src/com/vaadin/tests/components/TestBase.java rename to tests/src/com/vaadin/tests/components/TestBase.java diff --git a/src/com/vaadin/tests/components/absolutelayout/AbsoluteLayoutClipping.html b/tests/src/com/vaadin/tests/components/absolutelayout/AbsoluteLayoutClipping.html similarity index 100% rename from src/com/vaadin/tests/components/absolutelayout/AbsoluteLayoutClipping.html rename to tests/src/com/vaadin/tests/components/absolutelayout/AbsoluteLayoutClipping.html diff --git a/src/com/vaadin/tests/components/absolutelayout/AbsoluteLayoutClipping.java b/tests/src/com/vaadin/tests/components/absolutelayout/AbsoluteLayoutClipping.java similarity index 100% rename from src/com/vaadin/tests/components/absolutelayout/AbsoluteLayoutClipping.java rename to tests/src/com/vaadin/tests/components/absolutelayout/AbsoluteLayoutClipping.java diff --git a/src/com/vaadin/tests/components/abstractfield/AbstractFieldCommitWithInvalidValues.html b/tests/src/com/vaadin/tests/components/abstractfield/AbstractFieldCommitWithInvalidValues.html similarity index 100% rename from src/com/vaadin/tests/components/abstractfield/AbstractFieldCommitWithInvalidValues.html rename to tests/src/com/vaadin/tests/components/abstractfield/AbstractFieldCommitWithInvalidValues.html diff --git a/src/com/vaadin/tests/components/abstractfield/AbstractFieldCommitWithInvalidValues.java b/tests/src/com/vaadin/tests/components/abstractfield/AbstractFieldCommitWithInvalidValues.java similarity index 100% rename from src/com/vaadin/tests/components/abstractfield/AbstractFieldCommitWithInvalidValues.java rename to tests/src/com/vaadin/tests/components/abstractfield/AbstractFieldCommitWithInvalidValues.java diff --git a/src/com/vaadin/tests/components/accordion/AccordionInactiveTabSize.java b/tests/src/com/vaadin/tests/components/accordion/AccordionInactiveTabSize.java similarity index 100% rename from src/com/vaadin/tests/components/accordion/AccordionInactiveTabSize.java rename to tests/src/com/vaadin/tests/components/accordion/AccordionInactiveTabSize.java diff --git a/src/com/vaadin/tests/components/accordion/RemoveTabs.html b/tests/src/com/vaadin/tests/components/accordion/RemoveTabs.html similarity index 100% rename from src/com/vaadin/tests/components/accordion/RemoveTabs.html rename to tests/src/com/vaadin/tests/components/accordion/RemoveTabs.html diff --git a/src/com/vaadin/tests/components/accordion/RemoveTabs.java b/tests/src/com/vaadin/tests/components/accordion/RemoveTabs.java similarity index 100% rename from src/com/vaadin/tests/components/accordion/RemoveTabs.java rename to tests/src/com/vaadin/tests/components/accordion/RemoveTabs.java diff --git a/src/com/vaadin/tests/components/beanitemcontainer/BeanItemContainerGenerator.java b/tests/src/com/vaadin/tests/components/beanitemcontainer/BeanItemContainerGenerator.java similarity index 100% rename from src/com/vaadin/tests/components/beanitemcontainer/BeanItemContainerGenerator.java rename to tests/src/com/vaadin/tests/components/beanitemcontainer/BeanItemContainerGenerator.java diff --git a/src/com/vaadin/tests/components/beanitemcontainer/BeanItemContainerNullValues.java b/tests/src/com/vaadin/tests/components/beanitemcontainer/BeanItemContainerNullValues.java similarity index 100% rename from src/com/vaadin/tests/components/beanitemcontainer/BeanItemContainerNullValues.java rename to tests/src/com/vaadin/tests/components/beanitemcontainer/BeanItemContainerNullValues.java diff --git a/src/com/vaadin/tests/components/beanitemcontainer/TestBeanItemContainerUsage.html b/tests/src/com/vaadin/tests/components/beanitemcontainer/TestBeanItemContainerUsage.html similarity index 100% rename from src/com/vaadin/tests/components/beanitemcontainer/TestBeanItemContainerUsage.html rename to tests/src/com/vaadin/tests/components/beanitemcontainer/TestBeanItemContainerUsage.html diff --git a/src/com/vaadin/tests/components/beanitemcontainer/TestBeanItemContainerUsage.java b/tests/src/com/vaadin/tests/components/beanitemcontainer/TestBeanItemContainerUsage.java similarity index 100% rename from src/com/vaadin/tests/components/beanitemcontainer/TestBeanItemContainerUsage.java rename to tests/src/com/vaadin/tests/components/beanitemcontainer/TestBeanItemContainerUsage.java diff --git a/src/com/vaadin/tests/components/button/ButtonErrorMessage.java b/tests/src/com/vaadin/tests/components/button/ButtonErrorMessage.java similarity index 100% rename from src/com/vaadin/tests/components/button/ButtonErrorMessage.java rename to tests/src/com/vaadin/tests/components/button/ButtonErrorMessage.java diff --git a/src/com/vaadin/tests/components/button/ButtonUndefinedWidth.html b/tests/src/com/vaadin/tests/components/button/ButtonUndefinedWidth.html similarity index 100% rename from src/com/vaadin/tests/components/button/ButtonUndefinedWidth.html rename to tests/src/com/vaadin/tests/components/button/ButtonUndefinedWidth.html diff --git a/src/com/vaadin/tests/components/button/ButtonUndefinedWidth.java b/tests/src/com/vaadin/tests/components/button/ButtonUndefinedWidth.java similarity index 100% rename from src/com/vaadin/tests/components/button/ButtonUndefinedWidth.java rename to tests/src/com/vaadin/tests/components/button/ButtonUndefinedWidth.java diff --git a/src/com/vaadin/tests/components/button/DisabledButtons.html b/tests/src/com/vaadin/tests/components/button/DisabledButtons.html similarity index 100% rename from src/com/vaadin/tests/components/button/DisabledButtons.html rename to tests/src/com/vaadin/tests/components/button/DisabledButtons.html diff --git a/src/com/vaadin/tests/components/button/DisabledButtons.java b/tests/src/com/vaadin/tests/components/button/DisabledButtons.java similarity index 100% rename from src/com/vaadin/tests/components/button/DisabledButtons.java rename to tests/src/com/vaadin/tests/components/button/DisabledButtons.java diff --git a/src/com/vaadin/tests/components/button/IE7ButtonWithIcon.html b/tests/src/com/vaadin/tests/components/button/IE7ButtonWithIcon.html similarity index 100% rename from src/com/vaadin/tests/components/button/IE7ButtonWithIcon.html rename to tests/src/com/vaadin/tests/components/button/IE7ButtonWithIcon.html diff --git a/src/com/vaadin/tests/components/button/IE7ButtonWithIcon.java b/tests/src/com/vaadin/tests/components/button/IE7ButtonWithIcon.java similarity index 100% rename from src/com/vaadin/tests/components/button/IE7ButtonWithIcon.java rename to tests/src/com/vaadin/tests/components/button/IE7ButtonWithIcon.java diff --git a/src/com/vaadin/tests/components/button/TooltipForDisabledButton.java b/tests/src/com/vaadin/tests/components/button/TooltipForDisabledButton.java similarity index 100% rename from src/com/vaadin/tests/components/button/TooltipForDisabledButton.java rename to tests/src/com/vaadin/tests/components/button/TooltipForDisabledButton.java diff --git a/src/com/vaadin/tests/components/caption/LargeCaptionIcon.html b/tests/src/com/vaadin/tests/components/caption/LargeCaptionIcon.html similarity index 100% rename from src/com/vaadin/tests/components/caption/LargeCaptionIcon.html rename to tests/src/com/vaadin/tests/components/caption/LargeCaptionIcon.html diff --git a/src/com/vaadin/tests/components/caption/LargeCaptionIcon.java b/tests/src/com/vaadin/tests/components/caption/LargeCaptionIcon.java similarity index 100% rename from src/com/vaadin/tests/components/caption/LargeCaptionIcon.java rename to tests/src/com/vaadin/tests/components/caption/LargeCaptionIcon.java diff --git a/src/com/vaadin/tests/components/checkbox/CheckboxCaptionWrapping.html b/tests/src/com/vaadin/tests/components/checkbox/CheckboxCaptionWrapping.html similarity index 100% rename from src/com/vaadin/tests/components/checkbox/CheckboxCaptionWrapping.html rename to tests/src/com/vaadin/tests/components/checkbox/CheckboxCaptionWrapping.html diff --git a/src/com/vaadin/tests/components/checkbox/CheckboxCaptionWrapping.java b/tests/src/com/vaadin/tests/components/checkbox/CheckboxCaptionWrapping.java similarity index 100% rename from src/com/vaadin/tests/components/checkbox/CheckboxCaptionWrapping.java rename to tests/src/com/vaadin/tests/components/checkbox/CheckboxCaptionWrapping.java diff --git a/src/com/vaadin/tests/components/checkbox/CheckboxIcon.java b/tests/src/com/vaadin/tests/components/checkbox/CheckboxIcon.java similarity index 100% rename from src/com/vaadin/tests/components/checkbox/CheckboxIcon.java rename to tests/src/com/vaadin/tests/components/checkbox/CheckboxIcon.java diff --git a/src/com/vaadin/tests/components/combobox/ComboBoxInPopupView.java b/tests/src/com/vaadin/tests/components/combobox/ComboBoxInPopupView.java similarity index 100% rename from src/com/vaadin/tests/components/combobox/ComboBoxInPopupView.java rename to tests/src/com/vaadin/tests/components/combobox/ComboBoxInPopupView.java diff --git a/src/com/vaadin/tests/components/combobox/ComboBoxItemIcon.html b/tests/src/com/vaadin/tests/components/combobox/ComboBoxItemIcon.html similarity index 100% rename from src/com/vaadin/tests/components/combobox/ComboBoxItemIcon.html rename to tests/src/com/vaadin/tests/components/combobox/ComboBoxItemIcon.html diff --git a/src/com/vaadin/tests/components/combobox/ComboBoxItemIcon.java b/tests/src/com/vaadin/tests/components/combobox/ComboBoxItemIcon.java similarity index 100% rename from src/com/vaadin/tests/components/combobox/ComboBoxItemIcon.java rename to tests/src/com/vaadin/tests/components/combobox/ComboBoxItemIcon.java diff --git a/src/com/vaadin/tests/components/combobox/ComboBoxLargeIcons.java b/tests/src/com/vaadin/tests/components/combobox/ComboBoxLargeIcons.java similarity index 100% rename from src/com/vaadin/tests/components/combobox/ComboBoxLargeIcons.java rename to tests/src/com/vaadin/tests/components/combobox/ComboBoxLargeIcons.java diff --git a/src/com/vaadin/tests/components/combobox/ComboBoxNavigation.html b/tests/src/com/vaadin/tests/components/combobox/ComboBoxNavigation.html similarity index 100% rename from src/com/vaadin/tests/components/combobox/ComboBoxNavigation.html rename to tests/src/com/vaadin/tests/components/combobox/ComboBoxNavigation.html diff --git a/src/com/vaadin/tests/components/combobox/ComboBoxNavigation.java b/tests/src/com/vaadin/tests/components/combobox/ComboBoxNavigation.java similarity index 100% rename from src/com/vaadin/tests/components/combobox/ComboBoxNavigation.java rename to tests/src/com/vaadin/tests/components/combobox/ComboBoxNavigation.java diff --git a/src/com/vaadin/tests/components/combobox/ComboBoxValueInput.html b/tests/src/com/vaadin/tests/components/combobox/ComboBoxValueInput.html similarity index 100% rename from src/com/vaadin/tests/components/combobox/ComboBoxValueInput.html rename to tests/src/com/vaadin/tests/components/combobox/ComboBoxValueInput.html diff --git a/src/com/vaadin/tests/components/combobox/ComboBoxValueInput.java b/tests/src/com/vaadin/tests/components/combobox/ComboBoxValueInput.java similarity index 100% rename from src/com/vaadin/tests/components/combobox/ComboBoxValueInput.java rename to tests/src/com/vaadin/tests/components/combobox/ComboBoxValueInput.java diff --git a/src/com/vaadin/tests/components/combobox/ComboBoxValueUpdate.java b/tests/src/com/vaadin/tests/components/combobox/ComboBoxValueUpdate.java similarity index 100% rename from src/com/vaadin/tests/components/combobox/ComboBoxValueUpdate.java rename to tests/src/com/vaadin/tests/components/combobox/ComboBoxValueUpdate.java diff --git a/src/com/vaadin/tests/components/combobox/ComboxBoxErrorMessage.java b/tests/src/com/vaadin/tests/components/combobox/ComboxBoxErrorMessage.java similarity index 100% rename from src/com/vaadin/tests/components/combobox/ComboxBoxErrorMessage.java rename to tests/src/com/vaadin/tests/components/combobox/ComboxBoxErrorMessage.java diff --git a/src/com/vaadin/tests/components/combobox/fi.gif b/tests/src/com/vaadin/tests/components/combobox/fi.gif similarity index 100% rename from src/com/vaadin/tests/components/combobox/fi.gif rename to tests/src/com/vaadin/tests/components/combobox/fi.gif diff --git a/src/com/vaadin/tests/components/combobox/se.gif b/tests/src/com/vaadin/tests/components/combobox/se.gif similarity index 100% rename from src/com/vaadin/tests/components/combobox/se.gif rename to tests/src/com/vaadin/tests/components/combobox/se.gif diff --git a/src/com/vaadin/tests/components/datefield/DateFieldReadOnly.html b/tests/src/com/vaadin/tests/components/datefield/DateFieldReadOnly.html similarity index 100% rename from src/com/vaadin/tests/components/datefield/DateFieldReadOnly.html rename to tests/src/com/vaadin/tests/components/datefield/DateFieldReadOnly.html diff --git a/src/com/vaadin/tests/components/datefield/DateFieldReadOnly.java b/tests/src/com/vaadin/tests/components/datefield/DateFieldReadOnly.java similarity index 100% rename from src/com/vaadin/tests/components/datefield/DateFieldReadOnly.java rename to tests/src/com/vaadin/tests/components/datefield/DateFieldReadOnly.java diff --git a/src/com/vaadin/tests/components/datefield/DisabledDateFieldWidth b/tests/src/com/vaadin/tests/components/datefield/DisabledDateFieldWidth similarity index 100% rename from src/com/vaadin/tests/components/datefield/DisabledDateFieldWidth rename to tests/src/com/vaadin/tests/components/datefield/DisabledDateFieldWidth diff --git a/src/com/vaadin/tests/components/datefield/DisabledDateFieldWidth.java b/tests/src/com/vaadin/tests/components/datefield/DisabledDateFieldWidth.java similarity index 100% rename from src/com/vaadin/tests/components/datefield/DisabledDateFieldWidth.java rename to tests/src/com/vaadin/tests/components/datefield/DisabledDateFieldWidth.java diff --git a/src/com/vaadin/tests/components/datefield/TestDatefieldYear.html b/tests/src/com/vaadin/tests/components/datefield/TestDatefieldYear.html similarity index 100% rename from src/com/vaadin/tests/components/datefield/TestDatefieldYear.html rename to tests/src/com/vaadin/tests/components/datefield/TestDatefieldYear.html diff --git a/src/com/vaadin/tests/components/datefield/TestDatefieldYear.java b/tests/src/com/vaadin/tests/components/datefield/TestDatefieldYear.java similarity index 100% rename from src/com/vaadin/tests/components/datefield/TestDatefieldYear.java rename to tests/src/com/vaadin/tests/components/datefield/TestDatefieldYear.java diff --git a/src/com/vaadin/tests/components/embedded/EmbeddedFlash.java b/tests/src/com/vaadin/tests/components/embedded/EmbeddedFlash.java similarity index 100% rename from src/com/vaadin/tests/components/embedded/EmbeddedFlash.java rename to tests/src/com/vaadin/tests/components/embedded/EmbeddedFlash.java diff --git a/src/com/vaadin/tests/components/embedded/EmbeddedImageRefresh.java b/tests/src/com/vaadin/tests/components/embedded/EmbeddedImageRefresh.java similarity index 100% rename from src/com/vaadin/tests/components/embedded/EmbeddedImageRefresh.java rename to tests/src/com/vaadin/tests/components/embedded/EmbeddedImageRefresh.java diff --git a/src/com/vaadin/tests/components/embedded/EmbeddedTooltip.java b/tests/src/com/vaadin/tests/components/embedded/EmbeddedTooltip.java similarity index 100% rename from src/com/vaadin/tests/components/embedded/EmbeddedTooltip.java rename to tests/src/com/vaadin/tests/components/embedded/EmbeddedTooltip.java diff --git a/src/com/vaadin/tests/components/form/FormCommitWithInvalidValues.html b/tests/src/com/vaadin/tests/components/form/FormCommitWithInvalidValues.html similarity index 100% rename from src/com/vaadin/tests/components/form/FormCommitWithInvalidValues.html rename to tests/src/com/vaadin/tests/components/form/FormCommitWithInvalidValues.html diff --git a/src/com/vaadin/tests/components/form/FormCommitWithInvalidValues.java b/tests/src/com/vaadin/tests/components/form/FormCommitWithInvalidValues.java similarity index 100% rename from src/com/vaadin/tests/components/form/FormCommitWithInvalidValues.java rename to tests/src/com/vaadin/tests/components/form/FormCommitWithInvalidValues.java diff --git a/src/com/vaadin/tests/components/form/FormNotGettingSmaller.java b/tests/src/com/vaadin/tests/components/form/FormNotGettingSmaller.java similarity index 100% rename from src/com/vaadin/tests/components/form/FormNotGettingSmaller.java rename to tests/src/com/vaadin/tests/components/form/FormNotGettingSmaller.java diff --git a/src/com/vaadin/tests/components/form/FormRenderingFlicker.java b/tests/src/com/vaadin/tests/components/form/FormRenderingFlicker.java similarity index 100% rename from src/com/vaadin/tests/components/form/FormRenderingFlicker.java rename to tests/src/com/vaadin/tests/components/form/FormRenderingFlicker.java diff --git a/src/com/vaadin/tests/components/label/HundredPercentWideLabelResize.html b/tests/src/com/vaadin/tests/components/label/HundredPercentWideLabelResize.html similarity index 100% rename from src/com/vaadin/tests/components/label/HundredPercentWideLabelResize.html rename to tests/src/com/vaadin/tests/components/label/HundredPercentWideLabelResize.html diff --git a/src/com/vaadin/tests/components/label/HundredPercentWideLabelResize.java b/tests/src/com/vaadin/tests/components/label/HundredPercentWideLabelResize.java similarity index 100% rename from src/com/vaadin/tests/components/label/HundredPercentWideLabelResize.java rename to tests/src/com/vaadin/tests/components/label/HundredPercentWideLabelResize.java diff --git a/src/com/vaadin/tests/components/label/LabelWrapping.html b/tests/src/com/vaadin/tests/components/label/LabelWrapping.html similarity index 100% rename from src/com/vaadin/tests/components/label/LabelWrapping.html rename to tests/src/com/vaadin/tests/components/label/LabelWrapping.html diff --git a/src/com/vaadin/tests/components/label/LabelWrapping.java b/tests/src/com/vaadin/tests/components/label/LabelWrapping.java similarity index 100% rename from src/com/vaadin/tests/components/label/LabelWrapping.java rename to tests/src/com/vaadin/tests/components/label/LabelWrapping.java diff --git a/src/com/vaadin/tests/components/link/LinkIcon.java b/tests/src/com/vaadin/tests/components/link/LinkIcon.java similarity index 100% rename from src/com/vaadin/tests/components/link/LinkIcon.java rename to tests/src/com/vaadin/tests/components/link/LinkIcon.java diff --git a/src/com/vaadin/tests/components/link/LinkTargetSize.java b/tests/src/com/vaadin/tests/components/link/LinkTargetSize.java similarity index 100% rename from src/com/vaadin/tests/components/link/LinkTargetSize.java rename to tests/src/com/vaadin/tests/components/link/LinkTargetSize.java diff --git a/tests/src/com/vaadin/tests/components/loginform/LoginFormTest.java b/tests/src/com/vaadin/tests/components/loginform/LoginFormTest.java new file mode 100644 index 0000000000..f8e8b96f62 --- /dev/null +++ b/tests/src/com/vaadin/tests/components/loginform/LoginFormTest.java @@ -0,0 +1,63 @@ +package com.vaadin.tests.components.loginform; + +import com.vaadin.tests.components.TestBase; +import com.vaadin.ui.Button; +import com.vaadin.ui.Label; +import com.vaadin.ui.LoginForm; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.LoginForm.LoginEvent; +import com.vaadin.ui.LoginForm.LoginListener; + +public class LoginFormTest extends TestBase { + + private LoginForm loginForm; + + @Override + protected void setup() { + loginForm = new LoginForm(); + getLayout().setSizeFull(); + loginForm.addListener(new LoginListener() { + + /** + * + */ + private static final long serialVersionUID = 1L; + + public void onLogin(LoginEvent event) { + login(event.getLoginParameter("user"), event + .getLoginParameter("password")); + + } + }); + addComponent(loginForm); + + } + + protected void login(String user, String password) { + Label info = new Label("User '" + user + "', password='" + password + + "' logged in"); + getLayout().removeAllComponents(); + getLayout().addComponent(info); + getLayout().addComponent(new Button("Log out", new ClickListener() { + + public void buttonClick(ClickEvent event) { + getLayout().removeAllComponents(); + getLayout().addComponent(loginForm); + } + + })); + + } + + @Override + protected String getDescription() { + return "Basic test for the LoginForm component. The login form should be visible. Entering a username+password and clicking 'login' should replace the login form with a label telling the user name as password. Also a logout button should then be shown and pressing that takes the user back to the original screen with the LoginForm"; + } + + @Override + protected Integer getTicketNumber() { + return 3597; + } + +} diff --git a/src/com/vaadin/tests/components/optiongroup/OptionGroupMultipleValueChange.java b/tests/src/com/vaadin/tests/components/optiongroup/OptionGroupMultipleValueChange.java similarity index 100% rename from src/com/vaadin/tests/components/optiongroup/OptionGroupMultipleValueChange.java rename to tests/src/com/vaadin/tests/components/optiongroup/OptionGroupMultipleValueChange.java diff --git a/src/com/vaadin/tests/components/orderedlayout/ReplaceComponentNPE.html b/tests/src/com/vaadin/tests/components/orderedlayout/ReplaceComponentNPE.html similarity index 100% rename from src/com/vaadin/tests/components/orderedlayout/ReplaceComponentNPE.html rename to tests/src/com/vaadin/tests/components/orderedlayout/ReplaceComponentNPE.html diff --git a/src/com/vaadin/tests/components/orderedlayout/ReplaceComponentNPE.java b/tests/src/com/vaadin/tests/components/orderedlayout/ReplaceComponentNPE.java similarity index 100% rename from src/com/vaadin/tests/components/orderedlayout/ReplaceComponentNPE.java rename to tests/src/com/vaadin/tests/components/orderedlayout/ReplaceComponentNPE.java diff --git a/src/com/vaadin/tests/components/panel/PanelShouldRemoveActionHandler.java b/tests/src/com/vaadin/tests/components/panel/PanelShouldRemoveActionHandler.java similarity index 100% rename from src/com/vaadin/tests/components/panel/PanelShouldRemoveActionHandler.java rename to tests/src/com/vaadin/tests/components/panel/PanelShouldRemoveActionHandler.java diff --git a/src/com/vaadin/tests/components/popupview/PopupViewLabelResized.java b/tests/src/com/vaadin/tests/components/popupview/PopupViewLabelResized.java similarity index 100% rename from src/com/vaadin/tests/components/popupview/PopupViewLabelResized.java rename to tests/src/com/vaadin/tests/components/popupview/PopupViewLabelResized.java diff --git a/src/com/vaadin/tests/components/popupview/PopupViewNullValues.java b/tests/src/com/vaadin/tests/components/popupview/PopupViewNullValues.java similarity index 100% rename from src/com/vaadin/tests/components/popupview/PopupViewNullValues.java rename to tests/src/com/vaadin/tests/components/popupview/PopupViewNullValues.java diff --git a/src/com/vaadin/tests/components/popupview/PopupViewOffScreen.html b/tests/src/com/vaadin/tests/components/popupview/PopupViewOffScreen.html similarity index 100% rename from src/com/vaadin/tests/components/popupview/PopupViewOffScreen.html rename to tests/src/com/vaadin/tests/components/popupview/PopupViewOffScreen.html diff --git a/src/com/vaadin/tests/components/popupview/PopupViewOffScreen.java b/tests/src/com/vaadin/tests/components/popupview/PopupViewOffScreen.java similarity index 100% rename from src/com/vaadin/tests/components/popupview/PopupViewOffScreen.java rename to tests/src/com/vaadin/tests/components/popupview/PopupViewOffScreen.java diff --git a/tests/src/com/vaadin/tests/components/popupview/PopupViewWithRTE.java b/tests/src/com/vaadin/tests/components/popupview/PopupViewWithRTE.java new file mode 100644 index 0000000000..06319a5019 --- /dev/null +++ b/tests/src/com/vaadin/tests/components/popupview/PopupViewWithRTE.java @@ -0,0 +1,50 @@ +package com.vaadin.tests.components.popupview; + +import com.vaadin.tests.components.TestBase; +import com.vaadin.ui.Component; +import com.vaadin.ui.PopupView; +import com.vaadin.ui.RichTextArea; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.PopupView.Content; + +public class PopupViewWithRTE extends TestBase { + + @Override + protected String getDescription() { + return "Rich text editor should work properly in popupview. Try to edit text below."; + } + + @Override + protected Integer getTicketNumber() { + return 3043; + } + + @Override + protected void setup() { + PopupView pv = new PopupView(new Content() { + + RichTextArea rte = new RichTextArea(); + + VerticalLayout vl = new VerticalLayout(); + + public String getMinimizedValueAsHTML() { + Object value = rte.getValue(); + if (value == null || "".equals(value)) { + value = "Initial content for

rte

."; + rte.setValue(value); + rte.setHeight("150px"); + rte.setWidth("100%"); + vl.addComponent(rte); + vl.setWidth("600px"); + } + return value.toString(); + } + + public Component getPopupComponent() { + return vl; + } + }); + getLayout().addComponent(pv); + } + +} diff --git a/src/com/vaadin/tests/components/richtextarea/RichTextAreaSize.html b/tests/src/com/vaadin/tests/components/richtextarea/RichTextAreaSize.html similarity index 100% rename from src/com/vaadin/tests/components/richtextarea/RichTextAreaSize.html rename to tests/src/com/vaadin/tests/components/richtextarea/RichTextAreaSize.html diff --git a/src/com/vaadin/tests/components/richtextarea/RichTextAreaSize.java b/tests/src/com/vaadin/tests/components/richtextarea/RichTextAreaSize.java similarity index 100% rename from src/com/vaadin/tests/components/richtextarea/RichTextAreaSize.java rename to tests/src/com/vaadin/tests/components/richtextarea/RichTextAreaSize.java diff --git a/src/com/vaadin/tests/components/select/NullSelectionItemId.java b/tests/src/com/vaadin/tests/components/select/NullSelectionItemId.java similarity index 60% rename from src/com/vaadin/tests/components/select/NullSelectionItemId.java rename to tests/src/com/vaadin/tests/components/select/NullSelectionItemId.java index f42995a601..bff840f421 100644 --- a/src/com/vaadin/tests/components/select/NullSelectionItemId.java +++ b/tests/src/com/vaadin/tests/components/select/NullSelectionItemId.java @@ -33,20 +33,40 @@ public class NullSelectionItemId extends TestBase implements ClickListener { addComponent(mySelect); addComponent(button); + button = new Button( + "Select null with select(NULL_ITEM_ID) (should make value null)", + new Button.ClickListener() { + public void buttonClick(ClickEvent event) { + mySelect.select(NULL_ITEM_ID); + } + }); + + addComponent(button); + + button = new Button( + "Select null with setValue(null) (should make value null)", + new Button.ClickListener() { + public void buttonClick(ClickEvent event) { + mySelect.setValue(null); + } + }); + + addComponent(button); + } public void buttonClick(ClickEvent event) { - this.getMainWindow().showNotification( + getMainWindow().showNotification( "mySelect.getValue() returns: " + mySelect.getValue()); } @Override protected String getDescription() { return "Steps to reproduce:
" - + "
  1. Click the button -> value is the item id \"Null item id\".
  2. " + + "
    1. Click the button -> value is the item id \"Null item id\" (should be null).
    2. " + "
    3. Select the \"Another item\".
    4. " + "
    5. Select back the first item.
    6. " - + "
    7. Click the button -> the value is null
    "; + + "
  3. Click the button -> the value is null (as it should)
"; } @Override diff --git a/src/com/vaadin/tests/components/splitpanel/SplitPanelExtraScrollbars.html b/tests/src/com/vaadin/tests/components/splitpanel/SplitPanelExtraScrollbars.html similarity index 100% rename from src/com/vaadin/tests/components/splitpanel/SplitPanelExtraScrollbars.html rename to tests/src/com/vaadin/tests/components/splitpanel/SplitPanelExtraScrollbars.html diff --git a/src/com/vaadin/tests/components/splitpanel/SplitPanelExtraScrollbars.java b/tests/src/com/vaadin/tests/components/splitpanel/SplitPanelExtraScrollbars.java similarity index 100% rename from src/com/vaadin/tests/components/splitpanel/SplitPanelExtraScrollbars.java rename to tests/src/com/vaadin/tests/components/splitpanel/SplitPanelExtraScrollbars.java diff --git a/src/com/vaadin/tests/components/splitpanel/SplitPanelSplitterWidth.java b/tests/src/com/vaadin/tests/components/splitpanel/SplitPanelSplitterWidth.java similarity index 100% rename from src/com/vaadin/tests/components/splitpanel/SplitPanelSplitterWidth.java rename to tests/src/com/vaadin/tests/components/splitpanel/SplitPanelSplitterWidth.java diff --git a/src/com/vaadin/tests/components/splitpanel/SplitPanelWidthOnResize.java b/tests/src/com/vaadin/tests/components/splitpanel/SplitPanelWidthOnResize.java similarity index 100% rename from src/com/vaadin/tests/components/splitpanel/SplitPanelWidthOnResize.java rename to tests/src/com/vaadin/tests/components/splitpanel/SplitPanelWidthOnResize.java diff --git a/src/com/vaadin/tests/components/table/ClippedComponentsInTable.html b/tests/src/com/vaadin/tests/components/table/ClippedComponentsInTable.html similarity index 100% rename from src/com/vaadin/tests/components/table/ClippedComponentsInTable.html rename to tests/src/com/vaadin/tests/components/table/ClippedComponentsInTable.html diff --git a/src/com/vaadin/tests/components/table/ClippedComponentsInTable.java b/tests/src/com/vaadin/tests/components/table/ClippedComponentsInTable.java similarity index 100% rename from src/com/vaadin/tests/components/table/ClippedComponentsInTable.java rename to tests/src/com/vaadin/tests/components/table/ClippedComponentsInTable.java diff --git a/src/com/vaadin/tests/components/table/ColumnCollapsingAndColumnExpansion.html b/tests/src/com/vaadin/tests/components/table/ColumnCollapsingAndColumnExpansion.html similarity index 100% rename from src/com/vaadin/tests/components/table/ColumnCollapsingAndColumnExpansion.html rename to tests/src/com/vaadin/tests/components/table/ColumnCollapsingAndColumnExpansion.html diff --git a/src/com/vaadin/tests/components/table/ColumnCollapsingAndColumnExpansion.java b/tests/src/com/vaadin/tests/components/table/ColumnCollapsingAndColumnExpansion.java similarity index 100% rename from src/com/vaadin/tests/components/table/ColumnCollapsingAndColumnExpansion.java rename to tests/src/com/vaadin/tests/components/table/ColumnCollapsingAndColumnExpansion.java diff --git a/src/com/vaadin/tests/components/table/ColumnExpandRatio.html b/tests/src/com/vaadin/tests/components/table/ColumnExpandRatio.html similarity index 100% rename from src/com/vaadin/tests/components/table/ColumnExpandRatio.html rename to tests/src/com/vaadin/tests/components/table/ColumnExpandRatio.html diff --git a/src/com/vaadin/tests/components/table/ColumnExpandRatio.java b/tests/src/com/vaadin/tests/components/table/ColumnExpandRatio.java similarity index 100% rename from src/com/vaadin/tests/components/table/ColumnExpandRatio.java rename to tests/src/com/vaadin/tests/components/table/ColumnExpandRatio.java diff --git a/src/com/vaadin/tests/components/table/ColumnExpandWithFixedColumns.html b/tests/src/com/vaadin/tests/components/table/ColumnExpandWithFixedColumns.html similarity index 100% rename from src/com/vaadin/tests/components/table/ColumnExpandWithFixedColumns.html rename to tests/src/com/vaadin/tests/components/table/ColumnExpandWithFixedColumns.html diff --git a/src/com/vaadin/tests/components/table/ColumnExpandWithFixedColumns.java b/tests/src/com/vaadin/tests/components/table/ColumnExpandWithFixedColumns.java similarity index 100% rename from src/com/vaadin/tests/components/table/ColumnExpandWithFixedColumns.java rename to tests/src/com/vaadin/tests/components/table/ColumnExpandWithFixedColumns.java diff --git a/src/com/vaadin/tests/components/table/ColumnGeneratorAddingOrder.java b/tests/src/com/vaadin/tests/components/table/ColumnGeneratorAddingOrder.java similarity index 100% rename from src/com/vaadin/tests/components/table/ColumnGeneratorAddingOrder.java rename to tests/src/com/vaadin/tests/components/table/ColumnGeneratorAddingOrder.java diff --git a/src/com/vaadin/tests/components/table/ColumnWidths.java b/tests/src/com/vaadin/tests/components/table/ColumnWidths.java similarity index 100% rename from src/com/vaadin/tests/components/table/ColumnWidths.java rename to tests/src/com/vaadin/tests/components/table/ColumnWidths.java diff --git a/src/com/vaadin/tests/components/table/ContainerSizeChange.html b/tests/src/com/vaadin/tests/components/table/ContainerSizeChange.html similarity index 100% rename from src/com/vaadin/tests/components/table/ContainerSizeChange.html rename to tests/src/com/vaadin/tests/components/table/ContainerSizeChange.html diff --git a/src/com/vaadin/tests/components/table/ContainerSizeChange.java b/tests/src/com/vaadin/tests/components/table/ContainerSizeChange.java similarity index 100% rename from src/com/vaadin/tests/components/table/ContainerSizeChange.java rename to tests/src/com/vaadin/tests/components/table/ContainerSizeChange.java diff --git a/src/com/vaadin/tests/components/table/LabelEmbeddedClickThroughForTable.html b/tests/src/com/vaadin/tests/components/table/LabelEmbeddedClickThroughForTable.html similarity index 100% rename from src/com/vaadin/tests/components/table/LabelEmbeddedClickThroughForTable.html rename to tests/src/com/vaadin/tests/components/table/LabelEmbeddedClickThroughForTable.html diff --git a/src/com/vaadin/tests/components/table/LabelEmbeddedClickThroughForTable.java b/tests/src/com/vaadin/tests/components/table/LabelEmbeddedClickThroughForTable.java similarity index 100% rename from src/com/vaadin/tests/components/table/LabelEmbeddedClickThroughForTable.java rename to tests/src/com/vaadin/tests/components/table/LabelEmbeddedClickThroughForTable.java diff --git a/src/com/vaadin/tests/components/table/MissingScrollbar.html b/tests/src/com/vaadin/tests/components/table/MissingScrollbar.html similarity index 100% rename from src/com/vaadin/tests/components/table/MissingScrollbar.html rename to tests/src/com/vaadin/tests/components/table/MissingScrollbar.html diff --git a/src/com/vaadin/tests/components/table/MissingScrollbar.java b/tests/src/com/vaadin/tests/components/table/MissingScrollbar.java similarity index 100% rename from src/com/vaadin/tests/components/table/MissingScrollbar.java rename to tests/src/com/vaadin/tests/components/table/MissingScrollbar.java diff --git a/src/com/vaadin/tests/components/table/ModifyContainerProperty.java b/tests/src/com/vaadin/tests/components/table/ModifyContainerProperty.java similarity index 100% rename from src/com/vaadin/tests/components/table/ModifyContainerProperty.java rename to tests/src/com/vaadin/tests/components/table/ModifyContainerProperty.java diff --git a/src/com/vaadin/tests/components/table/NotselectablePaintSelections.java b/tests/src/com/vaadin/tests/components/table/NotselectablePaintSelections.java similarity index 100% rename from src/com/vaadin/tests/components/table/NotselectablePaintSelections.java rename to tests/src/com/vaadin/tests/components/table/NotselectablePaintSelections.java diff --git a/src/com/vaadin/tests/components/table/PropertyValueChange.html b/tests/src/com/vaadin/tests/components/table/PropertyValueChange.html similarity index 100% rename from src/com/vaadin/tests/components/table/PropertyValueChange.html rename to tests/src/com/vaadin/tests/components/table/PropertyValueChange.html diff --git a/src/com/vaadin/tests/components/table/PropertyValueChange.java b/tests/src/com/vaadin/tests/components/table/PropertyValueChange.java similarity index 100% rename from src/com/vaadin/tests/components/table/PropertyValueChange.java rename to tests/src/com/vaadin/tests/components/table/PropertyValueChange.java diff --git a/src/com/vaadin/tests/components/table/RowAdditionTest.java b/tests/src/com/vaadin/tests/components/table/RowAdditionTest.java similarity index 100% rename from src/com/vaadin/tests/components/table/RowAdditionTest.java rename to tests/src/com/vaadin/tests/components/table/RowAdditionTest.java diff --git a/src/com/vaadin/tests/components/table/TableItemIcon.java b/tests/src/com/vaadin/tests/components/table/TableItemIcon.java similarity index 100% rename from src/com/vaadin/tests/components/table/TableItemIcon.java rename to tests/src/com/vaadin/tests/components/table/TableItemIcon.java diff --git a/src/com/vaadin/tests/components/table/TableLastRowMissing.html b/tests/src/com/vaadin/tests/components/table/TableLastRowMissing.html similarity index 100% rename from src/com/vaadin/tests/components/table/TableLastRowMissing.html rename to tests/src/com/vaadin/tests/components/table/TableLastRowMissing.html diff --git a/src/com/vaadin/tests/components/table/TableLastRowMissing.java b/tests/src/com/vaadin/tests/components/table/TableLastRowMissing.java similarity index 100% rename from src/com/vaadin/tests/components/table/TableLastRowMissing.java rename to tests/src/com/vaadin/tests/components/table/TableLastRowMissing.java diff --git a/src/com/vaadin/tests/components/table/TablePageLengthUpdate.html b/tests/src/com/vaadin/tests/components/table/TablePageLengthUpdate.html similarity index 100% rename from src/com/vaadin/tests/components/table/TablePageLengthUpdate.html rename to tests/src/com/vaadin/tests/components/table/TablePageLengthUpdate.html diff --git a/src/com/vaadin/tests/components/table/TablePageLengthUpdate.java b/tests/src/com/vaadin/tests/components/table/TablePageLengthUpdate.java similarity index 100% rename from src/com/vaadin/tests/components/table/TablePageLengthUpdate.java rename to tests/src/com/vaadin/tests/components/table/TablePageLengthUpdate.java diff --git a/src/com/vaadin/tests/components/table/TableRowHeight.html b/tests/src/com/vaadin/tests/components/table/TableRowHeight.html similarity index 100% rename from src/com/vaadin/tests/components/table/TableRowHeight.html rename to tests/src/com/vaadin/tests/components/table/TableRowHeight.html diff --git a/src/com/vaadin/tests/components/table/TableRowHeight.java b/tests/src/com/vaadin/tests/components/table/TableRowHeight.java similarity index 100% rename from src/com/vaadin/tests/components/table/TableRowHeight.java rename to tests/src/com/vaadin/tests/components/table/TableRowHeight.java diff --git a/src/com/vaadin/tests/components/table/TableRowHeight2.html b/tests/src/com/vaadin/tests/components/table/TableRowHeight2.html similarity index 100% rename from src/com/vaadin/tests/components/table/TableRowHeight2.html rename to tests/src/com/vaadin/tests/components/table/TableRowHeight2.html diff --git a/src/com/vaadin/tests/components/table/TableRowHeight2.java b/tests/src/com/vaadin/tests/components/table/TableRowHeight2.java similarity index 100% rename from src/com/vaadin/tests/components/table/TableRowHeight2.java rename to tests/src/com/vaadin/tests/components/table/TableRowHeight2.java diff --git a/src/com/vaadin/tests/components/table/TableRowHeight3.html b/tests/src/com/vaadin/tests/components/table/TableRowHeight3.html similarity index 100% rename from src/com/vaadin/tests/components/table/TableRowHeight3.html rename to tests/src/com/vaadin/tests/components/table/TableRowHeight3.html diff --git a/src/com/vaadin/tests/components/table/TableRowHeight3.java b/tests/src/com/vaadin/tests/components/table/TableRowHeight3.java similarity index 100% rename from src/com/vaadin/tests/components/table/TableRowHeight3.java rename to tests/src/com/vaadin/tests/components/table/TableRowHeight3.java diff --git a/src/com/vaadin/tests/components/table/TableVisibleColumnsUpdate.html b/tests/src/com/vaadin/tests/components/table/TableVisibleColumnsUpdate.html similarity index 100% rename from src/com/vaadin/tests/components/table/TableVisibleColumnsUpdate.html rename to tests/src/com/vaadin/tests/components/table/TableVisibleColumnsUpdate.html diff --git a/src/com/vaadin/tests/components/table/TableVisibleColumnsUpdate.java b/tests/src/com/vaadin/tests/components/table/TableVisibleColumnsUpdate.java similarity index 100% rename from src/com/vaadin/tests/components/table/TableVisibleColumnsUpdate.java rename to tests/src/com/vaadin/tests/components/table/TableVisibleColumnsUpdate.java diff --git a/src/com/vaadin/tests/components/table/TestCurrentPageFirstItem.java b/tests/src/com/vaadin/tests/components/table/TestCurrentPageFirstItem.java similarity index 100% rename from src/com/vaadin/tests/components/table/TestCurrentPageFirstItem.java rename to tests/src/com/vaadin/tests/components/table/TestCurrentPageFirstItem.java diff --git a/src/com/vaadin/tests/components/table/TextFieldRelativeWidth.html b/tests/src/com/vaadin/tests/components/table/TextFieldRelativeWidth.html similarity index 100% rename from src/com/vaadin/tests/components/table/TextFieldRelativeWidth.html rename to tests/src/com/vaadin/tests/components/table/TextFieldRelativeWidth.html diff --git a/src/com/vaadin/tests/components/table/TextFieldRelativeWidth.java b/tests/src/com/vaadin/tests/components/table/TextFieldRelativeWidth.java similarity index 100% rename from src/com/vaadin/tests/components/table/TextFieldRelativeWidth.java rename to tests/src/com/vaadin/tests/components/table/TextFieldRelativeWidth.java diff --git a/src/com/vaadin/tests/components/table/fi.gif b/tests/src/com/vaadin/tests/components/table/fi.gif similarity index 100% rename from src/com/vaadin/tests/components/table/fi.gif rename to tests/src/com/vaadin/tests/components/table/fi.gif diff --git a/src/com/vaadin/tests/components/table/se.gif b/tests/src/com/vaadin/tests/components/table/se.gif similarity index 100% rename from src/com/vaadin/tests/components/table/se.gif rename to tests/src/com/vaadin/tests/components/table/se.gif diff --git a/src/com/vaadin/tests/components/tabsheet/AddAndRemoveTabs.html b/tests/src/com/vaadin/tests/components/tabsheet/AddAndRemoveTabs.html similarity index 100% rename from src/com/vaadin/tests/components/tabsheet/AddAndRemoveTabs.html rename to tests/src/com/vaadin/tests/components/tabsheet/AddAndRemoveTabs.html diff --git a/src/com/vaadin/tests/components/tabsheet/AddAndRemoveTabs.java b/tests/src/com/vaadin/tests/components/tabsheet/AddAndRemoveTabs.java similarity index 100% rename from src/com/vaadin/tests/components/tabsheet/AddAndRemoveTabs.java rename to tests/src/com/vaadin/tests/components/tabsheet/AddAndRemoveTabs.java diff --git a/src/com/vaadin/tests/components/tabsheet/PreventTabChange.html b/tests/src/com/vaadin/tests/components/tabsheet/PreventTabChange.html similarity index 100% rename from src/com/vaadin/tests/components/tabsheet/PreventTabChange.html rename to tests/src/com/vaadin/tests/components/tabsheet/PreventTabChange.html diff --git a/src/com/vaadin/tests/components/tabsheet/PreventTabChange.java b/tests/src/com/vaadin/tests/components/tabsheet/PreventTabChange.java similarity index 100% rename from src/com/vaadin/tests/components/tabsheet/PreventTabChange.java rename to tests/src/com/vaadin/tests/components/tabsheet/PreventTabChange.java diff --git a/src/com/vaadin/tests/components/tabsheet/RemoveTabs.java b/tests/src/com/vaadin/tests/components/tabsheet/RemoveTabs.java similarity index 100% rename from src/com/vaadin/tests/components/tabsheet/RemoveTabs.java rename to tests/src/com/vaadin/tests/components/tabsheet/RemoveTabs.java diff --git a/src/com/vaadin/tests/components/tabsheet/RemoveTabsTabsheet.html b/tests/src/com/vaadin/tests/components/tabsheet/RemoveTabsTabsheet.html similarity index 100% rename from src/com/vaadin/tests/components/tabsheet/RemoveTabsTabsheet.html rename to tests/src/com/vaadin/tests/components/tabsheet/RemoveTabsTabsheet.html diff --git a/src/com/vaadin/tests/components/tabsheet/TabSheetCaptions.html b/tests/src/com/vaadin/tests/components/tabsheet/TabSheetCaptions.html similarity index 100% rename from src/com/vaadin/tests/components/tabsheet/TabSheetCaptions.html rename to tests/src/com/vaadin/tests/components/tabsheet/TabSheetCaptions.html diff --git a/src/com/vaadin/tests/components/tabsheet/TabSheetCaptions.java b/tests/src/com/vaadin/tests/components/tabsheet/TabSheetCaptions.java similarity index 100% rename from src/com/vaadin/tests/components/tabsheet/TabSheetCaptions.java rename to tests/src/com/vaadin/tests/components/tabsheet/TabSheetCaptions.java diff --git a/src/com/vaadin/tests/components/tabsheet/TabSheetDisabling.html b/tests/src/com/vaadin/tests/components/tabsheet/TabSheetDisabling.html similarity index 100% rename from src/com/vaadin/tests/components/tabsheet/TabSheetDisabling.html rename to tests/src/com/vaadin/tests/components/tabsheet/TabSheetDisabling.html diff --git a/src/com/vaadin/tests/components/tabsheet/TabSheetDisabling.java b/tests/src/com/vaadin/tests/components/tabsheet/TabSheetDisabling.java similarity index 100% rename from src/com/vaadin/tests/components/tabsheet/TabSheetDisabling.java rename to tests/src/com/vaadin/tests/components/tabsheet/TabSheetDisabling.java diff --git a/src/com/vaadin/tests/components/tabsheet/TabSheetIcons.html b/tests/src/com/vaadin/tests/components/tabsheet/TabSheetIcons.html similarity index 100% rename from src/com/vaadin/tests/components/tabsheet/TabSheetIcons.html rename to tests/src/com/vaadin/tests/components/tabsheet/TabSheetIcons.html diff --git a/src/com/vaadin/tests/components/tabsheet/TabSheetIcons.java b/tests/src/com/vaadin/tests/components/tabsheet/TabSheetIcons.java similarity index 100% rename from src/com/vaadin/tests/components/tabsheet/TabSheetIcons.java rename to tests/src/com/vaadin/tests/components/tabsheet/TabSheetIcons.java diff --git a/src/com/vaadin/tests/components/tabsheet/TabSheetWithoutTabCaption.html b/tests/src/com/vaadin/tests/components/tabsheet/TabSheetWithoutTabCaption.html similarity index 100% rename from src/com/vaadin/tests/components/tabsheet/TabSheetWithoutTabCaption.html rename to tests/src/com/vaadin/tests/components/tabsheet/TabSheetWithoutTabCaption.html diff --git a/src/com/vaadin/tests/components/tabsheet/TabSheetWithoutTabCaption.java b/tests/src/com/vaadin/tests/components/tabsheet/TabSheetWithoutTabCaption.java similarity index 100% rename from src/com/vaadin/tests/components/tabsheet/TabSheetWithoutTabCaption.java rename to tests/src/com/vaadin/tests/components/tabsheet/TabSheetWithoutTabCaption.java diff --git a/src/com/vaadin/tests/components/tabsheet/TabsheetNPE.java b/tests/src/com/vaadin/tests/components/tabsheet/TabsheetNPE.java similarity index 100% rename from src/com/vaadin/tests/components/tabsheet/TabsheetNPE.java rename to tests/src/com/vaadin/tests/components/tabsheet/TabsheetNPE.java diff --git a/src/com/vaadin/tests/components/tabsheet/TabsheetScrolling.html b/tests/src/com/vaadin/tests/components/tabsheet/TabsheetScrolling.html similarity index 100% rename from src/com/vaadin/tests/components/tabsheet/TabsheetScrolling.html rename to tests/src/com/vaadin/tests/components/tabsheet/TabsheetScrolling.html diff --git a/src/com/vaadin/tests/components/tabsheet/TabsheetScrolling.java b/tests/src/com/vaadin/tests/components/tabsheet/TabsheetScrolling.java similarity index 100% rename from src/com/vaadin/tests/components/tabsheet/TabsheetScrolling.java rename to tests/src/com/vaadin/tests/components/tabsheet/TabsheetScrolling.java diff --git a/src/com/vaadin/tests/components/tabsheet/TabsheetTooltip.html b/tests/src/com/vaadin/tests/components/tabsheet/TabsheetTooltip.html similarity index 100% rename from src/com/vaadin/tests/components/tabsheet/TabsheetTooltip.html rename to tests/src/com/vaadin/tests/components/tabsheet/TabsheetTooltip.html diff --git a/src/com/vaadin/tests/components/tabsheet/TabsheetTooltip.java b/tests/src/com/vaadin/tests/components/tabsheet/TabsheetTooltip.java similarity index 100% rename from src/com/vaadin/tests/components/tabsheet/TabsheetTooltip.java rename to tests/src/com/vaadin/tests/components/tabsheet/TabsheetTooltip.java diff --git a/src/com/vaadin/tests/components/tabsheet/VerticalScrollbarPosition.html b/tests/src/com/vaadin/tests/components/tabsheet/VerticalScrollbarPosition.html similarity index 100% rename from src/com/vaadin/tests/components/tabsheet/VerticalScrollbarPosition.html rename to tests/src/com/vaadin/tests/components/tabsheet/VerticalScrollbarPosition.html diff --git a/src/com/vaadin/tests/components/tabsheet/VerticalScrollbarPosition.java b/tests/src/com/vaadin/tests/components/tabsheet/VerticalScrollbarPosition.java similarity index 100% rename from src/com/vaadin/tests/components/tabsheet/VerticalScrollbarPosition.java rename to tests/src/com/vaadin/tests/components/tabsheet/VerticalScrollbarPosition.java diff --git a/src/com/vaadin/tests/components/textfield/EnterShortcutMaySendInputPromptAsValue.java b/tests/src/com/vaadin/tests/components/textfield/EnterShortcutMaySendInputPromptAsValue.java similarity index 100% rename from src/com/vaadin/tests/components/textfield/EnterShortcutMaySendInputPromptAsValue.java rename to tests/src/com/vaadin/tests/components/textfield/EnterShortcutMaySendInputPromptAsValue.java diff --git a/src/com/vaadin/tests/components/textfield/IE6Cursor.java b/tests/src/com/vaadin/tests/components/textfield/IE6Cursor.java similarity index 100% rename from src/com/vaadin/tests/components/textfield/IE6Cursor.java rename to tests/src/com/vaadin/tests/components/textfield/IE6Cursor.java diff --git a/src/com/vaadin/tests/components/textfield/TextFields.html b/tests/src/com/vaadin/tests/components/textfield/TextFields.html similarity index 100% rename from src/com/vaadin/tests/components/textfield/TextFields.html rename to tests/src/com/vaadin/tests/components/textfield/TextFields.html diff --git a/src/com/vaadin/tests/components/textfield/TextFields.java b/tests/src/com/vaadin/tests/components/textfield/TextFields.java similarity index 100% rename from src/com/vaadin/tests/components/textfield/TextFields.java rename to tests/src/com/vaadin/tests/components/textfield/TextFields.java diff --git a/src/com/vaadin/tests/components/tree/TreeNodeCaptionWrapping.html b/tests/src/com/vaadin/tests/components/tree/TreeNodeCaptionWrapping.html similarity index 100% rename from src/com/vaadin/tests/components/tree/TreeNodeCaptionWrapping.html rename to tests/src/com/vaadin/tests/components/tree/TreeNodeCaptionWrapping.html diff --git a/src/com/vaadin/tests/components/tree/TreeNodeCaptionWrapping.java b/tests/src/com/vaadin/tests/components/tree/TreeNodeCaptionWrapping.java similarity index 100% rename from src/com/vaadin/tests/components/tree/TreeNodeCaptionWrapping.java rename to tests/src/com/vaadin/tests/components/tree/TreeNodeCaptionWrapping.java diff --git a/src/com/vaadin/tests/components/window/CenteredWindowWithUndefinedSize.html b/tests/src/com/vaadin/tests/components/window/CenteredWindowWithUndefinedSize.html similarity index 100% rename from src/com/vaadin/tests/components/window/CenteredWindowWithUndefinedSize.html rename to tests/src/com/vaadin/tests/components/window/CenteredWindowWithUndefinedSize.html diff --git a/src/com/vaadin/tests/components/window/CenteredWindowWithUndefinedSize.java b/tests/src/com/vaadin/tests/components/window/CenteredWindowWithUndefinedSize.java similarity index 100% rename from src/com/vaadin/tests/components/window/CenteredWindowWithUndefinedSize.java rename to tests/src/com/vaadin/tests/components/window/CenteredWindowWithUndefinedSize.java diff --git a/src/com/vaadin/tests/components/window/EmbeddedInSubWindow.html b/tests/src/com/vaadin/tests/components/window/EmbeddedInSubWindow.html similarity index 100% rename from src/com/vaadin/tests/components/window/EmbeddedInSubWindow.html rename to tests/src/com/vaadin/tests/components/window/EmbeddedInSubWindow.html diff --git a/src/com/vaadin/tests/components/window/EmbeddedInSubWindow.java b/tests/src/com/vaadin/tests/components/window/EmbeddedInSubWindow.java similarity index 100% rename from src/com/vaadin/tests/components/window/EmbeddedInSubWindow.java rename to tests/src/com/vaadin/tests/components/window/EmbeddedInSubWindow.java diff --git a/src/com/vaadin/tests/components/window/FullSizedWindow.java b/tests/src/com/vaadin/tests/components/window/FullSizedWindow.java similarity index 100% rename from src/com/vaadin/tests/components/window/FullSizedWindow.java rename to tests/src/com/vaadin/tests/components/window/FullSizedWindow.java diff --git a/src/com/vaadin/tests/components/window/SubWindowOrder.java b/tests/src/com/vaadin/tests/components/window/SubWindowOrder.java similarity index 100% rename from src/com/vaadin/tests/components/window/SubWindowOrder.java rename to tests/src/com/vaadin/tests/components/window/SubWindowOrder.java diff --git a/src/com/vaadin/tests/components/window/SubwindowInvalidLayout.java b/tests/src/com/vaadin/tests/components/window/SubwindowInvalidLayout.java similarity index 100% rename from src/com/vaadin/tests/components/window/SubwindowInvalidLayout.java rename to tests/src/com/vaadin/tests/components/window/SubwindowInvalidLayout.java diff --git a/src/com/vaadin/tests/components/window/TestTooSmallSubwindowSize.html b/tests/src/com/vaadin/tests/components/window/TestTooSmallSubwindowSize.html similarity index 100% rename from src/com/vaadin/tests/components/window/TestTooSmallSubwindowSize.html rename to tests/src/com/vaadin/tests/components/window/TestTooSmallSubwindowSize.html diff --git a/src/com/vaadin/tests/components/window/TestTooSmallSubwindowSize.java b/tests/src/com/vaadin/tests/components/window/TestTooSmallSubwindowSize.java similarity index 100% rename from src/com/vaadin/tests/components/window/TestTooSmallSubwindowSize.java rename to tests/src/com/vaadin/tests/components/window/TestTooSmallSubwindowSize.java diff --git a/src/com/vaadin/tests/components/window/UndefinedWidthSubWindow.html b/tests/src/com/vaadin/tests/components/window/UndefinedWidthSubWindow.html similarity index 100% rename from src/com/vaadin/tests/components/window/UndefinedWidthSubWindow.html rename to tests/src/com/vaadin/tests/components/window/UndefinedWidthSubWindow.html diff --git a/src/com/vaadin/tests/components/window/UndefinedWidthSubWindow.java b/tests/src/com/vaadin/tests/components/window/UndefinedWidthSubWindow.java similarity index 100% rename from src/com/vaadin/tests/components/window/UndefinedWidthSubWindow.java rename to tests/src/com/vaadin/tests/components/window/UndefinedWidthSubWindow.java diff --git a/src/com/vaadin/tests/components/window/WindowResizeListener.java b/tests/src/com/vaadin/tests/components/window/WindowResizeListener.java similarity index 100% rename from src/com/vaadin/tests/components/window/WindowResizeListener.java rename to tests/src/com/vaadin/tests/components/window/WindowResizeListener.java diff --git a/src/com/vaadin/tests/components/window/WindowShouldRemoveActionHandler.html b/tests/src/com/vaadin/tests/components/window/WindowShouldRemoveActionHandler.html similarity index 100% rename from src/com/vaadin/tests/components/window/WindowShouldRemoveActionHandler.html rename to tests/src/com/vaadin/tests/components/window/WindowShouldRemoveActionHandler.html diff --git a/src/com/vaadin/tests/components/window/WindowShouldRemoveActionHandler.java b/tests/src/com/vaadin/tests/components/window/WindowShouldRemoveActionHandler.java similarity index 100% rename from src/com/vaadin/tests/components/window/WindowShouldRemoveActionHandler.java rename to tests/src/com/vaadin/tests/components/window/WindowShouldRemoveActionHandler.java diff --git a/src/com/vaadin/tests/components/window/WindowStyleNames.java b/tests/src/com/vaadin/tests/components/window/WindowStyleNames.java similarity index 100% rename from src/com/vaadin/tests/components/window/WindowStyleNames.java rename to tests/src/com/vaadin/tests/components/window/WindowStyleNames.java diff --git a/src/com/vaadin/tests/containers/BeanItemContainerFilteringTest.java b/tests/src/com/vaadin/tests/containers/BeanItemContainerFilteringTest.java similarity index 100% rename from src/com/vaadin/tests/containers/BeanItemContainerFilteringTest.java rename to tests/src/com/vaadin/tests/containers/BeanItemContainerFilteringTest.java diff --git a/src/com/vaadin/tests/containers/BeanItemContainerTest.java b/tests/src/com/vaadin/tests/containers/BeanItemContainerTest.java similarity index 100% rename from src/com/vaadin/tests/containers/BeanItemContainerTest.java rename to tests/src/com/vaadin/tests/containers/BeanItemContainerTest.java diff --git a/src/com/vaadin/tests/containers/IndexedContainerFilteringTest.java b/tests/src/com/vaadin/tests/containers/IndexedContainerFilteringTest.java similarity index 100% rename from src/com/vaadin/tests/containers/IndexedContainerFilteringTest.java rename to tests/src/com/vaadin/tests/containers/IndexedContainerFilteringTest.java diff --git a/src/com/vaadin/tests/featurebrowser/Feature.java b/tests/src/com/vaadin/tests/featurebrowser/Feature.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/Feature.java rename to tests/src/com/vaadin/tests/featurebrowser/Feature.java diff --git a/src/com/vaadin/tests/featurebrowser/FeatureBrowser.java b/tests/src/com/vaadin/tests/featurebrowser/FeatureBrowser.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/FeatureBrowser.java rename to tests/src/com/vaadin/tests/featurebrowser/FeatureBrowser.java diff --git a/src/com/vaadin/tests/featurebrowser/FeatureBuffering.java b/tests/src/com/vaadin/tests/featurebrowser/FeatureBuffering.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/FeatureBuffering.java rename to tests/src/com/vaadin/tests/featurebrowser/FeatureBuffering.java diff --git a/src/com/vaadin/tests/featurebrowser/FeatureButton.java b/tests/src/com/vaadin/tests/featurebrowser/FeatureButton.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/FeatureButton.java rename to tests/src/com/vaadin/tests/featurebrowser/FeatureButton.java diff --git a/src/com/vaadin/tests/featurebrowser/FeatureContainers.java b/tests/src/com/vaadin/tests/featurebrowser/FeatureContainers.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/FeatureContainers.java rename to tests/src/com/vaadin/tests/featurebrowser/FeatureContainers.java diff --git a/src/com/vaadin/tests/featurebrowser/FeatureCustomLayout.java b/tests/src/com/vaadin/tests/featurebrowser/FeatureCustomLayout.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/FeatureCustomLayout.java rename to tests/src/com/vaadin/tests/featurebrowser/FeatureCustomLayout.java diff --git a/src/com/vaadin/tests/featurebrowser/FeatureDateField.java b/tests/src/com/vaadin/tests/featurebrowser/FeatureDateField.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/FeatureDateField.java rename to tests/src/com/vaadin/tests/featurebrowser/FeatureDateField.java diff --git a/src/com/vaadin/tests/featurebrowser/FeatureEmbedded.java b/tests/src/com/vaadin/tests/featurebrowser/FeatureEmbedded.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/FeatureEmbedded.java rename to tests/src/com/vaadin/tests/featurebrowser/FeatureEmbedded.java diff --git a/src/com/vaadin/tests/featurebrowser/FeatureForm.java b/tests/src/com/vaadin/tests/featurebrowser/FeatureForm.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/FeatureForm.java rename to tests/src/com/vaadin/tests/featurebrowser/FeatureForm.java diff --git a/src/com/vaadin/tests/featurebrowser/FeatureGridLayout.java b/tests/src/com/vaadin/tests/featurebrowser/FeatureGridLayout.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/FeatureGridLayout.java rename to tests/src/com/vaadin/tests/featurebrowser/FeatureGridLayout.java diff --git a/src/com/vaadin/tests/featurebrowser/FeatureItems.java b/tests/src/com/vaadin/tests/featurebrowser/FeatureItems.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/FeatureItems.java rename to tests/src/com/vaadin/tests/featurebrowser/FeatureItems.java diff --git a/src/com/vaadin/tests/featurebrowser/FeatureLabel.java b/tests/src/com/vaadin/tests/featurebrowser/FeatureLabel.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/FeatureLabel.java rename to tests/src/com/vaadin/tests/featurebrowser/FeatureLabel.java diff --git a/src/com/vaadin/tests/featurebrowser/FeatureLink.java b/tests/src/com/vaadin/tests/featurebrowser/FeatureLink.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/FeatureLink.java rename to tests/src/com/vaadin/tests/featurebrowser/FeatureLink.java diff --git a/src/com/vaadin/tests/featurebrowser/FeatureOrderedLayout.java b/tests/src/com/vaadin/tests/featurebrowser/FeatureOrderedLayout.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/FeatureOrderedLayout.java rename to tests/src/com/vaadin/tests/featurebrowser/FeatureOrderedLayout.java diff --git a/src/com/vaadin/tests/featurebrowser/FeaturePanel.java b/tests/src/com/vaadin/tests/featurebrowser/FeaturePanel.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/FeaturePanel.java rename to tests/src/com/vaadin/tests/featurebrowser/FeaturePanel.java diff --git a/src/com/vaadin/tests/featurebrowser/FeatureParameters.java b/tests/src/com/vaadin/tests/featurebrowser/FeatureParameters.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/FeatureParameters.java rename to tests/src/com/vaadin/tests/featurebrowser/FeatureParameters.java diff --git a/src/com/vaadin/tests/featurebrowser/FeatureProperties.java b/tests/src/com/vaadin/tests/featurebrowser/FeatureProperties.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/FeatureProperties.java rename to tests/src/com/vaadin/tests/featurebrowser/FeatureProperties.java diff --git a/src/com/vaadin/tests/featurebrowser/FeatureSelect.java b/tests/src/com/vaadin/tests/featurebrowser/FeatureSelect.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/FeatureSelect.java rename to tests/src/com/vaadin/tests/featurebrowser/FeatureSelect.java diff --git a/src/com/vaadin/tests/featurebrowser/FeatureTabSheet.java b/tests/src/com/vaadin/tests/featurebrowser/FeatureTabSheet.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/FeatureTabSheet.java rename to tests/src/com/vaadin/tests/featurebrowser/FeatureTabSheet.java diff --git a/src/com/vaadin/tests/featurebrowser/FeatureTable.java b/tests/src/com/vaadin/tests/featurebrowser/FeatureTable.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/FeatureTable.java rename to tests/src/com/vaadin/tests/featurebrowser/FeatureTable.java diff --git a/src/com/vaadin/tests/featurebrowser/FeatureTextField.java b/tests/src/com/vaadin/tests/featurebrowser/FeatureTextField.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/FeatureTextField.java rename to tests/src/com/vaadin/tests/featurebrowser/FeatureTextField.java diff --git a/src/com/vaadin/tests/featurebrowser/FeatureTree.java b/tests/src/com/vaadin/tests/featurebrowser/FeatureTree.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/FeatureTree.java rename to tests/src/com/vaadin/tests/featurebrowser/FeatureTree.java diff --git a/src/com/vaadin/tests/featurebrowser/FeatureUpload.java b/tests/src/com/vaadin/tests/featurebrowser/FeatureUpload.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/FeatureUpload.java rename to tests/src/com/vaadin/tests/featurebrowser/FeatureUpload.java diff --git a/src/com/vaadin/tests/featurebrowser/FeatureUtil.java b/tests/src/com/vaadin/tests/featurebrowser/FeatureUtil.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/FeatureUtil.java rename to tests/src/com/vaadin/tests/featurebrowser/FeatureUtil.java diff --git a/src/com/vaadin/tests/featurebrowser/FeatureValidators.java b/tests/src/com/vaadin/tests/featurebrowser/FeatureValidators.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/FeatureValidators.java rename to tests/src/com/vaadin/tests/featurebrowser/FeatureValidators.java diff --git a/src/com/vaadin/tests/featurebrowser/FeatureWindow.java b/tests/src/com/vaadin/tests/featurebrowser/FeatureWindow.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/FeatureWindow.java rename to tests/src/com/vaadin/tests/featurebrowser/FeatureWindow.java diff --git a/src/com/vaadin/tests/featurebrowser/FeaturesApplication.java b/tests/src/com/vaadin/tests/featurebrowser/FeaturesApplication.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/FeaturesApplication.java rename to tests/src/com/vaadin/tests/featurebrowser/FeaturesApplication.java diff --git a/src/com/vaadin/tests/featurebrowser/IntroBasic.java b/tests/src/com/vaadin/tests/featurebrowser/IntroBasic.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/IntroBasic.java rename to tests/src/com/vaadin/tests/featurebrowser/IntroBasic.java diff --git a/src/com/vaadin/tests/featurebrowser/IntroComponents.java b/tests/src/com/vaadin/tests/featurebrowser/IntroComponents.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/IntroComponents.java rename to tests/src/com/vaadin/tests/featurebrowser/IntroComponents.java diff --git a/src/com/vaadin/tests/featurebrowser/IntroDataHandling.java b/tests/src/com/vaadin/tests/featurebrowser/IntroDataHandling.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/IntroDataHandling.java rename to tests/src/com/vaadin/tests/featurebrowser/IntroDataHandling.java diff --git a/src/com/vaadin/tests/featurebrowser/IntroDataModel.java b/tests/src/com/vaadin/tests/featurebrowser/IntroDataModel.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/IntroDataModel.java rename to tests/src/com/vaadin/tests/featurebrowser/IntroDataModel.java diff --git a/src/com/vaadin/tests/featurebrowser/IntroItemContainers.java b/tests/src/com/vaadin/tests/featurebrowser/IntroItemContainers.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/IntroItemContainers.java rename to tests/src/com/vaadin/tests/featurebrowser/IntroItemContainers.java diff --git a/src/com/vaadin/tests/featurebrowser/IntroLayouts.java b/tests/src/com/vaadin/tests/featurebrowser/IntroLayouts.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/IntroLayouts.java rename to tests/src/com/vaadin/tests/featurebrowser/IntroLayouts.java diff --git a/src/com/vaadin/tests/featurebrowser/IntroTerminal.java b/tests/src/com/vaadin/tests/featurebrowser/IntroTerminal.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/IntroTerminal.java rename to tests/src/com/vaadin/tests/featurebrowser/IntroTerminal.java diff --git a/src/com/vaadin/tests/featurebrowser/IntroWelcome.java b/tests/src/com/vaadin/tests/featurebrowser/IntroWelcome.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/IntroWelcome.java rename to tests/src/com/vaadin/tests/featurebrowser/IntroWelcome.java diff --git a/src/com/vaadin/tests/featurebrowser/PropertyPanel.java b/tests/src/com/vaadin/tests/featurebrowser/PropertyPanel.java similarity index 100% rename from src/com/vaadin/tests/featurebrowser/PropertyPanel.java rename to tests/src/com/vaadin/tests/featurebrowser/PropertyPanel.java diff --git a/src/com/vaadin/tests/featurebrowser/components.png b/tests/src/com/vaadin/tests/featurebrowser/components.png similarity index 100% rename from src/com/vaadin/tests/featurebrowser/components.png rename to tests/src/com/vaadin/tests/featurebrowser/components.png diff --git a/src/com/vaadin/tests/featurebrowser/icon_demo.png b/tests/src/com/vaadin/tests/featurebrowser/icon_demo.png similarity index 100% rename from src/com/vaadin/tests/featurebrowser/icon_demo.png rename to tests/src/com/vaadin/tests/featurebrowser/icon_demo.png diff --git a/src/com/vaadin/tests/featurebrowser/icon_intro.png b/tests/src/com/vaadin/tests/featurebrowser/icon_intro.png similarity index 100% rename from src/com/vaadin/tests/featurebrowser/icon_intro.png rename to tests/src/com/vaadin/tests/featurebrowser/icon_intro.png diff --git a/src/com/vaadin/tests/featurebrowser/itmill.gif b/tests/src/com/vaadin/tests/featurebrowser/itmill.gif similarity index 100% rename from src/com/vaadin/tests/featurebrowser/itmill.gif rename to tests/src/com/vaadin/tests/featurebrowser/itmill.gif diff --git a/src/com/vaadin/tests/featurebrowser/m-bullet-blue.gif b/tests/src/com/vaadin/tests/featurebrowser/m-bullet-blue.gif similarity index 100% rename from src/com/vaadin/tests/featurebrowser/m-bullet-blue.gif rename to tests/src/com/vaadin/tests/featurebrowser/m-bullet-blue.gif diff --git a/src/com/vaadin/tests/featurebrowser/m.gif b/tests/src/com/vaadin/tests/featurebrowser/m.gif similarity index 100% rename from src/com/vaadin/tests/featurebrowser/m.gif rename to tests/src/com/vaadin/tests/featurebrowser/m.gif diff --git a/src/com/vaadin/tests/featurebrowser/vaadin_spin.swf b/tests/src/com/vaadin/tests/featurebrowser/vaadin_spin.swf similarity index 100% rename from src/com/vaadin/tests/featurebrowser/vaadin_spin.swf rename to tests/src/com/vaadin/tests/featurebrowser/vaadin_spin.swf diff --git a/src/com/vaadin/tests/layouts/AbsoluteLayoutAddRemove.java b/tests/src/com/vaadin/tests/layouts/AbsoluteLayoutAddRemove.java similarity index 100% rename from src/com/vaadin/tests/layouts/AbsoluteLayoutAddRemove.java rename to tests/src/com/vaadin/tests/layouts/AbsoluteLayoutAddRemove.java diff --git a/src/com/vaadin/tests/layouts/DeepComponentTrees.java b/tests/src/com/vaadin/tests/layouts/DeepComponentTrees.java similarity index 100% rename from src/com/vaadin/tests/layouts/DeepComponentTrees.java rename to tests/src/com/vaadin/tests/layouts/DeepComponentTrees.java diff --git a/src/com/vaadin/tests/layouts/FormLayoutWithInvisibleComponent.java b/tests/src/com/vaadin/tests/layouts/FormLayoutWithInvisibleComponent.java similarity index 100% rename from src/com/vaadin/tests/layouts/FormLayoutWithInvisibleComponent.java rename to tests/src/com/vaadin/tests/layouts/FormLayoutWithInvisibleComponent.java diff --git a/src/com/vaadin/tests/layouts/GridLayoutExpandRatioModification.java b/tests/src/com/vaadin/tests/layouts/GridLayoutExpandRatioModification.java similarity index 100% rename from src/com/vaadin/tests/layouts/GridLayoutExpandRatioModification.java rename to tests/src/com/vaadin/tests/layouts/GridLayoutExpandRatioModification.java diff --git a/src/com/vaadin/tests/layouts/GridLayoutInsidePanel.java b/tests/src/com/vaadin/tests/layouts/GridLayoutInsidePanel.java similarity index 100% rename from src/com/vaadin/tests/layouts/GridLayoutInsidePanel.java rename to tests/src/com/vaadin/tests/layouts/GridLayoutInsidePanel.java diff --git a/src/com/vaadin/tests/layouts/GridLayoutInsidePanel2.java b/tests/src/com/vaadin/tests/layouts/GridLayoutInsidePanel2.java similarity index 100% rename from src/com/vaadin/tests/layouts/GridLayoutInsidePanel2.java rename to tests/src/com/vaadin/tests/layouts/GridLayoutInsidePanel2.java diff --git a/src/com/vaadin/tests/layouts/HiddenHorizontalLayout.java b/tests/src/com/vaadin/tests/layouts/HiddenHorizontalLayout.java similarity index 100% rename from src/com/vaadin/tests/layouts/HiddenHorizontalLayout.java rename to tests/src/com/vaadin/tests/layouts/HiddenHorizontalLayout.java diff --git a/src/com/vaadin/tests/layouts/OrderedLayoutBasics.java b/tests/src/com/vaadin/tests/layouts/OrderedLayoutBasics.java similarity index 100% rename from src/com/vaadin/tests/layouts/OrderedLayoutBasics.java rename to tests/src/com/vaadin/tests/layouts/OrderedLayoutBasics.java diff --git a/src/com/vaadin/tests/layouts/OrderedLayoutCSSCompatibility.java b/tests/src/com/vaadin/tests/layouts/OrderedLayoutCSSCompatibility.java similarity index 100% rename from src/com/vaadin/tests/layouts/OrderedLayoutCSSCompatibility.java rename to tests/src/com/vaadin/tests/layouts/OrderedLayoutCSSCompatibility.java diff --git a/src/com/vaadin/tests/layouts/TestAbsoluteLayout.java b/tests/src/com/vaadin/tests/layouts/TestAbsoluteLayout.java similarity index 100% rename from src/com/vaadin/tests/layouts/TestAbsoluteLayout.java rename to tests/src/com/vaadin/tests/layouts/TestAbsoluteLayout.java diff --git a/src/com/vaadin/tests/layouts/TestLayoutPerformance.java b/tests/src/com/vaadin/tests/layouts/TestLayoutPerformance.java similarity index 100% rename from src/com/vaadin/tests/layouts/TestLayoutPerformance.java rename to tests/src/com/vaadin/tests/layouts/TestLayoutPerformance.java diff --git a/src/com/vaadin/tests/layouts/VerticalLayoutExpandRatioModification.java b/tests/src/com/vaadin/tests/layouts/VerticalLayoutExpandRatioModification.java similarity index 100% rename from src/com/vaadin/tests/layouts/VerticalLayoutExpandRatioModification.java rename to tests/src/com/vaadin/tests/layouts/VerticalLayoutExpandRatioModification.java diff --git a/src/com/vaadin/tests/layouts/VerticalLayoutWithRelativeSizeComponents.java b/tests/src/com/vaadin/tests/layouts/VerticalLayoutWithRelativeSizeComponents.java similarity index 100% rename from src/com/vaadin/tests/layouts/VerticalLayoutWithRelativeSizeComponents.java rename to tests/src/com/vaadin/tests/layouts/VerticalLayoutWithRelativeSizeComponents.java diff --git a/src/com/vaadin/tests/m.gif b/tests/src/com/vaadin/tests/m.gif similarity index 100% rename from src/com/vaadin/tests/m.gif rename to tests/src/com/vaadin/tests/m.gif diff --git a/src/com/vaadin/tests/resources/ResourceDownload.java b/tests/src/com/vaadin/tests/resources/ResourceDownload.java similarity index 100% rename from src/com/vaadin/tests/resources/ResourceDownload.java rename to tests/src/com/vaadin/tests/resources/ResourceDownload.java diff --git a/src/com/vaadin/tests/robustness/Robustness.java b/tests/src/com/vaadin/tests/robustness/Robustness.java similarity index 100% rename from src/com/vaadin/tests/robustness/Robustness.java rename to tests/src/com/vaadin/tests/robustness/Robustness.java diff --git a/src/com/vaadin/tests/robustness/RobustnessSimple.java b/tests/src/com/vaadin/tests/robustness/RobustnessSimple.java similarity index 100% rename from src/com/vaadin/tests/robustness/RobustnessSimple.java rename to tests/src/com/vaadin/tests/robustness/RobustnessSimple.java diff --git a/src/com/vaadin/tests/themes/ButtonsTest.java b/tests/src/com/vaadin/tests/themes/ButtonsTest.java similarity index 100% rename from src/com/vaadin/tests/themes/ButtonsTest.java rename to tests/src/com/vaadin/tests/themes/ButtonsTest.java diff --git a/src/com/vaadin/tests/tickets/Ticket1225.java b/tests/src/com/vaadin/tests/tickets/Ticket1225.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1225.java rename to tests/src/com/vaadin/tests/tickets/Ticket1225.java diff --git a/src/com/vaadin/tests/tickets/Ticket1230.java b/tests/src/com/vaadin/tests/tickets/Ticket1230.java similarity index 82% rename from src/com/vaadin/tests/tickets/Ticket1230.java rename to tests/src/com/vaadin/tests/tickets/Ticket1230.java index 233dd3aae8..b77c21a4a6 100644 --- a/src/com/vaadin/tests/tickets/Ticket1230.java +++ b/tests/src/com/vaadin/tests/tickets/Ticket1230.java @@ -1,129 +1,151 @@ -package com.vaadin.tests.tickets; - -import com.vaadin.Application; -import com.vaadin.data.Item; -import com.vaadin.ui.Button; -import com.vaadin.ui.GridLayout; -import com.vaadin.ui.Select; -import com.vaadin.ui.Window; -import com.vaadin.ui.Button.ClickEvent; -import com.vaadin.ui.Button.ClickListener; - -public class Ticket1230 extends Application { - - private static final Object PROPERTY_ID = new Object(); - private static final Object NULL_ITEM_ID = new Object(); - private Select selectWithoutNullItem; - private Select selectWithNullItem; - - @Override - public void init() { - Window w = new Window(getClass().getName()); - setMainWindow(w); - - GridLayout layout = new GridLayout(5, 5); - w.setLayout(layout); - - layout.setSpacing(true); - - { - selectWithoutNullItem = createSelect(); - - layout.addComponent(selectWithoutNullItem); - Button b = new Button("Select NULL_PROPERTY", new ClickListener() { - - public void buttonClick(ClickEvent event) { - selectWithoutNullItem.select(NULL_ITEM_ID); - - } - }); - layout.addComponent(b); - b = new Button("Select 1", new ClickListener() { - - public void buttonClick(ClickEvent event) { - selectWithoutNullItem.select("1"); - - } - }); - layout.addComponent(b); - b = new Button("Select 2", new ClickListener() { - - public void buttonClick(ClickEvent event) { - selectWithoutNullItem.select("2"); - - } - }); - layout.addComponent(b); - - b = new Button("Select null", new ClickListener() { - - public void buttonClick(ClickEvent event) { - selectWithoutNullItem.select(null); - - } - }); - layout.addComponent(b); - } - - { - selectWithNullItem = createSelect(); - Item nullItem = selectWithNullItem.addItem(NULL_ITEM_ID); - nullItem.getItemProperty(PROPERTY_ID).setValue("NULL"); - selectWithNullItem.setNullSelectionItemId(NULL_ITEM_ID); - - layout.addComponent(selectWithNullItem); - Button b = new Button("Select NULL_PROPERTY", new ClickListener() { - - public void buttonClick(ClickEvent event) { - selectWithNullItem.select(NULL_ITEM_ID); - - } - }); - layout.addComponent(b); - - b = new Button("Select 1", new ClickListener() { - - public void buttonClick(ClickEvent event) { - selectWithNullItem.select("1"); - - } - }); - layout.addComponent(b); - b = new Button("Select 2", new ClickListener() { - - public void buttonClick(ClickEvent event) { - selectWithNullItem.select("2"); - - } - }); - layout.addComponent(b); - - b = new Button("Select null", new ClickListener() { - - public void buttonClick(ClickEvent event) { - selectWithNullItem.select(null); - - } - }); - layout.addComponent(b); - - } - } - - private Select createSelect() { - Select select = new Select(); - select.setMultiSelect(false); - select.addContainerProperty(PROPERTY_ID, String.class, ""); - select.setItemCaptionPropertyId(PROPERTY_ID); - - Item item1 = select.addItem("1"); - item1.getItemProperty(PROPERTY_ID).setValue("1"); - Item item2 = select.addItem("2"); - item2.getItemProperty(PROPERTY_ID).setValue("2"); - - select.setNullSelectionAllowed(true); - - return select; - } - -} +package com.vaadin.tests.tickets; + +import com.vaadin.Application; +import com.vaadin.data.Item; +import com.vaadin.ui.Button; +import com.vaadin.ui.GridLayout; +import com.vaadin.ui.Select; +import com.vaadin.ui.Window; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; + +public class Ticket1230 extends Application { + + private static final Object PROPERTY_ID = new Object(); + private static final Object NULL_ITEM_ID = new Object(); + private Select selectWithoutNullItem; + private Select selectWithNullItem; + + @Override + public void init() { + Window w = new Window(getClass().getName()); + setMainWindow(w); + + GridLayout layout = new GridLayout(5, 5); + w.setLayout(layout); + + layout.setSpacing(true); + + { + selectWithoutNullItem = createSelect(); + + layout.addComponent(selectWithoutNullItem); + Button b = new Button("Select NULL_PROPERTY", new ClickListener() { + + public void buttonClick(ClickEvent event) { + selectWithoutNullItem.select(NULL_ITEM_ID); + printState(); + + } + }); + layout.addComponent(b); + b = new Button("Select 1", new ClickListener() { + + public void buttonClick(ClickEvent event) { + selectWithoutNullItem.select("1"); + printState(); + + } + }); + layout.addComponent(b); + b = new Button("Select 2", new ClickListener() { + + public void buttonClick(ClickEvent event) { + selectWithoutNullItem.select("2"); + printState(); + + } + }); + layout.addComponent(b); + + b = new Button("Select null", new ClickListener() { + + public void buttonClick(ClickEvent event) { + selectWithoutNullItem.select(null); + printState(); + + } + }); + layout.addComponent(b); + } + + { + selectWithNullItem = createSelect(); + Item nullItem = selectWithNullItem.addItem(NULL_ITEM_ID); + nullItem.getItemProperty(PROPERTY_ID).setValue("NULL"); + selectWithNullItem.setNullSelectionItemId(NULL_ITEM_ID); + + layout.addComponent(selectWithNullItem); + selectWithNullItem.setCaption("Select with null item id"); + Button b = new Button("Select NULL_PROPERTY", new ClickListener() { + + public void buttonClick(ClickEvent event) { + selectWithNullItem.select(NULL_ITEM_ID); + printState(); + + } + }); + layout.addComponent(b); + + b = new Button("Select 1", new ClickListener() { + + public void buttonClick(ClickEvent event) { + selectWithNullItem.select("1"); + printState(); + + } + }); + layout.addComponent(b); + b = new Button("Select 2", new ClickListener() { + + public void buttonClick(ClickEvent event) { + selectWithNullItem.select("2"); + printState(); + } + }); + layout.addComponent(b); + + b = new Button("Select null", new ClickListener() { + + public void buttonClick(ClickEvent event) { + selectWithNullItem.select(null); + printState(); + } + }); + layout.addComponent(b); + + } + + w.addComponent(new Button("print select values", + new Button.ClickListener() { + public void buttonClick(ClickEvent event) { + printState(); + } + })); + } + + private Select createSelect() { + Select select = new Select(); + select.setMultiSelect(false); + select.addContainerProperty(PROPERTY_ID, String.class, ""); + select.setItemCaptionPropertyId(PROPERTY_ID); + + Item item1 = select.addItem("1"); + item1.getItemProperty(PROPERTY_ID).setValue("1"); + Item item2 = select.addItem("2"); + item2.getItemProperty(PROPERTY_ID).setValue("2"); + + select.setNullSelectionAllowed(true); + + return select; + } + + void printState() { + System.out.println(" Select without null item " + + selectWithoutNullItem.getValue()); + System.out.println(" Select with null item " + + selectWithNullItem.getValue()); + + } + +} diff --git a/src/com/vaadin/tests/tickets/Ticket124.java b/tests/src/com/vaadin/tests/tickets/Ticket124.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket124.java rename to tests/src/com/vaadin/tests/tickets/Ticket124.java diff --git a/src/com/vaadin/tests/tickets/Ticket1245.java b/tests/src/com/vaadin/tests/tickets/Ticket1245.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1245.java rename to tests/src/com/vaadin/tests/tickets/Ticket1245.java diff --git a/src/com/vaadin/tests/tickets/Ticket1362Login.java b/tests/src/com/vaadin/tests/tickets/Ticket1362Login.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1362Login.java rename to tests/src/com/vaadin/tests/tickets/Ticket1362Login.java diff --git a/src/com/vaadin/tests/tickets/Ticket1365.java b/tests/src/com/vaadin/tests/tickets/Ticket1365.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1365.java rename to tests/src/com/vaadin/tests/tickets/Ticket1365.java diff --git a/src/com/vaadin/tests/tickets/Ticket1368.java b/tests/src/com/vaadin/tests/tickets/Ticket1368.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1368.java rename to tests/src/com/vaadin/tests/tickets/Ticket1368.java diff --git a/src/com/vaadin/tests/tickets/Ticket1397.java b/tests/src/com/vaadin/tests/tickets/Ticket1397.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1397.java rename to tests/src/com/vaadin/tests/tickets/Ticket1397.java diff --git a/src/com/vaadin/tests/tickets/Ticket1435.java b/tests/src/com/vaadin/tests/tickets/Ticket1435.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1435.java rename to tests/src/com/vaadin/tests/tickets/Ticket1435.java diff --git a/src/com/vaadin/tests/tickets/Ticket1444.java b/tests/src/com/vaadin/tests/tickets/Ticket1444.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1444.java rename to tests/src/com/vaadin/tests/tickets/Ticket1444.java diff --git a/src/com/vaadin/tests/tickets/Ticket1465ModalNotification.java b/tests/src/com/vaadin/tests/tickets/Ticket1465ModalNotification.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1465ModalNotification.java rename to tests/src/com/vaadin/tests/tickets/Ticket1465ModalNotification.java diff --git a/src/com/vaadin/tests/tickets/Ticket1506.java b/tests/src/com/vaadin/tests/tickets/Ticket1506.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1506.java rename to tests/src/com/vaadin/tests/tickets/Ticket1506.java diff --git a/src/com/vaadin/tests/tickets/Ticket1506_Panel.java b/tests/src/com/vaadin/tests/tickets/Ticket1506_Panel.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1506_Panel.java rename to tests/src/com/vaadin/tests/tickets/Ticket1506_Panel.java diff --git a/src/com/vaadin/tests/tickets/Ticket1506_TestContainer.java b/tests/src/com/vaadin/tests/tickets/Ticket1506_TestContainer.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1506_TestContainer.java rename to tests/src/com/vaadin/tests/tickets/Ticket1506_TestContainer.java diff --git a/src/com/vaadin/tests/tickets/Ticket1506_TestContainer2.java b/tests/src/com/vaadin/tests/tickets/Ticket1506_TestContainer2.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1506_TestContainer2.java rename to tests/src/com/vaadin/tests/tickets/Ticket1506_TestContainer2.java diff --git a/src/com/vaadin/tests/tickets/Ticket1519.java b/tests/src/com/vaadin/tests/tickets/Ticket1519.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1519.java rename to tests/src/com/vaadin/tests/tickets/Ticket1519.java diff --git a/src/com/vaadin/tests/tickets/Ticket1572.java b/tests/src/com/vaadin/tests/tickets/Ticket1572.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1572.java rename to tests/src/com/vaadin/tests/tickets/Ticket1572.java diff --git a/src/com/vaadin/tests/tickets/Ticket1581.java b/tests/src/com/vaadin/tests/tickets/Ticket1581.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1581.java rename to tests/src/com/vaadin/tests/tickets/Ticket1581.java diff --git a/src/com/vaadin/tests/tickets/Ticket1589.java b/tests/src/com/vaadin/tests/tickets/Ticket1589.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1589.java rename to tests/src/com/vaadin/tests/tickets/Ticket1589.java diff --git a/src/com/vaadin/tests/tickets/Ticket1598.java b/tests/src/com/vaadin/tests/tickets/Ticket1598.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1598.java rename to tests/src/com/vaadin/tests/tickets/Ticket1598.java diff --git a/src/com/vaadin/tests/tickets/Ticket161.java b/tests/src/com/vaadin/tests/tickets/Ticket161.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket161.java rename to tests/src/com/vaadin/tests/tickets/Ticket161.java diff --git a/src/com/vaadin/tests/tickets/Ticket1632.java b/tests/src/com/vaadin/tests/tickets/Ticket1632.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1632.java rename to tests/src/com/vaadin/tests/tickets/Ticket1632.java diff --git a/src/com/vaadin/tests/tickets/Ticket1659.java b/tests/src/com/vaadin/tests/tickets/Ticket1659.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1659.java rename to tests/src/com/vaadin/tests/tickets/Ticket1659.java diff --git a/src/com/vaadin/tests/tickets/Ticket1663.java b/tests/src/com/vaadin/tests/tickets/Ticket1663.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1663.java rename to tests/src/com/vaadin/tests/tickets/Ticket1663.java diff --git a/src/com/vaadin/tests/tickets/Ticket1673.java b/tests/src/com/vaadin/tests/tickets/Ticket1673.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1673.java rename to tests/src/com/vaadin/tests/tickets/Ticket1673.java diff --git a/src/com/vaadin/tests/tickets/Ticket1710.java b/tests/src/com/vaadin/tests/tickets/Ticket1710.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1710.java rename to tests/src/com/vaadin/tests/tickets/Ticket1710.java diff --git a/src/com/vaadin/tests/tickets/Ticket1737.java b/tests/src/com/vaadin/tests/tickets/Ticket1737.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1737.java rename to tests/src/com/vaadin/tests/tickets/Ticket1737.java diff --git a/src/com/vaadin/tests/tickets/Ticket1767.java b/tests/src/com/vaadin/tests/tickets/Ticket1767.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1767.java rename to tests/src/com/vaadin/tests/tickets/Ticket1767.java diff --git a/src/com/vaadin/tests/tickets/Ticket1772.java b/tests/src/com/vaadin/tests/tickets/Ticket1772.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1772.java rename to tests/src/com/vaadin/tests/tickets/Ticket1772.java diff --git a/src/com/vaadin/tests/tickets/Ticket1775.java b/tests/src/com/vaadin/tests/tickets/Ticket1775.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1775.java rename to tests/src/com/vaadin/tests/tickets/Ticket1775.java diff --git a/src/com/vaadin/tests/tickets/Ticket1804.java b/tests/src/com/vaadin/tests/tickets/Ticket1804.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1804.java rename to tests/src/com/vaadin/tests/tickets/Ticket1804.java diff --git a/src/com/vaadin/tests/tickets/Ticket1805.java b/tests/src/com/vaadin/tests/tickets/Ticket1805.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1805.java rename to tests/src/com/vaadin/tests/tickets/Ticket1805.java diff --git a/src/com/vaadin/tests/tickets/Ticket1806.java b/tests/src/com/vaadin/tests/tickets/Ticket1806.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1806.java rename to tests/src/com/vaadin/tests/tickets/Ticket1806.java diff --git a/src/com/vaadin/tests/tickets/Ticket1811.java b/tests/src/com/vaadin/tests/tickets/Ticket1811.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1811.java rename to tests/src/com/vaadin/tests/tickets/Ticket1811.java diff --git a/src/com/vaadin/tests/tickets/Ticket1819.java b/tests/src/com/vaadin/tests/tickets/Ticket1819.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1819.java rename to tests/src/com/vaadin/tests/tickets/Ticket1819.java diff --git a/src/com/vaadin/tests/tickets/Ticket1834PanelScrolling.java b/tests/src/com/vaadin/tests/tickets/Ticket1834PanelScrolling.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1834PanelScrolling.java rename to tests/src/com/vaadin/tests/tickets/Ticket1834PanelScrolling.java diff --git a/src/com/vaadin/tests/tickets/Ticket1857.java b/tests/src/com/vaadin/tests/tickets/Ticket1857.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1857.java rename to tests/src/com/vaadin/tests/tickets/Ticket1857.java diff --git a/src/com/vaadin/tests/tickets/Ticket1868.java b/tests/src/com/vaadin/tests/tickets/Ticket1868.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1868.java rename to tests/src/com/vaadin/tests/tickets/Ticket1868.java diff --git a/src/com/vaadin/tests/tickets/Ticket1869.java b/tests/src/com/vaadin/tests/tickets/Ticket1869.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1869.java rename to tests/src/com/vaadin/tests/tickets/Ticket1869.java diff --git a/src/com/vaadin/tests/tickets/Ticket1878.java b/tests/src/com/vaadin/tests/tickets/Ticket1878.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1878.java rename to tests/src/com/vaadin/tests/tickets/Ticket1878.java diff --git a/src/com/vaadin/tests/tickets/Ticket1900.java b/tests/src/com/vaadin/tests/tickets/Ticket1900.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1900.java rename to tests/src/com/vaadin/tests/tickets/Ticket1900.java diff --git a/src/com/vaadin/tests/tickets/Ticket1902.java b/tests/src/com/vaadin/tests/tickets/Ticket1902.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1902.java rename to tests/src/com/vaadin/tests/tickets/Ticket1902.java diff --git a/src/com/vaadin/tests/tickets/Ticket1904.java b/tests/src/com/vaadin/tests/tickets/Ticket1904.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1904.java rename to tests/src/com/vaadin/tests/tickets/Ticket1904.java diff --git a/src/com/vaadin/tests/tickets/Ticket1916.java b/tests/src/com/vaadin/tests/tickets/Ticket1916.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1916.java rename to tests/src/com/vaadin/tests/tickets/Ticket1916.java diff --git a/src/com/vaadin/tests/tickets/Ticket1919.java b/tests/src/com/vaadin/tests/tickets/Ticket1919.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1919.java rename to tests/src/com/vaadin/tests/tickets/Ticket1919.java diff --git a/src/com/vaadin/tests/tickets/Ticket1921.java b/tests/src/com/vaadin/tests/tickets/Ticket1921.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1921.java rename to tests/src/com/vaadin/tests/tickets/Ticket1921.java diff --git a/src/com/vaadin/tests/tickets/Ticket1923.java b/tests/src/com/vaadin/tests/tickets/Ticket1923.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1923.java rename to tests/src/com/vaadin/tests/tickets/Ticket1923.java diff --git a/src/com/vaadin/tests/tickets/Ticket1924ThemeChanging.java b/tests/src/com/vaadin/tests/tickets/Ticket1924ThemeChanging.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1924ThemeChanging.java rename to tests/src/com/vaadin/tests/tickets/Ticket1924ThemeChanging.java diff --git a/src/com/vaadin/tests/tickets/Ticket1925.java b/tests/src/com/vaadin/tests/tickets/Ticket1925.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1925.java rename to tests/src/com/vaadin/tests/tickets/Ticket1925.java diff --git a/src/com/vaadin/tests/tickets/Ticket1934.java b/tests/src/com/vaadin/tests/tickets/Ticket1934.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1934.java rename to tests/src/com/vaadin/tests/tickets/Ticket1934.java diff --git a/src/com/vaadin/tests/tickets/Ticket1939.java b/tests/src/com/vaadin/tests/tickets/Ticket1939.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1939.java rename to tests/src/com/vaadin/tests/tickets/Ticket1939.java diff --git a/src/com/vaadin/tests/tickets/Ticket1940.java b/tests/src/com/vaadin/tests/tickets/Ticket1940.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1940.java rename to tests/src/com/vaadin/tests/tickets/Ticket1940.java diff --git a/src/com/vaadin/tests/tickets/Ticket1953.java b/tests/src/com/vaadin/tests/tickets/Ticket1953.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1953.java rename to tests/src/com/vaadin/tests/tickets/Ticket1953.java diff --git a/src/com/vaadin/tests/tickets/Ticket1966.java b/tests/src/com/vaadin/tests/tickets/Ticket1966.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1966.java rename to tests/src/com/vaadin/tests/tickets/Ticket1966.java diff --git a/src/com/vaadin/tests/tickets/Ticket1966_2.java b/tests/src/com/vaadin/tests/tickets/Ticket1966_2.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1966_2.java rename to tests/src/com/vaadin/tests/tickets/Ticket1966_2.java diff --git a/src/com/vaadin/tests/tickets/Ticket1966_3.java b/tests/src/com/vaadin/tests/tickets/Ticket1966_3.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1966_3.java rename to tests/src/com/vaadin/tests/tickets/Ticket1966_3.java diff --git a/src/com/vaadin/tests/tickets/Ticket1969.java b/tests/src/com/vaadin/tests/tickets/Ticket1969.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1969.java rename to tests/src/com/vaadin/tests/tickets/Ticket1969.java diff --git a/src/com/vaadin/tests/tickets/Ticket1970.java b/tests/src/com/vaadin/tests/tickets/Ticket1970.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1970.java rename to tests/src/com/vaadin/tests/tickets/Ticket1970.java diff --git a/src/com/vaadin/tests/tickets/Ticket1972.java b/tests/src/com/vaadin/tests/tickets/Ticket1972.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1972.java rename to tests/src/com/vaadin/tests/tickets/Ticket1972.java diff --git a/src/com/vaadin/tests/tickets/Ticket1973.java b/tests/src/com/vaadin/tests/tickets/Ticket1973.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1973.java rename to tests/src/com/vaadin/tests/tickets/Ticket1973.java diff --git a/src/com/vaadin/tests/tickets/Ticket1973_2.java b/tests/src/com/vaadin/tests/tickets/Ticket1973_2.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1973_2.java rename to tests/src/com/vaadin/tests/tickets/Ticket1973_2.java diff --git a/src/com/vaadin/tests/tickets/Ticket1975.java b/tests/src/com/vaadin/tests/tickets/Ticket1975.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1975.java rename to tests/src/com/vaadin/tests/tickets/Ticket1975.java diff --git a/src/com/vaadin/tests/tickets/Ticket1982.java b/tests/src/com/vaadin/tests/tickets/Ticket1982.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1982.java rename to tests/src/com/vaadin/tests/tickets/Ticket1982.java diff --git a/src/com/vaadin/tests/tickets/Ticket1983.java b/tests/src/com/vaadin/tests/tickets/Ticket1983.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1983.java rename to tests/src/com/vaadin/tests/tickets/Ticket1983.java diff --git a/src/com/vaadin/tests/tickets/Ticket1986.java b/tests/src/com/vaadin/tests/tickets/Ticket1986.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1986.java rename to tests/src/com/vaadin/tests/tickets/Ticket1986.java diff --git a/src/com/vaadin/tests/tickets/Ticket1991.java b/tests/src/com/vaadin/tests/tickets/Ticket1991.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1991.java rename to tests/src/com/vaadin/tests/tickets/Ticket1991.java diff --git a/src/com/vaadin/tests/tickets/Ticket1995.java b/tests/src/com/vaadin/tests/tickets/Ticket1995.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket1995.java rename to tests/src/com/vaadin/tests/tickets/Ticket1995.java diff --git a/src/com/vaadin/tests/tickets/Ticket20.java b/tests/src/com/vaadin/tests/tickets/Ticket20.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket20.java rename to tests/src/com/vaadin/tests/tickets/Ticket20.java diff --git a/src/com/vaadin/tests/tickets/Ticket2001.java b/tests/src/com/vaadin/tests/tickets/Ticket2001.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2001.java rename to tests/src/com/vaadin/tests/tickets/Ticket2001.java diff --git a/src/com/vaadin/tests/tickets/Ticket2002.java b/tests/src/com/vaadin/tests/tickets/Ticket2002.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2002.java rename to tests/src/com/vaadin/tests/tickets/Ticket2002.java diff --git a/src/com/vaadin/tests/tickets/Ticket2007.java b/tests/src/com/vaadin/tests/tickets/Ticket2007.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2007.java rename to tests/src/com/vaadin/tests/tickets/Ticket2007.java diff --git a/src/com/vaadin/tests/tickets/Ticket2009.java b/tests/src/com/vaadin/tests/tickets/Ticket2009.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2009.java rename to tests/src/com/vaadin/tests/tickets/Ticket2009.java diff --git a/src/com/vaadin/tests/tickets/Ticket2011.java b/tests/src/com/vaadin/tests/tickets/Ticket2011.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2011.java rename to tests/src/com/vaadin/tests/tickets/Ticket2011.java diff --git a/src/com/vaadin/tests/tickets/Ticket2014.java b/tests/src/com/vaadin/tests/tickets/Ticket2014.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2014.java rename to tests/src/com/vaadin/tests/tickets/Ticket2014.java diff --git a/src/com/vaadin/tests/tickets/Ticket2021.java b/tests/src/com/vaadin/tests/tickets/Ticket2021.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2021.java rename to tests/src/com/vaadin/tests/tickets/Ticket2021.java diff --git a/src/com/vaadin/tests/tickets/Ticket2022.java b/tests/src/com/vaadin/tests/tickets/Ticket2022.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2022.java rename to tests/src/com/vaadin/tests/tickets/Ticket2022.java diff --git a/src/com/vaadin/tests/tickets/Ticket2023.java b/tests/src/com/vaadin/tests/tickets/Ticket2023.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2023.java rename to tests/src/com/vaadin/tests/tickets/Ticket2023.java diff --git a/src/com/vaadin/tests/tickets/Ticket2024.java b/tests/src/com/vaadin/tests/tickets/Ticket2024.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2024.java rename to tests/src/com/vaadin/tests/tickets/Ticket2024.java diff --git a/src/com/vaadin/tests/tickets/Ticket2026.java b/tests/src/com/vaadin/tests/tickets/Ticket2026.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2026.java rename to tests/src/com/vaadin/tests/tickets/Ticket2026.java diff --git a/src/com/vaadin/tests/tickets/Ticket2029.java b/tests/src/com/vaadin/tests/tickets/Ticket2029.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2029.java rename to tests/src/com/vaadin/tests/tickets/Ticket2029.java diff --git a/src/com/vaadin/tests/tickets/Ticket2032.java b/tests/src/com/vaadin/tests/tickets/Ticket2032.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2032.java rename to tests/src/com/vaadin/tests/tickets/Ticket2032.java diff --git a/src/com/vaadin/tests/tickets/Ticket2033.java b/tests/src/com/vaadin/tests/tickets/Ticket2033.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2033.java rename to tests/src/com/vaadin/tests/tickets/Ticket2033.java diff --git a/src/com/vaadin/tests/tickets/Ticket2037.java b/tests/src/com/vaadin/tests/tickets/Ticket2037.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2037.java rename to tests/src/com/vaadin/tests/tickets/Ticket2037.java diff --git a/src/com/vaadin/tests/tickets/Ticket2038.java b/tests/src/com/vaadin/tests/tickets/Ticket2038.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2038.java rename to tests/src/com/vaadin/tests/tickets/Ticket2038.java diff --git a/src/com/vaadin/tests/tickets/Ticket2040.java b/tests/src/com/vaadin/tests/tickets/Ticket2040.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2040.java rename to tests/src/com/vaadin/tests/tickets/Ticket2040.java diff --git a/src/com/vaadin/tests/tickets/Ticket2042.java b/tests/src/com/vaadin/tests/tickets/Ticket2042.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2042.java rename to tests/src/com/vaadin/tests/tickets/Ticket2042.java diff --git a/src/com/vaadin/tests/tickets/Ticket2043.java b/tests/src/com/vaadin/tests/tickets/Ticket2043.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2043.java rename to tests/src/com/vaadin/tests/tickets/Ticket2043.java diff --git a/src/com/vaadin/tests/tickets/Ticket2048.java b/tests/src/com/vaadin/tests/tickets/Ticket2048.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2048.java rename to tests/src/com/vaadin/tests/tickets/Ticket2048.java diff --git a/src/com/vaadin/tests/tickets/Ticket2051.java b/tests/src/com/vaadin/tests/tickets/Ticket2051.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2051.java rename to tests/src/com/vaadin/tests/tickets/Ticket2051.java diff --git a/src/com/vaadin/tests/tickets/Ticket2053.java b/tests/src/com/vaadin/tests/tickets/Ticket2053.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2053.java rename to tests/src/com/vaadin/tests/tickets/Ticket2053.java diff --git a/src/com/vaadin/tests/tickets/Ticket2060.java b/tests/src/com/vaadin/tests/tickets/Ticket2060.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2060.java rename to tests/src/com/vaadin/tests/tickets/Ticket2060.java diff --git a/src/com/vaadin/tests/tickets/Ticket2061.java b/tests/src/com/vaadin/tests/tickets/Ticket2061.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2061.java rename to tests/src/com/vaadin/tests/tickets/Ticket2061.java diff --git a/src/com/vaadin/tests/tickets/Ticket2061b.java b/tests/src/com/vaadin/tests/tickets/Ticket2061b.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2061b.java rename to tests/src/com/vaadin/tests/tickets/Ticket2061b.java diff --git a/src/com/vaadin/tests/tickets/Ticket2061c.java b/tests/src/com/vaadin/tests/tickets/Ticket2061c.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2061c.java rename to tests/src/com/vaadin/tests/tickets/Ticket2061c.java diff --git a/src/com/vaadin/tests/tickets/Ticket2062.java b/tests/src/com/vaadin/tests/tickets/Ticket2062.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2062.java rename to tests/src/com/vaadin/tests/tickets/Ticket2062.java diff --git a/src/com/vaadin/tests/tickets/Ticket2083.java b/tests/src/com/vaadin/tests/tickets/Ticket2083.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2083.java rename to tests/src/com/vaadin/tests/tickets/Ticket2083.java diff --git a/src/com/vaadin/tests/tickets/Ticket2090.java b/tests/src/com/vaadin/tests/tickets/Ticket2090.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2090.java rename to tests/src/com/vaadin/tests/tickets/Ticket2090.java diff --git a/src/com/vaadin/tests/tickets/Ticket2095.java b/tests/src/com/vaadin/tests/tickets/Ticket2095.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2095.java rename to tests/src/com/vaadin/tests/tickets/Ticket2095.java diff --git a/src/com/vaadin/tests/tickets/Ticket2098.java b/tests/src/com/vaadin/tests/tickets/Ticket2098.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2098.java rename to tests/src/com/vaadin/tests/tickets/Ticket2098.java diff --git a/src/com/vaadin/tests/tickets/Ticket2099.java b/tests/src/com/vaadin/tests/tickets/Ticket2099.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2099.java rename to tests/src/com/vaadin/tests/tickets/Ticket2099.java diff --git a/src/com/vaadin/tests/tickets/Ticket2101.java b/tests/src/com/vaadin/tests/tickets/Ticket2101.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2101.java rename to tests/src/com/vaadin/tests/tickets/Ticket2101.java diff --git a/src/com/vaadin/tests/tickets/Ticket2103.java b/tests/src/com/vaadin/tests/tickets/Ticket2103.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2103.java rename to tests/src/com/vaadin/tests/tickets/Ticket2103.java diff --git a/src/com/vaadin/tests/tickets/Ticket2104.java b/tests/src/com/vaadin/tests/tickets/Ticket2104.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2104.java rename to tests/src/com/vaadin/tests/tickets/Ticket2104.java diff --git a/src/com/vaadin/tests/tickets/Ticket2106.java b/tests/src/com/vaadin/tests/tickets/Ticket2106.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2106.java rename to tests/src/com/vaadin/tests/tickets/Ticket2106.java diff --git a/src/com/vaadin/tests/tickets/Ticket2107.java b/tests/src/com/vaadin/tests/tickets/Ticket2107.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2107.java rename to tests/src/com/vaadin/tests/tickets/Ticket2107.java diff --git a/src/com/vaadin/tests/tickets/Ticket2117.java b/tests/src/com/vaadin/tests/tickets/Ticket2117.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2117.java rename to tests/src/com/vaadin/tests/tickets/Ticket2117.java diff --git a/src/com/vaadin/tests/tickets/Ticket2119.java b/tests/src/com/vaadin/tests/tickets/Ticket2119.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2119.java rename to tests/src/com/vaadin/tests/tickets/Ticket2119.java diff --git a/src/com/vaadin/tests/tickets/Ticket2125.java b/tests/src/com/vaadin/tests/tickets/Ticket2125.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2125.java rename to tests/src/com/vaadin/tests/tickets/Ticket2125.java diff --git a/src/com/vaadin/tests/tickets/Ticket2126.java b/tests/src/com/vaadin/tests/tickets/Ticket2126.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2126.java rename to tests/src/com/vaadin/tests/tickets/Ticket2126.java diff --git a/src/com/vaadin/tests/tickets/Ticket2151.java b/tests/src/com/vaadin/tests/tickets/Ticket2151.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2151.java rename to tests/src/com/vaadin/tests/tickets/Ticket2151.java diff --git a/src/com/vaadin/tests/tickets/Ticket2157.java b/tests/src/com/vaadin/tests/tickets/Ticket2157.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2157.java rename to tests/src/com/vaadin/tests/tickets/Ticket2157.java diff --git a/src/com/vaadin/tests/tickets/Ticket2178.java b/tests/src/com/vaadin/tests/tickets/Ticket2178.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2178.java rename to tests/src/com/vaadin/tests/tickets/Ticket2178.java diff --git a/src/com/vaadin/tests/tickets/Ticket2179.java b/tests/src/com/vaadin/tests/tickets/Ticket2179.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2179.java rename to tests/src/com/vaadin/tests/tickets/Ticket2179.java diff --git a/src/com/vaadin/tests/tickets/Ticket2180.java b/tests/src/com/vaadin/tests/tickets/Ticket2180.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2180.java rename to tests/src/com/vaadin/tests/tickets/Ticket2180.java diff --git a/src/com/vaadin/tests/tickets/Ticket2181.java b/tests/src/com/vaadin/tests/tickets/Ticket2181.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2181.java rename to tests/src/com/vaadin/tests/tickets/Ticket2181.java diff --git a/src/com/vaadin/tests/tickets/Ticket2186.java b/tests/src/com/vaadin/tests/tickets/Ticket2186.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2186.java rename to tests/src/com/vaadin/tests/tickets/Ticket2186.java diff --git a/src/com/vaadin/tests/tickets/Ticket2204.java b/tests/src/com/vaadin/tests/tickets/Ticket2204.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2204.java rename to tests/src/com/vaadin/tests/tickets/Ticket2204.java diff --git a/src/com/vaadin/tests/tickets/Ticket2208.java b/tests/src/com/vaadin/tests/tickets/Ticket2208.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2208.java rename to tests/src/com/vaadin/tests/tickets/Ticket2208.java diff --git a/src/com/vaadin/tests/tickets/Ticket2209.java b/tests/src/com/vaadin/tests/tickets/Ticket2209.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2209.java rename to tests/src/com/vaadin/tests/tickets/Ticket2209.java diff --git a/src/com/vaadin/tests/tickets/Ticket2209OL.java b/tests/src/com/vaadin/tests/tickets/Ticket2209OL.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2209OL.java rename to tests/src/com/vaadin/tests/tickets/Ticket2209OL.java diff --git a/src/com/vaadin/tests/tickets/Ticket2209OL2.java b/tests/src/com/vaadin/tests/tickets/Ticket2209OL2.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2209OL2.java rename to tests/src/com/vaadin/tests/tickets/Ticket2209OL2.java diff --git a/src/com/vaadin/tests/tickets/Ticket2215.java b/tests/src/com/vaadin/tests/tickets/Ticket2215.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2215.java rename to tests/src/com/vaadin/tests/tickets/Ticket2215.java diff --git a/src/com/vaadin/tests/tickets/Ticket2221.java b/tests/src/com/vaadin/tests/tickets/Ticket2221.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2221.java rename to tests/src/com/vaadin/tests/tickets/Ticket2221.java diff --git a/src/com/vaadin/tests/tickets/Ticket2222.java b/tests/src/com/vaadin/tests/tickets/Ticket2222.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2222.java rename to tests/src/com/vaadin/tests/tickets/Ticket2222.java diff --git a/src/com/vaadin/tests/tickets/Ticket2227OrderedlayoutInTable.java b/tests/src/com/vaadin/tests/tickets/Ticket2227OrderedlayoutInTable.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2227OrderedlayoutInTable.java rename to tests/src/com/vaadin/tests/tickets/Ticket2227OrderedlayoutInTable.java diff --git a/src/com/vaadin/tests/tickets/Ticket2231.java b/tests/src/com/vaadin/tests/tickets/Ticket2231.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2231.java rename to tests/src/com/vaadin/tests/tickets/Ticket2231.java diff --git a/src/com/vaadin/tests/tickets/Ticket2232.java b/tests/src/com/vaadin/tests/tickets/Ticket2232.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2232.java rename to tests/src/com/vaadin/tests/tickets/Ticket2232.java diff --git a/src/com/vaadin/tests/tickets/Ticket2234.java b/tests/src/com/vaadin/tests/tickets/Ticket2234.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2234.java rename to tests/src/com/vaadin/tests/tickets/Ticket2234.java diff --git a/src/com/vaadin/tests/tickets/Ticket2235.java b/tests/src/com/vaadin/tests/tickets/Ticket2235.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2235.java rename to tests/src/com/vaadin/tests/tickets/Ticket2235.java diff --git a/src/com/vaadin/tests/tickets/Ticket2240.java b/tests/src/com/vaadin/tests/tickets/Ticket2240.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2240.java rename to tests/src/com/vaadin/tests/tickets/Ticket2240.java diff --git a/src/com/vaadin/tests/tickets/Ticket2242.java b/tests/src/com/vaadin/tests/tickets/Ticket2242.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2242.java rename to tests/src/com/vaadin/tests/tickets/Ticket2242.java diff --git a/src/com/vaadin/tests/tickets/Ticket2244.java b/tests/src/com/vaadin/tests/tickets/Ticket2244.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2244.java rename to tests/src/com/vaadin/tests/tickets/Ticket2244.java diff --git a/src/com/vaadin/tests/tickets/Ticket2245.java b/tests/src/com/vaadin/tests/tickets/Ticket2245.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2245.java rename to tests/src/com/vaadin/tests/tickets/Ticket2245.java diff --git a/src/com/vaadin/tests/tickets/Ticket2267.java b/tests/src/com/vaadin/tests/tickets/Ticket2267.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2267.java rename to tests/src/com/vaadin/tests/tickets/Ticket2267.java diff --git a/src/com/vaadin/tests/tickets/Ticket2271.java b/tests/src/com/vaadin/tests/tickets/Ticket2271.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2271.java rename to tests/src/com/vaadin/tests/tickets/Ticket2271.java diff --git a/src/com/vaadin/tests/tickets/Ticket2279.java b/tests/src/com/vaadin/tests/tickets/Ticket2279.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2279.java rename to tests/src/com/vaadin/tests/tickets/Ticket2279.java diff --git a/src/com/vaadin/tests/tickets/Ticket2282.java b/tests/src/com/vaadin/tests/tickets/Ticket2282.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2282.java rename to tests/src/com/vaadin/tests/tickets/Ticket2282.java diff --git a/src/com/vaadin/tests/tickets/Ticket2283.java b/tests/src/com/vaadin/tests/tickets/Ticket2283.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2283.java rename to tests/src/com/vaadin/tests/tickets/Ticket2283.java diff --git a/src/com/vaadin/tests/tickets/Ticket2287.java b/tests/src/com/vaadin/tests/tickets/Ticket2287.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2287.java rename to tests/src/com/vaadin/tests/tickets/Ticket2287.java diff --git a/src/com/vaadin/tests/tickets/Ticket2289.java b/tests/src/com/vaadin/tests/tickets/Ticket2289.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2289.java rename to tests/src/com/vaadin/tests/tickets/Ticket2289.java diff --git a/src/com/vaadin/tests/tickets/Ticket2292.java b/tests/src/com/vaadin/tests/tickets/Ticket2292.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2292.java rename to tests/src/com/vaadin/tests/tickets/Ticket2292.java diff --git a/src/com/vaadin/tests/tickets/Ticket2294.java b/tests/src/com/vaadin/tests/tickets/Ticket2294.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2294.java rename to tests/src/com/vaadin/tests/tickets/Ticket2294.java diff --git a/src/com/vaadin/tests/tickets/Ticket2296.java b/tests/src/com/vaadin/tests/tickets/Ticket2296.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2296.java rename to tests/src/com/vaadin/tests/tickets/Ticket2296.java diff --git a/src/com/vaadin/tests/tickets/Ticket2297.java b/tests/src/com/vaadin/tests/tickets/Ticket2297.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2297.java rename to tests/src/com/vaadin/tests/tickets/Ticket2297.java diff --git a/src/com/vaadin/tests/tickets/Ticket2303.java b/tests/src/com/vaadin/tests/tickets/Ticket2303.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2303.java rename to tests/src/com/vaadin/tests/tickets/Ticket2303.java diff --git a/src/com/vaadin/tests/tickets/Ticket2304.java b/tests/src/com/vaadin/tests/tickets/Ticket2304.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2304.java rename to tests/src/com/vaadin/tests/tickets/Ticket2304.java diff --git a/src/com/vaadin/tests/tickets/Ticket2310.java b/tests/src/com/vaadin/tests/tickets/Ticket2310.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2310.java rename to tests/src/com/vaadin/tests/tickets/Ticket2310.java diff --git a/src/com/vaadin/tests/tickets/Ticket2319.java b/tests/src/com/vaadin/tests/tickets/Ticket2319.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2319.java rename to tests/src/com/vaadin/tests/tickets/Ticket2319.java diff --git a/src/com/vaadin/tests/tickets/Ticket2323.java b/tests/src/com/vaadin/tests/tickets/Ticket2323.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2323.java rename to tests/src/com/vaadin/tests/tickets/Ticket2323.java diff --git a/src/com/vaadin/tests/tickets/Ticket2325.java b/tests/src/com/vaadin/tests/tickets/Ticket2325.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2325.java rename to tests/src/com/vaadin/tests/tickets/Ticket2325.java diff --git a/src/com/vaadin/tests/tickets/Ticket2329.java b/tests/src/com/vaadin/tests/tickets/Ticket2329.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2329.java rename to tests/src/com/vaadin/tests/tickets/Ticket2329.java diff --git a/src/com/vaadin/tests/tickets/Ticket2337.java b/tests/src/com/vaadin/tests/tickets/Ticket2337.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2337.java rename to tests/src/com/vaadin/tests/tickets/Ticket2337.java diff --git a/src/com/vaadin/tests/tickets/Ticket2339.java b/tests/src/com/vaadin/tests/tickets/Ticket2339.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2339.java rename to tests/src/com/vaadin/tests/tickets/Ticket2339.java diff --git a/src/com/vaadin/tests/tickets/Ticket2341.java b/tests/src/com/vaadin/tests/tickets/Ticket2341.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2341.java rename to tests/src/com/vaadin/tests/tickets/Ticket2341.java diff --git a/src/com/vaadin/tests/tickets/Ticket2344.java b/tests/src/com/vaadin/tests/tickets/Ticket2344.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2344.java rename to tests/src/com/vaadin/tests/tickets/Ticket2344.java diff --git a/src/com/vaadin/tests/tickets/Ticket2347.java b/tests/src/com/vaadin/tests/tickets/Ticket2347.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2347.java rename to tests/src/com/vaadin/tests/tickets/Ticket2347.java diff --git a/src/com/vaadin/tests/tickets/Ticket2364.java b/tests/src/com/vaadin/tests/tickets/Ticket2364.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2364.java rename to tests/src/com/vaadin/tests/tickets/Ticket2364.java diff --git a/src/com/vaadin/tests/tickets/Ticket2365.java b/tests/src/com/vaadin/tests/tickets/Ticket2365.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2365.java rename to tests/src/com/vaadin/tests/tickets/Ticket2365.java diff --git a/src/com/vaadin/tests/tickets/Ticket2398.java b/tests/src/com/vaadin/tests/tickets/Ticket2398.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2398.java rename to tests/src/com/vaadin/tests/tickets/Ticket2398.java diff --git a/src/com/vaadin/tests/tickets/Ticket2404.java b/tests/src/com/vaadin/tests/tickets/Ticket2404.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2404.java rename to tests/src/com/vaadin/tests/tickets/Ticket2404.java diff --git a/src/com/vaadin/tests/tickets/Ticket2405.java b/tests/src/com/vaadin/tests/tickets/Ticket2405.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2405.java rename to tests/src/com/vaadin/tests/tickets/Ticket2405.java diff --git a/src/com/vaadin/tests/tickets/Ticket2406.java b/tests/src/com/vaadin/tests/tickets/Ticket2406.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2406.java rename to tests/src/com/vaadin/tests/tickets/Ticket2406.java diff --git a/src/com/vaadin/tests/tickets/Ticket2407.java b/tests/src/com/vaadin/tests/tickets/Ticket2407.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2407.java rename to tests/src/com/vaadin/tests/tickets/Ticket2407.java diff --git a/src/com/vaadin/tests/tickets/Ticket2411.java b/tests/src/com/vaadin/tests/tickets/Ticket2411.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2411.java rename to tests/src/com/vaadin/tests/tickets/Ticket2411.java diff --git a/src/com/vaadin/tests/tickets/Ticket2415.java b/tests/src/com/vaadin/tests/tickets/Ticket2415.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2415.java rename to tests/src/com/vaadin/tests/tickets/Ticket2415.java diff --git a/src/com/vaadin/tests/tickets/Ticket2420.java b/tests/src/com/vaadin/tests/tickets/Ticket2420.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2420.java rename to tests/src/com/vaadin/tests/tickets/Ticket2420.java diff --git a/src/com/vaadin/tests/tickets/Ticket2425.java b/tests/src/com/vaadin/tests/tickets/Ticket2425.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2425.java rename to tests/src/com/vaadin/tests/tickets/Ticket2425.java diff --git a/src/com/vaadin/tests/tickets/Ticket2426.java b/tests/src/com/vaadin/tests/tickets/Ticket2426.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2426.java rename to tests/src/com/vaadin/tests/tickets/Ticket2426.java diff --git a/src/com/vaadin/tests/tickets/Ticket2431.java b/tests/src/com/vaadin/tests/tickets/Ticket2431.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2431.java rename to tests/src/com/vaadin/tests/tickets/Ticket2431.java diff --git a/src/com/vaadin/tests/tickets/Ticket2432.java b/tests/src/com/vaadin/tests/tickets/Ticket2432.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2432.java rename to tests/src/com/vaadin/tests/tickets/Ticket2432.java diff --git a/src/com/vaadin/tests/tickets/Ticket2434.java b/tests/src/com/vaadin/tests/tickets/Ticket2434.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2434.java rename to tests/src/com/vaadin/tests/tickets/Ticket2434.java diff --git a/src/com/vaadin/tests/tickets/Ticket2436.java b/tests/src/com/vaadin/tests/tickets/Ticket2436.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2436.java rename to tests/src/com/vaadin/tests/tickets/Ticket2436.java diff --git a/src/com/vaadin/tests/tickets/Ticket2440.java b/tests/src/com/vaadin/tests/tickets/Ticket2440.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2440.java rename to tests/src/com/vaadin/tests/tickets/Ticket2440.java diff --git a/src/com/vaadin/tests/tickets/Ticket2526.java b/tests/src/com/vaadin/tests/tickets/Ticket2526.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2526.java rename to tests/src/com/vaadin/tests/tickets/Ticket2526.java diff --git a/src/com/vaadin/tests/tickets/Ticket2742.java b/tests/src/com/vaadin/tests/tickets/Ticket2742.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2742.java rename to tests/src/com/vaadin/tests/tickets/Ticket2742.java diff --git a/src/com/vaadin/tests/tickets/Ticket2901.java b/tests/src/com/vaadin/tests/tickets/Ticket2901.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2901.java rename to tests/src/com/vaadin/tests/tickets/Ticket2901.java diff --git a/src/com/vaadin/tests/tickets/Ticket2998.java b/tests/src/com/vaadin/tests/tickets/Ticket2998.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket2998.java rename to tests/src/com/vaadin/tests/tickets/Ticket2998.java diff --git a/src/com/vaadin/tests/tickets/Ticket3146.java b/tests/src/com/vaadin/tests/tickets/Ticket3146.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket3146.java rename to tests/src/com/vaadin/tests/tickets/Ticket3146.java diff --git a/src/com/vaadin/tests/tickets/Ticket34.java b/tests/src/com/vaadin/tests/tickets/Ticket34.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket34.java rename to tests/src/com/vaadin/tests/tickets/Ticket34.java diff --git a/src/com/vaadin/tests/tickets/Ticket677.java b/tests/src/com/vaadin/tests/tickets/Ticket677.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket677.java rename to tests/src/com/vaadin/tests/tickets/Ticket677.java diff --git a/src/com/vaadin/tests/tickets/Ticket695.java b/tests/src/com/vaadin/tests/tickets/Ticket695.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket695.java rename to tests/src/com/vaadin/tests/tickets/Ticket695.java diff --git a/src/com/vaadin/tests/tickets/Ticket736.java b/tests/src/com/vaadin/tests/tickets/Ticket736.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket736.java rename to tests/src/com/vaadin/tests/tickets/Ticket736.java diff --git a/src/com/vaadin/tests/tickets/Ticket846.java b/tests/src/com/vaadin/tests/tickets/Ticket846.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket846.java rename to tests/src/com/vaadin/tests/tickets/Ticket846.java diff --git a/src/com/vaadin/tests/tickets/Ticket932.java b/tests/src/com/vaadin/tests/tickets/Ticket932.java similarity index 100% rename from src/com/vaadin/tests/tickets/Ticket932.java rename to tests/src/com/vaadin/tests/tickets/Ticket932.java diff --git a/src/com/vaadin/tests/util/LogPrintWriter.java b/tests/src/com/vaadin/tests/util/LogPrintWriter.java similarity index 100% rename from src/com/vaadin/tests/util/LogPrintWriter.java rename to tests/src/com/vaadin/tests/util/LogPrintWriter.java diff --git a/src/com/vaadin/tests/util/LoremIpsum.java b/tests/src/com/vaadin/tests/util/LoremIpsum.java similarity index 100% rename from src/com/vaadin/tests/util/LoremIpsum.java rename to tests/src/com/vaadin/tests/util/LoremIpsum.java diff --git a/src/com/vaadin/tests/util/RandomComponents.java b/tests/src/com/vaadin/tests/util/RandomComponents.java similarity index 100% rename from src/com/vaadin/tests/util/RandomComponents.java rename to tests/src/com/vaadin/tests/util/RandomComponents.java diff --git a/src/com/vaadin/tests/util/TestClickListener.java b/tests/src/com/vaadin/tests/util/TestClickListener.java similarity index 100% rename from src/com/vaadin/tests/util/TestClickListener.java rename to tests/src/com/vaadin/tests/util/TestClickListener.java diff --git a/src/com/vaadin/tests/vaadin_spin.swf b/tests/src/com/vaadin/tests/vaadin_spin.swf similarity index 100% rename from src/com/vaadin/tests/vaadin_spin.swf rename to tests/src/com/vaadin/tests/vaadin_spin.swf diff --git a/src/com/vaadin/tests/validation/RequiredErrorMessage.java b/tests/src/com/vaadin/tests/validation/RequiredErrorMessage.java similarity index 100% rename from src/com/vaadin/tests/validation/RequiredErrorMessage.java rename to tests/src/com/vaadin/tests/validation/RequiredErrorMessage.java diff --git a/src/com/vaadin/tests/validation/RequiredIndicatorForReadOnly.java b/tests/src/com/vaadin/tests/validation/RequiredIndicatorForReadOnly.java similarity index 100% rename from src/com/vaadin/tests/validation/RequiredIndicatorForReadOnly.java rename to tests/src/com/vaadin/tests/validation/RequiredIndicatorForReadOnly.java diff --git a/src/com/vaadin/tests/validation/TestValidators.java b/tests/src/com/vaadin/tests/validation/TestValidators.java similarity index 100% rename from src/com/vaadin/tests/validation/TestValidators.java rename to tests/src/com/vaadin/tests/validation/TestValidators.java -- 2.39.5