/******************************************************************************* * Copyright (c) 2009, 2017 Angelo Zerr and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation * IBM Corporation - initial API and implementation * Simon Scholz <simon.scholz@vogella.com> - Bug 513300 *******************************************************************************/ package org.eclipse.e4.ui.css.swt.dom; import org.eclipse.e4.ui.css.core.dom.CSSStylableElement; import org.eclipse.e4.ui.css.core.engine.CSSEngine; import org.eclipse.e4.ui.css.swt.helpers.CSSSWTCursorHelper; import org.eclipse.e4.ui.css.swt.helpers.CSSSWTFontHelper; import org.eclipse.e4.ui.css.swt.properties.GradientBackgroundListener; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusAdapter; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseTrackAdapter; import org.eclipse.swt.events.MouseTrackListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.w3c.dom.Element; import org.w3c.dom.Node; /** * {@link CSSStylableElement} implementation which wrap SWT {@link Control}. * */ public class ControlElement extends WidgetElement { private static final String WEBSITE_CLASS = "org.eclipse.swt.browser.WebSite"; protected boolean hasFocus = false; protected boolean hasMouseHover = false; private FocusListener focusListener = new FocusAdapter() { @Override public void focusGained(FocusEvent e) { ControlElement.this.hasFocus = true; doApplyStyles(); } @Override public void focusLost(FocusEvent e) { ControlElement.this.hasFocus = false; doApplyStyles(); } }; // Create SWT MouseTrack listener private MouseTrackListener mouseHoverListener = new MouseTrackAdapter() { @Override public void mouseEnter(MouseEvent e) { // mouse hover, apply styles // into the SWT control ControlElement.this.hasMouseHover = true; doApplyStyles(); } @Override public void mouseExit(MouseEvent e) { // mouse hover, apply styles ControlElement.this.hasMouseHover = false; doApplyStyles(); } }; public ControlElement(Control control, CSSEngine engine) { super(control, engine); } @Override public void initialize() { super.initialize(); if (!dynamicEnabled) { return; } Control control = getControl(); // Add focus listener control.addFocusListener(focusListener); // Add mouse track listener control.addMouseTrackListener(mouseHoverListener); } @Override public void dispose() { super.dispose(); if (!dynamicEnabled) { return; } Control control = getControl(); if (!control.isDisposed()) { control.removeFocusListener(focusListener); control.removeMouseTrackListener(mouseHoverListener); } } @Override public boolean isPseudoInstanceOf(String s) { if ("focus".equalsIgnoreCase(s)) { return this.hasFocus; } if ("hover".equalsIgnoreCase(s)) { return this.hasMouseHover; } if ("enabled".equalsIgnoreCase(s)) { return getControl().getEnabled(); } if ("disabled".equalsIgnoreCase(s)) { return !getControl().getEnabled(); } if ("visible".equalsIgnoreCase(s)) { return getControl().getVisible(); } return super.isPseudoInstanceOf(s); } @Override public Node getParentNode() { Control control = getControl(); Composite parent = control.getParent(); if (parent != null) { Element element = getElement(parent); return element; } return null; } protected Control getControl() { return (Control) getNativeWidget(); } @Override public void reset() { Control control = getControl(); CSSSWTFontHelper.restoreDefaultFont(control); CSSSWTCursorHelper.restoreDefaultCursor(control); GradientBackgroundListener.remove(control); if (control.getBackgroundImage() != null) { control.setBackgroundImage(null); } if (WEBSITE_CLASS.equals(control.getClass().getName())) { control.setBackground(control.getDisplay().getSystemColor( SWT.COLOR_LIST_BACKGROUND)); control.setForeground(control.getDisplay().getSystemColor( SWT.COLOR_LINK_FOREGROUND)); } else { control.setBackground(null); control.setForeground(null); } super.reset(); } }