package net.jeeeyul.eclipse.themes.css.internal; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.e4.ui.css.swt.CSSSWTConstants; import org.eclipse.swt.widgets.Widget; /** * It allows adding class or removing class easily. * * @author Jeeeyul Lee * @since 2.0.0 */ @SuppressWarnings("restriction") public class CSSClasses { private List<String> classes = new ArrayList<String>(); /** * Creates a {@link CSSClasses} with existing class names expression. * * @param classNames * empty space separated class names. */ public CSSClasses(String classNames) { if (classNames != null && !classNames.trim().isEmpty()) for (String name : classNames.split(" ")) classes.add(name); } /** * Adds class names. * * @param classNames * class names to add. */ public void add(String... classNames) { if (classNames == null) { throw new IllegalArgumentException(); } for (String each : classNames) { String trimmed = each.trim(); if (!classes.contains(trimmed)) { classes.add(trimmed); } } } /** * Test whether it contains given class name. * * @param className * class name to test. * @return <code>true</code> if this contains given class name. * */ public boolean contains(String className) { if (className == null) { throw new IllegalArgumentException(); } return classes.contains(className.trim()); } /** * Removes given class names from {@link CSSClasses}. * * @param classNames * class names to remove. */ public void remove(String... classNames) { if (classNames == null) { throw new IllegalArgumentException(); } for (String each : classNames) { String trimmed = each.trim(); classes.remove(trimmed); } } /** * Retrieves {@link CSSClasses} for given {@link Widget}. After modifying * returned {@link CSSClasses}, call * {@link #setStyleClasses(Widget, CSSClasses)} to apply. * * @param w * widget to get {@link CSSClasses} * @return {@link CSSClasses} that represents css classes for give widget. */ public static CSSClasses getStyleClasses(Widget w) { String literal = (String) w.getData(CSSSWTConstants.CSS_CLASS_NAME_KEY); return new CSSClasses(literal); } /** * Sets css classes in {@link CSSClasses} to {@link Widget}. * * @param w * Widget to set css classes. * @param newStyleClasses * {@link CSSClasses} to set. */ public static void setStyleClasses(Widget w, CSSClasses newStyleClasses) { w.setData(CSSSWTConstants.CSS_CLASS_NAME_KEY, newStyleClasses.toString()); } public String toString() { if (classes.isEmpty()) return ""; Iterator<String> iter = classes.iterator(); StringBuilder sb = new StringBuilder(iter.next()); while (iter.hasNext()) sb.append(" ").append(iter.next()); return sb.toString(); } }