com.nokia.tools.s60.ide.actions.ThemeModelDropDownAction.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.tools.s60.ide.actions.ThemeModelDropDownAction.java

Source

/*
* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies). 
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/
package com.nokia.tools.s60.ide.actions;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.FigureUtilities;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IMenuCreator;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.osgi.framework.internal.core.Constants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IWorkbenchPart;

import com.nokia.tools.content.core.ContentAttribute;
import com.nokia.tools.content.core.IContent;
import com.nokia.tools.content.core.IContentAdapter;
import com.nokia.tools.platform.extension.IThemeDescriptor;
import com.nokia.tools.platform.extension.IThemeModelDescriptor;
import com.nokia.tools.platform.extension.PluginEntry;
import com.nokia.tools.platform.theme.ThemePlatform;
import com.nokia.tools.s60.editor.actions.ChangeThemeModelAction;
import com.nokia.tools.s60.ide.S60WorkspacePlugin;
import com.nokia.tools.screen.ui.utils.EclipseUtils;
import com.nokia.tools.screen.ui.utils.ScreenUtil;

public class ThemeModelDropDownAction extends Action implements IMenuCreator {
    private Menu menu;

    private String currentId;

    /**
     * Action id for the model change combo.
     */
    public static final String ID = ThemeModelDropDownAction.class.getPackage().getName() + ".thememodel";

    public ThemeModelDropDownAction() {
        setToolTipText("Switch Between Platform Graphics");
        setMenuCreator(this);
        setImageDescriptor(S60WorkspacePlugin.getImageDescriptor("icons/platform/platform_base.png"));
        setId(ID);
    }

    public void dispose() {
        if (menu != null) {
            menu.dispose();
        }
    }

    public Menu getMenu(Control parent) {
        if (menu != null) {
            menu.dispose();
        }
        menu = new Menu(parent);
        String curModel = getContent().getAttribute(ContentAttribute.MODEL.name()).toString();
        for (IThemeModelDescriptor desc : getItems()) {
            ChangeThemeModelAction action = new ChangeThemeModelAction(getEditorPart(), this, desc.getId());
            action.setText(desc.getName());
            if (desc.getId().equalsIgnoreCase(curModel)) {
                action.setChecked(true);
                ActionContributionItem item = new ActionContributionItem(action);
                item.fill(menu, -1);

            } else {
                action.setChecked(false);
                ActionContributionItem item = new ActionContributionItem(action);
                item.fill(menu, -1);
            }
        }
        return menu;
    }

    protected List<IThemeModelDescriptor> getItems() {
        final IContent content = getContent();
        if (content != null) {
            String themeId = (String) content.getAttribute(ContentAttribute.THEME_ID.name());
            String modelId = (String) content.getAttribute(ContentAttribute.MODEL.name());
            IThemeDescriptor desc = ThemePlatform.getThemeDescriptorById(themeId);
            if (desc != null) {
                String containerId = desc.getContainerId();
                List<IThemeModelDescriptor> items = new ArrayList<IThemeModelDescriptor>();
                boolean isModelEditor = isModelEditor();
                Set<String> modelIds = new HashSet<String>();
                for (IThemeModelDescriptor modelDesc : ThemePlatform
                        .getThemeModelDescriptorsByContainer(containerId)) {
                    if ((!isModelEditor || modelId.equalsIgnoreCase(modelDesc.getId()))
                            && !modelIds.contains(modelDesc.getId()) && !isFromPluginProject(modelDesc)) {
                        items.add(modelDesc);
                        modelIds.add(modelDesc.getId());
                    }
                }
                Collections.sort(items, new Comparator<IThemeModelDescriptor>() {

                    /*
                     * (non-Javadoc)
                     * 
                     * @see java.util.Comparator#compare(java.lang.Object,
                     *      java.lang.Object)
                     */
                    public int compare(IThemeModelDescriptor o1, IThemeModelDescriptor o2) {
                        return o1.getName().compareToIgnoreCase(o2.getName());
                    }
                });
                return items;
            }
        }
        return Collections.EMPTY_LIST;
    }

    private boolean isFromPluginProject(IThemeModelDescriptor descriptor) {
        return !descriptor.getModelPath().toExternalForm().startsWith(Constants.OSGI_ENTRY_URL_PROTOCOL);
    }

    private boolean isModelEditor() {

        IEditorPart editor = getEditorPart();
        return editor != null && editor.getEditorInput() instanceof IFileEditorInput
                && PluginEntry.PLUGIN_XML.equals(((IFileEditorInput) editor.getEditorInput()).getFile().getName());
    }

    public IContent getContent() {
        IWorkbenchPart part = getEditorPart();
        if (part == null) {
            return null;
        }
        IContentAdapter adapter = (IContentAdapter) part.getAdapter(IContentAdapter.class);
        if (adapter == null) {
            return null;
        }
        return ScreenUtil.getPrimaryContent(adapter.getContents());
    }

    public IEditorPart getEditorPart() {
        return EclipseUtils.getActiveSafeEditor();
    }

    public Menu getMenu(Menu parent) {

        return null;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.action.Action#run()
     */
    @Override
    public void run() {
        IContent content = getContent();
        if (content != null) {
            String modelId = (String) content.getAttribute(ContentAttribute.MODEL.name());
            if (modelId != null) {
                IThemeModelDescriptor desc = ThemePlatform.getThemeModelDescriptorById(modelId);
                if (desc != null) {
                    String themeId = desc.getThemeId();
                    currentId = themeId;
                    String name = desc.getName();

                    setImageDescriptor(getCustomImageDescriptor(themeId, name));
                    setToolTipText(name);
                }
            }
        }
    }

    public ImageDescriptor getCustomImageDescriptor(String id, String text) {
        FontData fd = JFaceResources.getDefaultFont().getFontData()[0];
        Font bigFont = new Font(Display.getDefault(), fd.getName(), 9, SWT.BOLD);
        Font smallFont = new Font(Display.getDefault(), fd.getName(), 5, SWT.NORMAL);
        Font normalFont = new Font(Display.getDefault(), fd.getName(), 7, SWT.NORMAL);
        ImageDescriptor desc = S60WorkspacePlugin.getImageDescriptor("icons/platform/platform_base.png");

        Image bannerImage = null;
        GC imageGC = null;
        int logoSpace;
        Color color1 = new Color(Display.getDefault(), 128, 132, 135);
        Color color2 = new Color(Display.getDefault(), 183, 83, 176);
        Color color3 = new Color(Display.getDefault(), 143, 0, 96);

        try {
            bannerImage = desc.createImage();
            int imageWidth = bannerImage.getBounds().width;
            imageGC = new GC(bannerImage);
            if (id.contains("60")) {
                logoSpace = FigureUtilities.getTextWidth("S60", bigFont) + 2;
                imageGC.setForeground(color1);
                imageGC.setFont(bigFont);
                imageGC.drawString("S60", 1, 1, true);
            } else {
                logoSpace = 0;
            }
            imageGC.setForeground(ColorConstants.black);
            imageGC.setFont(normalFont);
            text = filtrateText(text);
            int freeSpace = imageWidth - logoSpace - 2;
            int textWidth = FigureUtilities.getTextWidth(text, normalFont);

            if (textWidth > freeSpace) {
                text = ScreenUtil.toShorterWithDots(text, freeSpace, normalFont);
                textWidth = FigureUtilities.getTextWidth(text, normalFont);
            }
            int x = (int) (((freeSpace) - textWidth) / 2) + logoSpace;
            imageGC.drawString(text, x, 3, true);
            ImageData data = bannerImage.getImageData();
            data.transparentPixel = new java.awt.Color(192, 192, 192).getRGB();
            return ImageDescriptor.createFromImageData(data);
        } finally {
            if (imageGC != null) {
                imageGC.dispose();
            }
            if (bannerImage != null) {
                bannerImage.dispose();
            }
            if (bigFont != null) {
                bigFont.dispose();
            }
            if (normalFont != null) {
                normalFont.dispose();
            }
            if (smallFont != null) {
                smallFont.dispose();
            }
            if (color1 != null) {
                color1.dispose();
            }
            if (color2 != null) {
                color2.dispose();
            }
            if (color3 != null) {
                color3.dispose();
            }
        }
    }

    private String filtrateText(String text) {
        text = text.replace("S60 ", "");
        text = text.replace("Series 40 ", "");
        text = text.replace(" Edition", "");
        text = text.replace(" BaseGraphics", "");
        return text;
    }
}