From ad101f842727ca84a184f1bf1ad7c5e63878302b Mon Sep 17 00:00:00 2001 From: Jouni Koivuviita Date: Thu, 27 Aug 2009 12:26:49 +0000 Subject: [PATCH] The Button Component Strikes Back Fixes many theme issues with Button (mostly Reindeer theme), including #3110, #3193, #3194, #3180 and 3079. Default button is now rendered on the client side with a DIV. Disabled buttons can now have descriptions, which fixes #2085. Added a "new" component, NativeButton, which uses native BUTTON element rendering on the client side. Theme compilation script now understands simple @import statements, which help keep things more organized in theme development. svn changeset:8558/svn branch:6.1 --- .../VAADIN/themes/base/button/button.css | 149 ++- .../VAADIN/themes/base/select/select.css | 2 - WebContent/VAADIN/themes/base/styles.css | 178 ++-- .../VAADIN/themes/reindeer/button/button.css | 440 +-------- .../VAADIN/themes/reindeer/button/firefox.css | 20 + .../VAADIN/themes/reindeer/button/ie.css | 79 ++ .../button/img/black-button-sprites-ie6.png | Bin 4101 -> 4106 bytes .../button/img/black-button-sprites.png | Bin 14379 -> 14386 bytes .../button/img/button-sprites-ie6.png | Bin 3967 -> 3968 bytes .../reindeer/button/img/button-sprites.png | Bin 15407 -> 15421 bytes .../themes/reindeer/button/link-style.css | 30 + .../VAADIN/themes/reindeer/button/opera.css | 8 + .../themes/reindeer/button/primary-style.css | 62 ++ .../VAADIN/themes/reindeer/button/safari.css | 10 + .../themes/reindeer/button/small-style.css | 67 ++ .../themes/reindeer/button/standard.css | 94 ++ WebContent/VAADIN/themes/reindeer/styles.css | 932 +++++++++--------- WebContent/VAADIN/themes/runo/styles.css | 202 ++-- .../VAADIN/themes/sampler/sampler/styles.css | 98 +- .../buildhelpers/CompileDefaultTheme.java | 112 ++- src/com/vaadin/demo/sampler/ModeSwitch.java | 3 +- .../demo/sampler/SamplerApplication.java | 11 +- .../gwt/client/ApplicationConnection.java | 3 +- .../terminal/gwt/client/DefaultWidgetSet.java | 7 +- .../terminal/gwt/client/ui/VButton.java | 429 ++++++-- .../gwt/client/ui/VCalendarPanel.java | 5 +- .../terminal/gwt/client/ui/VNativeButton.java | 182 ++++ .../gwt/client/ui/VOptionGroupBase.java | 4 +- src/com/vaadin/tests/themes/ButtonsTest.java | 158 +++ .../tests/themes/ReindeerButtonsTest.java | 82 -- src/com/vaadin/ui/Button.java | 34 - src/com/vaadin/ui/NativeButton.java | 51 + 32 files changed, 2051 insertions(+), 1401 deletions(-) create mode 100644 WebContent/VAADIN/themes/reindeer/button/firefox.css create mode 100644 WebContent/VAADIN/themes/reindeer/button/ie.css create mode 100644 WebContent/VAADIN/themes/reindeer/button/link-style.css create mode 100644 WebContent/VAADIN/themes/reindeer/button/opera.css create mode 100644 WebContent/VAADIN/themes/reindeer/button/primary-style.css create mode 100644 WebContent/VAADIN/themes/reindeer/button/safari.css create mode 100644 WebContent/VAADIN/themes/reindeer/button/small-style.css create mode 100644 WebContent/VAADIN/themes/reindeer/button/standard.css create mode 100644 src/com/vaadin/terminal/gwt/client/ui/VNativeButton.java create mode 100644 src/com/vaadin/tests/themes/ButtonsTest.java delete mode 100644 src/com/vaadin/tests/themes/ReindeerButtonsTest.java create mode 100644 src/com/vaadin/ui/NativeButton.java diff --git a/WebContent/VAADIN/themes/base/button/button.css b/WebContent/VAADIN/themes/base/button/button.css index c7e2fab8f6..31f091487c 100644 --- a/WebContent/VAADIN/themes/base/button/button.css +++ b/WebContent/VAADIN/themes/base/button/button.css @@ -1,57 +1,139 @@ +/* + * Default button (more customizable) + * -------------------------------------- */ .v-button { + display: inline-block; + zoom: 1; + text-align: center; + text-decoration: none; + border: 2px outset #ddd; + background: #eee; cursor: pointer; white-space: nowrap; margin: 0; + padding: .2em 1em; + color: inherit; + font: inherit; + line-height: normal; + -khtml-user-select: none; + -moz-user-select: none; + -ie-user-select: none; + user-select: none; + } + +.v-ie6 .v-button { + display: inline; } -.v-button span { - white-space: nowrap; -} -.v-checkbox input { + +.v-button-wrap, +.v-button-caption { vertical-align: middle; -} -.v-button img, -.v-checkbox img { - display: inline; + white-space: nowrap; + font: inherit; + color: inherit; + line-height: normal; + } + +.v-button .v-icon, +.v-nativebutton .v-icon { vertical-align: middle; margin-right: 3px; -} -.v-button span, -.v-checkbox label { + border: none; + } + +.v-button .v-errorindicator, +.v-nativebutton .v-errorindicator { + display: inline-block; + zoom: 1; vertical-align: middle; + float: none; } -.v-button-link { + +/* Link style (we really should deprecate this) */ +.v-button-link, +.v-nativebutton-link { border: none; text-align: left; - background: none; + background: transparent; padding: 0; -} + color: inherit; + } + /* Inset Safari focus outline a bit */ -.v-sa .v-button-link:focus { +.v-sa .v-button-link:focus{ outline-offset: -3px; -} -.v-button-link span { + } + +.v-button-link .v-button-caption, +.v-nativebutton-link .v-nativebutton-caption { text-decoration: underline; -} -.v-checkbox { - white-space: nowrap; -} -.v-checkbox .v-errorindicator { + color: inherit; + text-align: left; + } + + +/* + * NativeButton styles (html button element) + * -------------------------------------- */ +.v-nativebutton { + text-align: center; + cursor: pointer; + white-space: nowrap; + margin: 0; + color: inherit; + font: inherit; + line-height: normal; + } +.v-nativebutton .v-nativebutton-caption { + vertical-align: middle; + white-space: nowrap; + font: inherit; + color: inherit; + } + +.v-nativebutton .v-icon { + vertical-align: middle; + margin-right: 3px; + } + +.v-nativebutton .v-errorindicator { + display: inline-block; + zoom: 1; float: none; - display: inline; - padding-left: 1em; - background-position: left; } /* Fixes streched buttons in IE6 and IE7*/ -.v-ie6 .v-button { +.v-ie6 .v-nativebutton { width: 1px; } -.v-ie6 .v-button, -.v-ie7 .v-button, -.v-ie8 .v-button { +.v-ie6 .v-nativebutton, +.v-ie7 .v-nativebutton, +.v-ie8 .v-nativebutton { overflow: visible; padding-left: 1em; padding-right: 1em; } + +/* + * Checkbox styles + * -------------------------------------- */ + +.v-checkbox, +.v-checkbox label, +.v-checkbox input { + vertical-align: middle; + white-space: nowrap; +} +.v-checkbox img { + display: inline; + vertical-align: middle; + margin-right: 3px; +} +.v-checkbox .v-errorindicator { + float: none; + display: inline; + padding-left: 1em; + background-position: left; +} /* Error indicator on checkbox fix for IE6 */ .v-ie6 .v-checkbox * { float: left; @@ -76,13 +158,8 @@ padding-left: 0; padding-right: 0.7em; } -/* Error indicator on button fix for IE */ -.v-ie6 button .v-errorindicator, -.v-ie7 button .v-errorindicator, -.v-ie8 button .v-errorindicator { - display: inline; - padding-right: 0.5em; -} + + /* Disabled by default .v-checkbox-error { background: #ffe0e0; diff --git a/WebContent/VAADIN/themes/base/select/select.css b/WebContent/VAADIN/themes/base/select/select.css index 9bfcfefd45..7da7c1201f 100644 --- a/WebContent/VAADIN/themes/base/select/select.css +++ b/WebContent/VAADIN/themes/base/select/select.css @@ -33,11 +33,9 @@ clear: left; } .v-select-twincol .v-button { - display: block; float: left; } .v-select-twincol-buttons .v-button { - display: inline; float: none; } .v-filterselect { diff --git a/WebContent/VAADIN/themes/base/styles.css b/WebContent/VAADIN/themes/base/styles.css index 528c9dc4a9..fcd22a8afc 100644 --- a/WebContent/VAADIN/themes/base/styles.css +++ b/WebContent/VAADIN/themes/base/styles.css @@ -1,12 +1,10 @@ /* Automatically compiled css file from subdirectories. */ -/* ./WebContent/VAADIN/themes/base/absolutelayout/absolutelayout.css */ .v-absolutelayout-wrapper { position: absolute; overflow: hidden; } -/* ./WebContent/VAADIN/themes/base/accordion/accordion.css */ .v-accordion { position: relative; outline: none; @@ -34,61 +32,142 @@ width: 100%; } -/* ./WebContent/VAADIN/themes/base/button/button.css */ +/* + * Default button (more customizable) + * -------------------------------------- */ .v-button { + display: inline-block; + zoom: 1; + text-align: center; + text-decoration: none; + border: 2px outset #ddd; + background: #eee; cursor: pointer; white-space: nowrap; margin: 0; + padding: .2em 1em; + color: inherit; + font: inherit; + line-height: normal; + -khtml-user-select: none; + -moz-user-select: none; + -ie-user-select: none; + user-select: none; + } + +.v-ie6 .v-button { + display: inline; } -.v-button span { - white-space: nowrap; -} -.v-checkbox input { + +.v-button-wrap, +.v-button-caption { vertical-align: middle; -} -.v-button img, -.v-checkbox img { - display: inline; + white-space: nowrap; + font: inherit; + color: inherit; + line-height: normal; + } + +.v-button .v-icon, +.v-nativebutton .v-icon { vertical-align: middle; margin-right: 3px; -} -.v-button span, -.v-checkbox label { + border: none; + } + +.v-button .v-errorindicator, +.v-nativebutton .v-errorindicator { + display: inline-block; + zoom: 1; vertical-align: middle; + float: none; } -.v-button-link { + +/* Link style (we really should deprecate this) */ +.v-button-link, +.v-nativebutton-link { border: none; text-align: left; - background: none; + background: transparent; padding: 0; -} + color: inherit; + } + /* Inset Safari focus outline a bit */ -.v-sa .v-button-link:focus { +.v-sa .v-button-link:focus{ outline-offset: -3px; -} -.v-button-link span { + } + +.v-button-link .v-button-caption, +.v-nativebutton-link .v-nativebutton-caption { text-decoration: underline; -} -.v-checkbox { - white-space: nowrap; -} -.v-checkbox .v-errorindicator { + color: inherit; + text-align: left; + } + + +/* + * NativeButton styles (html button element) + * -------------------------------------- */ +.v-nativebutton { + text-align: center; + cursor: pointer; + white-space: nowrap; + margin: 0; + color: inherit; + font: inherit; + line-height: normal; + } +.v-nativebutton .v-nativebutton-caption { + vertical-align: middle; + white-space: nowrap; + font: inherit; + color: inherit; + } + +.v-nativebutton .v-icon { + vertical-align: middle; + margin-right: 3px; + } + +.v-nativebutton .v-errorindicator { + display: inline-block; + zoom: 1; float: none; - display: inline; - padding-left: 1em; - background-position: left; } /* Fixes streched buttons in IE6 and IE7*/ -.v-ie6 .v-button { +.v-ie6 .v-nativebutton { width: 1px; } -.v-ie6 .v-button, -.v-ie7 .v-button, -.v-ie8 .v-button { +.v-ie6 .v-nativebutton, +.v-ie7 .v-nativebutton, +.v-ie8 .v-nativebutton { overflow: visible; padding-left: 1em; padding-right: 1em; } + +/* + * Checkbox styles + * -------------------------------------- */ + +.v-checkbox, +.v-checkbox label, +.v-checkbox input { + vertical-align: middle; + white-space: nowrap; +} +.v-checkbox img { + display: inline; + vertical-align: middle; + margin-right: 3px; +} +.v-checkbox .v-errorindicator { + float: none; + display: inline; + padding-left: 1em; + background-position: left; +} /* Error indicator on checkbox fix for IE6 */ .v-ie6 .v-checkbox * { float: left; @@ -113,13 +192,8 @@ padding-left: 0; padding-right: 0.7em; } -/* Error indicator on button fix for IE */ -.v-ie6 button .v-errorindicator, -.v-ie7 button .v-errorindicator, -.v-ie8 button .v-errorindicator { - display: inline; - padding-right: 0.5em; -} + + /* Disabled by default .v-checkbox-error { background: #ffe0e0; @@ -131,7 +205,6 @@ } */ -/* ./WebContent/VAADIN/themes/base/caption/caption.css */ .v-captionwrapper { text-align: left; /* Force default alignment */ } @@ -164,7 +237,6 @@ display: inline; } -/* ./WebContent/VAADIN/themes/base/common/common.css */ /* References the BODY tag generated by Vaadin application servlet */ .v-generated-body { width: 100%; @@ -370,17 +442,14 @@ div.v-app-loading { padding: 2px; } -/* ./WebContent/VAADIN/themes/base/customcomponent/customcomponent.css */ .v-customcomponent { overflow: hidden; } -/* ./WebContent/VAADIN/themes/base/customlayout/customlayout.css */ .v-customlayout { overflow: hidden; } -/* ./WebContent/VAADIN/themes/base/datefield/datefield.css */ .v-datefield { white-space: nowrap; } @@ -452,7 +521,6 @@ div.v-app-loading { filter: alpha(opacity=30); } -/* ./WebContent/VAADIN/themes/base/formlayout/formlayout.css */ .v-formlayout-cell .v-errorindicator { display: block; } @@ -497,7 +565,6 @@ div.v-app-loading { float: none; } -/* ./WebContent/VAADIN/themes/base/gridlayout/gridlayout.css */ .v-gridlayout-margin-top { padding-top: 2em; } @@ -529,7 +596,6 @@ div.v-app-loading { overflow: hidden; } -/* ./WebContent/VAADIN/themes/base/link/link.css */ .v-link { white-space: nowrap; } @@ -549,7 +615,6 @@ div.v-app-loading { border:none; } -/* ./WebContent/VAADIN/themes/base/menubar/menubar.css */ .v-menubar table { white-space: nowrap; border-collapse: collapse; @@ -588,7 +653,6 @@ div.v-app-loading { cursor: default; } -/* ./WebContent/VAADIN/themes/base/notification/notification.css */ .v-Notification { background: #999; color: #fff; @@ -631,7 +695,6 @@ div.v-app-loading { white-space: nowrap; } -/* ./WebContent/VAADIN/themes/base/orderedlayout/orderedlayout.css */ .v-orderedlayout-margin-top, .v-horizontallayout-margin-top, .v-verticallayout-margin-top { @@ -675,7 +738,6 @@ div.v-app-loading { overflow: hidden; } -/* ./WebContent/VAADIN/themes/base/panel/panel.css */ .v-panel, .v-panel-caption, .v-panel-content, @@ -712,7 +774,6 @@ div.v-app-loading { .v-panel-deco { } -/* ./WebContent/VAADIN/themes/base/popupview/popupview.css */ .v-popupview { cursor: pointer; background: #aaa; @@ -721,7 +782,6 @@ div.v-app-loading { overflow: auto; } -/* ./WebContent/VAADIN/themes/base/progressindicator/progressindicator.css */ .v-progressindicator { overflow: hidden; /* for IE6 */ width: 150px; @@ -759,7 +819,6 @@ div.v-progressindicator-indeterminate-disabled { background: transparent; } -/* ./WebContent/VAADIN/themes/base/select/select.css */ .v-select { text-align: left; } @@ -795,11 +854,9 @@ div.v-progressindicator-indeterminate-disabled { clear: left; } .v-select-twincol .v-button { - display: block; float: left; } .v-select-twincol-buttons .v-button { - display: inline; float: none; } .v-filterselect { @@ -895,7 +952,6 @@ div.v-progressindicator-indeterminate-disabled { } */ -/* ./WebContent/VAADIN/themes/base/shadow/shadow.css */ .v-shadow { position: absolute; } @@ -982,7 +1038,6 @@ div.v-progressindicator-indeterminate-disabled { margin-left: -4px; } -/* ./WebContent/VAADIN/themes/base/slider/slider.css */ .v-slider { margin: 5px 0; } @@ -1046,7 +1101,6 @@ div.v-progressindicator-indeterminate-disabled { margin: 0 -1px; } -/* ./WebContent/VAADIN/themes/base/splitpanel/splitpanel.css */ .v-splitpanel-horizontal, .v-splitpanel-vertical { overflow: hidden; @@ -1085,7 +1139,6 @@ div.v-progressindicator-indeterminate-disabled { position: relative; } -/* ./WebContent/VAADIN/themes/base/table/table.css */ /* Table theme building instructions * * Vaadin scroll table is very complex widget with dozens of features. These @@ -1236,7 +1289,6 @@ div.v-progressindicator-indeterminate-disabled { color: #ddd; } -/* ./WebContent/VAADIN/themes/base/tabsheet/tabsheet.css */ .v-tabsheet, .v-tabsheet-content, .v-tabsheet-deco { @@ -1326,7 +1378,6 @@ div.v-progressindicator-indeterminate-disabled { height: 0; } -/* ./WebContent/VAADIN/themes/base/textfield/textfield.css */ .v-textfield { text-align: left /* Force default alignment */ } @@ -1380,7 +1431,6 @@ textarea.v-textarea-prompt { outline-width: medium; } -/* ./WebContent/VAADIN/themes/base/tree/tree.css */ .v-tree { text-align: left; /* Force default alignment */ overflow: hidden; @@ -1436,7 +1486,6 @@ div.v-tree-node-leaf { clear: left; } -/* ./WebContent/VAADIN/themes/base/upload/upload.css */ .v-upload-immediate { position: relative; width: 10em; @@ -1462,7 +1511,6 @@ div.v-tree-node-leaf { } -/* ./WebContent/VAADIN/themes/base/window/window.css */ .v-window { background: #fff; } diff --git a/WebContent/VAADIN/themes/reindeer/button/button.css b/WebContent/VAADIN/themes/reindeer/button/button.css index 36a5f998b4..1dc2e25551 100644 --- a/WebContent/VAADIN/themes/reindeer/button/button.css +++ b/WebContent/VAADIN/themes/reindeer/button/button.css @@ -1,157 +1,27 @@ -/* We serve simpler buttons for IE6, since it doesn't support the adjacent - * sibling selector (+) that is needed to position .v-icon properly. +/* Standard implementation of the button theme + * These files contain styles that apply to all browsers */ -div > .v-button, -.v-ie7 .v-button, -div > .v-button.v-disabled, -.v-ie7 .v-button.v-disabled { - height: 26px; - padding: 0 0 0 6px; - background-color: transparent; - background-repeat: no-repeat; - background-image: url(img/left.png); /** sprite-ref: buttons */ - border: none; - cursor: default; -} -/* Error indicator need this */ -.v-ff .v-button, -.v-sa .v-button { - position: relative; -} -div > .v-button .v-button-caption, -.v-ie7 .v-button .v-button-caption, -div > .v-button.v-disabled .v-button-caption, -.v-ie7 .v-button.v-disabled .v-button-caption { - display: inline-block; - height: 22px; - padding: 4px 15px 0 9px; - background-color: transparent; - background-repeat: no-repeat; - background-position: right top; - background-image: url(img/right.png); /** sprite-ref: buttons; sprite-alignment: right */ - text-shadow: #fff 0 1px 0; - font-weight: bold; - font-size: 11px; - line-height: 16px; - float: none; -} -.v-sa .v-button .v-button-caption { - height: 21px; - padding-top: 5px; -} -.v-ch .v-button .v-button-caption, -.v-ch .v-button .v-icon { - position: relative; - top: -1px; - left: -3px; -} -.v-button:focus { - background-image: url(img/left-focus.png); /** sprite-ref: buttons */ - outline: none; -} -.v-button:focus .v-button-caption { - background-image: url(img/right-focus.png); /** sprite-ref: buttons; sprite-alignment: right */ - outline: none; -} -.v-button:active, -.v-ie7 .v-button.v-pressed { - background-image: url(img/left-pressed.png); /** sprite-ref: buttons */ - outline: none; -} -.v-button:active .v-button-caption, -.v-ie7 .v-button.v-pressed .v-button-caption { - background-image: url(img/right-pressed.png); /** sprite-ref: buttons; sprite-alignment: right */ - outline: none; -} -/* FF3 & FF2 */ -.v-button::-moz-focus-inner { - border: none; - padding: 0; -} -.v-ff2 .v-button .v-button-caption { - display: -moz-inline-box; - padding-top: 6px; - height: 20px; -} -/* IE7 */ -.v-ie7 .v-button.v-pressed .v-button-caption { - position: relative; -} -.v-ie7 .v-button.v-pressed .v-icon { - z-index: 2; -} -/* Opera */ -.v-op .v-button:active .v-button-caption { - margin-top: -1px; - margin-left: -1px; -} -.v-op .v-button:active .v-icon + .v-button-caption, -.v-op .v-button:active .v-icon + .v-errorindicator + .v-button-caption { - margin-left: -26px; -} -/* Modifications for buttons with icons */ -div > .v-button .v-icon, -.v-ie7 .v-button .v-icon, -div > .v-button.v-disabled .v-icon, -.v-ie7 .v-button.v-disabled .v-icon { - display: inline-block; - width: 16px; - overflow: hidden; - position: relative; - margin: -1px 3px 0 6px; -} -.v-ff2 .v-button .v-icon, -.v-ff2 .v-button.v-disabled .v-icon { - display: block; - float: left; - margin-top: 4px; -} -.v-ch .v-button .v-icon, -.v-ch .v-button.v-disabled .v-icon { - z-index: 2; -} -.v-ff2 .v-button-link .v-icon, -.v-ff2 .v-button-link.v-disabled .v-icon { - margin: 0; -} -.v-button .v-icon + .v-button-caption, -.v-button .v-icon + .v-errorindicator + .v-button-caption, -.v-button.v-disabled .v-icon + .v-button-caption, -.v-button.v-disabled .v-icon + .v-errorindicator + .v-button-caption { - margin-left: -25px; - padding-left: 25px; -} -/* Buttons with error indicator */ -div > .v-button .v-errorindicator, -.v-ie7 .v-button .v-errorindicator { - position: absolute; - display: block; - width: 9px; - height: 16px; - background: transparent url(../common/icons/error.png) no-repeat 50%; - padding: 0; - margin: 0; - z-index: 3; -} -.v-ie7 .v-button.v-pressed .v-errorindicator { - display: none; -} -.v-ie7 .v-button .v-icon + .v-errorindicator + .v-button-caption { - margin-left: 0; -} -.v-ie6 .v-button .v-errorindicator { - position: absolute; - display: inline; - width: 9px; - height: 16px; - background: transparent url(../common/icons/error-ie6.png) no-repeat 50%; -} +@import "standard.css"; +@import "primary-style.css"; +@import "small-style.css"; +@import "link-style.css"; + +/* Browser-specific corrections to the standard implementation */ +@import "safari.css"; +@import "firefox.css"; +@import "opera.css"; +@import "ie.css"; + + + +/* + .v-ff .v-button .v-errorindicator, .v-sa .v-button .v-errorindicator { top: 2px; left: 16px; } -/* Buttons with explicit size */ +/* Buttons with explicit size * .v-button[style*="width"] .v-button-caption { display: block; } @@ -168,277 +38,5 @@ div > .v-button .v-errorindicator, display: block; margin-left: 0; } +*/ -/** - * Default action button style -------------------------- - */ -div > .v-button-primary, -.v-ie7 .v-button-primary, -div > .v-button-primary.v-disabled, -.v-ie7 .v-button-primary.v-disabled { - background-image: url(img/primary-left.png); /** sprite-ref: buttons */ -} -div > .v-button-primary .v-button-caption, -.v-ie7 .v-button-primary .v-button-caption, -div > .v-button-primary.v-disabled .v-button-caption, -.v-ie7 .v-button-primary.v-disabled .v-button-caption { - background-image: url(img/primary-right.png); /** sprite-ref: buttons; sprite-alignment: right */ -} -.v-button-primary:focus { - background-image: url(img/primary-left-focus.png); /** sprite-ref: buttons */ -} -.v-button-primary:focus .v-button-caption { - background-image: url(img/primary-right-focus.png); /** sprite-ref: buttons; sprite-alignment: right */ -} -.v-button-primary:active, -.v-ie7 .v-button-primary.v-pressed { - background-image: url(img/primary-left-pressed.png); /** sprite-ref: buttons */ -} -.v-button-primary:active .v-button-caption, -.v-ie7 .v-button-primary.v-pressed .v-button-caption { - background-image: url(img/primary-right-pressed.png); /** sprite-ref: buttons; sprite-alignment: right */ -} -/* - * Small-style -------------------------- - */ -div > .v-button-small, -.v-ie7 .v-button-small, -div > .v-button-small.v-disabled, -.v-ie7 .v-button-small.v-disabled { - background-image: url(img/small-left.png); /** sprite-ref: buttons */ - height: 20px; -} -div > .v-button-small .v-button-caption, -.v-ie7 .v-button-small .v-button-caption, -div > .v-button-small.v-disabled .v-button-caption, -.v-ie7 .v-button-small.v-disabled .v-button-caption { - background-image: url(img/small-right.png); /** sprite-ref: buttons; sprite-alignment: right */ - height: 19px; - padding: 1px 11px 0 5px; - font-weight: normal; -} -.v-ff2 .v-button-small .v-button-caption { - height: 17px; - padding-top: 3px; -} -.v-sa .v-button-small .v-button-caption { - height: 18px; - padding-top: 2px; -} -.v-button-small:focus { - background-image: url(img/small-left-focus.png); /** sprite-ref: buttons */ -} -.v-button-small:focus .v-button-caption { - background-image: url(img/small-right-focus.png); /** sprite-ref: buttons; sprite-alignment: right */ -} -.v-button-small:active, -.v-ie7 .v-button-small.v-pressed { - background-image: url(img/small-left-pressed.png); /** sprite-ref: buttons */ -} -.v-button-small:active .v-button-caption, -.v-ie7 .v-button-small.v-pressed .v-button-caption { - background-image: url(img/small-right-pressed.png); /** sprite-ref: buttons; sprite-alignment: right */ -} - -/*------------ -* Black buttons -*------------*/ -.black div > .v-button, -.v-ie7 .black .v-button, -.black div > .v-button.v-disabled, -.v-ie7 .black .v-button.v-disabled { - background-image: url(img/black/left.png); /** sprite-ref: black-buttons */ -} -.black div > .v-button .v-button-caption, -.v-ie7 .black .v-button .v-button-caption, -.black div > .v-button.v-disabled .v-button-caption, -.v-ie7 .black .v-button.v-disabled .v-button-caption { - background-image: url(img/black/right.png); /** sprite-ref: black-buttons; sprite-alignment: right */ - color: #c9ccce; - text-shadow: rgba(0,0,0,.8) 0 -1px 0; -} -.black .v-button:focus { - background-image: url(img/black/left-focus.png); /** sprite-ref: black-buttons */ -} -.black .v-button:focus .v-button-caption { - background-image: url(img/black/right-focus.png); /** sprite-ref: black-buttons; sprite-alignment: right */ -} -.black .v-button:active, -.v-ie7 .black .v-button.v-pressed { - background-image: url(img/black/left-pressed.png); /** sprite-ref: black-buttons */ -} -.black .v-button:active .v-button-caption, -.v-ie7 .black .v-button.v-pressed .v-button-caption { - background-image: url(img/black/right-pressed.png); /** sprite-ref: black-buttons; sprite-alignment: right */ -} - -/* - * Primary-style ---------------------------- - */ -.black div > .v-button-primary, -.v-ie7 .black .v-button-primary, -.black div > .v-button-primary.v-disabled, -.v-ie7 .black .v-button-primary.v-disabled { - background-image: url(img/black/primary-left.png); /** sprite-ref: black-buttons */ -} -.black div > .v-button-primary .v-button-caption, -.v-ie7 .black .v-button-primary .v-button-caption, -.black div > .v-button-primary.v-disabled .v-button-caption, -.v-ie7 .black .v-button-primary.v-disabled .v-button-caption { - background-image: url(img/black/primary-right.png); /** sprite-ref: black-buttons; sprite-alignment: right */ -} -.black .v-button-primary:focus { - background-image: url(img/black/primary-left-focus.png); /** sprite-ref: black-buttons */ -} -.black .v-button-primary:focus .v-button-caption { - background-image: url(img/black/primary-right-focus.png); /** sprite-ref: black-buttons; sprite-alignment: right */ - color: #eaf4fb; -} -.black .v-button-primary:active, -.v-ie7 .black .v-button-primary.v-pressed { - background-image: url(img/black/primary-left-pressed.png); /** sprite-ref: black-buttons */ -} -.black .v-button-primary:active .v-button-caption, -.v-ie7 .black .v-button-primary.v-pressed .v-button-caption { - background-image: url(img/black/primary-right-pressed.png); /** sprite-ref: black-buttons; sprite-alignment: right */ -} - -/* - * Small-style -------------------------- - */ -.black div > .v-button-small, -.v-ie7 .black .v-button-small, -.black div > .v-button-small.v-disabled, -.v-ie7 .black .v-button-small.v-disabled { - background-image: url(img/black/small-left.png); /** sprite-ref: black-buttons */ -} -.black div > .v-button-small .v-button-caption, -.v-ie7 .black .v-button-small .v-button-caption, -.black div > .v-button-small.v-disabled .v-button-caption, -.v-ie7 .black .v-button-small.v-disabled .v-button-caption { - background-image: url(img/black/small-right.png); /** sprite-ref: black-buttons; sprite-alignment: right */ -} -.black .v-button-small:focus { - background-image: url(img/black/small-left-focus.png); /** sprite-ref: black-buttons */ -} -.black .v-button-small:focus .v-button-caption { - background-image: url(img/black/small-right-focus.png); /** sprite-ref: black-buttons; sprite-alignment: right */ -} -.black .v-button-small:active, -.v-ie7 .black .v-button-small.v-pressed { - background-image: url(img/black/small-left-pressed.png); /** sprite-ref: black-buttons */ -} -.black .v-button-small:active .v-button-caption, -.v-ie7 .black .v-button-small.v-pressed .v-button-caption { - background-image: url(img/black/small-right-pressed.png); /** sprite-ref: black-buttons; sprite-alignment: right */ -} - - - - -/** - * Link style buttons ----------------------- - */ -div > .v-button.v-button-link, -div > .v-button.v-button-link:focus, -div > .v-button.v-button-link:active, -.v-ie7 .v-button-link, -.v-ie7 .v-button-link.v-pressed, -div > .v-button.v-button-link.v-disabled, -.v-ie7 .v-button-link.v-disabled { - background: transparent; - height: auto; - padding: 0; - cursor: pointer; -} -div > .v-button.v-button-link .v-button-caption, -div > .v-button.v-button-link:focus .v-button-caption, -div > .v-button.v-button-link:active .v-button-caption, -.v-ie7 .v-button-link .v-button-caption, -.v-ie7 .v-button-link.v-pressed .v-button-caption, -div > .v-button.v-button-link.v-disabled .v-button-caption, -.v-ie7 .v-button-link.v-disabled .v-button-caption { - background: transparent; - height: auto; - padding: 0; - display: inline; - font-weight: normal; - color: #1b699f; - font-size: 12px; - text-shadow: none; -} -.v-button.v-button-link .v-icon + .v-button-caption { - margin: 0; - padding: 0; -} -.v-button.v-button-link:focus { - outline: 1px dotted #1b699f; -} -div > .v-button-link .v-icon, -.v-ie7 .v-button-link .v-icon, -div > .v-disabled.v-button-link .v-icon, -.v-ie7 .v-disabled.v-button-link .v-icon { - position: static; - width: auto; -} - - - -/** - * IE6 buttons -------------------------- - */ -.v-ie6 .v-button { - border: 1px solid #b3b3b3; - border-bottom-color: #9a9a9a; - background: #d8d8d8 url(img/right.png) no-repeat 0 -1px; - padding: 3px 15px 2px 15px; - font-weight: bold; - font-size: 11px; - line-height: 16px; - height: 16px; - outline: none; - cursor: default; -} -.v-ie6 .v-button-primary { - background-image: url(img/primary-right.png); -} -.v-ie6 .v-button-small { - font-weight: normal; - padding: 1px 11px 0 11px; - height: 12px; - line-height: normal; - background-image: url(img/small-right.png); -} -.v-ie6 .v-button.v-pressed { - background: transparent url(img/right-pressed.png) no-repeat 0 -1px; -} -/* Buttons on blue background */ -.v-ie6 .blue .v-button { - border-color: #84949c; - border-top-color: #83939b; - border-bottom-color: #888d91; -} -/* Buttons on black background */ -.v-ie6 .black .v-button { - border: 1px solid #0d0e0f; - background: #202224 url(img/black/right.png) no-repeat 0 -1px; - color: #c9ccce; -} -.v-ie6 .black .v-button-primary { - background-image: url(img/black/primary-right.png); -} -.v-ie6 .black .v-button-small { - background-image: url(img/black/small-right.png); -} -.v-ie6 .black .v-button.v-pressed { - background-image: url(img/black/right-pressed.png); -} -/* Link button in IE6 */ -.v-ie6 .v-button-link { - border: none; - padding: 0; - background: transparent; - line-height: normal; - font-size: 12px; - font-weight: normal; -} \ No newline at end of file diff --git a/WebContent/VAADIN/themes/reindeer/button/firefox.css b/WebContent/VAADIN/themes/reindeer/button/firefox.css new file mode 100644 index 0000000000..76393e637a --- /dev/null +++ b/WebContent/VAADIN/themes/reindeer/button/firefox.css @@ -0,0 +1,20 @@ +.v-ff2 .v-button .v-button-caption { + display: -moz-inline-box; + padding-top: 6px; + height: 20px; + } + + +/* Modifications for buttons with icons * +.v-ff2 .v-button .v-icon, +.v-ff2 .v-button.v-disabled .v-icon { + display: block; + float: left; + margin-top: 4px; + } + +.v-ff2 .v-button-link .v-icon, +.v-ff2 .v-button-link.v-disabled .v-icon { + margin: 0; + } + */ \ No newline at end of file diff --git a/WebContent/VAADIN/themes/reindeer/button/ie.css b/WebContent/VAADIN/themes/reindeer/button/ie.css new file mode 100644 index 0000000000..4aab3e0d5b --- /dev/null +++ b/WebContent/VAADIN/themes/reindeer/button/ie.css @@ -0,0 +1,79 @@ +.v-ie6 .v-nativebutton-link, +.v-ie7 .v-nativebutton-link, +.v-ie8 .v-nativebutton-link { + padding: 0; + text-align: left; +} + + + + + +/** + * IE6 buttons -------------------------- + */ +.v-ie6 .v-button { + border: 1px solid #b3b3b3; + border-bottom-color: #9a9a9a; + background: #d8d8d8 url(img/right.png) no-repeat 0 -1px; + padding: 0 15px; + height: 23px; +} +.v-ie6 .v-button .v-button-wrap { + background: transparent; + height: 20px; + padding: 3px 0 0; + display: inline; + zoom: 1; +} +.v-ie6 .v-button-primary { + background-image: url(img/primary-right.png); +} +.v-ie6 .v-button-small { + background-image: url(img/small-right.png); + height: 17px; +} +.v-ie6 .v-button-small .v-button-wrap { + height: 17px; + padding: 0; +} +.v-ie6 .v-button.v-pressed { + background: transparent url(img/right-pressed.png) no-repeat 0 -1px; +} +/* Buttons on blue background */ +.v-ie6 .blue .v-button { + border-color: #84949c; + border-top-color: #83939b; + border-bottom-color: #888d91; +} +/* Buttons on black background */ +.v-ie6 .black .v-button { + border: 1px solid #0d0e0f; + background: #202224 url(img/black/right.png) no-repeat 0 -1px; + color: #c9ccce; +} +.v-ie6 .black .v-button-primary { + background-image: url(img/black/primary-right.png); +} +.v-ie6 .black .v-button-small { + background-image: url(img/black/small-right.png); +} +.v-ie6 .black .v-button.v-pressed { + background-image: url(img/black/right-pressed.png); +} + + +/* Link style button */ +.v-ie6 .v-button-link, +.v-ie6 .black .v-button-link { + background: transparent; + border: none; + height: auto; + line-height: normal; + padding: 0; +} +.v-ie6 .v-button-link .v-button-wrap, +.v-ie6 .black .v-button-link .v-button-wrap { + padding: 0; + height: auto; +} \ No newline at end of file diff --git a/WebContent/VAADIN/themes/reindeer/button/img/black-button-sprites-ie6.png b/WebContent/VAADIN/themes/reindeer/button/img/black-button-sprites-ie6.png index 9f7f7c465985b5dbf16ba5c3e77def0cc706211c..90a73be23fc9cc8ca0f0b171688dcb0d130c7b72 100644 GIT binary patch delta 3443 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 delta 3472 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 literal 14379 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 V;~*zc`5SWSUc7Q4SM$cd{|nM~k5>Qy literal 15407 zcmaL82{_d2`#;{dKAk!Vol{7*b52TGJ86(@DwQOu#MmXvU@Te2Hki|b(}EDPFWL89 zjNwF)eK!U}gD}Pz3^NR7es3Mj%=ur}-{o@E`~5ukb3e;{zwZ0>-0zq7?rL%$Idx>; zzJ1(Ux2`|fx9?E*zJ32!eE28e$&xTbaNj-^s@CqLA0NxRF*!MDY5PDFUTe4*e_SH(UPM9dU0Z2}B~- z*4CD#o7?hZmO9ei|F_dtzjtIr=!o`;Jhao4HA2Xq==9sZzP{HiUk1=u2(JaXcI1|v zCoC-RaHwF?KQO=t2zvSQC0jcqLkPqxwX94&LCLjYzsSGc|FXkX+q6ZOIXO9{78S`Q zD8n5jt#%bssM?x`f?@67-BK$mKr1v_@Y0eim&eY)Y3`I7I5EkhSGvIaFt7bN(9gW9qK_lfNM6pmm?d2Y0#u8Vc{Skqj5tium!1sl{T*P>V^q zI)+89z_~GjQE(m>5kyA5maQr>ya)rA3@u!ZD5SeLPo&K}-;i@31HVN(EvfpBdS&6F zJT-?4>=i9WlakdC3b+21xc&Epc4K2Blt);poB8#0SpJ;|>#M^udR*Jf`rFRHK(hyL z3V`$ZsPcOK`RXV5Yj1aTiV!~^-I)v)J1Zg4xP3%hA|>QhHy0b_bhnhe8uwI>5dUI` zZ>|=Io*ft%XpRtH4?S4JCSn+pCI${rJ$m%0Uy^u>S7d_=yMk7M2kC2T-nSyG!#R5$ zX`=vVw_!h8{Ib`ADZ5Th(%olR%HNif?xL*Ma&%re(&o=uQ{bsE7vVI!i`ZQp=J(gp2_@ZafXf*#UtDQL43SdWlS-OYV26>!ctV$*jO0LAP zX8*;^(q{~ZQ$t@#e*gY3n}9EdmOjo;Wm(-{)f|_&`=Yb6^KILAS#hn>3zy+@580<( zNvG4VnV6WYO^PwS6|^E$WZ0MCK1f|%l)kZ{0fWKt12g!NW>MJfh^fK!>gvnvv(^p? z3DJ8^0b~_F{_-k(m55;iO2kLR#l^ADS(-FlK^%<(!On{Muk=)I8$n@y{^slSZ&2`t zk>33fBW|PWa(aGEd81K>E)D;H0yXnW^WBi6^vFB$`N839{}ZcK)O>kwaF z@u_HQYgY~Q_rLp2S&y*3c^KbOu4udJJD8atVkA`B+H2nC3v%)wuF0=3g7w}mGsr4v z^*sZ#xi6=^vq|Z&2TQB;SlF68W(5N6FeO{)l^-&UAsrfoqMkv@&{vHH+wWRh_0(DF z_3%urw#`e(R^`1%7o8i^J3&5YOZ_!(UR0crtA?zNNJPWREF70Cm%3Y$& zGJD<(T$1Ty!gMS{nnW$%=nZ(c<2ZwC|a5};>3(k;&)=iA({xJFpSR=e-H@9VaNX)(vq5m1Gy z*jL>bTmrIpY%c8d{%k{-MrPXy9^uxc;76+|tWFMuX$c}qQ)9tSJpqhlJpO6Nqg^qL zb`Hp`gNaYoXtG?UVbA`p(Q0=A`I9?>CmuiL+4*P7%6>G(@GCsTa1XLdGUAhSiK_f_ zED6KC9lE4K^3Mo2^beR}jdz4=rDmZxtFC#^^Z(5!)7_PD+5OMwyZ&BwPw}^RWV*cu z;DNYR9Daq+$EMK(!xXWFBY}`q7Ah72dTgd=%AbgyJ%0Q+Tia3(3fK{g5mwJ39G+~} zWoe$15szFXhVbDhH40J-3lx9A4oeMfMP@Krt;A*uy&P2hp%iqL}}#{;PQOvgz6*R8Q zT{NRrANSnA?{#$7{rUuntqI9h-Eiu=f8AKRP)#iCY5mv2YT2&BGfYWT=9Y)288g-q zx#T#^Y^BGvt<;x}w9hLCB;v;9+KqdKlg-My3b4>YfkcRWJ*^Atgp9&A4g*BXc0@8Ou>>m6R8q5i`dQh}6;A8FSWzX+$pr*S{Z~L-uC(f^l?R)A{D2 zL0xfe#hCQ1_^F0KuB$A+nr=v+AFaNi8lZe>H8e0NsbmqOOO~nqb!*%tW!JKSLDL+6 z1OHiZ9qHr(y%p`uFkuIa2k#P9ywooVcLcwRPHot~6+X4OPGKM7WSdAwFnys1c&EkD zv6gFPq37N>2smKis00-+S$4;3#epA2?ApAO=|5v8 zT6q_#3RIHvc*mLFRg%HgslHCYd9K$Q!|HQPD`S9c@FKakSZ%Yz%H<8ix9^jPN$yXK zFyLs38!h+8Yar7;x%B*F>NVaqK3jin)xXWR-d4@MyQj#ACOohTA|`xLuDhmLcavmM zQdxA5C_K0ff-y=Lw)#M3si%sraE}*{avP%mUCH!316kDI(0en8lNL-Hrc1m*-9qq`Ku!?~hUxy-jzK99-OnU^|G+bE@w zZh2C17vyW0If_KahKmA3t;7~nC^CR^p?>d@zIz1lg2x(&<0(3r><~%{xBEkE)qF(} zHgCLi6;cd`q*RQjfgstvQvGu-J-L_XqI`N=^ZMI%4p5rCO%Ld+J{FDzVOOW%Soi{_ z6h;#&HEYOpOkQrve?^lPDy5ku8)E zRk|{rP)Rp;AnNo=$3^Wp_$x1*wM>eASLeJ?H8q__xw*|Q{JQh%v7Yz$^=He=%Sj9d zqr0!~c&Mn_sW%7zef!tYD796ps8;2|g(t2+RI~#aSKchl&(CkxR#ka9a3nQ>fq_1j zPt6lpY0eG6%~@ECpZQNp0YrE)*3vsFe9lY?vS1h1)YNoALBW$-8C%B&drrfQ1_>^HIr8LUVNkkgo;Y; z)9qha-AC73B$7=}3JV{Fb|scau~Ffyh3KCEuN*Er(udXpNHU znsTcKmgU6RvuF2`yMNQ67;|6y5j|Zs&__6N&>caYFWCd5yX$^+*5omCe3H*}Y?x@k z8s6>rE-oAY{$iw0^fqGf(#~Z5*3lYHYxAh`2sH6Hpr1CCqk>kHvWLUbRJs3 zz{d|nq+f2Myef?G6G3cwB|HDUFu>h2;nN#qhM=dBCtue`uLs;mn)LJ5r7%5XWxY@n z8*$alL$+#iI4|xQBR_O+g_YL0?f3(~v&f!xM72EaweL5s&X$uirbGH;telCLo15KL z{V{h90>Q)%B*lVmC`5{Jfn))YjHYn52!rJ2A!{Ks)k9 z&mK5%0RKh6V)Wwbs7?#g5q1c5mP8F3kwT& z;2SJGNKZ>&j7ejIu@f*rG2rNHT~ty!$?noC0NI3t^zQC^93qsJl`{oqn?pso*a5{D zf!J8t?{94_&W=~Gf`WoRt`$FZF%H4g)6;<9p&>&K!KZ|TvIJ%U`hjDW+P=F15`eVk ze;o5GEOhpL8n8Uo!oFVl1A~Ki<+>%#p5+J%4D|Hm(O1C!bPta4a&vQmi9kCOerBJD zA)asc5U;4Tbhp4+;M8-ozZ?4Y?a@%R`%Iv?*1{d&*gt2RRS6tW<{n@Y+olmI-cry4 zP4?$!Yw#+gA7H?aIuG(t$Ml0n|VM+4=sM4^3`zxcp32K84NKFzb z`)q+E>7KF8;8iX95q(>zCjMwnXJ_PantOHX>`_JbJ{+7{idd81O0Vtq{Y{65k6pF-Wo4LqEbo_c z^=E@Ox`z)NyN94gSF5m?>{mrIj_=`HmQ-4hOC~yM)pJm+l%bT@5tFk|MoMJGsaZolrFiIw-E3Yz+fP+u4FI!e+R*3${5 zk^TvWGh08fP{QKdbWZ&VHLZnPD5)KX_t#-uMCGIPWj>)f_v)q1p`n?ZyR4Dpks?)# z#laC5#l+Zzqw*}sswU0os#W0oKNFtJt;BX?z{hIBsH}`5QN^8``?!R}-C)Mkr`;Hg z*iB8gG!2UXwphZ|tebFDB+(2%^wsX9kWkg0YgT@}JlWhhv~(OG&!pZ=Q}kG)o);7m z0_Z@=)1)0!5z6$QehY2c%v3V3R2Ny}bxIy<^P(Uu1uN0YA%(LYg(VYIB&=_iSM`CU)7 z6SfiTFiypHE-o$j<4InXL0)4x+r99|!`Zyb8Ak!rmvlqxDU8s?g+nUWEMuK_H{yC$ zZmz?prVt@T@LD%>mY!vi|K7C1cI%+tF6!O}5IH?FGt+S(SAQG#>-w(m!tY*E$h{X` ztie3UpoO}x#%>2ZnefpAHO?D#;#$3!cFa9W{RZ5u{5qv>!^6y@XxjfZ+{`0vx*S{q zUP~j6T6mx<)?iEZTh9V6k{NLN+~Y)h2? z0)5leQs)4r2LX=r6uPOi-?j}!h#S52Z0p~@wSwgU4e7+# z&2jW9bwmgI>sDrZRh1$;f@!GP<1`W1ESOi6;Pg96AXjBo>e^(H&Xy9bWQhZ*PPT@H z1o!m#%@T>cTL5TJeJ0$4B&$RLbY(=zN(eiS^p}M9boXHSLX(vQe+mwg6W3bCSzk)# zWp85ug+flM1pG1892P9D#eW8{D|V=J>qG z@N65P%OgAAr(@s?905Z?P*Y}iANXV_mHUodH^O&=1BKxq3)MYDNZf!q0)W2oL5)Lj zZeb3$rZP$cp@{()o)2YG?3-W`6`Z?mjdl(y7tvQ-$g>=|tihM3&r?$~WTxUwfcOD0 zJPyIbs3O(=?{STIdM4qZue&ykW1T!nW5)rz%#1TmQM{zU9>G1%t&|lQLogeQ>r2o2 zmBYFK(C0t9%B{mL{bX*Q%VAJ35wPpzpaL;RUKCB_uv~5VGG#kLP#;}#Wgjg_eeH>+ z_YBVIhna?Xk-0|HM+HS0Jz*n};?*D@WOE_=7EAL*Pm=?RPuFgn?FTXD)Y@hQd zqSF$O^p;>>Anm-t{Q5=Rdc!~0ziBW(z$TkQ;-#ddn17sKBj_S)m>2c^p7Z#H@N`;6 zL9#W*Q*tlo`iADkK6jY88eDV_j!B`zOl3w<2CteGNC z2k1ORKG*j;;HgwvxJr8uf|Shpm=35ebnE9YpYpmF8_FLr^80`ASsx_t2UI6+?0Cvu3*2YK8Y`+~F zpI1d@`zy6uv$$EjJae77N!VCl&Sc!{85MJgQ*H?Fbl$ti`lD=?2HqOTJYb2`v&eQ( z{nZz-(eU+a_8!)RS9^VLmHFOb>EaKub0QyZY`%F-9n69n>*#lNbS+YNF{)7B1Mojq zr%&q%?lI0r4~#3zYGmef)qWigyHmd({r1z2*2iK1vge-mT6&F4d4<@|jm@DtY?QK= zJvOv;deK#1+s@hfXTTr*MA6$?;_#$^M4sg_vrX>5dt<{aI=Tn2vr`Y3%~1_9H&vDVmpNMoJxs(Z9onX_vV@}pvH30id?i;}yf zP{q!j0}~DM0&~Y#lDJjCSiU)-Q&|^TWNZ4$06ZSdL#*=qwUWH1BwU!6%%(9~3c_$F zh+QK9tiuR$^jArqhe303#{b#ddNIVATEogS`F^V%i+HL?>cpcA*6tduwIdmFVJ<4P zb}k$IdIj>ZTt4=g0(z;E)n+{}nYmtOa_Uq));|bmdQmM?a}eEhw>s4 zD>RuS+A71r45F1u*Z69;OXG80#^7F9^HtRlH1KWc^YW`fE3>Y8jN5!TX0C~QZyl|< zR<8a2BG5j*m**7w2|Bx*172!&`a1l+;yh_JU$J-W4nm4ZDhH=;{psXB99`~JI;Jxc zS0O_}=hN!bV@I6Y#%Q>Ch5}SV083X^+JcARV3p9VBXp~ zz}XiFB~*AW1(Nu=dkP%pV^@`i@`ar2$L>QRoy$=3YUGG_&lhL|ZnZl7ZK}m;sL1 z3bqj%)<~C0z7r*V-d`pM2zl5ezW%4Jxrsu#UgRl!IjO7q)Ml$(uPb`8g6yao^p zX?*$Ax^2Lg-}7981llTJFo{sPVCx<-GOo6470teoN1c42u%VTv5quy>sDT1w9!v5` zmEMez7*mOn_M4WAL>g6}=Qyxkb%y)_lm`0ZN_`>MxKHs)Ls`6g^;Dq+V`M4^YH^rd zT-&`KyL$R&Xj6+cOyaTRrhm?swSB*caG4*^`V!>=W(H>~Z#*eZIZEee~X+N`LAL>J91(%?Pm$vHcDO zQ8whORHD($N1jN3Y%`%#R0Bah=|3j^<(|7Izn9Gn{+_2nXF{?DcKu|dG*70}Z4+-- zAM@<59rjh3xNuL%E)4%tbH?ea5jH3cs6tT}5*6j)Ov>*W8C@R5`Cq!Epb#84ti0!f z)7(dDR*B$KCr@q%jE$*t!)$5tD0W}~UI%2g4+n(n*m%}JH8nN8BK4xe0uNf3EnuF@@`t8cB^6>E*1YOp4H-r5=-ANkpGPQGp@v5P>1Xx%p9`EcHxGOL3*!4G9_s5?eA}j6sbS2u z*%HNZKjLPg8H&YWZ*xyrlovTOD>;Dv0Vo@aia)&5x#!65qe;|z!)2K}>GKuG+k5V% z?gp*hVJUy1qoyeP%nh7H|A8C+Od$mdL!Ne-;=0f#+B`AuN*~pV)18@}NGo&G>WTHP zmS14Zdv=z(4C3s)GJtak8}1OOn$ghU$jb~*0p}1nE6Gt&PHX41A`aSD0XNsY`U4!! zD<`v3cKcW^EPO~UEp=1cCY*(H3pt#SK?k0G;lhPu1~JhAN&w}Y=fK0^!t#Mb>H&u* zYDY||Xu+M#*d1@vk)mrr?aI$u5q^p}I?NlpwyzbDZrH{@`x@X!s@Z*0KHSS|JA2hK zEBuq)1;G*%69Gst)zD*?KKL*3%&jBC4kLyz7nkH8e)^}~*Z^4X#|0G?@NMTl%mJU3 z+q|={_DDE~79a%$z*moidT=b3OiY^&@KmLS13U~M5JmJA^6VTBYjWaWjDd_A$Xd%# z97!1r1OfrmDExrtP&h9)H_kl8i?+g%ZRQtW0YCY6#qw$01pOb~0|8hHVl zzzy2lr+94dK#6O;Dk%J*W{JFU!+YYT#7_}G7D*t9ab(92@S0Usl_Eb6fIvUayWi3m z0c0|eL~8l?_^_{Uv?pnpZ_JNUKw++hg^417c2)WY28+Mt7i<2P~5GJ-S|1yM2m>M*O?tFKbC6J%P(zGIZr#pBRtzWL&7R;mZe<8C3HSQOoYqobqnd!vM86)$Ht4w6eZ zL1_s)lZ+I7#d2z8c0dK19~BE_cb`-9*s|2(>vElYBkHse`m!2h<)Q3|&;k^Xo|Eo* z&61|)23%S^nd{GC#}c=R&o6;;PXXwjht0J1^HUWD2W+yTgrAFt$E7LCI&fFXf23{Y z8td+pVRhrim(PofPk=}@);LXoMYy_;xOb_=5J@EN=g*(xhf1tc7hid>h+oC})j^Yb z85tQ7rJbuWpq_HC7U%O1rjkk;8DGPZ17Z+lH0`diy5E{RCsSEa;Iy?tu4hsKvZN~R z|IaUb;5@r*j5p8VHqPK^XJpo2;h21gM?4#K)3t{RpU}GQYfooyOlKoziodvzszJ^} z%K^jlSS>tg`jX$`>Ga%2dNqB_sYO@;GCpqJLjGhn^L`w2x9~IktqWpnBHq;E$zAP; z^jLnVh5IO&NX$AznOedndP0Upwj&BZSA^)!ar*6#bw5V`(*uWUqGe2|z?BexI&QDx z=}P}?ZEbKz^sM5UnXWyGaD`drE>{A_9TaV5avA>ixyDiRmRahNm(OnMXZ&*DPU=T{ z`}nQ)pI+{lH0wy|{QGLul|TNn3)dKPolus`%DD2SyqSf zCYJc!3f^QE0<&BeI}fhhM>8247};()vzilo!hp-T zBC`}ZznusBZh-#$)0MP;YvRjmmKJ_~o5Kg`4FWro?p*>x7+2sFhrW3O3_C8sAF$i~ zm94k85>OxAG&nd&(>UxE95}LD?tAW4AXy2x#(M?qMi@}hxkSiHW|$nthjx#Ti|y)j z4k(R$tgEX#zpxNGQt2dQ=jgb3<1qes>W2@fcjCw^_iKUEUIsXj_iL*~NdMgGYM*hS zI2J6%p9`GfiOS^%t!?K!UOqn`{A*FV@LeBJbNJ_;cNjNeZTl8iRZUoErA=+!v*UcV zt_SW0w2yujOfU?@P9Eo83W8w_4**c)r>PpHlUeK0ce)_pZJz zhZARn9@>}kmAod_)RuRTwDHfUBf0+IoRvcNkI!zCjeN+qQDZZbXx_pVStEkkiub{& zvFB1~O~{72IcWpU{rv;>p0l-_QHN}4FV6$}ne1|_DJMRk_(r#lr(S;h9udrD?k&eo zdM^vw6UrcM1&cnGjX~TxK+%Gn0tlpr85^r}_wXn`E6ry$`qjxsuXXyJ%;n0nl^Kp* z_hU*=H+KrJUQRN*sS#>+*%MNnbsGUr_pgdYE4CyF6(jgO^>b2hcNyHX_|z#$%1&|S zt1NmnBI#Jr8?8U&cR&G{ob#c5f5p?*={MC!ARA-FaK2psdaU`?3bIMm7|ye>;WjxU zYV3xPLFzDV%3&PkGKCHx>pV+9aDxg14bJ-&90$Src=@yJL$2)|q>V50n&Ifn8r zckb({x?KjzgiZkEF^7aX#waK#LRJy4B_zeZlt0gNa}W3<9_9}YDkcz=#j>)piY6bi z^wRp`;N;&(=)F=4kg@RpN^@C5K#>V?aW$dO+3LOd@+wxj$sQ|B+A*?b&7ar;z*hsq z^dLPbVsdI~>i;Xudjq}Ty)^NK$hmsH9?g~D`aZ#6&6^WIWr47mn8g%_hI60B)z`=2 z&9*hZ8)`GqhjPss*1oo+}vNn!+#N&WvxK^v(<_$ zbqZNmEC4SBwyztd#`G<6R$>rIL&Lqx-zDOk>nQQh`&4+! zJN~m3oBe5hI1OI1%VkOfO;H4f_?C5O-1P$6n2)1OQ{?{sbIb@haLSx2!-(zm2uswweAi2JmR8f*1Yk}e@kw~s=q4?;{*vIUM@F1 z#mt98Xj$os(;2vRuk+d)9-b(M#%*6>z@Mkl;bMk2`*ccs?$K(-#D=|5g+bUf&a9s`@*FVCE-WP>GE3) znMpkGVb2eLa~!|5>2IgGq0{Sb&(BguY|ECF3y*}zJ3xqQ`pp! zLohsbGK9uh>waXYx3TqPyh~lA&>Veg*Wuopo|&0!pC4E=Cx6`ps|9?!^N|Umy{N9P z-i-imlsySozYIUa=qfAHeQ^l6k!Qx5np(GkO(BtVjQX4@~aT60`2j=25IJj9ia8VBIoK$=D_;~^OCi$jcKfDZohc8Wi_vv%sJBrPLmyCCH z*Im*idJ=o}J!LcA^~TPAbyfKA<3pUk!rHOISX`yNjs1)cx!&yM%FWTp;kO7q)N*fU zZMj;qZh95rQ+t3~g5hvgi~_mj-HJjIu2bUTS#bJGzDjyj`7<=QhoKh57t;zLD1Z_}}5Dn8DR)g8!sVymbWit@aTaxh2T z$Ws$5&|1e%TS`7kmPF-MR#Ml2&q;KnZfE#t{=w$ii~$}m026*%^EQxKyS}ty_re8T zg%hs0;!M-~RlMxQ;+BfydFD>c@Th^y&R~ zP7Q?sdgMQS2V;B@h$0?d-sVf3<0LydI!cFxhBp28`Di_oS!8TtA^{X+PW;Nz$<(E8 zecBAD-Q3`>JB}_Za~}+Q!uGumUu92EPaKs>O$5H{>H@xJLeE}jTfsn?CT}R#%7&N_ z#Cn=zH!ylu^p;WN(xX-l!ST+e#fzdj4IiprY8nvml76Toy!!Z0lKDBk2NY9&T$3=K zZrD}~=3fKFn}9~lKthi|CKC>oEt-wZFs}knlY;Vi*{VP~<$wPa(2bx3N>gJjbn|pe z8QH)$6lXylD3yDMyH9Q5b?#D8R^AKXZ{$3T1M1{f9s-00<@Xn;R`m++r(;;G;I2RW zJ5>1cgWIw_;9qWMJlOMlzSFT#svJX!27DBFW5=JI%LS@p3C9`)G$0VjUduTkApZSD zQE;H#PP3G+*A9;#0jR4zUnu?J-fE(X zO-RVzeA0ki;3aStEM6Q_$M4-_T{BuMApurZ27D5g0n|16OXwzT`Wa?dR#p-e79U{S zY=98nCb-pHOIQ{Gaus(ipRaglWh3))@_fO0rtIz`R2#Vfl7bs_-HCIQQDxH!->0KbAtwtu0^N1=TuIU20-DW*&{} z=Yd+&KCT4BQH?v3;szsJ{Q?s!Kv1L~`W0@~bJ!d*Y(h~OoUe<+>4iSJ7@kmKA!3YWIe?ofaKiYZXt*|~kFiyyvmopgGn zhn+5!Id9Tdd8SfguGKSr{!WgrYJBh8p{P<7E8S2u-~7hk^92n_HuIe&QksnyduI%i zOWXwsOn!LVP*SOrpozO^z8ouEdrVr diff --git a/WebContent/VAADIN/themes/reindeer/button/link-style.css b/WebContent/VAADIN/themes/reindeer/button/link-style.css new file mode 100644 index 0000000000..14530c8dff --- /dev/null +++ b/WebContent/VAADIN/themes/reindeer/button/link-style.css @@ -0,0 +1,30 @@ +.v-button.v-button-link, +.v-button.v-button-link:focus, +.v-button.v-button-link:active, +.v-button-link.v-pressed, +.v-disabled.v-button.v-button-link, +.v-button.v-button-link .v-button-wrap, +.v-button.v-button-link:focus .v-button-wrap, +.v-button.v-button-link:active .v-button-wrap, +.v-button-link.v-pressed .v-button-wrap, +.v-disabled.v-button.v-button-link .v-button-wrap { + background: transparent; + height: auto; + padding: 0; + cursor: pointer; + line-height: inherit; + } + +.v-button-link .v-button-caption, +.v-nativebutton-link .v-nativebutton-caption { + line-height: inherit; + font-weight: normal; + color: #1b699f; + font-size: 12px; + text-shadow: none; + } + +.v-button-link:focus .v-button-caption, +.v-nativebutton-link:focus .v-nativebutton-caption { + outline: 1px dotted #1b699f; + } \ No newline at end of file diff --git a/WebContent/VAADIN/themes/reindeer/button/opera.css b/WebContent/VAADIN/themes/reindeer/button/opera.css new file mode 100644 index 0000000000..c1e22c9258 --- /dev/null +++ b/WebContent/VAADIN/themes/reindeer/button/opera.css @@ -0,0 +1,8 @@ +/*.v-op .v-button:active .v-button-caption { + margin-top: -1px; + margin-left: -1px; +} +.v-op .v-button:active .v-icon + .v-button-caption, +.v-op .v-button:active .v-icon + .v-errorindicator + .v-button-caption { + margin-left: -26px; +}*/ \ No newline at end of file diff --git a/WebContent/VAADIN/themes/reindeer/button/primary-style.css b/WebContent/VAADIN/themes/reindeer/button/primary-style.css new file mode 100644 index 0000000000..fdfe90ce3a --- /dev/null +++ b/WebContent/VAADIN/themes/reindeer/button/primary-style.css @@ -0,0 +1,62 @@ +.v-button-primary:focus { + background-image: url(img/primary-left-focus.png); /** sprite-ref: buttons */ + } + +.v-button-primary:focus .v-button-wrap { + background-image: url(img/primary-right-focus.png); /** sprite-ref: buttons; sprite-alignment: right */ + } + +.v-button-primary:active, +.v-button-primary.v-pressed { + background-image: url(img/primary-left-pressed.png); /** sprite-ref: buttons */ + } + +.v-button-primary:active .v-button-wrap, +.v-button-primary.v-pressed .v-button-wrap { + background-image: url(img/primary-right-pressed.png); /** sprite-ref: buttons; sprite-alignment: right */ + } + +.v-button-primary, +.v-disabled.v-button-primary { + background-image: url(img/primary-left.png); /** sprite-ref: buttons */ + } + +.v-button-primary .v-button-wrap, +.v-disabled.v-button-primary .v-button-wrap { + background-image: url(img/primary-right.png); /** sprite-ref: buttons; sprite-alignment: right */ + } + + + + +/* Black style */ + + +.black .v-button-primary:focus { + background-image: url(img/black/primary-left-focus.png); /** sprite-ref: black-buttons */ + } + +.black .v-button-primary:focus .v-button-wrap { + background-image: url(img/black/primary-right-focus.png); /** sprite-ref: black-buttons; sprite-alignment: right */ + color: #eaf4fb; + } + +.black .v-button-primary:active, +.black .v-button-primary.v-pressed { + background-image: url(img/black/primary-left-pressed.png); /** sprite-ref: black-buttons */ + } + +.black .v-button-primary:active .v-button-wrap, +.black .v-button-primary.v-pressed .v-button-wrap { + background-image: url(img/black/primary-right-pressed.png); /** sprite-ref: black-buttons; sprite-alignment: right */ + } + +.black .v-button-primary, +.black .v-disabled.v-button-primary { + background-image: url(img/black/primary-left.png); /** sprite-ref: black-buttons */ + } + +.black .v-button-primary .v-button-wrap, +.black .v-disabled.v-button-primary .v-button-wrap { + background-image: url(img/black/primary-right.png); /** sprite-ref: black-buttons; sprite-alignment: right */ + } diff --git a/WebContent/VAADIN/themes/reindeer/button/safari.css b/WebContent/VAADIN/themes/reindeer/button/safari.css new file mode 100644 index 0000000000..e32721d261 --- /dev/null +++ b/WebContent/VAADIN/themes/reindeer/button/safari.css @@ -0,0 +1,10 @@ +.v-sa .v-button-caption { + height: 21px; + padding-top: 5px; + line-height: 17px; + } + +.v-sa .v-button-small .v-button-caption { + height: 18px; + padding-top: 2px; + } \ No newline at end of file diff --git a/WebContent/VAADIN/themes/reindeer/button/small-style.css b/WebContent/VAADIN/themes/reindeer/button/small-style.css new file mode 100644 index 0000000000..fa6b177624 --- /dev/null +++ b/WebContent/VAADIN/themes/reindeer/button/small-style.css @@ -0,0 +1,67 @@ +.v-button-small:focus { + background-image: url(img/small-left-focus.png); /** sprite-ref: buttons */ + } + +.v-button-small:focus .v-button-wrap { + background-image: url(img/small-right-focus.png); /** sprite-ref: buttons; sprite-alignment: right */ + } + +.v-button-small:active, +.v-button-small.v-pressed { + background-image: url(img/small-left-pressed.png); /** sprite-ref: buttons */ + } + +.v-button-small:active .v-button-wrap, +.v-button-small.v-pressed .v-button-wrap { + background-image: url(img/small-right-pressed.png); /** sprite-ref: buttons; sprite-alignment: right */ + } + +.v-button-small, +.v-disabled.v-button-small { + background-image: url(img/small-left.png); /** sprite-ref: buttons */ + height: 20px; + } + +.v-button-small .v-button-wrap, +.v-disabled.v-button-small .v-button-wrap { + background-image: url(img/small-right.png); /** sprite-ref: buttons; sprite-alignment: right */ + height: 19px; + padding: 1px 14px 0 8px; + } + +.v-button-small .v-button-caption { + font-weight: normal; + } + + + + +/* Black style */ + +.black .v-button-small:focus { + background-image: url(img/black/small-left-focus.png); /** sprite-ref: black-buttons */ + } + +.black .v-button-small:focus .v-button-wrap { + background-image: url(img/black/small-right-focus.png); /** sprite-ref: black-buttons; sprite-alignment: right */ + } + +.black .v-button-small:active, +.black .v-button-small.v-pressed { + background-image: url(img/black/small-left-pressed.png); /** sprite-ref: black-buttons */ + } + +.black .v-button-small:active .v-button-wrap, +.black .v-button-small.v-pressed .v-button-wrap { + background-image: url(img/black/small-right-pressed.png); /** sprite-ref: black-buttons; sprite-alignment: right */ + } + +.black .v-button-small, +.black .v-disabled.v-button-small { + background-image: url(img/black/small-left.png); /** sprite-ref: black-buttons */ + } + +.black .v-button-small .v-button-wrap, +.black .v-disabled.v-button-small .v-button-wrap { + background-image: url(img/black/small-right.png); /** sprite-ref: black-buttons; sprite-alignment: right */ + } \ No newline at end of file diff --git a/WebContent/VAADIN/themes/reindeer/button/standard.css b/WebContent/VAADIN/themes/reindeer/button/standard.css new file mode 100644 index 0000000000..5510f82295 --- /dev/null +++ b/WebContent/VAADIN/themes/reindeer/button/standard.css @@ -0,0 +1,94 @@ +.v-button:focus { + background-image: url(img/left-focus.png); /** sprite-ref: buttons */ + outline: none; + } + +.v-button:focus .v-button-wrap { + background-image: url(img/right-focus.png); /** sprite-ref: buttons; sprite-alignment: right */ + outline: none; + } + +.v-button:active, +.v-button.v-pressed { + background-image: url(img/left-pressed.png); /** sprite-ref: buttons */ + outline: none; + } + +.v-button:active .v-button-wrap, +.v-button.v-pressed .v-button-wrap { + background-image: url(img/right-pressed.png); /** sprite-ref: buttons; sprite-alignment: right */ + outline: none; + } + +.v-button, +.v-disabled.v-button { + height: 26px; + padding: 0 0 0 6px; + background-color: transparent; + background-repeat: no-repeat; + background-image: url(img/left.png); /** sprite-ref: buttons */ + border: none; + cursor: default; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + } + +.v-button-wrap, +.v-disabled.v-button .v-button-wrap { + display: block; + height: 22px; + padding: 4px 15px 0 9px; + background-color: transparent; + background-repeat: no-repeat; + background-position: right top; + background-image: url(img/right.png); /** sprite-ref: buttons; sprite-alignment: right */ + } + +.v-button-caption { + color: #222; + text-shadow: #fff 0 1px 0; + font-weight: bold; + font-size: 11px; + line-height: 16px; + } + + + + +/************************** + * Black style + **************************/ +.black .v-button:focus { + background-image: url(img/black/left-focus.png); /** sprite-ref: black-buttons */ + } + +.black .v-button:focus .v-button-wrap { + background-image: url(img/black/right-focus.png); /** sprite-ref: black-buttons; sprite-alignment: right */ + } + +.black .v-button:active, +.black .v-button.v-pressed { + background-image: url(img/black/left-pressed.png); /** sprite-ref: black-buttons */ + } + +.black .v-button:active .v-button-wrap, +.black .v-button.v-pressed .v-button-wrap { + background-image: url(img/black/right-pressed.png); /** sprite-ref: black-buttons; sprite-alignment: right */ + } + +.black .v-button, +.black .v-disabled.v-button { + background-image: url(img/black/left.png); /** sprite-ref: black-buttons */ + } + +.black .v-button-wrap, +.black .v-disabled.v-button .v-button-wrap { + background-image: url(img/black/right.png); /** sprite-ref: black-buttons; sprite-alignment: right */ + } + +.black .v-button-caption { + color: #c9ccce; + text-shadow: #121314 0 -1px 0; + } \ No newline at end of file diff --git a/WebContent/VAADIN/themes/reindeer/styles.css b/WebContent/VAADIN/themes/reindeer/styles.css index 81993989c0..78be75158f 100644 --- a/WebContent/VAADIN/themes/reindeer/styles.css +++ b/WebContent/VAADIN/themes/reindeer/styles.css @@ -1,12 +1,10 @@ /* Automatically compiled css file from subdirectories. */ -/* ./WebContent/VAADIN/themes/base/absolutelayout/absolutelayout.css */ .v-absolutelayout-wrapper { position: absolute; overflow: hidden; } -/* ./WebContent/VAADIN/themes/base/accordion/accordion.css */ .v-accordion { position: relative; outline: none; @@ -34,61 +32,142 @@ width: 100%; } -/* ./WebContent/VAADIN/themes/base/button/button.css */ +/* + * Default button (more customizable) + * -------------------------------------- */ .v-button { + display: inline-block; + zoom: 1; + text-align: center; + text-decoration: none; + border: 2px outset #ddd; + background: #eee; cursor: pointer; white-space: nowrap; margin: 0; + padding: .2em 1em; + color: inherit; + font: inherit; + line-height: normal; + -khtml-user-select: none; + -moz-user-select: none; + -ie-user-select: none; + user-select: none; + } + +.v-ie6 .v-button { + display: inline; } -.v-button span { - white-space: nowrap; -} -.v-checkbox input { + +.v-button-wrap, +.v-button-caption { vertical-align: middle; -} -.v-button img, -.v-checkbox img { - display: inline; + white-space: nowrap; + font: inherit; + color: inherit; + line-height: normal; + } + +.v-button .v-icon, +.v-nativebutton .v-icon { vertical-align: middle; margin-right: 3px; -} -.v-button span, -.v-checkbox label { + border: none; + } + +.v-button .v-errorindicator, +.v-nativebutton .v-errorindicator { + display: inline-block; + zoom: 1; vertical-align: middle; + float: none; } -.v-button-link { + +/* Link style (we really should deprecate this) */ +.v-button-link, +.v-nativebutton-link { border: none; text-align: left; - background: none; + background: transparent; padding: 0; -} + color: inherit; + } + /* Inset Safari focus outline a bit */ -.v-sa .v-button-link:focus { +.v-sa .v-button-link:focus{ outline-offset: -3px; -} -.v-button-link span { + } + +.v-button-link .v-button-caption, +.v-nativebutton-link .v-nativebutton-caption { text-decoration: underline; -} -.v-checkbox { - white-space: nowrap; -} -.v-checkbox .v-errorindicator { + color: inherit; + text-align: left; + } + + +/* + * NativeButton styles (html button element) + * -------------------------------------- */ +.v-nativebutton { + text-align: center; + cursor: pointer; + white-space: nowrap; + margin: 0; + color: inherit; + font: inherit; + line-height: normal; + } +.v-nativebutton .v-nativebutton-caption { + vertical-align: middle; + white-space: nowrap; + font: inherit; + color: inherit; + } + +.v-nativebutton .v-icon { + vertical-align: middle; + margin-right: 3px; + } + +.v-nativebutton .v-errorindicator { + display: inline-block; + zoom: 1; float: none; - display: inline; - padding-left: 1em; - background-position: left; } /* Fixes streched buttons in IE6 and IE7*/ -.v-ie6 .v-button { +.v-ie6 .v-nativebutton { width: 1px; } -.v-ie6 .v-button, -.v-ie7 .v-button, -.v-ie8 .v-button { +.v-ie6 .v-nativebutton, +.v-ie7 .v-nativebutton, +.v-ie8 .v-nativebutton { overflow: visible; padding-left: 1em; padding-right: 1em; } + +/* + * Checkbox styles + * -------------------------------------- */ + +.v-checkbox, +.v-checkbox label, +.v-checkbox input { + vertical-align: middle; + white-space: nowrap; +} +.v-checkbox img { + display: inline; + vertical-align: middle; + margin-right: 3px; +} +.v-checkbox .v-errorindicator { + float: none; + display: inline; + padding-left: 1em; + background-position: left; +} /* Error indicator on checkbox fix for IE6 */ .v-ie6 .v-checkbox * { float: left; @@ -113,13 +192,8 @@ padding-left: 0; padding-right: 0.7em; } -/* Error indicator on button fix for IE */ -.v-ie6 button .v-errorindicator, -.v-ie7 button .v-errorindicator, -.v-ie8 button .v-errorindicator { - display: inline; - padding-right: 0.5em; -} + + /* Disabled by default .v-checkbox-error { background: #ffe0e0; @@ -131,7 +205,6 @@ } */ -/* ./WebContent/VAADIN/themes/base/caption/caption.css */ .v-captionwrapper { text-align: left; /* Force default alignment */ } @@ -164,7 +237,6 @@ display: inline; } -/* ./WebContent/VAADIN/themes/base/common/common.css */ /* References the BODY tag generated by Vaadin application servlet */ .v-generated-body { width: 100%; @@ -370,17 +442,14 @@ div.v-app-loading { padding: 2px; } -/* ./WebContent/VAADIN/themes/base/customcomponent/customcomponent.css */ .v-customcomponent { overflow: hidden; } -/* ./WebContent/VAADIN/themes/base/customlayout/customlayout.css */ .v-customlayout { overflow: hidden; } -/* ./WebContent/VAADIN/themes/base/datefield/datefield.css */ .v-datefield { white-space: nowrap; } @@ -452,7 +521,6 @@ div.v-app-loading { filter: alpha(opacity=30); } -/* ./WebContent/VAADIN/themes/base/formlayout/formlayout.css */ .v-formlayout-cell .v-errorindicator { display: block; } @@ -497,7 +565,6 @@ div.v-app-loading { float: none; } -/* ./WebContent/VAADIN/themes/base/gridlayout/gridlayout.css */ .v-gridlayout-margin-top { padding-top: 2em; } @@ -529,7 +596,6 @@ div.v-app-loading { overflow: hidden; } -/* ./WebContent/VAADIN/themes/base/link/link.css */ .v-link { white-space: nowrap; } @@ -549,7 +615,6 @@ div.v-app-loading { border:none; } -/* ./WebContent/VAADIN/themes/base/menubar/menubar.css */ .v-menubar table { white-space: nowrap; border-collapse: collapse; @@ -588,7 +653,6 @@ div.v-app-loading { cursor: default; } -/* ./WebContent/VAADIN/themes/base/notification/notification.css */ .v-Notification { background: #999; color: #fff; @@ -631,7 +695,6 @@ div.v-app-loading { white-space: nowrap; } -/* ./WebContent/VAADIN/themes/base/orderedlayout/orderedlayout.css */ .v-orderedlayout-margin-top, .v-horizontallayout-margin-top, .v-verticallayout-margin-top { @@ -675,7 +738,6 @@ div.v-app-loading { overflow: hidden; } -/* ./WebContent/VAADIN/themes/base/panel/panel.css */ .v-panel, .v-panel-caption, .v-panel-content, @@ -712,7 +774,6 @@ div.v-app-loading { .v-panel-deco { } -/* ./WebContent/VAADIN/themes/base/popupview/popupview.css */ .v-popupview { cursor: pointer; background: #aaa; @@ -721,7 +782,6 @@ div.v-app-loading { overflow: auto; } -/* ./WebContent/VAADIN/themes/base/progressindicator/progressindicator.css */ .v-progressindicator { overflow: hidden; /* for IE6 */ width: 150px; @@ -759,7 +819,6 @@ div.v-progressindicator-indeterminate-disabled { background: transparent; } -/* ./WebContent/VAADIN/themes/base/select/select.css */ .v-select { text-align: left; } @@ -795,11 +854,9 @@ div.v-progressindicator-indeterminate-disabled { clear: left; } .v-select-twincol .v-button { - display: block; float: left; } .v-select-twincol-buttons .v-button { - display: inline; float: none; } .v-filterselect { @@ -895,7 +952,6 @@ div.v-progressindicator-indeterminate-disabled { } */ -/* ./WebContent/VAADIN/themes/base/shadow/shadow.css */ .v-shadow { position: absolute; } @@ -982,7 +1038,6 @@ div.v-progressindicator-indeterminate-disabled { margin-left: -4px; } -/* ./WebContent/VAADIN/themes/base/slider/slider.css */ .v-slider { margin: 5px 0; } @@ -1046,7 +1101,6 @@ div.v-progressindicator-indeterminate-disabled { margin: 0 -1px; } -/* ./WebContent/VAADIN/themes/base/splitpanel/splitpanel.css */ .v-splitpanel-horizontal, .v-splitpanel-vertical { overflow: hidden; @@ -1085,7 +1139,6 @@ div.v-progressindicator-indeterminate-disabled { position: relative; } -/* ./WebContent/VAADIN/themes/base/table/table.css */ /* Table theme building instructions * * Vaadin scroll table is very complex widget with dozens of features. These @@ -1236,7 +1289,6 @@ div.v-progressindicator-indeterminate-disabled { color: #ddd; } -/* ./WebContent/VAADIN/themes/base/tabsheet/tabsheet.css */ .v-tabsheet, .v-tabsheet-content, .v-tabsheet-deco { @@ -1326,7 +1378,6 @@ div.v-progressindicator-indeterminate-disabled { height: 0; } -/* ./WebContent/VAADIN/themes/base/textfield/textfield.css */ .v-textfield { text-align: left /* Force default alignment */ } @@ -1380,7 +1431,6 @@ textarea.v-textarea-prompt { outline-width: medium; } -/* ./WebContent/VAADIN/themes/base/tree/tree.css */ .v-tree { text-align: left; /* Force default alignment */ overflow: hidden; @@ -1436,7 +1486,6 @@ div.v-tree-node-leaf { clear: left; } -/* ./WebContent/VAADIN/themes/base/upload/upload.css */ .v-upload-immediate { position: relative; width: 10em; @@ -1462,7 +1511,6 @@ div.v-tree-node-leaf { } -/* ./WebContent/VAADIN/themes/base/window/window.css */ .v-window { background: #fff; } @@ -1621,7 +1669,6 @@ div.v-tree-node-leaf { } /* Automatically compiled css file from subdirectories. */ -/* ./WebContent/VAADIN/themes/reindeer/a-sprite-definitions/a-sprite-definitions.css */ /*------------ * General vertical and horizontal sprites * -----------*/ @@ -1631,7 +1678,6 @@ div.v-tree-node-leaf { * Buttons * -----------*/ -/* ./WebContent/VAADIN/themes/reindeer/accordion/accordion.css */ .v-accordion { border: 1px solid #bebebe; border-radius: 2px; @@ -1682,34 +1728,60 @@ div.v-tree-node-leaf { -moz-border-radius: 0; } -/* ./WebContent/VAADIN/themes/reindeer/button/button.css */ -/* We serve simpler buttons for IE6, since it doesn't support the adjacent - * sibling selector (+) that is needed to position .v-icon properly. +/* Standard implementation of the button theme + * These files contain styles that apply to all browsers */ -div > .v-button, -.v-ie7 .v-button, -div > .v-button.v-disabled, -.v-ie7 .v-button.v-disabled { + +.v-button:focus { + background-image: url(button/img/button-sprites.png); + -background-image: url(button/img/button-sprites-ie6.png); + background-position: left -0px; + outline: none; + } + +.v-button:focus .v-button-wrap { + background-image: url(button/img/button-sprites.png); + -background-image: url(button/img/button-sprites-ie6.png); + background-position: right -26px; + outline: none; + } + +.v-button:active, +.v-button.v-pressed { + background-image: url(button/img/button-sprites.png); + -background-image: url(button/img/button-sprites-ie6.png); + background-position: left -52px; + outline: none; + } + +.v-button:active .v-button-wrap, +.v-button.v-pressed .v-button-wrap { + background-image: url(button/img/button-sprites.png); + -background-image: url(button/img/button-sprites-ie6.png); + background-position: right -78px; + outline: none; + } + +.v-button, +.v-disabled.v-button { height: 26px; padding: 0 0 0 6px; background-color: transparent; background-repeat: no-repeat; background-image: url(button/img/button-sprites.png); -background-image: url(button/img/button-sprites-ie6.png); - background-position: left -0px; + background-position: left -104px; border: none; cursor: default; -} -/* Error indicator need this */ -.v-ff .v-button, -.v-sa .v-button { - position: relative; -} -div > .v-button .v-button-caption, -.v-ie7 .v-button .v-button-caption, -div > .v-button.v-disabled .v-button-caption, -.v-ie7 .v-button.v-disabled .v-button-caption { - display: inline-block; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + } + +.v-button-wrap, +.v-disabled.v-button .v-button-wrap { + display: block; height: 22px; padding: 4px 15px 0 9px; background-color: transparent; @@ -1717,430 +1789,332 @@ div > .v-button.v-disabled .v-button-caption, background-position: right top; background-image: url(button/img/button-sprites.png); -background-image: url(button/img/button-sprites-ie6.png); - background-position: right -26px; + background-position: right -130px; + } + +.v-button-caption { + color: #222; text-shadow: #fff 0 1px 0; font-weight: bold; font-size: 11px; line-height: 16px; - float: none; -} -.v-sa .v-button .v-button-caption { - height: 21px; - padding-top: 5px; -} -.v-ch .v-button .v-button-caption, -.v-ch .v-button .v-icon { - position: relative; - top: -1px; - left: -3px; -} -.v-button:focus { + } + + + + +/************************** + * Black style + **************************/ +.black .v-button:focus { + background-image: url(button/img/black-button-sprites.png); + -background-image: url(button/img/black-button-sprites-ie6.png); + background-position: left -0px; + } + +.black .v-button:focus .v-button-wrap { + background-image: url(button/img/black-button-sprites.png); + -background-image: url(button/img/black-button-sprites-ie6.png); + background-position: right -26px; + } + +.black .v-button:active, +.black .v-button.v-pressed { + background-image: url(button/img/black-button-sprites.png); + -background-image: url(button/img/black-button-sprites-ie6.png); + background-position: left -52px; + } + +.black .v-button:active .v-button-wrap, +.black .v-button.v-pressed .v-button-wrap { + background-image: url(button/img/black-button-sprites.png); + -background-image: url(button/img/black-button-sprites-ie6.png); + background-position: right -78px; + } + +.black .v-button, +.black .v-disabled.v-button { + background-image: url(button/img/black-button-sprites.png); + -background-image: url(button/img/black-button-sprites-ie6.png); + background-position: left -104px; + } + +.black .v-button-wrap, +.black .v-disabled.v-button .v-button-wrap { + background-image: url(button/img/black-button-sprites.png); + -background-image: url(button/img/black-button-sprites-ie6.png); + background-position: right -130px; + } + +.black .v-button-caption { + color: #c9ccce; + text-shadow: #121314 0 -1px 0; + } + +.v-button-primary:focus { background-image: url(button/img/button-sprites.png); -background-image: url(button/img/button-sprites-ie6.png); - background-position: left -52px; - outline: none; -} -.v-button:focus .v-button-caption { + background-position: left -156px; + } + +.v-button-primary:focus .v-button-wrap { background-image: url(button/img/button-sprites.png); -background-image: url(button/img/button-sprites-ie6.png); - background-position: right -78px; - outline: none; -} -.v-button:active, -.v-ie7 .v-button.v-pressed { + background-position: right -182px; + } + +.v-button-primary:active, +.v-button-primary.v-pressed { background-image: url(button/img/button-sprites.png); -background-image: url(button/img/button-sprites-ie6.png); - background-position: left -104px; - outline: none; -} -.v-button:active .v-button-caption, -.v-ie7 .v-button.v-pressed .v-button-caption { + background-position: left -208px; + } + +.v-button-primary:active .v-button-wrap, +.v-button-primary.v-pressed .v-button-wrap { background-image: url(button/img/button-sprites.png); -background-image: url(button/img/button-sprites-ie6.png); - background-position: right -130px; - outline: none; -} -/* FF3 & FF2 */ -.v-button::-moz-focus-inner { - border: none; - padding: 0; -} -.v-ff2 .v-button .v-button-caption { - display: -moz-inline-box; - padding-top: 6px; - height: 20px; -} -/* IE7 */ -.v-ie7 .v-button.v-pressed .v-button-caption { - position: relative; -} -.v-ie7 .v-button.v-pressed .v-icon { - z-index: 2; -} -/* Opera */ -.v-op .v-button:active .v-button-caption { - margin-top: -1px; - margin-left: -1px; -} -.v-op .v-button:active .v-icon + .v-button-caption, -.v-op .v-button:active .v-icon + .v-errorindicator + .v-button-caption { - margin-left: -26px; -} -/* Modifications for buttons with icons */ -div > .v-button .v-icon, -.v-ie7 .v-button .v-icon, -div > .v-button.v-disabled .v-icon, -.v-ie7 .v-button.v-disabled .v-icon { - display: inline-block; - width: 16px; - overflow: hidden; - position: relative; - margin: -1px 3px 0 6px; -} -.v-ff2 .v-button .v-icon, -.v-ff2 .v-button.v-disabled .v-icon { - display: block; - float: left; - margin-top: 4px; -} -.v-ch .v-button .v-icon, -.v-ch .v-button.v-disabled .v-icon { - z-index: 2; -} -.v-ff2 .v-button-link .v-icon, -.v-ff2 .v-button-link.v-disabled .v-icon { - margin: 0; -} -.v-button .v-icon + .v-button-caption, -.v-button .v-icon + .v-errorindicator + .v-button-caption, -.v-button.v-disabled .v-icon + .v-button-caption, -.v-button.v-disabled .v-icon + .v-errorindicator + .v-button-caption { - margin-left: -25px; - padding-left: 25px; -} -/* Buttons with error indicator */ -div > .v-button .v-errorindicator, -.v-ie7 .v-button .v-errorindicator { - position: absolute; - display: block; - width: 9px; - height: 16px; - background: transparent url(common/icons/error.png) no-repeat 50%; - padding: 0; - margin: 0; - z-index: 3; -} -.v-ie7 .v-button.v-pressed .v-errorindicator { - display: none; -} -.v-ie7 .v-button .v-icon + .v-errorindicator + .v-button-caption { - margin-left: 0; -} -.v-ie6 .v-button .v-errorindicator { - position: absolute; - display: inline; - width: 9px; - height: 16px; - background: transparent url(common/icons/error-ie6.png) no-repeat 50%; -} -.v-ff .v-button .v-errorindicator, -.v-sa .v-button .v-errorindicator { - top: 2px; - left: 16px; -} -/* Buttons with explicit size */ -.v-button[style*="width"] .v-button-caption { - display: block; -} -.v-button[style*="width"] .v-icon + .v-button-caption, -.v-button[style*="width"] .v-icon + .v-errorindicator + .v-button-caption { - margin-left: 0; -} -.v-button[style*="width"] .v-icon, -.v-ie7 .v-button .v-icon { - position: absolute; - top: 4px; -} -.v-ie7 .v-button > .v-button-caption { - display: block; - margin-left: 0; -} + background-position: right -234px; + } -/** - * Default action button style -------------------------- - */ -div > .v-button-primary, -.v-ie7 .v-button-primary, -div > .v-button-primary.v-disabled, -.v-ie7 .v-button-primary.v-disabled { +.v-button-primary, +.v-disabled.v-button-primary { background-image: url(button/img/button-sprites.png); -background-image: url(button/img/button-sprites-ie6.png); - background-position: left -156px; -} -div > .v-button-primary .v-button-caption, -.v-ie7 .v-button-primary .v-button-caption, -div > .v-button-primary.v-disabled .v-button-caption, -.v-ie7 .v-button-primary.v-disabled .v-button-caption { + background-position: left -260px; + } + +.v-button-primary .v-button-wrap, +.v-disabled.v-button-primary .v-button-wrap { background-image: url(button/img/button-sprites.png); -background-image: url(button/img/button-sprites-ie6.png); + background-position: right -286px; + } + + + + +/* Black style */ + + +.black .v-button-primary:focus { + background-image: url(button/img/black-button-sprites.png); + -background-image: url(button/img/black-button-sprites-ie6.png); + background-position: left -156px; + } + +.black .v-button-primary:focus .v-button-wrap { + background-image: url(button/img/black-button-sprites.png); + -background-image: url(button/img/black-button-sprites-ie6.png); background-position: right -182px; -} -.v-button-primary:focus { - background-image: url(button/img/button-sprites.png); - -background-image: url(button/img/button-sprites-ie6.png); + color: #eaf4fb; + } + +.black .v-button-primary:active, +.black .v-button-primary.v-pressed { + background-image: url(button/img/black-button-sprites.png); + -background-image: url(button/img/black-button-sprites-ie6.png); background-position: left -208px; -} -.v-button-primary:focus .v-button-caption { - background-image: url(button/img/button-sprites.png); - -background-image: url(button/img/button-sprites-ie6.png); + } + +.black .v-button-primary:active .v-button-wrap, +.black .v-button-primary.v-pressed .v-button-wrap { + background-image: url(button/img/black-button-sprites.png); + -background-image: url(button/img/black-button-sprites-ie6.png); background-position: right -234px; -} -.v-button-primary:active, -.v-ie7 .v-button-primary.v-pressed { - background-image: url(button/img/button-sprites.png); - -background-image: url(button/img/button-sprites-ie6.png); + } + +.black .v-button-primary, +.black .v-disabled.v-button-primary { + background-image: url(button/img/black-button-sprites.png); + -background-image: url(button/img/black-button-sprites-ie6.png); background-position: left -260px; -} -.v-button-primary:active .v-button-caption, -.v-ie7 .v-button-primary.v-pressed .v-button-caption { - background-image: url(button/img/button-sprites.png); - -background-image: url(button/img/button-sprites-ie6.png); + } + +.black .v-button-primary .v-button-wrap, +.black .v-disabled.v-button-primary .v-button-wrap { + background-image: url(button/img/black-button-sprites.png); + -background-image: url(button/img/black-button-sprites-ie6.png); background-position: right -286px; -} -/* - * Small-style -------------------------- - */ -div > .v-button-small, -.v-ie7 .v-button-small, -div > .v-button-small.v-disabled, -.v-ie7 .v-button-small.v-disabled { + } + +.v-button-small:focus { background-image: url(button/img/button-sprites.png); -background-image: url(button/img/button-sprites-ie6.png); background-position: left -312px; - height: 20px; -} -div > .v-button-small .v-button-caption, -.v-ie7 .v-button-small .v-button-caption, -div > .v-button-small.v-disabled .v-button-caption, -.v-ie7 .v-button-small.v-disabled .v-button-caption { + } + +.v-button-small:focus .v-button-wrap { background-image: url(button/img/button-sprites.png); -background-image: url(button/img/button-sprites-ie6.png); background-position: right -332px; - height: 19px; - padding: 1px 11px 0 5px; - font-weight: normal; -} -.v-ff2 .v-button-small .v-button-caption { - height: 17px; - padding-top: 3px; -} -.v-sa .v-button-small .v-button-caption { - height: 18px; - padding-top: 2px; -} -.v-button-small:focus { + } + +.v-button-small:active, +.v-button-small.v-pressed { background-image: url(button/img/button-sprites.png); -background-image: url(button/img/button-sprites-ie6.png); background-position: left -352px; -} -.v-button-small:focus .v-button-caption { + } + +.v-button-small:active .v-button-wrap, +.v-button-small.v-pressed .v-button-wrap { background-image: url(button/img/button-sprites.png); -background-image: url(button/img/button-sprites-ie6.png); background-position: right -372px; -} -.v-button-small:active, -.v-ie7 .v-button-small.v-pressed { + } + +.v-button-small, +.v-disabled.v-button-small { background-image: url(button/img/button-sprites.png); -background-image: url(button/img/button-sprites-ie6.png); background-position: left -392px; -} -.v-button-small:active .v-button-caption, -.v-ie7 .v-button-small.v-pressed .v-button-caption { + height: 20px; + } + +.v-button-small .v-button-wrap, +.v-disabled.v-button-small .v-button-wrap { background-image: url(button/img/button-sprites.png); -background-image: url(button/img/button-sprites-ie6.png); background-position: right -412px; -} + height: 19px; + padding: 1px 14px 0 8px; + } -/*------------ -* Black buttons -*------------*/ -.black div > .v-button, -.v-ie7 .black .v-button, -.black div > .v-button.v-disabled, -.v-ie7 .black .v-button.v-disabled { - background-image: url(button/img/black-button-sprites.png); - -background-image: url(button/img/black-button-sprites-ie6.png); - background-position: left -0px; -} -.black div > .v-button .v-button-caption, -.v-ie7 .black .v-button .v-button-caption, -.black div > .v-button.v-disabled .v-button-caption, -.v-ie7 .black .v-button.v-disabled .v-button-caption { - background-image: url(button/img/black-button-sprites.png); - -background-image: url(button/img/black-button-sprites-ie6.png); - background-position: right -26px; - color: #c9ccce; - text-shadow: rgba(0,0,0,.8) 0 -1px 0; -} -.black .v-button:focus { - background-image: url(button/img/black-button-sprites.png); - -background-image: url(button/img/black-button-sprites-ie6.png); - background-position: left -52px; -} -.black .v-button:focus .v-button-caption { - background-image: url(button/img/black-button-sprites.png); - -background-image: url(button/img/black-button-sprites-ie6.png); - background-position: right -78px; -} -.black .v-button:active, -.v-ie7 .black .v-button.v-pressed { - background-image: url(button/img/black-button-sprites.png); - -background-image: url(button/img/black-button-sprites-ie6.png); - background-position: left -104px; -} -.black .v-button:active .v-button-caption, -.v-ie7 .black .v-button.v-pressed .v-button-caption { - background-image: url(button/img/black-button-sprites.png); - -background-image: url(button/img/black-button-sprites-ie6.png); - background-position: right -130px; -} +.v-button-small .v-button-caption { + font-weight: normal; + } + -/* - * Primary-style ---------------------------- - */ -.black div > .v-button-primary, -.v-ie7 .black .v-button-primary, -.black div > .v-button-primary.v-disabled, -.v-ie7 .black .v-button-primary.v-disabled { - background-image: url(button/img/black-button-sprites.png); - -background-image: url(button/img/black-button-sprites-ie6.png); - background-position: left -156px; -} -.black div > .v-button-primary .v-button-caption, -.v-ie7 .black .v-button-primary .v-button-caption, -.black div > .v-button-primary.v-disabled .v-button-caption, -.v-ie7 .black .v-button-primary.v-disabled .v-button-caption { - background-image: url(button/img/black-button-sprites.png); - -background-image: url(button/img/black-button-sprites-ie6.png); - background-position: right -182px; -} -.black .v-button-primary:focus { - background-image: url(button/img/black-button-sprites.png); - -background-image: url(button/img/black-button-sprites-ie6.png); - background-position: left -208px; -} -.black .v-button-primary:focus .v-button-caption { - background-image: url(button/img/black-button-sprites.png); - -background-image: url(button/img/black-button-sprites-ie6.png); - background-position: right -234px; - color: #eaf4fb; -} -.black .v-button-primary:active, -.v-ie7 .black .v-button-primary.v-pressed { - background-image: url(button/img/black-button-sprites.png); - -background-image: url(button/img/black-button-sprites-ie6.png); - background-position: left -260px; -} -.black .v-button-primary:active .v-button-caption, -.v-ie7 .black .v-button-primary.v-pressed .v-button-caption { - background-image: url(button/img/black-button-sprites.png); - -background-image: url(button/img/black-button-sprites-ie6.png); - background-position: right -286px; -} -/* - * Small-style -------------------------- - */ -.black div > .v-button-small, -.v-ie7 .black .v-button-small, -.black div > .v-button-small.v-disabled, -.v-ie7 .black .v-button-small.v-disabled { + +/* Black style */ + +.black .v-button-small:focus { background-image: url(button/img/black-button-sprites.png); -background-image: url(button/img/black-button-sprites-ie6.png); background-position: left -312px; -} -.black div > .v-button-small .v-button-caption, -.v-ie7 .black .v-button-small .v-button-caption, -.black div > .v-button-small.v-disabled .v-button-caption, -.v-ie7 .black .v-button-small.v-disabled .v-button-caption { + } + +.black .v-button-small:focus .v-button-wrap { background-image: url(button/img/black-button-sprites.png); -background-image: url(button/img/black-button-sprites-ie6.png); background-position: right -332px; -} -.black .v-button-small:focus { + } + +.black .v-button-small:active, +.black .v-button-small.v-pressed { background-image: url(button/img/black-button-sprites.png); -background-image: url(button/img/black-button-sprites-ie6.png); background-position: left -352px; -} -.black .v-button-small:focus .v-button-caption { + } + +.black .v-button-small:active .v-button-wrap, +.black .v-button-small.v-pressed .v-button-wrap { background-image: url(button/img/black-button-sprites.png); -background-image: url(button/img/black-button-sprites-ie6.png); background-position: right -372px; -} -.black .v-button-small:active, -.v-ie7 .black .v-button-small.v-pressed { + } + +.black .v-button-small, +.black .v-disabled.v-button-small { background-image: url(button/img/black-button-sprites.png); -background-image: url(button/img/black-button-sprites-ie6.png); background-position: left -392px; -} -.black .v-button-small:active .v-button-caption, -.v-ie7 .black .v-button-small.v-pressed .v-button-caption { + } + +.black .v-button-small .v-button-wrap, +.black .v-disabled.v-button-small .v-button-wrap { background-image: url(button/img/black-button-sprites.png); -background-image: url(button/img/black-button-sprites-ie6.png); background-position: right -412px; -} - - - + } -/** - * Link style buttons ----------------------- - */ -div > .v-button.v-button-link, -div > .v-button.v-button-link:focus, -div > .v-button.v-button-link:active, -.v-ie7 .v-button-link, -.v-ie7 .v-button-link.v-pressed, -div > .v-button.v-button-link.v-disabled, -.v-ie7 .v-button-link.v-disabled { +.v-button.v-button-link, +.v-button.v-button-link:focus, +.v-button.v-button-link:active, +.v-button-link.v-pressed, +.v-disabled.v-button.v-button-link, +.v-button.v-button-link .v-button-wrap, +.v-button.v-button-link:focus .v-button-wrap, +.v-button.v-button-link:active .v-button-wrap, +.v-button-link.v-pressed .v-button-wrap, +.v-disabled.v-button.v-button-link .v-button-wrap { background: transparent; height: auto; padding: 0; cursor: pointer; -} -div > .v-button.v-button-link .v-button-caption, -div > .v-button.v-button-link:focus .v-button-caption, -div > .v-button.v-button-link:active .v-button-caption, -.v-ie7 .v-button-link .v-button-caption, -.v-ie7 .v-button-link.v-pressed .v-button-caption, -div > .v-button.v-button-link.v-disabled .v-button-caption, -.v-ie7 .v-button-link.v-disabled .v-button-caption { - background: transparent; - height: auto; - padding: 0; - display: inline; + line-height: inherit; + } + +.v-button-link .v-button-caption, +.v-nativebutton-link .v-nativebutton-caption { + line-height: inherit; font-weight: normal; color: #1b699f; font-size: 12px; text-shadow: none; -} -.v-button.v-button-link .v-icon + .v-button-caption { - margin: 0; - padding: 0; -} -.v-button.v-button-link:focus { + } + +.v-button-link:focus .v-button-caption, +.v-nativebutton-link:focus .v-nativebutton-caption { outline: 1px dotted #1b699f; + } + +/* Browser-specific corrections to the standard implementation */ + +.v-sa .v-button-caption { + height: 21px; + padding-top: 5px; + line-height: 17px; + } + +.v-sa .v-button-small .v-button-caption { + height: 18px; + padding-top: 2px; + } + +.v-ff2 .v-button .v-button-caption { + display: -moz-inline-box; + padding-top: 6px; + height: 20px; + } + + +/* Modifications for buttons with icons * +.v-ff2 .v-button .v-icon, +.v-ff2 .v-button.v-disabled .v-icon { + display: block; + float: left; + margin-top: 4px; + } + +.v-ff2 .v-button-link .v-icon, +.v-ff2 .v-button-link.v-disabled .v-icon { + margin: 0; + } + */ + +/*.v-op .v-button:active .v-button-caption { + margin-top: -1px; + margin-left: -1px; } -div > .v-button-link .v-icon, -.v-ie7 .v-button-link .v-icon, -div > .v-disabled.v-button-link .v-icon, -.v-ie7 .v-disabled.v-button-link .v-icon { - position: static; - width: auto; +.v-op .v-button:active .v-icon + .v-button-caption, +.v-op .v-button:active .v-icon + .v-errorindicator + .v-button-caption { + margin-left: -26px; +}*/ + +.v-ie6 .v-nativebutton-link, +.v-ie7 .v-nativebutton-link, +.v-ie8 .v-nativebutton-link { + padding: 0; + text-align: left; } + + /** * IE6 buttons -------------------------- */ @@ -2148,23 +2122,26 @@ div > .v-disabled.v-button-link .v-icon, border: 1px solid #b3b3b3; border-bottom-color: #9a9a9a; background: #d8d8d8 url(button/img/right.png) no-repeat 0 -1px; - padding: 3px 15px 2px 15px; - font-weight: bold; - font-size: 11px; - line-height: 16px; - height: 16px; - outline: none; - cursor: default; + padding: 0 15px; + height: 23px; +} +.v-ie6 .v-button .v-button-wrap { + background: transparent; + height: 20px; + padding: 3px 0 0; + display: inline; + zoom: 1; } .v-ie6 .v-button-primary { background-image: url(button/img/primary-right.png); } .v-ie6 .v-button-small { - font-weight: normal; - padding: 1px 11px 0 11px; - height: 12px; - line-height: normal; background-image: url(button/img/small-right.png); + height: 17px; +} +.v-ie6 .v-button-small .v-button-wrap { + height: 17px; + padding: 0; } .v-ie6 .v-button.v-pressed { background: transparent url(button/img/right-pressed.png) no-repeat 0 -1px; @@ -2190,17 +2167,52 @@ div > .v-disabled.v-button-link .v-icon, .v-ie6 .black .v-button.v-pressed { background-image: url(button/img/black/right-pressed.png); } -/* Link button in IE6 */ -.v-ie6 .v-button-link { - border: none; - padding: 0; + + +/* Link style button */ +.v-ie6 .v-button-link, +.v-ie6 .black .v-button-link { background: transparent; + border: none; + height: auto; line-height: normal; - font-size: 12px; - font-weight: normal; + padding: 0; +} +.v-ie6 .v-button-link .v-button-wrap, +.v-ie6 .black .v-button-link .v-button-wrap { + padding: 0; + height: auto; } -/* ./WebContent/VAADIN/themes/reindeer/common/common.css */ + + +/* + +.v-ff .v-button .v-errorindicator, +.v-sa .v-button .v-errorindicator { + top: 2px; + left: 16px; +} +/* Buttons with explicit size * +.v-button[style*="width"] .v-button-caption { + display: block; +} +.v-button[style*="width"] .v-icon + .v-button-caption, +.v-button[style*="width"] .v-icon + .v-errorindicator + .v-button-caption { + margin-left: 0; +} +.v-button[style*="width"] .v-icon, +.v-ie7 .v-button .v-icon { + position: absolute; + top: 4px; +} +.v-ie7 .v-button > .v-button-caption { + display: block; + margin-left: 0; +} +*/ + + .v-generated-body, .v-app { background: #f5f5f5; @@ -2338,7 +2350,6 @@ div > .v-disabled.v-button-link .v-icon, cursor: default; } -/* ./WebContent/VAADIN/themes/reindeer/datefield/datefield.css */ .v-datefield-calendarpanel { border-collapse: collapse; margin: 0; @@ -2750,7 +2761,6 @@ td.v-datefield-calendarpanel-nextyear { background-position: right -294px; } -/* ./WebContent/VAADIN/themes/reindeer/formlayout/formlayout.css */ .v-formlayout-errorcell { width: 13px; } @@ -2809,7 +2819,6 @@ td.v-datefield-calendarpanel-nextyear { font-weight: bold; } -/* ./WebContent/VAADIN/themes/reindeer/label/label.css */ .v-label { line-height: 18px; } @@ -2885,7 +2894,6 @@ td.v-datefield-calendarpanel-nextyear { line-height: normal; } -/* ./WebContent/VAADIN/themes/reindeer/layouts/layouts.css */ .v-orderedlayout-margin-top, .v-horizontallayout-margin-top, .v-verticallayout-margin-top { @@ -2931,7 +2939,6 @@ td.v-datefield-calendarpanel-nextyear { background-color: #1e2022; } -/* ./WebContent/VAADIN/themes/reindeer/menubar/menubar.css */ .v-menubar { height: 23px; overflow: hidden; @@ -2987,7 +2994,6 @@ td.v-datefield-calendarpanel-nextyear { margin-top: -14px; } -/* ./WebContent/VAADIN/themes/reindeer/notification/notification.css */ .v-Notification { color: #fff; border-radius: 4px; @@ -3013,7 +3019,6 @@ td.v-datefield-calendarpanel-nextyear { font-size: 12px; } -/* ./WebContent/VAADIN/themes/reindeer/panel/panel.css */ .v-panel-caption, .v-panel-nocaption { border-bottom: 1px solid #dcdcdc; @@ -3091,7 +3096,6 @@ td.v-datefield-calendarpanel-nextyear { border: none; } -/* ./WebContent/VAADIN/themes/reindeer/progressindicator/progressindicator.css */ .v-progressindicator-wrapper { background: #dfe2e4 url(progressindicator/img/base.gif) repeat-x; border: 1px solid #bfbfbf; @@ -3103,7 +3107,6 @@ td.v-datefield-calendarpanel-nextyear { background: #f7f9f9 url(progressindicator/img/progress.png); } -/* ./WebContent/VAADIN/themes/reindeer/select/select.css */ .v-filterselect { height: 24px; background-repeat: no-repeat; @@ -3449,7 +3452,6 @@ td.v-datefield-calendarpanel-nextyear { overflow: hidden; } -/* ./WebContent/VAADIN/themes/reindeer/slider/slider.css */ .v-slider { border-top: 1px solid #9a9c9e; border-bottom: 1px solid #bdbfc1; @@ -3496,7 +3498,6 @@ td.v-datefield-calendarpanel-nextyear { margin-left: -5px; } -/* ./WebContent/VAADIN/themes/reindeer/splitpanel/splitpanel.css */ .v-splitpanel-hsplitter, .v-splitpanel-hsplitter-locked { width: 7px; @@ -3564,7 +3565,6 @@ td.v-datefield-calendarpanel-nextyear { background: #4e5253; } -/* ./WebContent/VAADIN/themes/reindeer/table/table.css */ .v-table-header-wrap { border-color: #c2c3c4; background: transparent repeat-x; @@ -3862,7 +3862,6 @@ td.v-datefield-calendarpanel-nextyear { border: none; } -/* ./WebContent/VAADIN/themes/reindeer/tabsheet/tabsheet.css */ .v-tabsheet-tabitemcell, .v-tabsheet-spacertd { height: 32px; @@ -4235,7 +4234,6 @@ td.v-datefield-calendarpanel-nextyear { } /* Content area font color specified with minimal style (reduces additional selectors) */ -/* ./WebContent/VAADIN/themes/reindeer/textfield/textfield.css */ .v-textfield, .v-textarea { line-height: normal; @@ -4381,7 +4379,6 @@ input.v-textfield-readonly, border-width: 0; } -/* ./WebContent/VAADIN/themes/reindeer/tree/tree.css */ .v-tree-node { background: transparent url(tree/img/arrows.png) no-repeat 6px -10px; margin-bottom: 2px; @@ -4426,7 +4423,6 @@ input.v-textfield-readonly, padding: 1px; } -/* ./WebContent/VAADIN/themes/reindeer/window/window.css */ .v-window { background: transparent; } diff --git a/WebContent/VAADIN/themes/runo/styles.css b/WebContent/VAADIN/themes/runo/styles.css index 265fdfb387..0dffa94902 100644 --- a/WebContent/VAADIN/themes/runo/styles.css +++ b/WebContent/VAADIN/themes/runo/styles.css @@ -1,12 +1,10 @@ /* Automatically compiled css file from subdirectories. */ -/* ./WebContent/VAADIN/themes/base/absolutelayout/absolutelayout.css */ .v-absolutelayout-wrapper { position: absolute; overflow: hidden; } -/* ./WebContent/VAADIN/themes/base/accordion/accordion.css */ .v-accordion { position: relative; outline: none; @@ -34,61 +32,142 @@ width: 100%; } -/* ./WebContent/VAADIN/themes/base/button/button.css */ +/* + * Default button (more customizable) + * -------------------------------------- */ .v-button { + display: inline-block; + zoom: 1; + text-align: center; + text-decoration: none; + border: 2px outset #ddd; + background: #eee; cursor: pointer; white-space: nowrap; margin: 0; + padding: .2em 1em; + color: inherit; + font: inherit; + line-height: normal; + -khtml-user-select: none; + -moz-user-select: none; + -ie-user-select: none; + user-select: none; + } + +.v-ie6 .v-button { + display: inline; } -.v-button span { - white-space: nowrap; -} -.v-checkbox input { + +.v-button-wrap, +.v-button-caption { vertical-align: middle; -} -.v-button img, -.v-checkbox img { - display: inline; + white-space: nowrap; + font: inherit; + color: inherit; + line-height: normal; + } + +.v-button .v-icon, +.v-nativebutton .v-icon { vertical-align: middle; margin-right: 3px; -} -.v-button span, -.v-checkbox label { + border: none; + } + +.v-button .v-errorindicator, +.v-nativebutton .v-errorindicator { + display: inline-block; + zoom: 1; vertical-align: middle; + float: none; } -.v-button-link { + +/* Link style (we really should deprecate this) */ +.v-button-link, +.v-nativebutton-link { border: none; text-align: left; - background: none; + background: transparent; padding: 0; -} + color: inherit; + } + /* Inset Safari focus outline a bit */ -.v-sa .v-button-link:focus { +.v-sa .v-button-link:focus{ outline-offset: -3px; -} -.v-button-link span { + } + +.v-button-link .v-button-caption, +.v-nativebutton-link .v-nativebutton-caption { text-decoration: underline; -} -.v-checkbox { - white-space: nowrap; -} -.v-checkbox .v-errorindicator { + color: inherit; + text-align: left; + } + + +/* + * NativeButton styles (html button element) + * -------------------------------------- */ +.v-nativebutton { + text-align: center; + cursor: pointer; + white-space: nowrap; + margin: 0; + color: inherit; + font: inherit; + line-height: normal; + } +.v-nativebutton .v-nativebutton-caption { + vertical-align: middle; + white-space: nowrap; + font: inherit; + color: inherit; + } + +.v-nativebutton .v-icon { + vertical-align: middle; + margin-right: 3px; + } + +.v-nativebutton .v-errorindicator { + display: inline-block; + zoom: 1; float: none; - display: inline; - padding-left: 1em; - background-position: left; } /* Fixes streched buttons in IE6 and IE7*/ -.v-ie6 .v-button { +.v-ie6 .v-nativebutton { width: 1px; } -.v-ie6 .v-button, -.v-ie7 .v-button, -.v-ie8 .v-button { +.v-ie6 .v-nativebutton, +.v-ie7 .v-nativebutton, +.v-ie8 .v-nativebutton { overflow: visible; padding-left: 1em; padding-right: 1em; } + +/* + * Checkbox styles + * -------------------------------------- */ + +.v-checkbox, +.v-checkbox label, +.v-checkbox input { + vertical-align: middle; + white-space: nowrap; +} +.v-checkbox img { + display: inline; + vertical-align: middle; + margin-right: 3px; +} +.v-checkbox .v-errorindicator { + float: none; + display: inline; + padding-left: 1em; + background-position: left; +} /* Error indicator on checkbox fix for IE6 */ .v-ie6 .v-checkbox * { float: left; @@ -113,13 +192,8 @@ padding-left: 0; padding-right: 0.7em; } -/* Error indicator on button fix for IE */ -.v-ie6 button .v-errorindicator, -.v-ie7 button .v-errorindicator, -.v-ie8 button .v-errorindicator { - display: inline; - padding-right: 0.5em; -} + + /* Disabled by default .v-checkbox-error { background: #ffe0e0; @@ -131,7 +205,6 @@ } */ -/* ./WebContent/VAADIN/themes/base/caption/caption.css */ .v-captionwrapper { text-align: left; /* Force default alignment */ } @@ -164,7 +237,6 @@ display: inline; } -/* ./WebContent/VAADIN/themes/base/common/common.css */ /* References the BODY tag generated by Vaadin application servlet */ .v-generated-body { width: 100%; @@ -370,17 +442,14 @@ div.v-app-loading { padding: 2px; } -/* ./WebContent/VAADIN/themes/base/customcomponent/customcomponent.css */ .v-customcomponent { overflow: hidden; } -/* ./WebContent/VAADIN/themes/base/customlayout/customlayout.css */ .v-customlayout { overflow: hidden; } -/* ./WebContent/VAADIN/themes/base/datefield/datefield.css */ .v-datefield { white-space: nowrap; } @@ -452,7 +521,6 @@ div.v-app-loading { filter: alpha(opacity=30); } -/* ./WebContent/VAADIN/themes/base/formlayout/formlayout.css */ .v-formlayout-cell .v-errorindicator { display: block; } @@ -497,7 +565,6 @@ div.v-app-loading { float: none; } -/* ./WebContent/VAADIN/themes/base/gridlayout/gridlayout.css */ .v-gridlayout-margin-top { padding-top: 2em; } @@ -529,7 +596,6 @@ div.v-app-loading { overflow: hidden; } -/* ./WebContent/VAADIN/themes/base/link/link.css */ .v-link { white-space: nowrap; } @@ -549,7 +615,6 @@ div.v-app-loading { border:none; } -/* ./WebContent/VAADIN/themes/base/menubar/menubar.css */ .v-menubar table { white-space: nowrap; border-collapse: collapse; @@ -588,7 +653,6 @@ div.v-app-loading { cursor: default; } -/* ./WebContent/VAADIN/themes/base/notification/notification.css */ .v-Notification { background: #999; color: #fff; @@ -631,7 +695,6 @@ div.v-app-loading { white-space: nowrap; } -/* ./WebContent/VAADIN/themes/base/orderedlayout/orderedlayout.css */ .v-orderedlayout-margin-top, .v-horizontallayout-margin-top, .v-verticallayout-margin-top { @@ -675,7 +738,6 @@ div.v-app-loading { overflow: hidden; } -/* ./WebContent/VAADIN/themes/base/panel/panel.css */ .v-panel, .v-panel-caption, .v-panel-content, @@ -712,7 +774,6 @@ div.v-app-loading { .v-panel-deco { } -/* ./WebContent/VAADIN/themes/base/popupview/popupview.css */ .v-popupview { cursor: pointer; background: #aaa; @@ -721,7 +782,6 @@ div.v-app-loading { overflow: auto; } -/* ./WebContent/VAADIN/themes/base/progressindicator/progressindicator.css */ .v-progressindicator { overflow: hidden; /* for IE6 */ width: 150px; @@ -759,7 +819,6 @@ div.v-progressindicator-indeterminate-disabled { background: transparent; } -/* ./WebContent/VAADIN/themes/base/select/select.css */ .v-select { text-align: left; } @@ -795,11 +854,9 @@ div.v-progressindicator-indeterminate-disabled { clear: left; } .v-select-twincol .v-button { - display: block; float: left; } .v-select-twincol-buttons .v-button { - display: inline; float: none; } .v-filterselect { @@ -895,7 +952,6 @@ div.v-progressindicator-indeterminate-disabled { } */ -/* ./WebContent/VAADIN/themes/base/shadow/shadow.css */ .v-shadow { position: absolute; } @@ -982,7 +1038,6 @@ div.v-progressindicator-indeterminate-disabled { margin-left: -4px; } -/* ./WebContent/VAADIN/themes/base/slider/slider.css */ .v-slider { margin: 5px 0; } @@ -1046,7 +1101,6 @@ div.v-progressindicator-indeterminate-disabled { margin: 0 -1px; } -/* ./WebContent/VAADIN/themes/base/splitpanel/splitpanel.css */ .v-splitpanel-horizontal, .v-splitpanel-vertical { overflow: hidden; @@ -1085,7 +1139,6 @@ div.v-progressindicator-indeterminate-disabled { position: relative; } -/* ./WebContent/VAADIN/themes/base/table/table.css */ /* Table theme building instructions * * Vaadin scroll table is very complex widget with dozens of features. These @@ -1236,7 +1289,6 @@ div.v-progressindicator-indeterminate-disabled { color: #ddd; } -/* ./WebContent/VAADIN/themes/base/tabsheet/tabsheet.css */ .v-tabsheet, .v-tabsheet-content, .v-tabsheet-deco { @@ -1326,7 +1378,6 @@ div.v-progressindicator-indeterminate-disabled { height: 0; } -/* ./WebContent/VAADIN/themes/base/textfield/textfield.css */ .v-textfield { text-align: left /* Force default alignment */ } @@ -1380,7 +1431,6 @@ textarea.v-textarea-prompt { outline-width: medium; } -/* ./WebContent/VAADIN/themes/base/tree/tree.css */ .v-tree { text-align: left; /* Force default alignment */ overflow: hidden; @@ -1436,7 +1486,6 @@ div.v-tree-node-leaf { clear: left; } -/* ./WebContent/VAADIN/themes/base/upload/upload.css */ .v-upload-immediate { position: relative; width: 10em; @@ -1462,7 +1511,6 @@ div.v-tree-node-leaf { } -/* ./WebContent/VAADIN/themes/base/window/window.css */ .v-window { background: #fff; } @@ -1621,13 +1669,11 @@ div.v-tree-node-leaf { } /* Automatically compiled css file from subdirectories. */ -/* ./WebContent/VAADIN/themes/runo/absolutelayout/absolutelayout.css */ .v-absolutelayout-wrapper { position: absolute; overflow:hidden; } -/* ./WebContent/VAADIN/themes/runo/accordion/accordion.css */ .v-accordion-item { background-color: #fff; } @@ -1650,7 +1696,6 @@ div.v-tree-node-leaf { border-bottom: 1px solid #c8cccd; } -/* ./WebContent/VAADIN/themes/runo/button/button.css */ .v-button { font-size: 13px; } @@ -1673,7 +1718,6 @@ div.v-tree-node-leaf { padding-right: 5px; } -/* ./WebContent/VAADIN/themes/runo/caption/caption.css */ .v-captionwrapper { margin: 0.3em 0 0 0; } @@ -1690,7 +1734,6 @@ div.v-tree-node-leaf { margin-left: -3px; } -/* ./WebContent/VAADIN/themes/runo/common/common.css */ .v-generated-body { background: #e9eced; } @@ -1788,7 +1831,6 @@ div.v-tree-node-leaf { margin-right: 10px; } -/* ./WebContent/VAADIN/themes/runo/datefield/datefield.css */ .v-datefield-button { font-size:13px; width: 22px; @@ -1926,7 +1968,6 @@ div.v-tree-node-leaf { margin: 0; } -/* ./WebContent/VAADIN/themes/runo/formlayout/formlayout.css */ .v-formlayout-cell .v-errorindicator { width: 10px; height: 16px; @@ -1978,7 +2019,6 @@ div.v-tree-node-leaf { font-weight: bold; } -/* ./WebContent/VAADIN/themes/runo/gridlayout/gridlayout.css */ .v-gridlayout-margin-top { padding-top: 15px; } @@ -1996,12 +2036,10 @@ div.v-tree-node-leaf { padding-top: 8px; } -/* ./WebContent/VAADIN/themes/runo/link/link.css */ .v-link a { color: #464f52; } -/* ./WebContent/VAADIN/themes/runo/menubar/menubar.css */ .v-menubar { color: #464f52; border: 1px solid #c6cbcc; @@ -2035,7 +2073,6 @@ div.v-tree-node-leaf { background: #5daee8; } -/* ./WebContent/VAADIN/themes/runo/notification/notification.css */ .v-Notification { font-family: "Trebuchet MS", geneva, helvetica, arial, tahoma, verdana, sans-serif; background-color: #818e92; @@ -2112,7 +2149,6 @@ div.v-tree-node-leaf { white-space: nowrap; } -/* ./WebContent/VAADIN/themes/runo/orderedlayout/orderedlayout.css */ .v-orderedlayout-margin-top, .v-horizontallayout-margin-top, .v-verticallayout-margin-top { @@ -2140,7 +2176,6 @@ div.v-tree-node-leaf { padding-left: 8px; } -/* ./WebContent/VAADIN/themes/runo/panel/panel.css */ .v-panel { background: transparent url(panel/img/top-left.png) no-repeat; } @@ -2241,7 +2276,6 @@ div.v-tree-node-leaf { overflow: hidden; } -/* ./WebContent/VAADIN/themes/runo/popupview/popupview.css */ .v-popupview-popup { border: 1px solid #babfc0; border-bottom: 1px solid #dee2e3; @@ -2249,7 +2283,6 @@ div.v-tree-node-leaf { padding: 3px; } -/* ./WebContent/VAADIN/themes/runo/progressindicator/progressindicator.css */ .v-progressindicator-wrapper { background: #dfe2e4 url(progressindicator/img/base.gif) repeat-x; border: 1px solid #b6bbbc; @@ -2270,7 +2303,6 @@ div.v-tree-node-leaf { background: #dfe2e4; } -/* ./WebContent/VAADIN/themes/runo/select/select.css */ .v-select-select { font-size: 13px; } @@ -2433,7 +2465,6 @@ div.v-tree-node-leaf { } */ -/* ./WebContent/VAADIN/themes/runo/shadow/shadow.css */ .v-shadow { position: absolute; } @@ -2503,7 +2534,6 @@ div.v-tree-node-leaf { background: transparent url(shadow/img/bottom-right.png); } -/* ./WebContent/VAADIN/themes/runo/slider/slider.css */ .v-slider { border-top: 1px solid #cccfd0; border-bottom: 1px solid #cccfd0; @@ -2588,7 +2618,6 @@ div.v-tree-node-leaf { margin: 0 -1px; } -/* ./WebContent/VAADIN/themes/runo/splitpanel/splitpanel.css */ .v-splitpanel-horizontal, .v-splitpanel-vertical { overflow: hidden; } @@ -2643,7 +2672,6 @@ div.v-tree-node-leaf { } -/* ./WebContent/VAADIN/themes/runo/table/table.css */ .v-table-header-wrap { height: 36px; border: 1px solid #b6bbbc; @@ -2786,7 +2814,6 @@ div.v-tree-node-leaf { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="/VAADIN/themes/default/table/img/scroll-position-bg.png", sizingMethod="scale"); } -/* ./WebContent/VAADIN/themes/runo/tabsheet/tabsheet.css */ .v-tabsheet-tabs { height: 48px; } @@ -3057,7 +3084,6 @@ div.v-tree-node-leaf { height: 0; } -/* ./WebContent/VAADIN/themes/runo/textfield/textfield.css */ .v-textfield { background: #fff url(textfield/img/bg.png) repeat-x; padding: 2px; @@ -3095,7 +3121,6 @@ textarea.v-textarea-prompt { background: #fff url(textfield/img/bg.png) repeat-x; } -/* ./WebContent/VAADIN/themes/runo/tree/tree.css */ .v-tree-node { background: transparent url(tree/img/collapsed.png) no-repeat 2px 1px; } @@ -3123,7 +3148,6 @@ textarea.v-textarea-prompt { padding: 1px; } -/* ./WebContent/VAADIN/themes/runo/window/window.css */ .v-window { color: #464f52; font-family: "Trebuchet MS", geneva, helvetica, arial, tahoma, verdana, sans-serif; diff --git a/WebContent/VAADIN/themes/sampler/sampler/styles.css b/WebContent/VAADIN/themes/sampler/sampler/styles.css index f675875c5d..63c0c264d5 100644 --- a/WebContent/VAADIN/themes/sampler/sampler/styles.css +++ b/WebContent/VAADIN/themes/sampler/sampler/styles.css @@ -111,14 +111,14 @@ text-decoration: none; } -.v-app-SamplerApplication .v-horizontallayout-topbar .v-button-link span { +.v-app-SamplerApplication .v-horizontallayout-topbar .v-nativebutton-link span { text-decoration: none; } -.v-app-SamplerApplication .v-horizontallayout-topbar .v-button-link:hover span { +.v-app-SamplerApplication .v-horizontallayout-topbar .v-nativebutton-link:hover span { text-decoration: underline; } -.v-app-SamplerApplication .v-horizontallayout-segment .v-button, -.v-app-SamplerApplication .v-horizontallayout-segment .v-button.v-disabled, +.v-app-SamplerApplication .v-horizontallayout-segment .v-nativebutton, +.v-app-SamplerApplication .v-horizontallayout-segment .v-nativebutton.v-disabled, .v-app-SamplerApplication .v-horizontallayout-segment .v-popupview { width: 30px; height: 24px; @@ -128,50 +128,50 @@ background: transparent url(segment.png) no-repeat; cursor: default; } -.v-app-SamplerApplication .v-horizontallayout-segment .v-button:active, -.v-app-SamplerApplication .v-horizontallayout-segment .v-button.v-pressed, +.v-app-SamplerApplication .v-horizontallayout-segment .v-nativebutton:active, +.v-app-SamplerApplication .v-horizontallayout-segment .v-nativebutton.v-pressed, .v-app-SamplerApplication .v-horizontallayout-segment .v-popupview:active { background-position: left bottom; } -.v-app-SamplerApplication .v-horizontallayout-segment .v-button-next, -.v-app-SamplerApplication .v-horizontallayout-segment .v-button-tree-switch { +.v-app-SamplerApplication .v-horizontallayout-segment .v-nativebutton-next, +.v-app-SamplerApplication .v-horizontallayout-segment .v-nativebutton-tree-switch { background-position: right top; } -.v-app-SamplerApplication .v-horizontallayout-segment .v-button-next:active, -.v-app-SamplerApplication .v-horizontallayout-segment .v-button-next.v-pressed, -.v-app-SamplerApplication .v-horizontallayout-segment .v-button-next.v-disabled, -.v-app-SamplerApplication .v-horizontallayout-segment .v-button-tree-switch:active, -.v-app-SamplerApplication .v-horizontallayout-segment .v-button-tree-switch.v-pressed { +.v-app-SamplerApplication .v-horizontallayout-segment .v-nativebutton-next:active, +.v-app-SamplerApplication .v-horizontallayout-segment .v-nativebutton-next.v-pressed, +.v-app-SamplerApplication .v-horizontallayout-segment .v-nativebutton-next.v-disabled, +.v-app-SamplerApplication .v-horizontallayout-segment .v-nativebutton-tree-switch:active, +.v-app-SamplerApplication .v-horizontallayout-segment .v-nativebutton-tree-switch.v-pressed { background-position: right bottom; } -.v-app-SamplerApplication .v-horizontallayout-segment .v-button-down { +.v-app-SamplerApplication .v-horizontallayout-segment .v-nativebutton-down { background-position: right bottom; } -.v-app-SamplerApplication .v-horizontallayout-segment .v-button span, +.v-app-SamplerApplication .v-horizontallayout-segment .v-nativebutton span, .v-app-SamplerApplication .v-horizontallayout-segment .v-popupview span, -.v-app-SamplerApplication .v-horizontallayout-segment .v-button.v-pressed span, -.v-app-SamplerApplication .v-horizontallayout-segment .v-button.v-disabled span { +.v-app-SamplerApplication .v-horizontallayout-segment .v-nativebutton.v-pressed span, +.v-app-SamplerApplication .v-horizontallayout-segment .v-nativebutton.v-disabled span { display: block; height: 24px; background-repeat: no-repeat; background-position: 50% 30%; } -.v-app-SamplerApplication .v-horizontallayout-segment .v-button-tree-switch span, -.v-app-SamplerApplication .v-horizontallayout-segment .v-button-tree-switch.v-pressed span { +.v-app-SamplerApplication .v-horizontallayout-segment .v-nativebutton-tree-switch span, +.v-app-SamplerApplication .v-horizontallayout-segment .v-nativebutton-tree-switch.v-pressed span { background-image: url(tree.png); } .v-app-SamplerApplication .v-horizontallayout-segment .v-popupview span { background-image: url(magnifier.png); background-position: 50% 40%; } -.v-app-SamplerApplication .v-horizontallayout-segment .v-button-previous span, -.v-app-SamplerApplication .v-horizontallayout-segment .v-button-previous.v-pressed span, -.v-app-SamplerApplication .v-horizontallayout-segment .v-button-previous.v-disabled span { +.v-app-SamplerApplication .v-horizontallayout-segment .v-nativebutton-previous span, +.v-app-SamplerApplication .v-horizontallayout-segment .v-nativebutton-previous.v-pressed span, +.v-app-SamplerApplication .v-horizontallayout-segment .v-nativebutton-previous.v-disabled span { background-image: url(prev.png); } -.v-app-SamplerApplication .v-horizontallayout-segment .v-button-next span, -.v-app-SamplerApplication .v-horizontallayout-segment .v-button-next.v-pressed span, -.v-app-SamplerApplication .v-horizontallayout-segment .v-button-next.v-disabled span { +.v-app-SamplerApplication .v-horizontallayout-segment .v-nativebutton-next span, +.v-app-SamplerApplication .v-horizontallayout-segment .v-nativebutton-next.v-pressed span, +.v-app-SamplerApplication .v-horizontallayout-segment .v-nativebutton-next.v-disabled span { background-image: url(next.png); } .v-popupview-popup-quickjump { @@ -237,16 +237,16 @@ text-indent: 15px; padding-right: 20px; } -.v-app-SamplerApplication .v-button-screenshot { +.v-app-SamplerApplication .v-nativebutton-screenshot { border: 3px solid #ccc; -moz-border-radius: 5px; -webkit-border-radius: 5px; overflow: hidden; } -.v-app-SamplerApplication .v-button-screenshot:hover { +.v-app-SamplerApplication .v-nativebutton-screenshot:hover { border-color: #abc; } -.v-app-SamplerApplication .v-button-screenshot img.v-icon { +.v-app-SamplerApplication .v-nativebutton-screenshot img.v-icon { margin: 0; margin-top: -2px; margin-left: -3px; @@ -257,7 +257,7 @@ overflow: hidden; position: static; } -.v-ie .v-app-SamplerApplication .v-button-screenshot img.v-icon { +.v-ie .v-app-SamplerApplication .v-nativebutton-screenshot img.v-icon { margin-left: -12px; } @@ -453,9 +453,9 @@ .v-app-SamplerApplication .v-link-showcode { margin-left: 3px; } -.v-app-SamplerApplication div > .v-button-showcode, -.v-app-SamplerApplication div > .v-button-showcode:active, -.v-app-SamplerApplication div > .v-button-showcode:focus, +.v-app-SamplerApplication div > .v-nativebutton-showcode, +.v-app-SamplerApplication div > .v-nativebutton-showcode:active, +.v-app-SamplerApplication div > .v-nativebutton-showcode:focus, .v-app-SamplerApplication .v-link-showcode { font-family: arial, helvetica, verdana, sans-serif; display: inline; @@ -464,17 +464,17 @@ height: 20px; margin-right: 3px; } -.v-sa .v-app-SamplerApplication .v-button-showcode, +.v-sa .v-app-SamplerApplication .v-nativebutton-showcode, .v-sa .v-app-SamplerApplication .v-link-showcode { font-family: helvetica, arial, verdana, sans-serif; } -.v-app-SamplerApplication div > .v-button-showcode.v-button-link span, +.v-app-SamplerApplication div > .v-nativebutton-showcode.v-nativebutton-link span, .v-app-SamplerApplication .v-link-showcode span { color: #8b8e91; text-decoration: none; } -.v-app-SamplerApplication div > .v-button-showcode:hover span, -.v-app-SamplerApplication div > .v-button-showcode:active span, +.v-app-SamplerApplication div > .v-nativebutton-showcode:hover span, +.v-app-SamplerApplication div > .v-nativebutton-showcode:active span, .v-app-SamplerApplication .v-link-showcode:hover span { color: #62696f; text-decoration: underline; @@ -484,7 +484,7 @@ background: #fff; } -.v-app .v-customcomponent-ModeSwitch button.v-button { +.v-app .v-customcomponent-ModeSwitch button.v-nativebutton { height: 24px; width: 30px; border: none; @@ -492,35 +492,35 @@ cursor: default; padding: 0; } -.v-app .v-customcomponent-ModeSwitch button.v-button span.v-button-caption { +.v-app .v-customcomponent-ModeSwitch button.v-nativebutton span.v-nativebutton-caption { display: none; } -.v-app .v-customcomponent-ModeSwitch button.v-button img.v-icon { +.v-app .v-customcomponent-ModeSwitch button.v-nativebutton img.v-icon { width: auto; height: auto; margin: 0; position: static; } -.v-app .v-customcomponent-ModeSwitch button.v-button-first-on, -.v-app .v-customcomponent-ModeSwitch button.v-button-first:active, -.v-app .v-customcomponent-ModeSwitch button.v-button-first.v-pressed { +.v-app .v-customcomponent-ModeSwitch button.v-nativebutton-first-on, +.v-app .v-customcomponent-ModeSwitch button.v-nativebutton-first:active, +.v-app .v-customcomponent-ModeSwitch button.v-nativebutton-first.v-pressed { background-position: left bottom; } -.v-app .v-customcomponent-ModeSwitch button.v-button-first { +.v-app .v-customcomponent-ModeSwitch button.v-nativebutton-first { background-position: left top; } /* -.v-customcomponent-ModeSwitch .v-button-mid-on { +.v-customcomponent-ModeSwitch .v-nativebutton-mid-on { background: transparent url(mid-on.gif) no-repeat; } -.v-customcomponent-ModeSwitch .v-button-mid { +.v-customcomponent-ModeSwitch .v-nativebutton-mid { background: transparent url(mid.gif) no-repeat; }*/ -.v-app .v-customcomponent-ModeSwitch button.v-button-last-on, -.v-app .v-customcomponent-ModeSwitch button.v-button-last:active, -.v-app .v-customcomponent-ModeSwitch button.v-button-last.v-pressed { +.v-app .v-customcomponent-ModeSwitch button.v-nativebutton-last-on, +.v-app .v-customcomponent-ModeSwitch button.v-nativebutton-last:active, +.v-app .v-customcomponent-ModeSwitch button.v-nativebutton-last.v-pressed { background-position: right bottom; } -.v-app .v-customcomponent-ModeSwitch button.v-button-last { +.v-app .v-customcomponent-ModeSwitch button.v-nativebutton-last { background-position: right top; } diff --git a/build/buildhelpers/com/vaadin/buildhelpers/CompileDefaultTheme.java b/build/buildhelpers/com/vaadin/buildhelpers/CompileDefaultTheme.java index 9e0455e474..96d5a3440a 100644 --- a/build/buildhelpers/com/vaadin/buildhelpers/CompileDefaultTheme.java +++ b/build/buildhelpers/com/vaadin/buildhelpers/CompileDefaultTheme.java @@ -41,6 +41,8 @@ public class CompileDefaultTheme { * inheritance). The order is the same in which the styles are * catenated. The resulted file is placed in the last specified * theme folder. + * + * @param * @throws IOException */ private static void combineTheme(String[] themeNames, @@ -54,53 +56,19 @@ public class CompileDefaultTheme { .append("/* Automatically compiled css file from subdirectories. */\n"); File[] subdir = f.listFiles(); - Arrays.sort(subdir, new Comparator() { - public int compare(Object arg0, Object arg1) { - return ((File) arg0).compareTo((File) arg1); + Arrays.sort(subdir, new Comparator() { + public int compare(File arg0, File arg1) { + return arg0.compareTo(arg1); } }); for (int i = 0; i < subdir.length; i++) { File dir = subdir[i]; - String name = dir.getName(); - String filename = dir.getPath() + "/" + name + ".css"; - - File cssFile = new File(filename); - if (cssFile.isFile()) { - - combinedCss.append("\n"); - combinedCss.append("/* " + filename.replaceAll("\\\\", "/") - + " */"); - combinedCss.append("\n"); + String folder = dir.getName(); + String filename = dir.getPath() + "/" + folder + ".css"; - FileInputStream fstream = new FileInputStream(cssFile); - // Get the object of DataInputStream - DataInputStream in = new DataInputStream(fstream); - BufferedReader br = new BufferedReader( - new InputStreamReader(in)); - String strLine; - while ((strLine = br.readLine()) != null) { - // Define image url prefix - String urlPrefix = ""; - if (j < themeNames.length - 1) { - urlPrefix = "../" + themeNames[j] + "/"; - } - - if (strLine.indexOf("url(../") > 0) { - strLine = strLine.replaceAll("url\\(../", - ("url\\(" + urlPrefix)); - - } else { - strLine = strLine.replaceAll("url\\(", ("url\\(" - + urlPrefix + name + "/")); - - } - combinedCss.append(strLine); - combinedCss.append("\n"); - } - // Close the input stream - in.close(); - } + processCSSFile(new File(filename), folder, themeNames[j], + combinedCss, j < themeNames.length - 1); } } @@ -131,6 +99,68 @@ public class CompileDefaultTheme { } } + private static void processCSSFile(File cssFile, String folder, + String themeName, StringBuffer combinedCss, boolean inheritedFile) + throws FileNotFoundException, IOException { + if (cssFile.isFile()) { + + combinedCss.append("\n"); + + FileInputStream fstream = new FileInputStream(cssFile); + // Get the object of DataInputStream + DataInputStream in = new DataInputStream(fstream); + BufferedReader br = new BufferedReader(new InputStreamReader(in)); + String strLine; + while ((strLine = br.readLine()) != null) { + + // Parse import rules + if (strLine.startsWith("@import")) { + // All import statements must be exactly + // @import "file-to-import.css"; + // No sub-directories are allowed in the url + String importFilename = strLine.split("\"")[1]; + + File importFile = new File(THEME_DIR + themeName + "/" + + folder + "/" + importFilename); + if (importFile.isFile()) { + processCSSFile(importFile, folder, themeName, + combinedCss, inheritedFile); + } else { + System.out + .println("File not found for @import statement " + + THEME_DIR + + themeName + + "/" + + folder + + "/" + importFilename); + } + } + + // Define image url prefix + String urlPrefix = ""; + if (inheritedFile) { + urlPrefix = "../" + themeName + "/"; + } + + if (strLine.indexOf("url(../") > 0) { + strLine = strLine.replaceAll("url\\(../", + ("url\\(" + urlPrefix)); + + } else { + strLine = strLine.replaceAll("url\\(", ("url\\(" + + urlPrefix + folder + "/")); + + } + if (!strLine.startsWith("@import")) { + combinedCss.append(strLine); + combinedCss.append("\n"); + } + } + // Close the input stream + in.close(); + } + } + private static void createSprites(String themeName) throws FileNotFoundException, IOException { String[] parameters = new String[] { "--sprite-png-depth", "AUTO", diff --git a/src/com/vaadin/demo/sampler/ModeSwitch.java b/src/com/vaadin/demo/sampler/ModeSwitch.java index 738f9f07cb..62a1ab8ef4 100644 --- a/src/com/vaadin/demo/sampler/ModeSwitch.java +++ b/src/com/vaadin/demo/sampler/ModeSwitch.java @@ -7,6 +7,7 @@ import com.vaadin.terminal.Resource; import com.vaadin.ui.Button; import com.vaadin.ui.CustomComponent; import com.vaadin.ui.GridLayout; +import com.vaadin.ui.NativeButton; import com.vaadin.ui.Button.ClickEvent; @SuppressWarnings("serial") @@ -45,7 +46,7 @@ public class ModeSwitch extends CustomComponent { if (idToButton.containsKey(id)) { removeMode(id); } - Button b = new Button(); + Button b = new NativeButton(); if (caption != null) { b.setCaption(caption); } diff --git a/src/com/vaadin/demo/sampler/SamplerApplication.java b/src/com/vaadin/demo/sampler/SamplerApplication.java index 2b5fc4a8ac..85978c16da 100644 --- a/src/com/vaadin/demo/sampler/SamplerApplication.java +++ b/src/com/vaadin/demo/sampler/SamplerApplication.java @@ -30,6 +30,7 @@ import com.vaadin.ui.Embedded; import com.vaadin.ui.GridLayout; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; +import com.vaadin.ui.NativeButton; import com.vaadin.ui.Panel; import com.vaadin.ui.PopupView; import com.vaadin.ui.SplitPanel; @@ -358,7 +359,7 @@ public class SamplerApplication extends Application { } private Component createLogo() { - Button logo = new Button("", new Button.ClickListener() { + Button logo = new NativeButton("", new Button.ClickListener() { public void buttonClick(ClickEvent event) { setFeature((Feature) null); } @@ -371,7 +372,7 @@ public class SamplerApplication extends Application { } private Button createNextButton() { - Button b = new Button("", new ClickListener() { + Button b = new NativeButton("", new ClickListener() { public void buttonClick(ClickEvent event) { Object curr = currentFeature.getValue(); Object next = allFeatures.nextItemId(curr); @@ -392,7 +393,7 @@ public class SamplerApplication extends Application { } private Button createPrevButton() { - Button b = new Button("", new ClickListener() { + Button b = new NativeButton("", new ClickListener() { public void buttonClick(ClickEvent event) { Object curr = currentFeature.getValue(); Object prev = allFeatures.prevItemId(curr); @@ -409,7 +410,7 @@ public class SamplerApplication extends Application { } private Component createTreeSwitch() { - final Button b = new Button(); + final Button b = new NativeButton(); b.setStyleName("tree-switch"); b.setDescription("Toggle sample tree visibility"); b.addListener(new Button.ClickListener() { @@ -716,7 +717,7 @@ public class SamplerApplication extends Application { if (grid.getCursorX() == 0) { grid.space(); } - Button b = new Button(); + Button b = new NativeButton(); b.setStyleName(Button.STYLE_LINK); b.addStyleName("screenshot"); String resId = "75-" + f.getIconName(); diff --git a/src/com/vaadin/terminal/gwt/client/ApplicationConnection.java b/src/com/vaadin/terminal/gwt/client/ApplicationConnection.java index a6965b2693..69174587a6 100755 --- a/src/com/vaadin/terminal/gwt/client/ApplicationConnection.java +++ b/src/com/vaadin/terminal/gwt/client/ApplicationConnection.java @@ -1108,10 +1108,11 @@ public class ApplicationConnection { boolean enabled = !uidl.getBooleanAttribute("disabled"); if (component instanceof FocusWidget) { FocusWidget fw = (FocusWidget) component; - fw.setEnabled(enabled); if (uidl.hasAttribute("tabindex")) { fw.setTabIndex(uidl.getIntAttribute("tabindex")); } + // Disabled state may affect tabindex + fw.setEnabled(enabled); } StringBuffer styleBuf = new StringBuffer(); diff --git a/src/com/vaadin/terminal/gwt/client/DefaultWidgetSet.java b/src/com/vaadin/terminal/gwt/client/DefaultWidgetSet.java index 9ac2337004..f72859dbfb 100644 --- a/src/com/vaadin/terminal/gwt/client/DefaultWidgetSet.java +++ b/src/com/vaadin/terminal/gwt/client/DefaultWidgetSet.java @@ -22,6 +22,7 @@ import com.vaadin.terminal.gwt.client.ui.VLabel; import com.vaadin.terminal.gwt.client.ui.VLink; import com.vaadin.terminal.gwt.client.ui.VListSelect; import com.vaadin.terminal.gwt.client.ui.VMenuBar; +import com.vaadin.terminal.gwt.client.ui.VNativeButton; import com.vaadin.terminal.gwt.client.ui.VNativeSelect; import com.vaadin.terminal.gwt.client.ui.VOptionGroup; import com.vaadin.terminal.gwt.client.ui.VOrderedLayout; @@ -64,6 +65,8 @@ public class DefaultWidgetSet implements WidgetSet { return new VCheckBox(); } else if (VButton.class == classType) { return new VButton(); + } else if (VNativeButton.class == classType) { + return new VNativeButton(); } else if (VWindow.class == classType) { return new VWindow(); } else if (VOrderedLayout.class == classType) { @@ -150,9 +153,11 @@ public class DefaultWidgetSet implements WidgetSet { protected Class resolveWidgetType(UIDL uidl) { final String tag = uidl.getTag(); - if ("button".equals(tag)) { + if ("button".equals(tag) || "nativebutton".equals(tag)) { if ("switch".equals(uidl.getStringAttribute("type"))) { return VCheckBox.class; + } else if ("nativebutton".equals(tag)) { + return VNativeButton.class; } else { return VButton.class; } diff --git a/src/com/vaadin/terminal/gwt/client/ui/VButton.java b/src/com/vaadin/terminal/gwt/client/ui/VButton.java index 768b98727b..b3213b1b8f 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VButton.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VButton.java @@ -4,14 +4,15 @@ package com.vaadin.terminal.gwt.client.ui; -import com.google.gwt.user.client.Command; +import com.google.gwt.dom.client.Document; +import com.google.gwt.dom.client.Element; +import com.google.gwt.dom.client.NativeEvent; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.DOM; -import com.google.gwt.user.client.DeferredCommand; -import com.google.gwt.user.client.Element; import com.google.gwt.user.client.Event; -import com.google.gwt.user.client.ui.Button; -import com.google.gwt.user.client.ui.ClickListener; -import com.google.gwt.user.client.ui.Widget; +import com.google.gwt.user.client.ui.Accessibility; +import com.google.gwt.user.client.ui.FocusWidget; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.BrowserInfo; import com.vaadin.terminal.gwt.client.Paintable; @@ -19,70 +20,86 @@ import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.terminal.gwt.client.Util; import com.vaadin.terminal.gwt.client.VTooltip; -public class VButton extends Button implements Paintable { - - private String width = null; +public class VButton extends FocusWidget implements Paintable { public static final String CLASSNAME = "v-button"; + private static final String CLASSNAME_PRESSED = "v-pressed"; - // Used only for IE, because it doesn't support :active CSS selector - private static final String CLASSNAME_DOWN = "v-pressed"; - - private String primaryStyleName; + protected String id; - String id; + protected ApplicationConnection client; - ApplicationConnection client; + protected final Element wrapper = DOM.createSpan(); - private Element errorIndicatorElement; + protected Element errorIndicatorElement; - private final Element captionElement = DOM.createSpan(); + protected final Element captionElement = DOM.createSpan(); - private Icon icon; + protected Icon icon; /** - * Helper flat to handle special-case where the button is moved from under + * Helper flag to handle special-case where the button is moved from under * mouse while clicking it. In this case mouse leaves the button without * moving. */ private boolean clickPending; + /* + * BELOW PRIVATE MEMBERS COPY-PASTED FROM GWT CustomButton + */ + + /** + * If true, this widget is capturing with the mouse held down. + */ + private boolean isCapturing; + + /** + * If true, this widget has focus with the space bar down. + */ + private boolean isFocusing; + + /** + * Used to decide whether to allow clicks to propagate up to the superclass + * or container elements. + */ + private boolean allowClick; + private boolean isHovering; + private boolean enabled = true; + private int tabIndex = 0; + public VButton() { + super(DOM.createDiv()); + setTabIndex(0); + sinkEvents(Event.ONCLICK | Event.MOUSEEVENTS | Event.FOCUSEVENTS + | Event.KEYEVENTS); + sinkEvents(VTooltip.TOOLTIP_EVENTS); + setStyleName(CLASSNAME); - DOM.appendChild(getElement(), captionElement); - captionElement.setPropertyString("className", CLASSNAME + "-caption"); + // Add a11y role "button" + Accessibility.setRole(getElement(), Accessibility.ROLE_BUTTON); - addClickListener(new ClickListener() { - public void onClick(Widget sender) { + wrapper.setClassName(CLASSNAME + "-wrap"); + getElement().appendChild(wrapper); + captionElement.setClassName(CLASSNAME + "-caption"); + wrapper.appendChild(captionElement); + + addClickHandler(new ClickHandler() { + public void onClick(ClickEvent event) { if (id == null || client == null) { return; } - /* - * TODO isolate workaround. Safari don't always seem to fire - * onblur previously focused component before button is clicked. - */ - VButton.this.setFocus(true); + if (BrowserInfo.get().isSafari()) { + VButton.this.setFocus(true); + } client.updateVariable(id, "state", true, true); clickPending = false; } }); - sinkEvents(VTooltip.TOOLTIP_EVENTS); - sinkEvents(Event.ONMOUSEDOWN); - sinkEvents(Event.ONMOUSEUP); } public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { - // client.updateComponent depends on this, so this must come before - if (uidl.hasAttribute("primarystyle") - && primaryStyleName != uidl.getStringAttribute("primarystyle")) { - primaryStyleName = uidl.getStringAttribute("primarystyle"); - setStyleName(primaryStyleName); - captionElement.setPropertyString("className", getStylePrimaryName() - + "-caption"); - } - // Ensure correct implementation, // but don't let container manage caption etc. if (client.updateComponent(this, uidl, false)) { @@ -100,115 +117,321 @@ public class VButton extends Button implements Paintable { if (uidl.hasAttribute("error")) { if (errorIndicatorElement == null) { errorIndicatorElement = DOM.createSpan(); - DOM.setElementProperty(errorIndicatorElement, "className", - "v-errorindicator"); + errorIndicatorElement.setClassName("v-errorindicator"); } - DOM.insertChild(getElement(), errorIndicatorElement, 0); + wrapper.insertBefore(errorIndicatorElement, captionElement); // Fix for IE6, IE7 - if (BrowserInfo.get().isIE()) { - DOM.setInnerText(errorIndicatorElement, " "); + if (BrowserInfo.get().isIE6() || BrowserInfo.get().isIE7()) { + errorIndicatorElement.setInnerText(" "); } } else if (errorIndicatorElement != null) { - DOM.removeChild(getElement(), errorIndicatorElement); + wrapper.removeChild(errorIndicatorElement); errorIndicatorElement = null; } - if (uidl.hasAttribute("readonly")) { - setEnabled(false); - } - if (uidl.hasAttribute("icon")) { if (icon == null) { icon = new Icon(client); - DOM.insertChild(getElement(), icon.getElement(), 0); + wrapper.insertBefore(icon.getElement(), captionElement); } icon.setUri(uidl.getStringAttribute("icon")); } else { if (icon != null) { - DOM.removeChild(getElement(), icon.getElement()); + wrapper.removeChild(icon.getElement()); icon = null; } } - if (BrowserInfo.get().isIE7()) { - /* - * Workaround for IE7 size calculation issues. Deferred because of - * issues with a button with an icon using the reindeer theme - */ - if (width.equals("")) { - DeferredCommand.addCommand(new Command() { - - public void execute() { - setWidth(""); - setWidth(getOffsetWidth() + "px"); - } - }); - } - } } - @Override public void setText(String text) { - DOM.setInnerText(captionElement, text); + captionElement.setInnerText(text); } + @SuppressWarnings("deprecation") @Override + /* + * Copy-pasted from GWT CustomButton, some minor modifications done: + * + * -for IE/Opera added CLASSNAME_PRESSED + * + * -event.preventDefault() commented from ONMOUSEDOWN (Firefox won't apply + * :active styles if it is present) + * + * -Tooltip event handling added + * + * -onload event handler added (for icon handling) + */ public void onBrowserEvent(Event event) { - super.onBrowserEvent(event); - + if (client != null) { + client.handleTooltipEvent(event, this); + } if (DOM.eventGetType(event) == Event.ONLOAD) { Util.notifyParentOfSizeChange(this, true); + } + // Should not act on button if disabled. + if (!isEnabled()) { + // This can happen when events are bubbled up from non-disabled + // children + return; + } - } else if (DOM.eventGetType(event) == Event.ONMOUSEDOWN - && event.getButton() == Event.BUTTON_LEFT) { - clickPending = true; - if (BrowserInfo.get().isIE()) { - // Only for IE, because it doesn't support :active CSS selector - // Simple check is cheaper than DOM manipulation - addStyleName(CLASSNAME_DOWN); + int type = DOM.eventGetType(event); + switch (type) { + case Event.ONCLICK: + // If clicks are currently disallowed, keep it from bubbling or + // being passed to the superclass. + if (!allowClick) { + event.stopPropagation(); + return; } - } else if (DOM.eventGetType(event) == Event.ONMOUSEMOVE) { - clickPending = false; - } else if (DOM.eventGetType(event) == Event.ONMOUSEOUT) { - if (clickPending) { - click(); + break; + case Event.ONMOUSEDOWN: + if (event.getButton() == Event.BUTTON_LEFT) { + clickPending = true; + setFocus(true); + DOM.setCapture(getElement()); + isCapturing = true; + // Prevent dragging (on some browsers); + // DOM.eventPreventDefault(event); + if (BrowserInfo.get().isIE() || BrowserInfo.get().isOpera()) { + addStyleName(CLASSNAME_PRESSED); + } } - if (BrowserInfo.get().isIE()) { - removeStyleName(CLASSNAME_DOWN); + break; + case Event.ONMOUSEUP: + if (isCapturing) { + isCapturing = false; + DOM.releaseCapture(getElement()); + if (isHovering() && event.getButton() == Event.BUTTON_LEFT) { + onClick(); + } + if (BrowserInfo.get().isIE() || BrowserInfo.get().isOpera()) { + removeStyleName(CLASSNAME_PRESSED); + } } + break; + case Event.ONMOUSEMOVE: clickPending = false; - } else if (DOM.eventGetType(event) == Event.ONMOUSEUP) { - if (BrowserInfo.get().isIE()) { - removeStyleName(CLASSNAME_DOWN); + if (isCapturing) { + // Prevent dragging (on other browsers); + DOM.eventPreventDefault(event); + } + break; + case Event.ONMOUSEOUT: + Element to = event.getRelatedTarget(); + if (getElement().isOrHasChild(DOM.eventGetTarget(event)) + && (to == null || !getElement().isOrHasChild(to))) { + if (clickPending) { + onClick(); + break; + } + clickPending = false; + if (isCapturing) { + } + setHovering(false); + if (BrowserInfo.get().isIE() || BrowserInfo.get().isOpera()) { + removeStyleName(CLASSNAME_PRESSED); + } + } + break; + case Event.ONMOUSEOVER: + if (DOM.isOrHasChild(getElement(), DOM.eventGetTarget(event))) { + setHovering(true); + if (isCapturing) { + } + } + break; + case Event.ONBLUR: + if (isFocusing) { + isFocusing = false; } + break; + case Event.ONLOSECAPTURE: + if (isCapturing) { + isCapturing = false; + } + break; } - if (client != null) { - client.handleTooltipEvent(event, this); + super.onBrowserEvent(event); + + // Synthesize clicks based on keyboard events AFTER the normal key + // handling. + if ((event.getTypeInt() & Event.KEYEVENTS) != 0) { + char keyCode = (char) DOM.eventGetKeyCode(event); + switch (type) { + case Event.ONKEYDOWN: + if (keyCode == ' ') { + isFocusing = true; + event.preventDefault(); + } + break; + case Event.ONKEYUP: + if (isFocusing && keyCode == ' ') { + isFocusing = false; + onClick(); + event.preventDefault(); + } + break; + case Event.ONKEYPRESS: + if (keyCode == '\n' || keyCode == '\r') { + onClick(); + event.preventDefault(); + } + break; + } + } + } + + final void setHovering(boolean hovering) { + if (hovering != isHovering()) { + isHovering = hovering; } } + final boolean isHovering() { + return isHovering; + } + + /* + * ALL BELOW COPY-PASTED FROM GWT CustomButton + */ + + /** + * Called when the user finishes clicking on this button. The default + * behavior is to fire the click event to listeners. Subclasses that + * override {@link #onClickStart()} should override this method to restore + * the normal widget display. + */ + protected void onClick() { + // Allow the click we're about to synthesize to pass through to the + // superclass and containing elements. Element.dispatchEvent() is + // synchronous, so we simply set and clear the flag within this method. + allowClick = true; + + // Mouse coordinates are not always available (e.g., when the click is + // caused by a keyboard event). + NativeEvent evt = Document.get().createClickEvent(1, 0, 0, 0, 0, false, + false, false, false); + getElement().dispatchEvent(evt); + + allowClick = false; + } + + /** + * Sets whether this button is enabled. + * + * @param enabled + * true to enable the button, false to + * disable it + */ + @Override - public void setWidth(String width) { - /* Workaround for IE7 button size part 1 (#2014) */ - if (BrowserInfo.get().isIE7() && this.width != null) { - if (this.width.equals(width)) { - return; + public final void setEnabled(boolean enabled) { + if (isEnabled() != enabled) { + this.enabled = enabled; + if (!enabled) { + cleanupCaptureState(); + Accessibility.removeState(getElement(), + Accessibility.STATE_PRESSED); + super.setTabIndex(-1); + } else { + Accessibility.setState(getElement(), + Accessibility.STATE_PRESSED, "false"); + super.setTabIndex(tabIndex); } + } + } - if (width == null) { - width = ""; - } + @Override + public final boolean isEnabled() { + return enabled; + } + + @Override + public final void setTabIndex(int index) { + super.setTabIndex(index); + tabIndex = index; + } + + /** + * Resets internal state if this button can no longer service events. This + * can occur when the widget becomes detached or disabled. + */ + private void cleanupCaptureState() { + if (isCapturing || isFocusing) { + DOM.releaseCapture(getElement()); + isCapturing = false; + isFocusing = false; } + } - this.width = width; + @Override + public void setWidth(String width) { + if (BrowserInfo.get().isIE6() || BrowserInfo.get().isIE7()) { + if (width != null && width.length() > 2) { + // Assume pixel values are always sent from + // ApplicationConnection + int w = Integer + .parseInt(width.substring(0, width.length() - 2)); + w -= getHorizontalBorderAndPaddingWidth(getElement()); + width = w + "px"; + } + } super.setWidth(width); + } - /* Workaround for IE7 button size part 2 (#2014) */ - if (BrowserInfo.get().isIE7()) { - super.setWidth(width); + private static native int getHorizontalBorderAndPaddingWidth(Element elem) + /*-{ + // THIS METHOD IS ONLY USED FOR INTERNET EXPLORER, IT DOESN'T WORK WITH OTHERS + + var convertToPixel = function(elem, value) { + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // Remember the original values + var left = style.left, rsLeft = elem.runtimeStyle.left; + + // Put in the new values to get a computed value out + elem.runtimeStyle.left = elem.currentStyle.left; + style.left = value || 0; + var ret = style.pixelLeft; + + // Revert the changed values + style.left = left; + elem.runtimeStyle.left = rsLeft; + + return ret; + } + + var ret = 0; + + var sides = ["Right","Left"]; + for(var i=0; i<2; i++) { + var side = sides[i]; + var value; + // Border ------------------------------------------------------- + if(elem.currentStyle["border"+side+"Style"] != "none") { + value = elem.currentStyle["border"+side+"Width"]; + if ( !/^\d+(px)?$/i.test( value ) && /^\d/.test( value ) ) { + ret += convertToPixel(elem, value); + } else if(value.length > 2) { + ret += parseInt(value.substr(0, value.length-2)); + } + } + + // Padding ------------------------------------------------------- + value = elem.currentStyle["padding"+side]; + if ( !/^\d+(px)?$/i.test( value ) && /^\d/.test( value ) ) { + ret += convertToPixel(elem, value); + } else if(value.length > 2) { + ret += parseInt(value.substr(0, value.length-2)); + } } - } + + return ret; + }-*/; } diff --git a/src/com/vaadin/terminal/gwt/client/ui/VCalendarPanel.java b/src/com/vaadin/terminal/gwt/client/ui/VCalendarPanel.java index 8d688c2ed9..f1f640653e 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VCalendarPanel.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VCalendarPanel.java @@ -394,7 +394,8 @@ public class VCalendarPanel extends FlexTable implements MouseListener { processClickEvent(sender, true); } - private class VEventButton extends VButton implements SourcesMouseEvents { + private class VEventButton extends VNativeButton implements + SourcesMouseEvents { private MouseListenerCollection mouseListeners; @@ -404,6 +405,7 @@ public class VCalendarPanel extends FlexTable implements MouseListener { | Event.MOUSEEVENTS); } + @Override public void addMouseListener(MouseListener listener) { if (mouseListeners == null) { mouseListeners = new MouseListenerCollection(); @@ -411,6 +413,7 @@ public class VCalendarPanel extends FlexTable implements MouseListener { mouseListeners.add(listener); } + @Override public void removeMouseListener(MouseListener listener) { if (mouseListeners != null) { mouseListeners.remove(listener); diff --git a/src/com/vaadin/terminal/gwt/client/ui/VNativeButton.java b/src/com/vaadin/terminal/gwt/client/ui/VNativeButton.java new file mode 100644 index 0000000000..e544e1f9ce --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/ui/VNativeButton.java @@ -0,0 +1,182 @@ +/* +@ITMillApache2LicenseForJavaFiles@ + */ + +package com.vaadin.terminal.gwt.client.ui; + +import com.google.gwt.dom.client.Element; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.DeferredCommand; +import com.google.gwt.user.client.Event; +import com.google.gwt.user.client.ui.Button; +import com.vaadin.terminal.gwt.client.ApplicationConnection; +import com.vaadin.terminal.gwt.client.BrowserInfo; +import com.vaadin.terminal.gwt.client.Paintable; +import com.vaadin.terminal.gwt.client.UIDL; +import com.vaadin.terminal.gwt.client.Util; +import com.vaadin.terminal.gwt.client.VTooltip; + +public class VNativeButton extends Button implements Paintable { + + public static final String CLASSNAME = "v-nativebutton"; + + protected String width = null; + + protected String id; + + protected ApplicationConnection client; + + protected Element errorIndicatorElement; + + protected final Element captionElement = DOM.createSpan(); + + protected Icon icon; + + /** + * Helper flag to handle special-case where the button is moved from under + * mouse while clicking it. In this case mouse leaves the button without + * moving. + */ + private boolean clickPending; + + public VNativeButton() { + setStyleName(CLASSNAME); + + getElement().appendChild(captionElement); + captionElement.setClassName(getStyleName() + "-caption"); + + addClickHandler(new ClickHandler() { + public void onClick(ClickEvent event) { + if (id == null || client == null) { + return; + } + if (BrowserInfo.get().isSafari()) { + VNativeButton.this.setFocus(true); + } + client.updateVariable(id, "state", true, true); + clickPending = false; + } + }); + sinkEvents(VTooltip.TOOLTIP_EVENTS); + sinkEvents(Event.ONMOUSEDOWN); + sinkEvents(Event.ONMOUSEUP); + } + + public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { + + // Ensure correct implementation, + // but don't let container manage caption etc. + if (client.updateComponent(this, uidl, false)) { + return; + } + + // Save details + this.client = client; + id = uidl.getId(); + + // Set text + setText(uidl.getStringAttribute("caption")); + + // handle error + if (uidl.hasAttribute("error")) { + if (errorIndicatorElement == null) { + errorIndicatorElement = DOM.createSpan(); + errorIndicatorElement.setClassName("v-errorindicator"); + } + getElement().insertBefore(errorIndicatorElement, captionElement); + + // Fix for IE6, IE7 + if (BrowserInfo.get().isIE()) { + errorIndicatorElement.setInnerText(" "); + } + + } else if (errorIndicatorElement != null) { + getElement().removeChild(errorIndicatorElement); + errorIndicatorElement = null; + } + + if (uidl.hasAttribute("icon")) { + if (icon == null) { + icon = new Icon(client); + getElement().insertBefore(icon.getElement(), captionElement); + } + icon.setUri(uidl.getStringAttribute("icon")); + } else { + if (icon != null) { + getElement().removeChild(icon.getElement()); + icon = null; + } + } + + if (BrowserInfo.get().isIE7()) { + /* + * Workaround for IE7 size calculation issues. Deferred because of + * issues with a button with an icon using the reindeer theme + */ + if (width.equals("")) { + DeferredCommand.addCommand(new Command() { + + public void execute() { + setWidth(""); + setWidth(getOffsetWidth() + "px"); + } + }); + } + } + } + + @Override + public void setText(String text) { + captionElement.setInnerText(text); + } + + @Override + public void onBrowserEvent(Event event) { + super.onBrowserEvent(event); + + if (DOM.eventGetType(event) == Event.ONLOAD) { + Util.notifyParentOfSizeChange(this, true); + + } else if (DOM.eventGetType(event) == Event.ONMOUSEDOWN + && event.getButton() == Event.BUTTON_LEFT) { + clickPending = true; + } else if (DOM.eventGetType(event) == Event.ONMOUSEMOVE) { + clickPending = false; + } else if (DOM.eventGetType(event) == Event.ONMOUSEOUT) { + if (clickPending) { + click(); + } + clickPending = false; + } + + if (client != null) { + client.handleTooltipEvent(event, this); + } + } + + @Override + public void setWidth(String width) { + /* Workaround for IE7 button size part 1 (#2014) */ + if (BrowserInfo.get().isIE7() && this.width != null) { + if (this.width.equals(width)) { + return; + } + + if (width == null) { + width = ""; + } + } + + this.width = width; + super.setWidth(width); + + /* Workaround for IE7 button size part 2 (#2014) */ + if (BrowserInfo.get().isIE7()) { + super.setWidth(width); + } + } + +} diff --git a/src/com/vaadin/terminal/gwt/client/ui/VOptionGroupBase.java b/src/com/vaadin/terminal/gwt/client/ui/VOptionGroupBase.java index d10bcc6cfa..4d4ba4e579 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VOptionGroupBase.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VOptionGroupBase.java @@ -58,7 +58,7 @@ abstract class VOptionGroupBase extends Composite implements Paintable, Field, private VTextField newItemField; - private VButton newItemButton; + private VNativeButton newItemButton; public VOptionGroupBase(String classname) { container = new FlowPanel(); @@ -155,7 +155,7 @@ abstract class VOptionGroupBase extends Composite implements Paintable, Field, if (uidl.getBooleanAttribute("allownewitem")) { if (newItemField == null) { - newItemButton = new VButton(); + newItemButton = new VNativeButton(); newItemButton.setText("+"); newItemButton.addClickListener(this); newItemField = new VTextField(); diff --git a/src/com/vaadin/tests/themes/ButtonsTest.java b/src/com/vaadin/tests/themes/ButtonsTest.java new file mode 100644 index 0000000000..9ad2a9f39e --- /dev/null +++ b/src/com/vaadin/tests/themes/ButtonsTest.java @@ -0,0 +1,158 @@ +package com.vaadin.tests.themes; + +import com.vaadin.terminal.ThemeResource; +import com.vaadin.terminal.UserError; +import com.vaadin.ui.Button; +import com.vaadin.ui.CheckBox; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Layout; +import com.vaadin.ui.NativeButton; +import com.vaadin.ui.Window; +import com.vaadin.ui.Button.ClickEvent; + +@SuppressWarnings("serial") +public class ButtonsTest extends com.vaadin.Application { + + final Window main = new Window("Button states & themes"); + + CheckBox styleToggle; + CheckBox iconToggle; + CheckBox nativeToggle; + CheckBox themeToggle; + boolean largeIcons = false; + boolean nativeButtons = false; + + final HorizontalLayout toggles = new HorizontalLayout(); + + @Override + public void init() { + setMainWindow(main); + setTheme("reindeer"); + + themeToggle = new CheckBox("Runo theme", new Button.ClickListener() { + public void buttonClick(ClickEvent event) { + if (getTheme() == "reindeer") { + setTheme("runo"); + } else { + setTheme("reindeer"); + } + } + }); + themeToggle.setStyleName("small"); + themeToggle.setImmediate(true); + + styleToggle = new CheckBox("Black style", new Button.ClickListener() { + public void buttonClick(ClickEvent event) { + if (!main.getContent().getStyleName().contains("black")) { + main.getContent().setStyleName("black"); + } else { + main.getContent().setStyleName(""); + } + } + }); + styleToggle.setImmediate(true); + styleToggle.setStyleName("small"); + + iconToggle = new CheckBox("64x icons", new Button.ClickListener() { + public void buttonClick(ClickEvent event) { + largeIcons = !largeIcons; + recreateAll(); + } + }); + iconToggle.setImmediate(true); + iconToggle.setStyleName("small"); + + nativeToggle = new CheckBox("Native buttons", + new Button.ClickListener() { + public void buttonClick(ClickEvent event) { + nativeButtons = !nativeButtons; + recreateAll(); + } + }); + nativeToggle.setImmediate(true); + nativeToggle.setStyleName("small"); + + toggles.setSpacing(true); + toggles.addComponent(themeToggle); + toggles.addComponent(styleToggle); + toggles.addComponent(iconToggle); + toggles.addComponent(nativeToggle); + main.addComponent(toggles); + + recreateAll(); + + } + + private void recreateAll() { + main.removeAllComponents(); + main.addComponent(toggles); + + main.addComponent(buildButtons(false, false, false, false)); + main.addComponent(buildButtons(false, false, true, false)); + main.addComponent(buildButtons(false, true, false, false)); + main.addComponent(buildButtons(false, true, true, false)); + main.addComponent(buildButtons(true, false, false, false)); + main.addComponent(buildButtons(true, false, true, false)); + main.addComponent(buildButtons(true, true, false, false)); + main.addComponent(buildButtons(true, true, true, false)); + + main.addComponent(buildButtons(false, false, false, true)); + main.addComponent(buildButtons(false, false, true, true)); + main.addComponent(buildButtons(false, true, false, true)); + main.addComponent(buildButtons(false, true, true, true)); + main.addComponent(buildButtons(true, false, false, true)); + main.addComponent(buildButtons(true, false, true, true)); + main.addComponent(buildButtons(true, true, false, true)); + main.addComponent(buildButtons(true, true, true, true)); + + final Button b = new Button("Tabindex"); + b.setTabIndex(1); + main.addComponent(b); + + Button c = new Button("toggle enabled", new Button.ClickListener() { + public void buttonClick(ClickEvent event) { + b.setEnabled(!b.isEnabled()); + } + }); + main.addComponent(c); + } + + private Layout buildButtons(boolean disabled, boolean icon, boolean error, + boolean sized) { + + String[] buttonStyles = new String[] { "Normal", "Primary", "Small", + "Link" }; + + HorizontalLayout hl = new HorizontalLayout(); + hl.setSpacing(true); + hl.setMargin(true); + + for (int i = 0; i < buttonStyles.length; i++) { + Button b; + if (nativeButtons) { + b = new NativeButton(buttonStyles[i] + " style"); + } else { + b = new Button(buttonStyles[i] + " style"); + } + b.setStyleName(buttonStyles[i].toLowerCase()); + if (icon) { + b.setIcon(new ThemeResource("../runo/icons/" + + (largeIcons ? "64" : "16") + "/document.png")); + } + if (error) { + b.setComponentError(new UserError("Error")); + } + if (disabled) { + b.setEnabled(false); + } + if (sized) { + b.setWidth("250px"); + b.setCaption(b.getCaption() + " (250px)"); + } + hl.addComponent(b); + } + + return hl; + } + +} \ No newline at end of file diff --git a/src/com/vaadin/tests/themes/ReindeerButtonsTest.java b/src/com/vaadin/tests/themes/ReindeerButtonsTest.java deleted file mode 100644 index 952b7ffd1c..0000000000 --- a/src/com/vaadin/tests/themes/ReindeerButtonsTest.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.vaadin.tests.themes; - -import com.vaadin.terminal.ThemeResource; -import com.vaadin.terminal.UserError; -import com.vaadin.ui.Button; -import com.vaadin.ui.HorizontalLayout; -import com.vaadin.ui.Layout; -import com.vaadin.ui.Window; -import com.vaadin.ui.Button.ClickEvent; - -@SuppressWarnings("serial") -public class ReindeerButtonsTest extends com.vaadin.Application { - - final Window main = new Window("Reindeer buttons"); - - @Override - public void init() { - setMainWindow(main); - setTheme("reindeer"); - - Button toggle = new Button("Toggle black style", - new Button.ClickListener() { - public void buttonClick(ClickEvent event) { - if (!main.getContent().getStyleName().contains("black")) { - main.getContent().setStyleName("black"); - } else { - main.getContent().setStyleName(""); - } - } - }); - main.addComponent(toggle); - - main.addComponent(buildButtons(false, false, false, false)); - main.addComponent(buildButtons(false, false, true, false)); - main.addComponent(buildButtons(false, true, false, false)); - main.addComponent(buildButtons(false, true, true, false)); - main.addComponent(buildButtons(true, false, false, false)); - main.addComponent(buildButtons(true, false, true, false)); - main.addComponent(buildButtons(true, true, false, false)); - main.addComponent(buildButtons(true, true, true, false)); - - main.addComponent(buildButtons(false, false, false, true)); - main.addComponent(buildButtons(false, false, true, true)); - main.addComponent(buildButtons(false, true, false, true)); - main.addComponent(buildButtons(false, true, true, true)); - main.addComponent(buildButtons(true, false, false, true)); - main.addComponent(buildButtons(true, false, true, true)); - main.addComponent(buildButtons(true, true, false, true)); - main.addComponent(buildButtons(true, true, true, true)); - } - - private Layout buildButtons(boolean disabled, boolean icon, boolean error, - boolean sized) { - - String[] buttonStyles = new String[] { "", "primary", "small", "link" }; - - HorizontalLayout hl = new HorizontalLayout(); - hl.setSpacing(true); - hl.setMargin(true); - - for (int i = 0; i < buttonStyles.length; i++) { - Button b = new Button(buttonStyles[i] + " style"); - b.setStyleName(buttonStyles[i]); - if (icon) { - b.setIcon(new ThemeResource("../runo/icons/16/document.png")); - } - if (error) { - b.setComponentError(new UserError("Error")); - } - if (disabled) { - b.setEnabled(false); - } - if (sized) { - b.setWidth("150px"); - } - hl.addComponent(b); - } - - return hl; - } - -} \ No newline at end of file diff --git a/src/com/vaadin/ui/Button.java b/src/com/vaadin/ui/Button.java index df40aeb018..e4ca734d34 100644 --- a/src/com/vaadin/ui/Button.java +++ b/src/com/vaadin/ui/Button.java @@ -28,8 +28,6 @@ public class Button extends AbstractField { boolean switchMode = false; - private String primaryStyleName; - /** * Creates a new push button. The value of the push button is false and it * is immediate by default. @@ -137,9 +135,6 @@ public class Button extends AbstractField { public void paintContent(PaintTarget target) throws PaintException { super.paintContent(target); - if (primaryStyleName != null) { - target.addAttribute("primarystyle", primaryStyleName); - } if (isSwitchMode()) { target.addAttribute("type", "switch"); } @@ -352,33 +347,4 @@ public class Button extends AbstractField { super.setInternalValue(newValue); } - /** - * - * EXPERIMENTAL FEATURE Use with caution, the method signature - * might change in following releases. - *

