diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/InstitutionalAuthenticationEntryPoint.java b/src/main/java/ch/ethz/seb/sebserver/gui/InstitutionalAuthenticationEntryPoint.java index 5926f635..73b8afea 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/InstitutionalAuthenticationEntryPoint.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/InstitutionalAuthenticationEntryPoint.java @@ -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 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; + } + } + } \ No newline at end of file diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/RAPConfiguration.java b/src/main/java/ch/ethz/seb/sebserver/gui/RAPConfiguration.java index 619d03d2..4841093e 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/RAPConfiguration.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/RAPConfiguration.java @@ -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 properties = new HashMap<>(); properties.put(WebClient.PAGE_TITLE, "SEB Server"); properties.put(WebClient.BODY_HTML, "Loading Application"); + 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); diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/widget/WidgetFactory.java b/src/main/java/ch/ethz/seb/sebserver/gui/widget/WidgetFactory.java index ac6006d2..beb3d8be 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/widget/WidgetFactory.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/widget/WidgetFactory.java @@ -107,7 +107,6 @@ public class WidgetFactory { return new Image(device, this.image); } - } public enum CustomVariant { diff --git a/src/main/resources/static/css/sms.css b/src/main/resources/static/css/sms.css new file mode 100644 index 00000000..e774b541 --- /dev/null +++ b/src/main/resources/static/css/sms.css @@ -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; +} + + + + + +