/*
 * Copyright 2010 Red Hat, Inc. and/or its affiliates.
 *
 * 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 org.guvnor.tools.views;

import java.util.HashMap;
import java.util.Map;

import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.progress.PendingUpdateAdapter;
import org.guvnor.tools.Activator;
import org.guvnor.tools.Messages;
import org.guvnor.tools.views.model.TreeObject;
import org.guvnor.tools.views.model.TreeParent;

/**
 * Label providers for Guvnor structure.
 */
public class RepositoryLabelProvider extends LabelProvider {
    private Map<ImageDescriptor, Image> images = new HashMap<ImageDescriptor, Image>();

    public RepositoryLabelProvider() {
    }

    public String getText(Object obj) {
        if (obj instanceof PendingUpdateAdapter) {
            return Messages.getString("pending"); //$NON-NLS-1$
        } else if (obj instanceof TreeParent) {
            switch (((TreeParent)obj).getNodeType()) {
            case GLOBALS:
                return "Global Area";
            case SNAPSHOTS:
                return "Snapshots";
            case PACKAGES:
                return "Packages";
            default:
                return stripTrailingSlash(obj.toString());
            }
        } else {
            return obj.toString();
        }
    }
    public Image getImage(Object obj) {
        Image res = null;
        if (obj instanceof TreeObject) {
            switch (((TreeObject)obj).getNodeType()) {
            case REPOSITORY:
                res = Activator.getDefault().getImageRegistry().get(Activator.IMG_GUVREP);
                break;
            case GLOBALS:
            case PACKAGES:
            case SNAPSHOTS:
                res = Activator.getDefault().getImageRegistry().get(Activator.IMG_GUVFOLDER);
                break;
            case PACKAGE:
                res = Activator.getDefault().getImageRegistry().get(Activator.IMG_GUVPACK);
                break;
            case SNAPSHOT_PACKAGE:
                res = Activator.getDefault().getImageRegistry().get(Activator.IMG_GUVSNAPPACK);
                break;
            case SNAPSHOT:
                res = Activator.getDefault().getImageRegistry().get(Activator.IMG_GUVSNAPSHOT);
                break;
            case RESOURCE:
                ImageDescriptor descriptor = PlatformUI.getWorkbench().getEditorRegistry().getImageDescriptor(patchExtension(((TreeObject)obj).getName()));
                if (descriptor == null) {
                    res = PlatformUI.getWorkbench().getSharedImages().
                            getImage(ISharedImages.IMG_OBJ_FILE);
                } else {
                    res = images.get(descriptor);
                    if (res == null) {
                        res = descriptor.createImage();
                        images.put(descriptor, res);
                    }
                    res = descriptor.createImage();
                }
                break;
            }
        }
        return res != null?res:PlatformUI.getWorkbench().getSharedImages().
                                                getImage(ISharedImages.IMG_OBJ_ELEMENT);
    }

    @Override
    public void dispose() {
        for (Image image : images.values()) {
            try {
                image.dispose();
            } catch (Exception e) {
            }
        }
        images.clear();
        super.dispose();
    }

    private String patchExtension(String name) {
        int index = name.lastIndexOf(".xmlschema");
        if (index > -1) {
            return name.substring(0,index) +".xsd";
        }
        return name;
    }
    
    private String stripTrailingSlash(String name) {
        if (name.endsWith("/")) {
            return name.substring(0, name.length() - 1);
        }
        return name;
    }
}
