All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.phloc.css.decl.CSSSelectorMemberNot Maven / Gradle / Ivy

There is a newer version: 3.7.7
Show newest version
/**
 * Copyright (C) 2006-2014 phloc systems
 * http://www.phloc.com
 * office[at]phloc[dot]com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.phloc.css.decl;

import java.util.List;

import javax.annotation.Nonnegative;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.annotation.concurrent.NotThreadSafe;

import com.phloc.commons.ValueEnforcer;
import com.phloc.commons.annotations.Nonempty;
import com.phloc.commons.annotations.ReturnsMutableCopy;
import com.phloc.commons.collections.ContainerHelper;
import com.phloc.commons.hash.HashCodeGenerator;
import com.phloc.commons.state.EChange;
import com.phloc.commons.string.ToStringGenerator;
import com.phloc.css.CSSSourceLocation;
import com.phloc.css.ECSSVersion;
import com.phloc.css.ICSSSourceLocationAware;
import com.phloc.css.ICSSVersionAware;
import com.phloc.css.ICSSWriterSettings;

/**
 * Represents an inverted CSS selector, used for the ":not()" CSS function.
* Note: this class was completely redesigned for version 3.7.4 * * @author Philip Helger */ @NotThreadSafe public class CSSSelectorMemberNot implements ICSSSelectorMember, ICSSVersionAware, ICSSSourceLocationAware { private final List m_aNestedSelectors; private CSSSourceLocation m_aSourceLocation; public CSSSelectorMemberNot (@Nonnull final CSSSelector aNestedSelector) { ValueEnforcer.notNull (aNestedSelector, "NestedSelector"); m_aNestedSelectors = ContainerHelper.newList (aNestedSelector); } public CSSSelectorMemberNot (@Nonnull final CSSSelector... aNestedSelectors) { ValueEnforcer.notNull (aNestedSelectors, "NestedSelectors"); m_aNestedSelectors = ContainerHelper.newList (aNestedSelectors); } public CSSSelectorMemberNot (@Nonnull final List aNestedSelectors) { ValueEnforcer.notNull (aNestedSelectors, "NestedSelectors"); m_aNestedSelectors = ContainerHelper.newList (aNestedSelectors); } public boolean hasSelectors () { return !m_aNestedSelectors.isEmpty (); } @Nonnegative public int getSelectorCount () { return m_aNestedSelectors.size (); } @Nonnull public CSSSelectorMemberNot addSelector (@Nonnull final ICSSSelectorMember aSingleSelectorMember) { ValueEnforcer.notNull (aSingleSelectorMember, "SingleSelectorMember"); return addSelector (new CSSSelector ().addMember (aSingleSelectorMember)); } @Nonnull public CSSSelectorMemberNot addSelector (@Nonnull final CSSSelector aSelector) { ValueEnforcer.notNull (aSelector, "Selector"); m_aNestedSelectors.add (aSelector); return this; } @Nonnull public CSSSelectorMemberNot addSelector (@Nonnegative final int nIndex, @Nonnull final ICSSSelectorMember aSingleSelectorMember) { ValueEnforcer.notNull (aSingleSelectorMember, "SingleSelectorMember"); return addSelector (nIndex, new CSSSelector ().addMember (aSingleSelectorMember)); } @Nonnull public CSSSelectorMemberNot addSelector (@Nonnegative final int nIndex, @Nonnull final CSSSelector aSelector) { ValueEnforcer.isGE0 (nIndex, "Index"); ValueEnforcer.notNull (aSelector, "Selector"); if (nIndex >= getSelectorCount ()) m_aNestedSelectors.add (aSelector); else m_aNestedSelectors.add (nIndex, aSelector); return this; } @Nonnull public EChange removeSelector (@Nonnull final CSSSelector aSelector) { return EChange.valueOf (m_aNestedSelectors.remove (aSelector)); } @Nonnull public EChange removeSelector (@Nonnegative final int nSelectorIndex) { if (nSelectorIndex < 0 || nSelectorIndex >= m_aNestedSelectors.size ()) return EChange.UNCHANGED; m_aNestedSelectors.remove (nSelectorIndex); return EChange.CHANGED; } /** * Remove all selectors. * * @return {@link EChange#CHANGED} if any selector was removed, * {@link EChange#UNCHANGED} otherwise. Never null. */ @Nonnull public EChange removeAllSelectors () { if (m_aNestedSelectors.isEmpty ()) return EChange.UNCHANGED; m_aNestedSelectors.clear (); return EChange.CHANGED; } @Nullable public CSSSelector getSelectorAtIndex (@Nonnegative final int nSelectorIndex) { return ContainerHelper.getSafe (m_aNestedSelectors, nSelectorIndex); } @Nonnull @ReturnsMutableCopy public List getAllSelectors () { return ContainerHelper.newList (m_aNestedSelectors); } @Nonnull @Nonempty public String getAsCSSString (@Nonnull final ICSSWriterSettings aSettings, @Nonnegative final int nIndentLevel) { aSettings.checkVersionRequirements (this); final boolean bOptimizedOutput = aSettings.isOptimizedOutput (); final StringBuilder aSB = new StringBuilder (":not("); boolean bFirst = true; for (final CSSSelector aNestedSelector : m_aNestedSelectors) { if (bFirst) bFirst = false; else aSB.append (bOptimizedOutput ? "," : ", "); aSB.append (aNestedSelector.getAsCSSString (aSettings, 0)); } return aSB.append (')').toString (); } @Nonnull public ECSSVersion getMinimumCSSVersion () { return ECSSVersion.CSS30; } /** * Set the source location of the object, determined while parsing. * * @param aSourceLocation * The source location to use. May be null. */ public void setSourceLocation (@Nullable final CSSSourceLocation aSourceLocation) { m_aSourceLocation = aSourceLocation; } @Nullable public CSSSourceLocation getSourceLocation () { return m_aSourceLocation; } @Override public boolean equals (final Object o) { if (o == this) return true; if (o == null || !getClass ().equals (o.getClass ())) return false; final CSSSelectorMemberNot rhs = (CSSSelectorMemberNot) o; return m_aNestedSelectors.equals (rhs.m_aNestedSelectors); } @Override public int hashCode () { return new HashCodeGenerator (this).append (m_aNestedSelectors).getHashCode (); } @Override public String toString () { return new ToStringGenerator (null).append ("nestedSelectors", m_aNestedSelectors) .appendIfNotNull ("sourceLocation", m_aSourceLocation) .toString (); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy