1/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Eclipse Public License, Version 1.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.eclipse.org/org/documents/epl-v10.php
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.ide.eclipse.adt.internal.project;
18
19import com.android.SdkConstants;
20import com.android.ide.eclipse.adt.AdtConstants;
21import com.android.ide.eclipse.adt.AdtPlugin;
22
23import org.eclipse.core.resources.IFolder;
24import org.eclipse.core.resources.IProject;
25import org.eclipse.core.resources.IResource;
26import org.eclipse.core.runtime.CoreException;
27import org.eclipse.jface.resource.ImageDescriptor;
28import org.eclipse.jface.viewers.IDecoration;
29import org.eclipse.jface.viewers.ILabelDecorator;
30import org.eclipse.jface.viewers.ILabelProviderListener;
31import org.eclipse.jface.viewers.ILightweightLabelDecorator;
32
33/**
34 * A {@link ILabelDecorator} associated with an org.eclipse.ui.decorators extension.
35 * This is used to add android icons in some special folders in the package explorer.
36 */
37public class FolderDecorator implements ILightweightLabelDecorator {
38
39    private ImageDescriptor mDescriptor;
40
41    public FolderDecorator() {
42        mDescriptor = AdtPlugin.getImageDescriptor("/icons/android_project.png"); //$NON-NLS-1$
43    }
44
45    @Override
46    public void decorate(Object element, IDecoration decoration) {
47        if (element instanceof IFolder) {
48            IFolder folder = (IFolder)element;
49
50            // get the project and make sure this is an android project
51            IProject project = folder.getProject();
52            if (project == null || !project.exists() || !folder.exists()) {
53                return;
54            }
55
56            try {
57                if (project.hasNature(AdtConstants.NATURE_DEFAULT)) {
58                    // check the folder is directly under the project.
59                    if (folder.getParent().getType() == IResource.PROJECT) {
60                        String name = folder.getName();
61                        if (name.equals(SdkConstants.FD_ASSETS)) {
62                            doDecoration(decoration, null);
63                        } else if (name.equals(SdkConstants.FD_RESOURCES)) {
64                            doDecoration(decoration, null);
65                        } else if (name.equals(SdkConstants.FD_GEN_SOURCES)) {
66                            doDecoration(decoration, " [Generated Java Files]");
67                        } else if (name.equals(SdkConstants.FD_NATIVE_LIBS)) {
68                            doDecoration(decoration, null);
69                        } else if (name.equals(SdkConstants.FD_OUTPUT)) {
70                            doDecoration(decoration, null);
71                        }
72                    }
73                }
74            } catch (CoreException e) {
75                // log the error
76                AdtPlugin.log(e, "Unable to get nature of project '%s'.", project.getName());
77            }
78        }
79    }
80
81    public void doDecoration(IDecoration decoration, String suffix) {
82        decoration.addOverlay(mDescriptor, IDecoration.TOP_LEFT);
83
84        if (suffix != null) {
85            decoration.addSuffix(suffix);
86        }
87    }
88
89    @Override
90    public boolean isLabelProperty(Object element, String property) {
91        // Property change do not affect the label
92        return false;
93    }
94
95    @Override
96    public void addListener(ILabelProviderListener listener) {
97        // No state change will affect the rendering.
98    }
99
100    @Override
101    public void removeListener(ILabelProviderListener listener) {
102        // No state change will affect the rendering.
103    }
104
105    @Override
106    public void dispose() {
107        // nothing to dispose
108    }
109}
110