/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php * * 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.android.ide.eclipse.adt.internal.preferences; import static com.android.SdkConstants.XMLNS; import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAttributeNode; import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion; import org.w3c.dom.Attr; import java.util.Comparator; /** Order to use when sorting attributes */ @SuppressWarnings("restriction") // IndexedRegion public enum AttributeSortOrder { NO_SORTING("none"), //$NON-NLS-1$ ALPHABETICAL("alpha"), //$NON-NLS-1$ LOGICAL("logical"); //$NON-NLS-1$ AttributeSortOrder(String key) { this.key = key; } public final String key; /** * @return a comparator for use by this attribute sort order */ public Comparator<Attr> getAttributeComparator() { switch (this) { case ALPHABETICAL: return ALPHABETICAL_COMPARATOR; case NO_SORTING: return EXISTING_ORDER_COMPARATOR; case LOGICAL: default: return SORTED_ORDER_COMPARATOR; } } /** Comparator which can be used to sort attributes in the coding style priority order */ private static final Comparator<Attr> SORTED_ORDER_COMPARATOR = new Comparator<Attr>() { @Override public int compare(Attr attr1, Attr attr2) { // Namespace declarations should always go first if (XMLNS.equals(attr1.getPrefix())) { if (XMLNS.equals(attr2.getPrefix())) { return 0; } return -1; } else if (XMLNS.equals(attr2.getPrefix())) { return 1; } // Sort by preferred attribute order return UiAttributeNode.compareAttributes( attr1.getPrefix(), attr1.getLocalName(), attr2.getPrefix(), attr2.getLocalName()); } }; /** * Comparator which can be used to "sort" attributes into their existing source order * (which is not the same as the node map iteration order in the DOM model) */ private static final Comparator<Attr> EXISTING_ORDER_COMPARATOR = new Comparator<Attr>() { @Override public int compare(Attr attr1, Attr attr2) { IndexedRegion region1 = (IndexedRegion) attr1; IndexedRegion region2 = (IndexedRegion) attr2; return region1.getStartOffset() - region2.getStartOffset(); } }; /** * Comparator which can be used to sort attributes into alphabetical order (but xmlns * is always first) */ private static final Comparator<Attr> ALPHABETICAL_COMPARATOR = new Comparator<Attr>() { @Override public int compare(Attr attr1, Attr attr2) { // Namespace declarations should always go first if (XMLNS.equals(attr1.getPrefix())) { if (XMLNS.equals(attr2.getPrefix())) { return 0; } return -1; } else if (XMLNS.equals(attr2.getPrefix())) { return 1; } // Sort by name rather than localname to ensure we sort by namespaces first, // then by names. return attr1.getName().compareTo(attr2.getName()); } }; }