/******************************************************************************* * 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 java.util.Objects; import java.util.function.Supplier; 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.CSSSWTImageHelper; import org.eclipse.swt.events.ShellEvent; import org.eclipse.swt.events.ShellListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Shell; import org.w3c.dom.Node; /** * {@link CSSStylableElement} implementation which wrap SWT {@link Shell}. * */ public class ShellElement extends CompositeElement { protected boolean isActive; // Create SWT Shell Listener private ShellListener shellListener = new ShellListener() { @Override public void shellActivated(ShellEvent e) { ShellElement.this.isActive = true; doApplyStyles(); } @Override public void shellDeactivated(ShellEvent e) { ShellElement.this.isActive = false; doApplyStyles(); } @Override public void shellDeiconified(ShellEvent e) { } @Override public void shellIconified(ShellEvent e) { } @Override public void shellClosed(ShellEvent e) { ShellElement.this.dispose(); } }; public ShellElement(Shell shell, CSSEngine engine) { super(shell, engine); } @Override public void initialize() { super.initialize(); Shell shell = getShell(); if (!dynamicEnabled) { return; } // Add Shell listener shell.addShellListener(shellListener); } @Override public Node getParentNode() { // Shells are considered as root notes; see bug 375069 // https://bugs.eclipse.org/bugs/show_bug.cgi?id=375069 return null; } private Shell getShell() { return (Shell) getNativeWidget(); } @Override public void dispose() { super.dispose(); if (!dynamicEnabled) { return; } Shell shell = getShell(); if (!shell.isDisposed()) { shell.removeShellListener(shellListener); } } @Override public boolean isPseudoInstanceOf(String s) { if ("active".equalsIgnoreCase(s)) { return this.isActive; } if ("swt-parented".equalsIgnoreCase(s)) { return getShell().getParent() != null; } if ("swt-unparented".equalsIgnoreCase(s)) { return getShell().getParent() == null; } return super.isPseudoInstanceOf(s); } @Override protected Supplier<String> internalGetAttribute(String attr) { if("title".equals(attr)) { return () -> Objects.toString(getShell().getText(), ""); } if ("parentage".equals(attr)) { return () -> { Shell shell = getShell(); Composite parent = shell.getParent(); if (parent == null) { return ""; } StringBuilder sb = new StringBuilder(); do { String id = WidgetElement.getID(parent); if (id != null && id.length() > 0) { sb.append(id).append(' '); } parent = parent.getParent(); } while (parent != null); return sb.toString().trim(); }; } return super.internalGetAttribute(attr); } @Override public void reset() { CSSSWTImageHelper.restoreDefaultImage(getShell()); super.reset(); } }