blob: f4ba3aa804fc1210de5fe9d528e04f7a063c7032 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2018 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors: IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.e4.ui.css.swt.properties.custom;
import org.eclipse.e4.ui.css.core.dom.properties.Gradient;
import org.eclipse.e4.ui.css.core.engine.CSSEngine;
import org.eclipse.e4.ui.css.swt.helpers.CSSSWTColorHelper;
import org.eclipse.e4.ui.css.swt.properties.AbstractCSSPropertySWTHandler;
import org.eclipse.e4.ui.internal.css.swt.ICTabRendering;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabFolderRenderer;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Listener;
import org.w3c.dom.css.CSSValue;
public class CSSPropertyUnselectedTabsSWTHandler extends AbstractCSSPropertySWTHandler {
private static final String UNSELECTED_TABS_COLOR_PROP = "swt-unselected-tabs-color";
private static final String RESIZE_LISTENER = "CSSPropertyUnselectedTabsSWTHandler.resizeListener";
@Override
protected void applyCSSProperty(Control control, String property,
CSSValue value, String pseudo, CSSEngine engine) throws Exception {
if (!(control instanceof CTabFolder)
|| !isUnselectedTabsColorProp(property)) {
return;
}
CTabFolder folder = ((CTabFolder) control);
CTabFolderRenderer renderer = folder.getRenderer();
if (!(renderer instanceof ICTabRendering)) {
return;
}
if (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE) {
Color color = (Color) engine.convert(value, Color.class,
control.getDisplay());
((ICTabRendering) renderer).setUnselectedTabsColor(color);
folder.setBackground(color);
removeResizeEventListener(folder);
return;
}
if (value.getCssValueType() == CSSValue.CSS_VALUE_LIST) {
Gradient grad = (Gradient) engine.convert(value, Gradient.class, control.getDisplay());
if (grad == null) {
return;
}
Color[] colors = null;
int[] percents = null;
if (!grad.getValues().isEmpty()) {
colors = CSSSWTColorHelper.getSWTColors(grad,
control.getDisplay(), engine);
percents = CSSSWTColorHelper.getPercents(grad);
}
((ICTabRendering) renderer)
.setUnselectedTabsColor(colors, percents);
folder.setBackground(colors, percents, true);
appendResizeEventListener(folder);
}
}
@Override
protected String retrieveCSSProperty(Control control, String property,
String pseudo, CSSEngine engine) throws Exception {
// TODO Auto-generated method stub
return null;
}
private boolean isUnselectedTabsColorProp(String property) {
return UNSELECTED_TABS_COLOR_PROP.equals(property);
}
// TODO: It needs to be refactored when the Bug 33276 gets fixed
private void appendResizeEventListener(CTabFolder folder) {
if (hasResizeEventListener(folder)) {
return;
}
final Listener resizeListener = event -> {
CTabFolder folder1 = (CTabFolder) event.widget;
for (Control child : folder1.getChildren()) {
if (isReskinRequired(child)) {
child.reskin(SWT.NONE);
}
}
};
folder.addListener(SWT.Resize, resizeListener);
folder.setData(RESIZE_LISTENER, resizeListener);
folder.addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
e.widget.removeListener(SWT.Resize, resizeListener);
}
});
}
private void removeResizeEventListener(CTabFolder folder) {
Object obj = folder.getData(RESIZE_LISTENER);
if (obj instanceof Listener) {
folder.removeListener(SWT.Resize, (Listener) obj);
folder.setData(RESIZE_LISTENER, null);
}
}
private boolean hasResizeEventListener(CTabFolder folder) {
return folder.getData(RESIZE_LISTENER) instanceof Listener;
}
private boolean isReskinRequired(Control control) {
if (control instanceof Composite) {
Composite composite = (Composite) control;
return composite.isVisible() && composite.getChildren().length > 0;
}
return false;
}
}