diff options
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/EclipseXmlFormatPreferences.java')
-rw-r--r-- | eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/EclipseXmlFormatPreferences.java | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/EclipseXmlFormatPreferences.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/EclipseXmlFormatPreferences.java new file mode 100644 index 000000000..6c00b8ee2 --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/EclipseXmlFormatPreferences.java @@ -0,0 +1,144 @@ +/* + * 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.editors.formatting; + +import com.android.annotations.NonNull; +import com.android.annotations.Nullable; +import com.android.annotations.VisibleForTesting; +import com.android.ide.common.xml.XmlFormatPreferences; +import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs; +import com.android.ide.common.xml.XmlAttributeSortOrder; + +import org.eclipse.core.runtime.Preferences; +import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.ui.internal.editors.text.EditorsPlugin; +import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants; +import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion; +import org.eclipse.wst.xml.core.internal.XMLCorePlugin; +import org.eclipse.wst.xml.core.internal.preferences.XMLCorePreferenceNames; +import org.w3c.dom.Attr; + +import java.util.Comparator; + +/** + * Formatting preferences used by the Android XML formatter. + */ +public class EclipseXmlFormatPreferences extends XmlFormatPreferences { + @VisibleForTesting + protected EclipseXmlFormatPreferences() { + } + + /** + * Creates a new {@link EclipseXmlFormatPreferences} based on the current settings + * in {@link AdtPrefs} + * + * @return an {@link EclipseXmlFormatPreferences} object + */ + @NonNull + public static EclipseXmlFormatPreferences create() { + EclipseXmlFormatPreferences p = new EclipseXmlFormatPreferences(); + AdtPrefs prefs = AdtPrefs.getPrefs(); + + p.useEclipseIndent = prefs.isUseEclipseIndent(); + p.removeEmptyLines = prefs.isRemoveEmptyLines(); + p.oneAttributeOnFirstLine = prefs.isOneAttributeOnFirstLine(); + p.sortAttributes = prefs.getAttributeSort(); + p.spaceBeforeClose = prefs.isSpaceBeforeClose(); + + return p; + } + + @Override + @Nullable + public Comparator<Attr> getAttributeComparator() { + // Can't just skip sorting; the attribute table moves attributes out of order + // due to hashing, so sort by node positions + if (sortAttributes == XmlAttributeSortOrder.NO_SORTING) { + return EXISTING_ORDER_COMPARATOR; + } + return sortAttributes.getAttributeComparator(); + } + + 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(); + } + }; + + // The XML module settings do not have a public API. We should replace this with JDT + // settings anyway since that's more likely what users have configured and want applied + // to their XML files + + /** + * Returns the string to use to indent one indentation level + * + * @return the string used to indent one indentation level + */ + @Override + @SuppressWarnings({ + "restriction", "deprecation" + }) + public String getOneIndentUnit() { + if (useEclipseIndent) { + // Look up Eclipse indent preferences + // TODO: Use the JDT preferences instead, which make more sense + Preferences preferences = XMLCorePlugin.getDefault().getPluginPreferences(); + int indentationWidth = preferences.getInt(XMLCorePreferenceNames.INDENTATION_SIZE); + String indentCharPref = preferences.getString(XMLCorePreferenceNames.INDENTATION_CHAR); + boolean useSpaces = XMLCorePreferenceNames.SPACE.equals(indentCharPref); + + StringBuilder indentString = new StringBuilder(); + for (int j = 0; j < indentationWidth; j++) { + if (useSpaces) { + indentString.append(' '); + } else { + indentString.append('\t'); + } + } + mOneIndentUnit = indentString.toString(); + } + + return mOneIndentUnit; + } + + /** + * Returns the number of spaces used to display a single tab character + * + * @return the number of spaces used to display a single tab character + */ + @Override + @SuppressWarnings("restriction") // Editor settings + public int getTabWidth() { + if (mTabWidth == -1) { + String key = AbstractDecoratedTextEditorPreferenceConstants.EDITOR_TAB_WIDTH; + try { + IPreferenceStore prefs = EditorsPlugin.getDefault().getPreferenceStore(); + mTabWidth = prefs.getInt(key); + } catch (Throwable t) { + // Pass: We'll pick a suitable default instead below + } + if (mTabWidth <= 0) { + mTabWidth = 4; + } + } + + return mTabWidth; + } +} |