| /* |
| * 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.SdkConstants; |
| import com.android.resources.ResourceFolderType; |
| import com.android.resources.ResourceType; |
| |
| import org.eclipse.core.runtime.IPath; |
| |
| /** |
| * Style to use when printing the XML. Different types of Android XML files use slightly |
| * different preferred formats. For example, in layout files there is typically always a |
| * newline between successive elements, whereas in a manifest file there is typically only |
| * newlines between different types of elements. As another example, in resource files, |
| * the format is typically much more compact: the text content of {@code <item>} tags is |
| * included on the same line whereas for other layout styles the children are typically |
| * placed on a line of their own. |
| */ |
| public enum XmlFormatStyle { |
| /** Layout formatting style: blank lines between elements, attributes on separate lines */ |
| LAYOUT, |
| |
| /** Similar to layout formatting style, but no blank lines inside opening elements */ |
| FILE, |
| |
| /** Resource style: one line per complete element including text child content */ |
| RESOURCE, |
| |
| /** |
| * Similar to layout style, but no newlines between related elements such as |
| * successive {@code <uses-permission>} declarations, and no newlines inside |
| * the second level elements (so an {@code <activity>} declaration appears as a |
| * single block with no whitespace within it) |
| */ |
| MANIFEST; |
| |
| /** |
| * Returns the {@link XmlFormatStyle} to use for a resource of the given type |
| * |
| * @param resourceType the type of resource to be formatted |
| * @return the suitable format style to use |
| */ |
| public static XmlFormatStyle get(ResourceType resourceType) { |
| switch (resourceType) { |
| case ARRAY: |
| case ATTR: |
| case BOOL: |
| case DECLARE_STYLEABLE: |
| case DIMEN: |
| case FRACTION: |
| case ID: |
| case INTEGER: |
| case STRING: |
| case PLURALS: |
| case STYLE: |
| case STYLEABLE: |
| case COLOR: |
| return RESOURCE; |
| |
| case LAYOUT: |
| return LAYOUT; |
| |
| case DRAWABLE: |
| case MENU: |
| case ANIM: |
| case ANIMATOR: |
| case INTERPOLATOR: |
| default: |
| return FILE; |
| } |
| } |
| |
| /** |
| * Returns the {@link XmlFormatStyle} to use for resource files in the given resource |
| * folder |
| * |
| * @param folderType the type of folder containing the resource file |
| * @return the suitable format style to use |
| */ |
| public static XmlFormatStyle getForFolderType(ResourceFolderType folderType) { |
| switch (folderType) { |
| case LAYOUT: |
| return LAYOUT; |
| case COLOR: |
| case VALUES: |
| return RESOURCE; |
| case ANIM: |
| case ANIMATOR: |
| case DRAWABLE: |
| case INTERPOLATOR: |
| case MENU: |
| default: |
| return FILE; |
| } |
| } |
| |
| /** |
| * Returns the {@link XmlFormatStyle} to use for resource files of the given path. |
| * |
| * @param path the path to the resource file |
| * @return the suitable format style to use |
| */ |
| public static XmlFormatStyle getForFile(IPath path) { |
| if (SdkConstants.FN_ANDROID_MANIFEST_XML.equals(path.lastSegment())) { |
| return MANIFEST; |
| } |
| |
| if (path.segmentCount() > 2) { |
| String parentName = path.segment(path.segmentCount() - 2); |
| ResourceFolderType folderType = ResourceFolderType.getFolderType(parentName); |
| return getForFolderType(folderType); |
| } |
| |
| return FILE; |
| } |
| } |