/*******************************************************************************
* Copyright (c) 2009, 2015 Remy Chi Jian Suen 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:
* Remy Chi Jian Suen <remy.suen@gmail.com> - initial API and implementation
* IBM Corporation
******************************************************************************/
package org.eclipse.e4.ui.css.swt.properties.custom;
import org.eclipse.e4.ui.css.core.dom.properties.ICSSPropertyHandler;
import org.eclipse.e4.ui.css.core.engine.CSSEngine;
import org.eclipse.e4.ui.css.swt.helpers.SWTElementHelpers;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Item;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Widget;
import org.w3c.dom.css.CSSStyleDeclaration;
import org.w3c.dom.css.CSSValue;
public class CSSPropertyShowCloseHandler extends CTabETabHelper implements ICSSPropertyHandler {
private static final String CSS_CTABITEM_SELECTED_SHOW_CLOSE_LISTENER_KEY = "CSS_CTABFOLDER_SELECTED_SHOW_CLOSE_LISTENER_KEY"; //$NON-NLS-1$
@Override
public boolean applyCSSProperty(Object element, String property,
CSSValue value, String pseudo, CSSEngine engine) throws Exception {
Widget widget = SWTElementHelpers.getWidget(element);
if (widget instanceof CTabItem) {
Item item = (Item) widget;
boolean showClose = ((Boolean) engine.convert(value, Boolean.class,
null)).booleanValue();
if ("selected".equals(pseudo)) {
Control parent = getParent(widget);
ShowCloseSelectionListener listener = (ShowCloseSelectionListener) parent.getData(
CSS_CTABITEM_SELECTED_SHOW_CLOSE_LISTENER_KEY);
if (listener == null) {
listener = new ShowCloseSelectionListener(engine);
parent.addListener(SWT.Paint, listener);
parent.setData(
CSS_CTABITEM_SELECTED_SHOW_CLOSE_LISTENER_KEY,
listener);
} else {
listener.setEngine(engine);
}
item = getSelection(getParent(widget));
listener.setSelection(item);
if (item != null) {
setShowClose(item, showClose);
}
} else {
setShowClose(item, showClose);
}
return true;
}
return false;
}
@Override
public String retrieveCSSProperty(Object element, String property,
String pseudo, CSSEngine engine) throws Exception {
Widget widget = SWTElementHelpers.getWidget(element);
if (widget instanceof CTabItem) {
CTabItem item = (CTabItem) widget;
return Boolean.toString(item.getShowClose());
}
return null;
}
private class ShowCloseSelectionListener implements Listener {
private CSSEngine engine;
private Item selection;
public ShowCloseSelectionListener(CSSEngine engine) {
this.engine = engine;
}
public void setSelection(Item selection) {
this.selection = selection;
}
public void setEngine(CSSEngine engine) {
this.engine = engine;
}
@Override
public void handleEvent(Event e) {
Item selection = getSelection(e.widget);
if (selection == null || selection.isDisposed()
|| this.selection == selection) {
return;
}
Item[] items = getItems(e.widget);
int selectionIndex = getSelectionIndex(e.widget);
boolean selectionSet = false;
CSSStyleDeclaration selectedStyle = engine.getViewCSS()
.getComputedStyle(engine.getElement(selection),
"selected");
if (selectedStyle != null) {
CSSValue value = selectedStyle
.getPropertyCSSValue("show-close");
if (value != null) {
setShowClose(selection, Boolean.parseBoolean(value.getCssText()));
selectionSet = true;
}
}
CSSStyleDeclaration unselectedStyle = engine.getViewCSS()
.getComputedStyle(engine.getElement(selection),
null);
if (unselectedStyle == null) {
for (int i = 0; i < items.length; i++) {
if (selectionSet && i != selectionIndex) {
setShowClose(items[i], false);
}
}
} else {
CSSValue value = unselectedStyle
.getPropertyCSSValue("show-close");
boolean unselectedShowClose = value == null ? false : Boolean
.parseBoolean(value.getCssText());
for (int i = 0; i < items.length; i++) {
if (selectionSet && i != selectionIndex) {
setShowClose(items[i], unselectedShowClose);
}
}
}
this.selection = selection;
}
}
}