trying to make theme customizable

This commit is contained in:
anhefti 2019-08-14 08:11:01 +02:00
parent 39dde1d9a7
commit 8cb4c22cc8
4 changed files with 898 additions and 25 deletions

View file

@ -9,6 +9,8 @@
package ch.ethz.seb.sebserver.gui;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
@ -16,6 +18,9 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.rap.rwt.client.WebClient;
import org.eclipse.rap.rwt.internal.application.ApplicationContextImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
@ -31,6 +36,7 @@ import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import ch.ethz.seb.sebserver.gbl.api.API;
import ch.ethz.seb.sebserver.gui.RAPConfiguration.RAPSpringEntryPointFactory;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.auth.WebserviceURIService;
@Lazy
@ -59,24 +65,38 @@ final class InstitutionalAuthenticationEntryPoint implements AuthenticationEntry
final HttpServletResponse response,
final AuthenticationException authException) throws IOException, ServletException {
final String requestURI = request.getRequestURI();
final String institutionalEndpoint = extractInstitutionalEndpoint(request);
log.info("No default gui entrypoint requested: {}", requestURI);
log.info("No default gui entrypoint requested: {}", institutionalEndpoint);
final String logoImageBase64 = requestLogoImage(requestURI);
final String logoImageBase64 = requestLogoImage(institutionalEndpoint);
if (StringUtils.isNotBlank(logoImageBase64)) {
request.getSession().setAttribute(API.PARAM_LOGO_IMAGE, logoImageBase64);
request.getSession().setAttribute("themeId", "sms");
forwardToEntryPoint(request, response, this.guiEntryPoint);
} else {
request.getSession().removeAttribute(API.PARAM_LOGO_IMAGE);
response.setStatus(HttpStatus.UNAUTHORIZED.value());
forwardToEntryPoint(request, response, this.guiEntryPoint);
}
final RequestDispatcher dispatcher = request.getServletContext()
.getRequestDispatcher(this.guiEntryPoint);
}
private void forwardToEntryPoint(
final HttpServletRequest request,
final HttpServletResponse response,
final String entryPoint) throws ServletException, IOException {
final RequestDispatcher dispatcher = request
.getServletContext()
.getRequestDispatcher(entryPoint);
dispatcher.forward(request, response);
}
private String requestLogoImage(final String requestURI) {
private String extractInstitutionalEndpoint(final HttpServletRequest request) {
final String requestURI = request.getRequestURI();
log.debug("Trying to verify insitution from requested entrypoint url: {}", requestURI);
final String instPrefix = requestURI.replaceAll("/", "");
@ -84,6 +104,14 @@ final class InstitutionalAuthenticationEntryPoint implements AuthenticationEntry
return null;
}
return instPrefix;
}
private String requestLogoImage(final String institutionalEndpoint) {
if (StringUtils.isBlank(institutionalEndpoint)) {
return null;
}
try {
final RestTemplate restTemplate = new RestTemplate();
@ -97,18 +125,39 @@ final class InstitutionalAuthenticationEntryPoint implements AuthenticationEntry
HttpMethod.GET,
HttpEntity.EMPTY,
String.class,
instPrefix);
institutionalEndpoint);
if (exchange.getStatusCodeValue() == HttpStatus.OK.value()) {
return exchange.getBody();
} else {
log.error("Failed to verify insitution from requested entrypoint url: {}, response: {}", requestURI,
log.error("Failed to verify insitution from requested entrypoint url: {}, response: {}",
institutionalEndpoint,
exchange);
}
} catch (final Exception e) {
log.error("Failed to verify insitution from requested entrypoint url: {}", requestURI, e);
log.error("Failed to verify insitution from requested entrypoint url: {}",
institutionalEndpoint,
e);
}
return null;
}
private boolean initInstitutionalBasedThemeEntryPoint(final String institutionalEndpoint) {
try {
final ApplicationContextImpl appContext = (ApplicationContextImpl) RWT.getApplicationContext();
final Map<String, String> properties = new HashMap<>();
properties.put(WebClient.THEME_ID, "sms");
appContext.getEntryPointManager().register(
institutionalEndpoint,
new RAPSpringEntryPointFactory(),
properties);
return true;
} catch (final Exception e) {
log.warn("Failed to dynamically set entry point for institution: {}", institutionalEndpoint, e);
return false;
}
}
}