- * Sets the components primary style name. - *

- * The primary style name is usually used on the client-side as the prefix - * for widget CSS classnames (this depends on the terminal implementation). - * The default primary styles are usually prefixed with Vaadin proprietary - * "v-" string, e.g. the primary style name for a default Vaadin button is - * "v-button". - *

- * With this method, you can change the primary style name to "mybutton", - * and then on the client-side you would have "mybutton" as the CSS - * classname. After that, all other style names you set for the component - * will be prefixed with the new primary style name, i.e. setting an - * additional style name "red" for the same button would result in a CSS - * classname "mybutton-red" on the client-side. - */ - public void setPrimaryStyleName(String primary) { - primaryStyleName = primary; - requestRepaint(); - } - - public String getPrimaryStyleName() { - return primaryStyleName; - } - } diff --git a/src/com/vaadin/ui/NativeButton.java b/src/com/vaadin/ui/NativeButton.java new file mode 100644 index 0000000000..4df771d054 --- /dev/null +++ b/src/com/vaadin/ui/NativeButton.java @@ -0,0 +1,51 @@ +package com.vaadin.ui; + +import com.vaadin.data.Property; + +@SuppressWarnings("serial") +public class NativeButton extends Button { + + public NativeButton() { + super(); + } + + public NativeButton(String caption) { + super(caption); + } + + public NativeButton(String caption, ClickListener listener) { + super(caption, listener); + } + + public NativeButton(String caption, Object target, String methodName) { + super(caption, target, methodName); + } + + /** + * Creates a new switch button with initial value. + * + * @param state + * the Initial state of the switch-button. + * @param initialState + */ + public NativeButton(String caption, boolean initialState) { + super(caption, initialState); + } + + /** + * Creates a new switch button that is connected to a boolean property. + * + * @param state + * the Initial state of the switch-button. + * @param dataSource + */ + public NativeButton(String caption, Property dataSource) { + super(caption, dataSource); + } + + @Override + public String getTag() { + return "nativebutton"; + } + +} \ No newline at end of file -- 2.39.5