package org.xmind.cathy.internal.css; 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.e4.ui.css.swt.properties.custom.CTabETabHelper; import org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer; import org.eclipse.e4.ui.model.application.ui.MUIElement; 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; import org.xmind.cathy.internal.ICathyConstants; @SuppressWarnings("restriction") public class CSSPropertyXShowCloseHandler extends CTabETabHelper implements ICSSPropertyHandler { public static final ICSSPropertyHandler INSTANCE = new CSSPropertyXShowCloseHandler(); private static final String CSS_CTABITEM_SELECTED_SHOW_CLOSE_LISTENER_KEY = "CSS_CTABFOLDER_SELECTED_SHOW_CLOSE_LISTENER_KEY"; //$NON-NLS-1$ private static final String SUPPORTED_PSEUDO = "selected"; //$NON-NLS-1$ private static final String TAG_NOCLOSE = "NoClose"; //$NON-NLS-1$ 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 (SUPPORTED_PSEUDO.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)); if (item != null) { internalSetShowClose(item, showClose); } } else { internalSetShowClose(item, showClose); } return true; } return false; } 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; public ShowCloseSelectionListener(CSSEngine engine) { this.engine = engine; } public void setEngine(CSSEngine engine) { this.engine = engine; } public void handleEvent(Event e) { Item selection = getSelection(e.widget); if (selection == null || selection.isDisposed()) { return; } Item[] items = getItems(e.widget); int selectionIndex = getSelectionIndex(e.widget); boolean selectionSet = false; CSSStyleDeclaration selectedStyle = engine.getViewCSS() .getComputedStyle(engine.getElement(selection), SUPPORTED_PSEUDO); if (selectedStyle != null) { CSSValue value = selectedStyle.getPropertyCSSValue( ICathyConstants.PROPERTY_SHOW_CLOSE); if (value != null) { internalSetShowClose(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) { internalSetShowClose(items[i], false); } } } else { CSSValue value = unselectedStyle.getPropertyCSSValue( ICathyConstants.PROPERTY_SHOW_CLOSE); boolean unselectedShowClose = value == null ? false : Boolean.parseBoolean(value.getCssText()); for (int i = 0; i < items.length; i++) { if (selectionSet && i != selectionIndex) { internalSetShowClose(items[i], unselectedShowClose); } } } } } private void internalSetShowClose(Item item, boolean showClose) { Object data = item.getData(AbstractPartRenderer.OWNING_ME); if (data instanceof MUIElement) { boolean noClose = ((MUIElement) data).getTags() .contains(TAG_NOCLOSE); if (noClose) showClose = !noClose; } if (item instanceof CTabItem) ((CTabItem) item).setShowClose(showClose); } }