View file

@ -21,6 +21,7 @@ import org.eclipse.rap.rwt.application.ApplicationConfiguration;
import org.eclipse.rap.rwt.application.EntryPoint;
import org.eclipse.rap.rwt.application.EntryPointFactory;
import org.eclipse.rap.rwt.client.WebClient;
import org.eclipse.rap.rwt.internal.theme.ThemeUtil;
import org.eclipse.rap.rwt.service.ServiceManager;
import org.eclipse.swt.widgets.Composite;
import org.slf4j.Logger;
@ -34,20 +35,26 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.auth.SEBServerAuthori
public class RAPConfiguration implements ApplicationConfiguration {
private static final String DEFAULT_THEME_NAME = "sebserver";
private static final Logger log = LoggerFactory.getLogger(RAPConfiguration.class);
@Override
public void configure(final Application application) {
try {
// TODO get file path from properties
//application.addStyleSheet(RWT.DEFAULT_THEME_ID, "static/css/sebserver.css");
application.addStyleSheet(DEFAULT_THEME_NAME, "resource/theme/default.css");
application.addStyleSheet(DEFAULT_THEME_NAME, "static/css/sebserver.css");
application.addStyleSheet("sms", "resource/theme/default.css");
application.addStyleSheet("sms", "static/css/sms.css");
final Map<String, String> properties = new HashMap<>();
properties.put(WebClient.PAGE_TITLE, "SEB Server");
properties.put(WebClient.BODY_HTML, "<big>Loading Application<big>");
properties.put(WebClient.THEME_ID, DEFAULT_THEME_NAME);
// properties.put(WebClient.FAVICON, "icons/favicon.png");
application.addEntryPoint("/gui", RAPSpringEntryPointFactory, properties);
// TODO get file path from properties
application.addStyleSheet(RWT.DEFAULT_THEME_ID, "static/css/sebserver.css");
application.addEntryPoint("/gui", new RAPSpringEntryPointFactory(), properties);
} catch (final RuntimeException re) {
throw re;
@ -63,12 +70,13 @@ public class RAPConfiguration implements ApplicationConfiguration {
void loadMainPage(final Composite parent);
}
private static final EntryPointFactory RAPSpringEntryPointFactory = new EntryPointFactory() {
public static final class RAPSpringEntryPointFactory implements EntryPointFactory {
private boolean serviceInistialized = false;
private boolean initialized = false;
@Override
public EntryPoint create() {
return new AbstractEntryPoint() {
private static final long serialVersionUID = -1299125117752916270L;
@ -86,6 +94,15 @@ public class RAPConfiguration implements ApplicationConfiguration {
"HttpSession not available from RWT.getUISession().getHttpSession()");
}
final Object themeId = httpSession.getAttribute("themeId");
if (themeId != null) {
ThemeUtil.setCurrentThemeId(RWT.getUISession(parent.getDisplay()), String.valueOf(themeId));
parent.redraw();
parent.layout(true);
parent.redraw();
}
final WebApplicationContext webApplicationContext = getWebApplicationContext(httpSession);
initSpringBasedRAPServices(webApplicationContext);
@ -98,16 +115,19 @@ public class RAPConfiguration implements ApplicationConfiguration {
entryPointService.loadLoginPage(parent);
}
}
};
}
private void initSpringBasedRAPServices(final WebApplicationContext webApplicationContext) {
if (!this.serviceInistialized) {
final ServiceManager manager = RWT.getServiceManager();
final DownloadService downloadService = webApplicationContext.getBean(DownloadService.class);
manager.registerServiceHandler(DownloadService.DOWNLOAD_SERVICE_NAME, downloadService);
this.serviceInistialized = true;
if (!this.initialized) {
try {
final ServiceManager manager = RWT.getServiceManager();
final DownloadService downloadService = webApplicationContext.getBean(DownloadService.class);
manager.registerServiceHandler(DownloadService.DOWNLOAD_SERVICE_NAME, downloadService);
this.initialized = true;
} catch (final IllegalArgumentException iae) {
log.warn("Failed to register DownloadService on ServiceManager. Already registered: ", iae);
}
}
}
@ -128,8 +148,8 @@ public class RAPConfiguration implements ApplicationConfiguration {
log.debug("Initialize Spring-Context on Servlet-Context: " + servletContext);
return WebApplicationContextUtils.getRequiredWebApplicationContext(
servletContext);
return WebApplicationContextUtils
.getRequiredWebApplicationContext(servletContext);
} catch (final Exception e) {
log.error("Failed to initialize Spring-Context on HttpSession: " + httpSession);

View file

@ -107,7 +107,6 @@ public class WidgetFactory {
return new Image(device, this.image);
}
}
public enum CustomVariant {

View file

@ -0,0 +1,805 @@
* {
color: #000000;
font: normal 12px Arial, Helvetica, sans-serif;
background-image: none;
background-color: #FFFFFF;
padding: 0;
}
*:disabled {
color: #CFCFCF;
}
/* Label default theme */
Label {
font: 12px Arial, Helvetica, sans-serif;
color: #4a4a4a;
background-color: transparent;
background-image: none;
background-repeat: repeat;
background-position: left top;
border: none;
border-radius: 0;
text-decoration: none;
cursor: default;
opacity: 1;
text-shadow: none;
padding: 0px 0px 0px 0px;
}
Label.head {
font: bold 12px Arial, Helvetica, sans-serif;
padding: 0px 0px 0px 0px;
}
Label.form-center {
padding: 5px 0px 0px 0px;
}
Label.action {
font: 12px Arial, Helvetica, sans-serif;
color: #C50509;
background-color: transparent;
background-image: none;
background-repeat: repeat;
background-position: left top;
border: none;
border-radius: 0;
text-decoration: none;
cursor: default;
opacity: 1;
text-shadow: none;
}
Label.h1 {
font: 25px Arial, Helvetica, sans-serif;
height: 28px;
padding: 0px 12px 6px 12px;
color: #1f407a;
}
Label.h2 {
font: 19px Arial, Helvetica, sans-serif;
height: 22px;
padding: 0 0 6px 0;
color: #1f407a;
}
Label.h3 {
font: bold 14px Arial, Helvetica, sans-serif;
height: 20px;
padding: 0;
color: #1f407a;
}
Label.error {
font: 10px Arial, Helvetica, sans-serif;
color: #aa0000;
}
Label:hover.imageButton {
background-color: transparent;
background-repeat: no-repeat;
}
Label.selection {
padding: 4px 6px 3px 6px;
}
Label:hover.selection {
color: #4a4a4a;
background-color: #b5b5b5;
background-image: gradient(linear, left top, left bottom, from(#b5b5b5),to(#b5b5b5));
padding: 4px 6px 3px 6px;
}
Label.selected {
color: #4a4a4a;
background-color: #c5c5c5;
background-image: gradient(linear, left top, left bottom, from(#c5c5c5),to(#c5c5c5));
padding: 4px 6px 3px 6px;
}
Label-SeparatorLine {
background-image: none;
background-color: transparent;
border: 1px solid #bdbdbd;
border-radius: 0px;
height: 1px;
}
Composite.bordered {
border: 2px;
}
Composite.header {
background-color: #000000;
color: #FFFFFF;
}
Composite.logo {
background-color: #1F407A;
}
Composite.bgLogo {
background-color: #1F407A;
background-image: url(static/images/ethz_logo_white.png);
background-repeat: no-repeat;
background-position: left center;
}
Composite.bgLogoNoImage {
background-color: transparent;
background-repeat: no-repeat;
background-position: left center;
}
Composite.bgContent {
background-color: #EAECEE;
background-image: url(static/images/blueBackground.png);
background-repeat: repeat-x;
}
Composite.content {
background-color: #FFFFFF;
margin: 0 0 0 0;
}
Composite.actionPane {
background-color: #D3D9DB;
}
Composite.bgFooter {
background-color: #EAECEE;
}
Composite.footer {
background-color: #1F407A;
}
Composite.login {
background-color: #EAECEE;
margin: 20px 0 0 0;
padding: 15px 8px 8px 8px;
border: 1px solid #bdbdbd;
border-radius: 2px;
}
Composite.error {
border: 1px solid #aa0000;
border-radius: 1px;
}
*.header {
font: bold 12px Arial, Helvetica, sans-serif;
color: #FFFFFF;
background-color: transparent;
}
*.footer {
font: bold 12px Arial, Helvetica, sans-serif;
color: #FFFFFF;
background-color: transparent;
}
/* Group default theme */
Group {
font: 10px Arial, Helvetica, sans-serif;
color: #4a4a4a;
background-color: #ffffff;
border: none;
}
Group-Frame {
margin: 10px 0 0 0;
padding: 10px 0px 0px 0px;
border: 1px solid #bdbdbd;
border-radius: 2px;
}
Group-Label {
padding: 2px 10px 2px 10px;
background-color: #ffffff;
background-image: none;
background-repeat: repeat;
background-position: left top;
border: 0px solid #bdbdbd;
border-radius: 0px;
color: inherit;
margin: 0px 0px 0px 10px;
text-shadow: none;
}
/* Text default */
Text {
font: 12px Arial, Helvetica, sans-serif;
border: none;
border-radius: 0;
padding: 3px 10px 3px 10px;
color: #4a4a4a;
background-repeat: repeat;
background-position: left top;
background-color: #ffffff;
background-image: none;
text-shadow: none;
box-shadow: none;
}
Text.error {
border: 1px solid #aa0000;
}
Text[BORDER], Text[MULTI][BORDER] {
border: 1px solid #aaaaaa;
border-radius: 0;
box-shadow: none;
}
Text[BORDER].error, Text[MULTI][BORDER].error {
border: 1px solid #aa0000;
border-radius: 0;
box-shadow: none;
}
Text[BORDER]:focused, Text[MULTI][BORDER]:focused {
border: 1px solid #4f7cb1;
box-shadow: none;
}
Text:disabled,
Text:read-only,
Text[BORDER]:disabled,
Text[BORDER]:read-only,
Text[MULTI]:disabled,
Text[MULTI]:read-only,
Text[MULTI][BORDER]:disabled,
Text[MULTI][BORDER]:read-only {
box-shadow: none;
background-color: #ffffff;
border: none;
border-radius: 0;
color: #4a4a4a;
padding: 0px 0px 0px 0px;
}
/* Combo default theme */
Combo, Combo[BORDER] {
font: 12px Arial, Helvetica, sans-serif;
color: #4a4a4a;
background-color: #ffffff;
border: 1px solid #aaaaaa;
border-radius: 0 2px 2px 0;
background-image: none;
text-shadow: none;
box-shadow: none;
}
Combo:focused, Combo[BORDER]:focused {
text-shadow: none;
box-shadow: none;
}
Combo:disabled, Combo[BORDER]:disabled {
text-shadow: none;
box-shadow: none;
}
Combo-Button {
cursor: default;
background-color: #ffffff;
background-image: gradient(linear, left top, left bottom, from(#ffffff), to(#ffffff));
border: none;
width: 20px;
}
Combo-Field {
padding: 3px 0px 1px 10px;
}
Combo.error, , Combo[BORDER].error {
border: 1px solid #aa0000;
border-radius: 0 2px 2px 0;
}
/* DateTime default theme */
DateTime, DateTime[BORDER] {
font: 12px Arial, Helvetica, sans-serif;
color: #4a4a4a;
background-color: #ffffff;
border: 1px solid #aaaaaa;
border-radius: 0 2px 2px 0;
background-image: none;
text-shadow: none;
box-shadow: none;
}
DateTime, DateTime[BORDER]:focused {
text-shadow: none;
box-shadow: none;
}
DateTime-Field, DateTime-Field[BORDER] {
font: 12px Arial, Helvetica, sans-serif;
color: #4a4a4a;
background-color: #ffffff;
padding: 3px 10px 2px 10px;
text-shadow: none;
box-shadow: none;
}
DateTime-UpButton {
cursor: default;
background-color: #ffffff;
background-image: gradient(linear, left top, left bottom, from(#ffffff), to(#ffffff));
border: none;
width: 30px;
}
DateTime-DownButton {
cursor: default;
background-color: #ffffff;
background-image: gradient(linear, left top, left bottom, from(#ffffff), to(#ffffff));
border: none;
width: 30px;
}
DateTime-DropDownButton {
cursor: default;
background-color: #ffffff;
background-image: gradient(linear, left top, left bottom, from(#ffffff), to(#ffffff));
border: none;
width: 30px;
}
/* Message titlebar */
Shell.message {
animation: none;
border: 1px solid #bdbdbd;
background-color: #ffffff;
background-image: none;
padding: 0px;
opacity: 1;
box-shadow: none;
width: 400px;
}
Shell-Titlebar.message {
background-color: #1f407a;
background-gradient-color: #1f407a;
color: white;
background-image: gradient( linear, left top, left bottom, from( #1f407a ), to( #1f407a ) );
padding: 2px 5px 2px;
margin: 0px;
height: 22px;
font: 14px Arial, Helvetica, sans-serif;
border: none;
border-radius: 1px 1px 0px 0px;
text-shadow: none;
}
Shell-CloseButton:hover.message {
background-color: #C50509;
background-gradient-color: #C50509;
background-image: gradient( linear, left top, left bottom, from( #C50509 ), to( #C50509 ) );
}
Button {
font: 12px Arial, Helvetica, sans-serif;
padding: 5px 6px 5px 6px;
}
/* Push Buttons */
Button[PUSH],
Button[PUSH]:default {
font: bold 12px Arial, Helvetica, sans-serif;
background-color: #0069B4;
background-gradient-color: #0069B4;
background-image: gradient( linear, left top, left bottom, from( #0069B4 ), to( #0069B4 ) );
color: #fff;
border: none;
border-radius: 0px;
padding: 6px 15px;
text-shadow: none;
}
Button[PUSH]:pressed {
background-color: #444;
color: #fff;
background-gradient-color: #444;
background-image: gradient( linear, left top, left bottom, from( #444 ), to( #444 ) );
}
Button[PUSH]:hover {
background-color: #C50509;
background-gradient-color: #C50509;
background-image: gradient( linear, left top, left bottom, from( #C50509 ), to( #C50509 ) );
color: #444;
cursor: pointer;
}
Button[PUSH]:disabled {
background-color: transparent;
border: 1px solid #EAECEE;
color: #c0c0c0;
background-repeat: no-repeat;
background-position: right;
}
Button-FocusIndicator[PUSH][BORDER] {
background-color: transparent;
}
/* Push Buttons header */
Button[PUSH].header,
Button[PUSH]:default.header {
font: bold 12px Arial, Helvetica, sans-serif;
background-color: #595959;
background-gradient-color: #595959;
background-image: gradient( linear, left top, left bottom, from( #595959 ), to( #595959 ) );
color: #fff;
border: none;
border-radius: 0px;
padding: 6px 15px;
text-shadow: none;
}
Button[PUSH]:pressed.header {
background-color: #444;
color: #fff;
background-gradient-color: #444;
background-image: gradient( linear, left top, left bottom, from( #444 ), to( #444 ) );
}
Button[PUSH]:hover.header {
background-color: #C50509;
background-gradient-color: #C50509;
background-image: gradient( linear, left top, left bottom, from( #C50509 ), to( #C50509 ) );
color: #444;
cursor: pointer;
}
FileUpload,
FileUpload:default,
FileUpload:hover,
FileUpload:pressed {
background-color: transparent;
background-gradient-color: transparent;
background-image: gradient( linear, left top, left bottom, from( transparent ), to( transparent ) );
border: none;
border-radius: 0px;
text-shadow: none;
}
/* Sash default */
Sash {
background-image: none;
background-color: transparent;
background-color: #EAECEE;
}
Sash:hover {
background-color: #444444;
}
/*Standard Einstellungen fuer Trees*/
Tree {
font: bold 14px Arial, Helvetica, sans-serif;
background-color: transparent;
border: none;
color: #1f407a;
margin: 0px 0px 0px 0px;
padding: 0px 0px 0px 40px;
}
Tree[BORDER] {
border: 1px solid #eceeef;
}
TreeItem, TreeItem.treesection, Tree-RowOverlay:hover.treesection, Tree-RowOverlay:selected.treesection, Tree-RowOverlay:selected:hover.treesection {
font: bold 14px Arial, Helvetica, sans-serif;
color: #1f407a;
background-color: transparent;
text-decoration: none;
text-shadow: none;
background-image: none;
margin: 20px 20px 20px 20px;
padding: 20px 20px 20px 40px;
}
TreeItem:linesvisible:even {
background-color: #f3f3f4;
}
Tree-RowOverlay {
background-color: transparent;
color: inherit;
background-image: none;
}
Tree-RowOverlay:hover {
background-color: #C50509;
color: #1F407A;
}
Tree-RowOverlay:selected {
background-color: #C50509;
color: #1F407A;
}
Tree-RowOverlay:selected:unfocused {
background-color: #C50509;
color: #1f407a;
}
Tree-RowOverlay:selected:hover {
background-color: #C50509;
color: #000000;
}
Tree.actions {
font: 12px Arial, Helvetica, sans-serif;
color: #4a4a4a;
background-color: transparent;
border: none;
margin: 0 0 0 0;
}
Tree[BORDER].actions {
border: 1px solid #eceeef;
}
TreeItem.actions {
font: 12px Arial, Helvetica, sans-serif;
color: #4a4a4a;
background-color: transparent;
text-decoration: none;
text-shadow: none;
background-image: none;
margin: 0 0 0 0;
}
Tree-RowOverlay:hover.actions {
background-color: #C50509;
color: #4a4a4a;
}
Tree-RowOverlay:selected.actions {
background-color: #595959;
color: #4a4a4a;
}
/* TabFolder default theme */
TabFolder {
font: 12px Arial, Helvetica, sans-serif;
color: #4a4a4a;
border: none;
}
TabFolder-ContentContainer {
border: none;
border-top: 1px solid #bdbdbd;
}
TabItem {
font: 12px Arial, Helvetica, sans-serif;
color: #4a4a4a;
background-color: #FFFFFF;
text-decoration: none;
text-shadow: none;
background-image: none;
margin: 1px 0px 0px 0px;
border: 1px solid #bdbdbd;
border-bottom: none;
border-left: none;
}
TabItem:selected {
background-color: #D3D9DB;
background-gradient-color: #D3D9DB;
background-image: gradient( linear, left top, left bottom, from( #D3D9DB ), to( #D3D9DB ) );
color: #4a4a4a;
margin: 0px 0px 0px 0px;
border: 1px solid #bdbdbd;
border-bottom: none;
border-left: none;
}
TabItem:hover {
background-color: #C50509;
background-gradient-color: #C50509;
background-image: gradient( linear, left top, left bottom, from( #C50509 ), to( #C50509 ) );
color: #4a4a4a;
margin: 1px 0px 0px -1px;
border-left: none;
}
TabItem:selected:hover {
background-color: #C50509;
background-gradient-color: #C50509;
background-image: gradient( linear, left top, left bottom, from( #C50509 ), to( #C50509 ) );
color: #4a4a4a;
margin: 0px 0px 0px 0px;
border-left: none;
}
TabItem:first {
font: 12px Arial, Helvetica, sans-serif;
color: #4a4a4a;
background-color: #FFFFFF;
text-decoration: none;
text-shadow: none;
background-image: none;
margin: 1px 0px 0px -1px;
border: 1px solid #bdbdbd;
border-bottom: none;
}
TabItem:first:hover {
background-color: #C50509;
background-gradient-color: #C50509;
background-image: gradient( linear, left top, left bottom, from( #C50509 ), to( #C50509 ) );
color: #4a4a4a;
margin: 1px 0px 0px -1px;
border-left: none;
}
TabItem:selected:first {
background-color: #D3D9DB;
color: #4a4a4a;
margin: 0px 0px 0px 0px;
border-left: 1px solid #bdbdbd;
}
TabItem:selected:hover:first {
background-color: #C50509;
background-gradient-color: #C50509;
background-image: gradient( linear, left top, left bottom, from( #C50509 ), to( #C50509 ) );
color: #4a4a4a;
margin: 0px 0px 0px 0px;
border-left: 1px solid #bdbdbd;
}
Widget-ToolTip {
padding: 1px 3px 2px 3px;
background-color: #C50509;
border: 1px solid #3C5A0F;
border-radius: 2px 2px 2px 2px;
color: #4a4a4a;
opacity: 1;
animation: fadeIn 200ms linear, fadeOut 600ms ease-out;
box-shadow: 3px 4px 2px rgba(0, 0, 0, 0.3);
text-align: center;
}
Widget-ToolTip-Pointer {
background-image: none;
}
/* Table default theme */
Table {
font: 12px Arial, Helvetica, sans-serif;
background-color: #ffffff;
background-image: none;
color: #4a4a4a;
border: none;
}
Table[BORDER] {
border: 1px solid #bdbdbd;
}
TableColumn {
font: 12px Arial, Helvetica, sans-serif;
background-color: #595959;
background-gradient-color: #595959;
background-image: gradient( linear, left top, left bottom, from( #595959 ), to( #595959 ) );
padding: 4px 3px 4px 3px;
color: #FFFFFF;
border-bottom: 1px solid #bdbdbd;
text-shadow: none;
}
TableColumn:hover {
background-color: #595959;
background-gradient-color: #595959;
background-image: gradient( linear, left top, left bottom, from( #595959 ), to( #595959 ) );
}
TableItem, TableItem:linesvisible:even:rowtemplate {
background-color: transparent;
color: inherit;
text-decoration: none;
text-shadow: none;
background-image: none;
}
TableItem:linesvisible:even {
background-color: #ffffff;
color: inherit;
}
Table-RowOverlay {
background-color: transparent;
color: inherit;
background-image: none;
}
Table-RowOverlay:hover {
color: #4a4a4a;
background-color: #b5b5b5;
background-image: gradient(linear, left top, left bottom, from(#b5b5b5), to(#b5b5b5));
}
Table-RowOverlay:selected {
color: #4a4a4a;
background-color: #c5c5c5;
background-image: gradient(linear, left top, left bottom, from(#c5c5c5),to(#c5c5c5));
}
Table-RowOverlay:selected:unfocused {
color: #4a4a4a;
background-color: #c5c5c5;
background-image: gradient(linear, left top, left bottom, from(#c5c5c5),to(#c5c5c5));
}
Table-RowOverlay:linesvisible:even:hover {
color: #4a4a4a;
background-color: #b5b5b5;
background-image: gradient(linear, left top, left bottom, from(#b5b5b5),to(#b5b5b5));
}
Table-RowOverlay:linesvisible:even:selected {
color: #4a4a4a;
background-color: #c5c5c5;
background-image: gradient(linear, left top, left bottom, from(#c5c5c5),to(#c5c5c5));
}
Table-RowOverlay:linesvisible:even:selected:unfocused {
background-color: #c5c5c5;
background-image: gradient(linear, left top, left bottom, from(#c5c5c5),to(#c5c5c5));
color: #4a4a4a;
}
TableColumn-SortIndicator {
background-image: none;
}
/*
TableColumn-SortIndicator:up {
background-image: url( themes/images/column/sort-indicator-up.png );
}
TableColumn-SortIndicator:down {
background-image: url( themes/images/column/sort-indicator-down.png );
}
*/
Table-Cell {
spacing: 3px;
padding: 5px 3px 5px 3px;
}
Table-GridLine, Table-GridLine:vertical:rowtemplate {
color: transparent;
}
Table-GridLine:vertical, Table-GridLine:header, Table-GridLine:horizontal:rowtemplate {
color: transparent;
}