com.nokia.tools.s60.editor.Series60EditorPart.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.tools.s60.editor.Series60EditorPart.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.editor;

import java.lang.reflect.InvocationTargetException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.PositionConstants;
import org.eclipse.emf.common.util.EList;
import org.eclipse.gef.ContextMenuProvider;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPartViewer;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.gef.KeyHandler;
import org.eclipse.gef.KeyStroke;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.commands.CommandStack;
import org.eclipse.gef.commands.CommandStackEvent;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.gef.ui.actions.ActionRegistry;
import org.eclipse.gef.ui.actions.AlignmentAction;
import org.eclipse.gef.ui.actions.MatchHeightAction;
import org.eclipse.gef.ui.actions.MatchWidthAction;
import org.eclipse.gef.ui.actions.PrintAction;
import org.eclipse.gef.ui.palette.PaletteViewer;
import org.eclipse.gef.ui.parts.TreeViewer;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.jface.util.TransferDragSourceListener;
import org.eclipse.jface.util.TransferDropTargetListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.dnd.FileTransfer;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.IPropertyListener;
import org.eclipse.ui.IShowEditorInput;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.dialogs.PreferencesUtil;
import org.eclipse.ui.ide.IDEActionFactory;
import org.eclipse.ui.internal.ViewIntroAdapterPart;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.part.ISetSelectionTarget;
import org.eclipse.ui.part.PageBook;
import org.eclipse.ui.views.navigator.LocalSelectionTransfer;

import com.nokia.tools.content.core.ContentAttribute;
import com.nokia.tools.content.core.ContentException;
import com.nokia.tools.content.core.IContent;
import com.nokia.tools.content.core.IContentAdapter;
import com.nokia.tools.content.core.IContentData;
import com.nokia.tools.content.core.IContentService;
import com.nokia.tools.editing.jfc.JFCDiagramAdapter;
import com.nokia.tools.editing.model.EditDiagram;
import com.nokia.tools.editing.model.EditObject;
import com.nokia.tools.editing.ui.figure.ViewportCenterLayout;
import com.nokia.tools.editing.ui.part.DefaultEditPartFactory;
import com.nokia.tools.editing.ui.part.DiagramGraphicalEditPart;
import com.nokia.tools.media.utils.IMediaConstants;
import com.nokia.tools.media.utils.ThreadUtils;
import com.nokia.tools.media.utils.clipboard.ClipboardHelper;
import com.nokia.tools.media.utils.svg.ColorGroupsStore;
import com.nokia.tools.media.utils.tooltip.FloatingToolbar;
import com.nokia.tools.packaging.IPackager;
import com.nokia.tools.platform.theme.Theme;
import com.nokia.tools.resource.util.IInvokable;
import com.nokia.tools.s60.editor.actions.AbstractAction;
import com.nokia.tools.s60.editor.actions.BrowseForFileAction;
import com.nokia.tools.s60.editor.actions.ClearImageEditorAction;
import com.nokia.tools.s60.editor.actions.ConvertAndEditSVGInBitmapEditorAction;
import com.nokia.tools.s60.editor.actions.CopyImageAction;
import com.nokia.tools.s60.editor.actions.EditImageInBitmapEditorAction;
import com.nokia.tools.s60.editor.actions.EditImageInSVGEditorAction;
import com.nokia.tools.s60.editor.actions.EditInSystemEditorAction;
import com.nokia.tools.s60.editor.actions.EditMaskAction;
import com.nokia.tools.s60.editor.actions.EditMaskAction2;
import com.nokia.tools.s60.editor.actions.ElevenPieceConvertAction;
import com.nokia.tools.s60.editor.actions.NinePieceConvertAction;
import com.nokia.tools.s60.editor.actions.PasteContentDataAction;
import com.nokia.tools.s60.editor.actions.PasteImageAction;
import com.nokia.tools.s60.editor.actions.SetColorAction;
import com.nokia.tools.s60.editor.actions.SetStretchModeAction;
import com.nokia.tools.s60.editor.actions.ShowInComponentViewAction;
import com.nokia.tools.s60.editor.actions.ShowInResourceViewAction;
import com.nokia.tools.s60.editor.dnd.FileDropAdapter;
import com.nokia.tools.s60.editor.dnd.S60BaseDragListener;
import com.nokia.tools.s60.editor.ui.views.LayersView;
import com.nokia.tools.s60.ide.ContributedActionsResolver;
import com.nokia.tools.s60.ide.IS60IDEConstants;
import com.nokia.tools.s60.ide.PerspectiveUtil;
import com.nokia.tools.s60.ide.S60WorkspacePlugin;
import com.nokia.tools.s60.ide.actions.OpenGraphicsEditorAction;
import com.nokia.tools.s60.internal.utils.CommandInspector;
import com.nokia.tools.s60.views.menu.GraphicalIconMenuProvider;
import com.nokia.tools.screen.core.IScreenElement;
import com.nokia.tools.screen.core.JEMUtil;
import com.nokia.tools.screen.ui.actions.IKeyHandler;
import com.nokia.tools.screen.ui.actions.KeyActionFactory;
import com.nokia.tools.screen.ui.actions.MoveKeyHandler;
import com.nokia.tools.screen.ui.actions.PausePlayingAction;
import com.nokia.tools.screen.ui.actions.PlayAllAction;
import com.nokia.tools.screen.ui.actions.PlaySelectionAction;
import com.nokia.tools.screen.ui.actions.ResizeKeyHandler;
import com.nokia.tools.screen.ui.actions.SetPlayingSpeedAction;
import com.nokia.tools.screen.ui.actions.StopPlayingAction;
import com.nokia.tools.screen.ui.editor.ScreenEditorPart;
import com.nokia.tools.screen.ui.editor.embedded.IEmbeddedEditorContributor;
import com.nokia.tools.screen.ui.editor.embedded.IEmbeddedEditorCustomizer;
import com.nokia.tools.screen.ui.editor.embedded.IEmbeddedEditorPart;
import com.nokia.tools.screen.ui.extension.ExtensionManager;
import com.nokia.tools.screen.ui.extension.IEmbeddedEditorDescriptor;
import com.nokia.tools.screen.ui.gallery.IGalleryAdapter;
import com.nokia.tools.screen.ui.gallery.IGalleryScreenProvider;
import com.nokia.tools.screen.ui.gallery.IGalleryScreenProvider.IGalleryScreen;
import com.nokia.tools.screen.ui.gef.IDoubleClickListener;
import com.nokia.tools.screen.ui.gef.PaletteManager;
import com.nokia.tools.screen.ui.gef.SComponentGraphicalEditPart;
import com.nokia.tools.screen.ui.gef.ScreenEditPartFactory;
import com.nokia.tools.screen.ui.gef.ZOrderScrollingGraphicalViewer;
import com.nokia.tools.screen.ui.menu.IIconMenuProvider;
import com.nokia.tools.screen.ui.utils.ScreenUtil;
import com.nokia.tools.theme.content.ThemeUtil;
import com.nokia.tools.theme.s60.model.S60Theme;
import com.nokia.tools.theme.s60.model.tpi.TPIconConflictEntry;
import com.nokia.tools.theme.s60.model.tpi.ThirdPartyIconManager;
import com.nokia.tools.theme.s60.model.tpi.ThirdPartyIconWrapper;
import com.nokia.tools.ui.dialog.MessageDialogWithTextContent;
import com.nokia.tools.ui.view.BaseContentOutlinePage;

/**
 * This is the main content editor that other views are dependent on.<br/> This
 * editor can host multiple graphical viewers and display them on demand. Also
 * the editor can be reused by calling {@link #showEditorInput(IEditorInput)}.
 */
public class Series60EditorPart extends ContentEditorPart
        implements IShowEditorInput, IPartListener, IDoubleClickListener, ISetSelectionTarget, IPropertyListener {

    private GalleryAdapter galleryAdapter;

    private GraphicalViewer graphicalViewer;

    private TransferDragSourceListener[] currentDragListeners = null;

    private PageBook pageBook;

    private FloatingToolbar toolbar;

    private boolean cancelledNotification = false;

    public Series60EditorPart() {
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.nokia.tools.screen.ui.editor.ScreenEditorPart#init(org.eclipse.ui.IEditorSite,
     *      org.eclipse.ui.IEditorInput)
     */
    @Override
    public void init(IEditorSite site, IEditorInput input) throws PartInitException {
        super.init(site, input);
        mediator = createScreenModelMediator();
        //      mediator.start();

        galleryAdapter = new GalleryAdapter();

        site.getWorkbenchWindow().getPartService().addPartListener(this);
        showEditorInput(input, true);

    }

    private ScreenModelMediator createScreenModelMediator() {
        ScreenModelMediator m = new ScreenModelMediator(this);
        return m;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.IPartListener#partActivated(org.eclipse.ui.IWorkbenchPart)
     */
    public void partActivated(IWorkbenchPart part) {
        try {
            activatePart(part);

            if (!cancelledNotification && part == this) {
                synchronized (this) {
                    if (!cancelledNotification) {
                        Theme activeTheme = ThemeUtil.getCurrentActiveTheme();
                        if (activeTheme instanceof S60Theme) {
                            Map<ThirdPartyIconWrapper, List<TPIconConflictEntry>> conflictingIconList = ThirdPartyIconManager
                                    .getConflictingIconList((S60Theme) activeTheme);
                            if (!conflictingIconList.isEmpty()) {
                                boolean confirmed = MessageDialog.openConfirm(part.getSite().getShell(),
                                        "Third Party Icons Conflicts",
                                        "Third party icon definitions for the current theme has conflicts. Resolve them now?");

                                if (confirmed) {
                                    if (IDialogConstants.CANCEL_ID == showThirdPartyIconPage())
                                        cancelledNotification = true;
                                } else {
                                    cancelledNotification = true;
                                }
                            }
                        }
                    }
                }
            }

        } catch (RuntimeException e) {

            e.printStackTrace();
        }
    }

    private void activatePart(IWorkbenchPart part) {
        if (part == this) {
            IWorkbenchPage page = getSite().getWorkbenchWindow().getActivePage();
            if (page != null) {

                // activate layers view
                try {
                    // if view is on page and not visible, activate
                    if (page.findView(LayersView.ID) != null) {
                        page.showView(LayersView.ID, null, IWorkbenchPage.VIEW_VISIBLE);
                    }
                } catch (PartInitException e) {
                    e.printStackTrace();
                }
            }

            if (toolbar != null && toolbar.isStayOnTop()) {
                toolbar.show();
            }
        } else {
            // if another editor selected hide tooltip
            if (toolbar != null) {
                if (PerspectiveUtil.getActiveEditorPart() != this || part instanceof ViewIntroAdapterPart) {
                    toolbar.hide();
                } else {
                    if (toolbar.isStayOnTop()) {
                        toolbar.show();
                    }
                }
            }
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.IPartListener#partBroughtToTop(org.eclipse.ui.IWorkbenchPart)
     */
    public void partBroughtToTop(IWorkbenchPart part) {
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.IPartListener#partDeactivated(org.eclipse.ui.IWorkbenchPart)
     */
    public void partDeactivated(IWorkbenchPart part) {
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.IPartListener#partClosed(org.eclipse.ui.IWorkbenchPart)
     */
    public void partClosed(IWorkbenchPart part) {
        if (part == this && toolbar != null) {
            toolbar.hide();
        }
        if (part == this)
            cancelledNotification = false;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.IPartListener#partOpened(org.eclipse.ui.IWorkbenchPart)
     */
    public void partOpened(IWorkbenchPart part) {
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
     */
    @Override
    public void createPartControl(Composite parent) {
        String error = checkInput();
        if (error != null) {
            createErrorForm(parent, error);
            return;
        }
        IContent activeContent = mediator.getActiveContent();
        if (activeContent == null) {
            createErrorForm(parent, EditorMessages.Editor_Error_ContentNotAvailable_Title, null,
                    NLS.bind(EditorMessages.Editor_Error_ContentNotAvailable_Info,
                            new Object[] { ((IFileEditorInput) getEditorInput()).getFile().getLocation() }));
            return;
        }

        pageBook = new PageBook(parent, SWT.NONE);

        if (toolbar != null) {
            toolbar.dispose();
        }

        toolbar = new FloatingToolbar(null, this, "s60_screen_toolbar", FloatingToolbar.EStyle.VERTICAL_VERTICAL) {

            @Override
            public boolean show(Point location) {
                IPreferenceStore store = S60WorkspacePlugin.getDefault().getPreferenceStore();
                Boolean showToolbar = store.getBoolean(IS60IDEConstants.PREF_SHOW_EDITOR_TOOLTIP);
                if (showToolbar) {
                    return super.show(location);
                }
                return false;
            }
        };
        toolbar.setControl(pageBook);

        if (!ScreenUtil.isPrimaryContent(activeContent)
                && mediator.getEditor(graphicalViewer) instanceof IEmbeddedEditorPart) {
            IEmbeddedEditorPart embeddedEditor = (IEmbeddedEditorPart) mediator.getEditor(graphicalViewer);
            createEmbeddedViewerControl(embeddedEditor, graphicalViewer);
            showEmbeddedEditor(embeddedEditor, graphicalViewer);
        } else {
            Control control = createViewerControl(graphicalViewer);
            pageBook.showPage(control);
        }
        PlatformUI.getWorkbench().getHelpSystem().setHelp(pageBook, Series60EditorPart.THEME_CONTEXT);
    }

    protected PaletteViewer createPaletteViewer(IContent content) {
        if (content == null) {
            return null;
        }

        PaletteManager paletteManager = new PaletteManager();
        paletteManager.initializePalette();
        IEmbeddedEditorDescriptor descriptor = ExtensionManager
                .getEmbeddedEditorDescriptorByContentType(content.getType());
        if (descriptor != null) {
            IEmbeddedEditorCustomizer customizer = descriptor.getEmbeddedEditorCustomizer();
            if (customizer != null) {
                customizer.customizePalette(paletteManager, content);
            }
        }
        if (paletteManager.isRequired()) {
            PaletteRoot paletteRoot = paletteManager.getPaletteRoot();

            PaletteViewer paletteViewer = new PaletteViewer();
            paletteViewer.setPaletteRoot(paletteRoot);

            getEditDomain().setPaletteViewer(paletteViewer);
            return paletteViewer;
        }
        return null;
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.nokia.tools.screen.ui.editor.ScreenEditorPart#createActionRegistry()
     */
    @Override
    protected ActionRegistry createActionRegistry() {
        return new ActionRegistry() {

            /*
             * (non-Javadoc)
             * 
             * @see org.eclipse.gef.ui.actions.ActionRegistry#getAction(java.lang.Object)
             */
            @Override
            public IAction getAction(Object key) {

                if (pageBook != null && !pageBook.isDisposed() && key instanceof String) {
                    for (Control child : pageBook.getChildren()) {
                        if (child.isVisible()) {
                            if (child.getData() instanceof IEmbeddedEditorPart) {
                                IAction action = ((IEmbeddedEditorPart) child.getData()).getAction((String) key);
                                if (action != null) {
                                    return action;
                                }
                            }
                        }
                    }
                }
                /*if(key.equals("createNew"))
                {
                   return new CreateNewAction(instance);
                }   */
                return super.getAction(key);
            }
        };
    }

    private void internalAdd(ActionRegistry registry, AbstractAction aa) {
        aa.listenSelection();
        getSelectionActions().add(aa.getId());
        registry.registerAction(aa);
    }

    /**
     * Creates the default actions that are associated with the editor.
     */
    protected void createActions() {
        super.createActions();
        ActionRegistry registry = getActionRegistry();
        IAction action;
        IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();

        // copy paste
        internalAdd(registry, new CopyImageAction(this, null));
        internalAdd(registry, new PasteImageAction(this, null));

        internalAdd(registry, new PasteContentDataAction(this, null, ClipboardHelper.APPLICATION_CLIPBOARD));

        ActionFactory.IWorkbenchAction actionBookmarks = IDEActionFactory.BOOKMARK.create(window);
        registry.registerAction(actionBookmarks);

        ActionFactory.IWorkbenchAction actionTasks = IDEActionFactory.ADD_TASK.create(window);
        registry.registerAction(actionTasks);

        action = new PrintAction(this);
        registry.registerAction(action);

        IKeyHandler handler = new MoveKeyHandler(this);
        action = KeyActionFactory.CTRL_LEFT.create(this, handler);
        registry.registerAction(action);
        getStackActions().add(action.getId());
        action = KeyActionFactory.CTRL_RIGHT.create(this, handler);
        registry.registerAction(action);
        getStackActions().add(action.getId());
        action = KeyActionFactory.CTRL_UP.create(this, handler);
        registry.registerAction(action);
        getStackActions().add(action.getId());
        action = KeyActionFactory.CTRL_DOWN.create(this, handler);
        registry.registerAction(action);
        getStackActions().add(action.getId());

        handler = new ResizeKeyHandler(this);
        action = KeyActionFactory.CTRL_SHIFT_LEFT.create(this, handler);
        registry.registerAction(action);
        getStackActions().add(action.getId());
        action = KeyActionFactory.CTRL_SHIFT_RIGHT.create(this, handler);
        registry.registerAction(action);
        getStackActions().add(action.getId());
        action = KeyActionFactory.CTRL_SHIFT_UP.create(this, handler);
        registry.registerAction(action);
        getStackActions().add(action.getId());
        action = KeyActionFactory.CTRL_SHIFT_DOWN.create(this, handler);
        registry.registerAction(action);
        getStackActions().add(action.getId());

        action = new ShowInResourceViewAction(this);
        registry.registerAction(action);

        action = new ShowInComponentViewAction(this);
        registry.registerAction(action);

        // Alignment tools
        action = new AlignmentAction((IWorkbenchPart) this, PositionConstants.LEFT);
        registry.registerAction(action);
        getSelectionActions().add(action.getId());

        action = new AlignmentAction((IWorkbenchPart) this, PositionConstants.RIGHT);
        registry.registerAction(action);
        getSelectionActions().add(action.getId());

        action = new AlignmentAction((IWorkbenchPart) this, PositionConstants.TOP);
        registry.registerAction(action);
        getSelectionActions().add(action.getId());

        action = new AlignmentAction((IWorkbenchPart) this, PositionConstants.BOTTOM);
        registry.registerAction(action);
        getSelectionActions().add(action.getId());

        action = new AlignmentAction((IWorkbenchPart) this, PositionConstants.CENTER);
        registry.registerAction(action);
        getSelectionActions().add(action.getId());

        action = new AlignmentAction((IWorkbenchPart) this, PositionConstants.MIDDLE);
        registry.registerAction(action);
        getSelectionActions().add(action.getId());

        action = new MatchWidthAction(this);
        registry.registerAction(action);
        getSelectionActions().add(action.getId());

        action = new MatchHeightAction(this);
        registry.registerAction(action);
        getSelectionActions().add(action.getId());

        action = new PlayAllAction(this);
        registry.registerAction(action);
        getStackActions().add(action.getId());

        action = new PlaySelectionAction(this);
        registry.registerAction(action);
        getStackActions().add(action.getId());

        action = new PausePlayingAction(this);
        registry.registerAction(action);
        getStackActions().add(action.getId());

        action = new StopPlayingAction(this);
        registry.registerAction(action);
        getStackActions().add(action.getId());

        action = new SetPlayingSpeedAction(this);
        registry.registerAction(action);
        getStackActions().add(action.getId());

        internalAdd(registry, new SetStretchModeAction(this, IMediaConstants.STRETCHMODE_STRETCH));

        internalAdd(registry, new SetStretchModeAction(this, IMediaConstants.STRETCHMODE_ASPECT));

        internalAdd(registry, new ConvertAndEditSVGInBitmapEditorAction(this));

        internalAdd(registry, new EditInSystemEditorAction(this));

        internalAdd(registry, new EditImageInBitmapEditorAction(this));

        internalAdd(registry, new EditImageInSVGEditorAction(this));

        internalAdd(registry, new BrowseForFileAction(this));

        internalAdd(registry, new ClearImageEditorAction(this));

        internalAdd(registry, new SetColorAction(this));

        /* masks */

        internalAdd(registry, new EditMaskAction2(this));

        internalAdd(registry, new EditMaskAction(this));

        /* nine-piece related actions */

        internalAdd(registry, new NinePieceConvertAction(this, NinePieceConvertAction.TYPE_CONVERT2SINGLE));

        internalAdd(registry, new NinePieceConvertAction(this, NinePieceConvertAction.TYPE_CONVERT2NINE));
        //11 pic related actions

        internalAdd(registry, new ElevenPieceConvertAction(this, ElevenPieceConvertAction.TYPE_CONVERT2SINGLE));

        internalAdd(registry, new ElevenPieceConvertAction(this, ElevenPieceConvertAction.TYPE_ELEVEN_PIECE));

        AbstractAction aa = new OpenGraphicsEditorAction(this);
        internalAdd(registry, aa);
        getEditorSite().getActionBars().setGlobalActionHandler(OpenGraphicsEditorAction.ID, aa);

        /* add contributed actions */
        ContributedActionsResolver.getInstance().addToRegistry(this, registry);
    }

    /**
     * Creates the graphical viewer on top of the given EMF model.<br> <b>Note:
     * the graphical viewer created doesn't have a control yet.</b>
     * 
     * @param model the model object.
     * @return the graphical viewer.
     */
    protected GraphicalViewer createGraphicalViewer(EditDiagram model) {
        final GraphicalViewer viewer = new ZOrderScrollingGraphicalViewer();
        initializeEditPartViewer(viewer);

        viewer.setEditPartFactory(new ScreenEditPartFactory(DefaultEditPartFactory.TYPE_GRAPHICAL));

        viewer.setContents(new DiagramGraphicalEditPart(model) {

            /*
             * (non-Javadoc)
             * 
             * @see com.nokia.tools.editing.ui.part.DiagramGraphicalEditPart#createFigure()
             */
            @Override
            protected IFigure createFigure() {
                IFigure figure = super.createFigure();
                figure.setLayoutManager(new ViewportCenterLayout());
                return figure;
            }

        });
        JFCDiagramAdapter adapter = new JFCDiagramAdapter(viewer);
        model.eAdapters().add(adapter);

        viewer.addDropTargetListener(
                (TransferDropTargetListener) new FileDropAdapter(viewer, LocalSelectionTransfer.getInstance()));
        viewer.addDropTargetListener(
                (TransferDropTargetListener) new FileDropAdapter(viewer, FileTransfer.getInstance()));

        return viewer;
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.nokia.tools.ui.editor.BaseEditorPart#createContextMenuProvider()
     */
    @Override
    protected ContextMenuProvider createContextMenuProvider() {
        // context menu
        ScreenEditorContextMenuProvider provider = new ScreenEditorContextMenuProvider(graphicalViewer);
        for (IEmbeddedEditorDescriptor descriptor : ExtensionManager.getEmbeddedEditorDescriptors()) {
            IEmbeddedEditorContributor contributor = descriptor.getContributor();
            if (contributor != null) {
                try {
                    contributor.contributeActions(this);
                } catch (Exception e) {
                    S60WorkspacePlugin.error(e);
                }
                provider.addEmbeddedEditorContributor(contributor);
            }
        }
        return provider;
    }

    /**
     * Creates the control for the graphical viewer.
     * 
     * @param viewer the graphical viewer.
     * @return the control or null if the editor is not visiable yet or has been
     *         disposed.
     */
    protected Control createViewerControl(EditPartViewer viewer) {
        if (pageBook == null || pageBook.isDisposed() || viewer == null) {
            return null;
        }

        Composite composite = new Composite(pageBook, SWT.BORDER);
        StackLayout stack = new StackLayout();
        stack.topControl = viewer.createControl(composite);
        composite.setLayout(stack);

        return composite;
    }

    public Control createEmbeddedViewerControl(IEmbeddedEditorPart embeddedEditor, EditPartViewer viewer) {
        if (embeddedEditor == null || pageBook == null) {
            return null;
        }

        if (embeddedEditor.getControl() == null) {
            embeddedEditor.createPartControl(pageBook);
            Control[] children = pageBook.getChildren();
            children[children.length - 1].setData(embeddedEditor);
        }

        embeddedEditor.createViewerControl(viewer);
        return viewer.getControl().getParent();
    }

    private void showEmbeddedEditor(IEmbeddedEditorPart embeddedEditor, EditPartViewer viewer) {
        try {
            if (embeddedEditor.getControl() != null) {
                PaletteViewer paletteViewer = (PaletteViewer) embeddedEditor.getAdapter(PaletteViewer.class);
                if (paletteViewer == null) {
                    paletteViewer = createPaletteViewer(mediator.extractContent(viewer));
                    embeddedEditor.createPaletteControl(paletteViewer);
                }
                if (paletteViewer != null) {
                    getEditDomain().setPaletteRoot(paletteViewer.getPaletteRoot());
                    getEditDomain().setPaletteViewer(paletteViewer);
                }
                //widget disposed exception is coming when we remove

                if (!pageBook.isDisposed() && !embeddedEditor.getControl().isDisposed())
                    pageBook.showPage(embeddedEditor.getControl());
                embeddedEditor.showView(viewer);
            }
        } catch (SWTException e) {

            e.printStackTrace();
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.nokia.tools.ui.editor.BaseEditorPart#createKeyHandler()
     */
    protected KeyHandler createKeyHandler() {
        KeyHandler keyHandler = new KeyHandler();

        keyHandler.put(KeyStroke.getPressed((char) 3, 99, 262144),
                getActionRegistry().getAction(ActionFactory.COPY.getId()));

        keyHandler.put(KeyStroke.getPressed((char) 22, 118, 262144),
                getActionRegistry().getAction(ActionFactory.PASTE.getId()));

        keyHandler.put(KeyStroke.getPressed((char) 26, 122, 262144),
                getActionRegistry().getAction(ActionFactory.UNDO.getId()));

        keyHandler.put(KeyStroke.getPressed((char) 25, 121, 262144),
                getActionRegistry().getAction(ActionFactory.REDO.getId()));

        keyHandler.put(KeyActionFactory.CTRL_LEFT.getKeyStroke(),
                getActionRegistry().getAction(KeyActionFactory.CTRL_LEFT_ID));
        keyHandler.put(KeyActionFactory.CTRL_RIGHT.getKeyStroke(),
                getActionRegistry().getAction(KeyActionFactory.CTRL_RIGHT_ID));
        keyHandler.put(KeyActionFactory.CTRL_UP.getKeyStroke(),
                getActionRegistry().getAction(KeyActionFactory.CTRL_UP_ID));
        keyHandler.put(KeyActionFactory.CTRL_DOWN.getKeyStroke(),
                getActionRegistry().getAction(KeyActionFactory.CTRL_DOWN_ID));
        keyHandler.put(KeyActionFactory.CTRL_SHIFT_LEFT.getKeyStroke(),
                getActionRegistry().getAction(KeyActionFactory.CTRL_SHIFT_LEFT_ID));
        keyHandler.put(KeyActionFactory.CTRL_SHIFT_RIGHT.getKeyStroke(),
                getActionRegistry().getAction(KeyActionFactory.CTRL_SHIFT_RIGHT_ID));
        keyHandler.put(KeyActionFactory.CTRL_SHIFT_UP.getKeyStroke(),
                getActionRegistry().getAction(KeyActionFactory.CTRL_SHIFT_UP_ID));
        keyHandler.put(KeyActionFactory.CTRL_SHIFT_DOWN.getKeyStroke(),
                getActionRegistry().getAction(KeyActionFactory.CTRL_SHIFT_DOWN_ID));

        return keyHandler;

    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
     */
    @Override
    public void setFocus() {
        if (pageBook != null) {
            pageBook.setFocus();
        } else {
            super.setFocus();
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
     */
    @Override
    public boolean isSaveAsAllowed() {
        return true;
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.nokia.tools.ui.editor.BaseEditorPart#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
     */
    public void selectionChanged(SelectionChangedEvent event) {
        ISelection selection = event.getSelection();
        if (selection instanceof IStructuredSelection) {
            Object element = ((IStructuredSelection) selection).getFirstElement();
            if (element instanceof GraphicalViewer) {
                GraphicalViewer viewer = (GraphicalViewer) element;
                if (viewer.getContents() == null || viewer.getContents().getModel() == null) {

                    return;
                }
                bringToFront(false, viewer);
                // sets the focus only when the whole viewer is selected
                setFocus();
            }
        }
        super.selectionChanged(event);
    }

    /**
     * 
     */
    private void removeDragListeners() {
        if (graphicalViewer == null) {
            return;
        }
        if (currentDragListeners != null) {
            for (int i = 0; i < currentDragListeners.length; i++) {
                graphicalViewer.removeDragSourceListener(currentDragListeners[i]);
            }
        }
    }

    /**
     * 
     */
    private void addDragListeners() {
        currentDragListeners = new TransferDragSourceListener[2];
        TransferDragSourceListener localTransferListener = new S60BaseDragListener(
                LocalSelectionTransfer.getInstance(), graphicalViewer);
        TransferDragSourceListener fileTransferListener = new S60BaseDragListener(FileTransfer.getInstance(),
                graphicalViewer);
        graphicalViewer.addDragSourceListener(localTransferListener);
        graphicalViewer.addDragSourceListener((fileTransferListener));
        currentDragListeners[0] = localTransferListener;
        currentDragListeners[1] = fileTransferListener;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.ide.IGotoMarker#gotoMarker(org.eclipse.core.resources.IMarker)
     */
    public void gotoMarker(IMarker marker) {
        String id = marker.getAttribute(ContentAttribute.ID.name(), null);
        final IContentData elemData;
        if (id != null) {
            elemData = mediator.getPrimaryContent().findById(id);
        } else {
            String name = marker.getAttribute(ContentAttribute.NAME.name(), null);
            elemData = mediator.getPrimaryContent().findByName(name);
        }
        if (elemData != null) {
            String screen = marker.getAttribute(ScreenEditorPart.SCREEN, null);

            if (elemData != null) {
                if (screen != null)
                    bringScreenToTop(screen);
            }

            if (!selectAndRevealData(elemData, screen)) {
                Display.getCurrent().asyncExec(new Runnable() {

                    public void run() {
                        ((ShowInResourceViewAction) getActionRegistry().getAction(ShowInResourceViewAction.ID))
                                .doRun(elemData);
                    }
                });
            }
            try {
                EditPart sel = ScreenUtil.findPartForMarkerAttrs(getEditPartViewer().getContents(),
                        marker.getAttributes());
                if (null != sel)
                    getEditPartViewer().select(sel);
                else
                    getEditPartViewer().deselectAll();
            } catch (CoreException e) {
                e.printStackTrace();
            }
            return;
        } else {

            String screen = marker.getAttribute(ScreenEditorPart.SCREEN, null);
            if (screen != null) {
                bringScreenToTop(screen);
                return;
            }
        }
    }

    /**
     * @return false if there is no preview screen and item can not be selectede
     */
    private boolean selectAndRevealData(IContentData data, String preferedScreen) {
        return selectAndRevealData(new IContentData[] { data }, preferedScreen);
    }

    /**
     * @return false if there is no preview screen and item can not be selectede
     */
    private boolean selectAndRevealData(IContentData[] data, String preferedScreen) {
        IContentData scrData = null;
        if (null == preferedScreen) {

            // if screen not defined check on current screen
            List<EditPart> sels = ScreenUtil.findPartsForData(getEditPartViewer().getContents(), data);
            if (!sels.isEmpty()) {
                getEditPartViewer().setSelection(new StructuredSelection(sels));
                return true;
            }

            // if screen not defined get one that can display element with id
            int i = 0;
            while (preferedScreen == null && i < data.length) {

                scrData = ScreenUtil.getScreenForData(data[i], true);
                if (null != scrData) {
                    break;
                }
                i++;
            }

            if (null == scrData) {
                getEditPartViewer().deselectAll();
                return false;
            }
        }
        if (scrData != null) {
            bringScreenToTop(scrData);
        }
        List<EditPart> sels = ScreenUtil.findPartsForData(getEditPartViewer().getContents(), data);
        if (sels.size() > 0)
            getEditPartViewer().setSelection(new StructuredSelection(sels));
        else
            getEditPartViewer().deselectAll();
        return true;
    }

    private void activateViewer() {
        IWorkbenchPage page = getSite().getWorkbenchWindow().getActivePage();
        IWorkbenchPart activePart = page.getActivePart();
        if (activePart == this) {
            // we need to reactivate the editor in order to have
            // the workbench
            // selection service hooked into the graphical
            // viewer immediately,
            for (IViewReference ref : page.getViewReferences()) {
                IViewPart part = ref.getView(false);
                if (part != null) {
                    ISelectionProvider provider = ((IViewSite) part.getSite()).getSelectionProvider();
                    if (provider != null) {
                        // clears the selection to prevent from re-selecting and
                        // thus causing screen switching again
                        ((IViewSite) part.getSite()).getSelectionProvider().setSelection(StructuredSelection.EMPTY);
                    }
                    page.activate(part);
                    break;
                }
            }
        }

        if (page.getActiveEditor() != null) {
            page.activate(this);
        }
    }

    /**
     * Brings the given viewer to the front and hides the other viewers.
     * 
     * @param viewer the viewer to be shown.
     */
    private void bringToFront(boolean isNew, GraphicalViewer viewer) {
        if (graphicalViewer == viewer) {
            return;
        }
        removeDragListeners();
        if (graphicalViewer != null) {
            getSelectionSynchronizer().removeViewer(graphicalViewer);
        }
        removeFigureListeners();

        graphicalViewer = viewer;

        EditPart contents = graphicalViewer.getContents();
        if (contents != null) {
            if (contents.getModel() instanceof EditDiagram) {
                EList<EditObject> list = ((EditDiagram) contents.getModel()).getEditObjects();
                if (!list.isEmpty()) {
                    Object part = graphicalViewer.getEditPartRegistry().get(list.get(0));
                    if (part instanceof SComponentGraphicalEditPart) {
                        ((SComponentGraphicalEditPart) part).removeContour();
                    }
                }
            }
        }
        addFigureListeners();

        IEditorPart editor = mediator.getEditor(viewer);

        if (editor instanceof IEmbeddedEditorPart) {
            showEmbeddedEditor((IEmbeddedEditorPart) editor, viewer);
        } else if (viewer != null && viewer.getControl() != null) {
            pageBook.showPage(viewer.getControl().getParent());
        }

        if (graphicalViewer != null) {
            IContentData data = mediator.getScreenByViewer(graphicalViewer);
            if (data != null) {
                setPartName(getProject().getName() + " - " + data.getName());
            }
            if (ScreenUtil.isPrimaryContent(data)) {
                addDragListeners();
            }
        }

        if (!(editor instanceof IEmbeddedEditorPart)) {
            // resets the palette tool to select
            PaletteViewer palette = getEditDomain().getPaletteViewer();
            if (palette != null) {
                palette.setActiveTool(null);
            }
        }

        initializeViewers();

        fireContentRootChanged();

        if (!isNew) {
            activateViewer();
        }

        final PlayAllAction action = (PlayAllAction) getActionRegistry().getAction(PlayAllAction.ID);
        if (action != null && action.isEnabled()) {
            // queues after update has completed
            getSite().getShell().getDisplay().asyncExec(new Runnable() {

                public void run() {
                    action.setPlayOnce(true);
                    action.run();
                    action.setPlayOnce(false);
                }
            });
        }
    }

    private void bringScreenToTop(String screenName) {
        for (IGalleryScreen screen : mediator.getGalleryScreens()) {
            if (screen.getName().equalsIgnoreCase(screenName)) {
                bringScreenToTop(screen.getData());
            }
        }
    }

    private void bringScreenToTop(IContentData scrData) {

        if (mediator.getActiveContent() != mediator.getPrimaryContent()) {
            IProject project = getProject();
            IFile file = project.getFile(project.getName() + ".tdf");
            if (!file.isLinked()) {
                IFolder folder = project.getFolder(project.getName());
                if (folder.exists()) {
                    file = folder.getFile(project.getName() + ".tdf");
                }
            }
            if (file == null || !file.exists()) {
                return;
            }
            showEditorInput(new FileEditorInput(file), false);
        }
        IProgressMonitor monitor = getProgressMonitor();
        monitor.beginTask(EditorMessages.Editor_Task_CreatingGraphicalViewer, ScreenModelMediator.TOTAL_WORK);
        try {
            final GraphicalViewer viewer = mediator.getViewer(scrData, false, monitor);
            if (viewer == graphicalViewer) {
                return;
            }

            Series60EditorPart.this.getSite().getShell().getDisplay().syncExec(new Runnable() {

                public void run() {
                    bringToFront(false, viewer);
                }
            });
        } catch (IllegalStateException e) {
        } finally {
            monitor.done();
        }

        if (graphicalViewer != null) {
            IContentData data = mediator.getScreenByViewer(graphicalViewer);
            if (data != null) {
                setPartName(getProject().getName() + " - " + data.getName());
            }

        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.nokia.tools.ui.editor.BaseGEFEditorPart#getEditPartViewer()
     */
    @Override
    public EditPartViewer getEditPartViewer() {
        return graphicalViewer;
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.nokia.tools.screen.ui.editor.ScreenEditorPart#dispose()
     */
    @Override
    public void dispose() {
        try {
            getSite().getWorkbenchWindow().getPartService().removePartListener(this);
        } catch (Throwable e) {
            S60WorkspacePlugin.error(e);
        }
        try {
            if (graphicalViewer != null) {
                getSelectionSynchronizer().removeViewer(graphicalViewer);
            }
        } catch (Throwable e) {
            S60WorkspacePlugin.error(e);
        }
        try {
            removeFigureListeners();
        } catch (Throwable e) {
            S60WorkspacePlugin.error(e);
        }

        try {
            if (mediator != null) {
                mediator.dispose();
            }
        } catch (Throwable e) {
            S60WorkspacePlugin.error(e);
        }

        ColorGroupsStore.disposeColorGroupsForProject(getProject());

        super.dispose();
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.nokia.tools.screen.ui.editor.ScreenEditorPart#getAdapter(java.lang.Class)
     */
    @Override
    public Object getAdapter(Class adapter) {
        if (mediator == null) {
            return super.getAdapter(adapter);
        }
        if (adapter == IPackager.class) {
            if (mediator.getPrimaryContent() != null) {
                return mediator.getPrimaryContent().getAdapter(IPackager.class);
            }
        }

        if (adapter == IContent.class) {
            return mediator.getPrimaryContent();
        }

        if (adapter == IGalleryScreenProvider.class) {
            if (mediator.getActiveContent() == null) {
                return null;
            }
            return mediator;
        }
        if (adapter == IGalleryAdapter.class) {
            if (mediator.getActiveContent() == null) {
                return null;
            }
            return galleryAdapter;
        }
        if (adapter == IContentAdapter.class || adapter == IContentService.class) {
            return this;
        }

        if (adapter == IIconMenuProvider.class) {
            return new GraphicalIconMenuProvider();
        }

        Object object = super.getAdapter(adapter);
        if (object != null) {
            return object;
        }

        IEditorPart editor = mediator.getEditor(getEditPartViewer());
        if (editor != null && editor != this) {
            return editor.getAdapter(adapter);
        }
        return null;
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.nokia.tools.ui.editor.BaseEditorPart#stackChanged(org.eclipse.gef.commands.CommandStackEvent)
     */
    @Override
    public void stackChanged(CommandStackEvent event) {
        super.stackChanged(event);

        if (event.getCommand() != null) {
            if ((event.getDetail()
                    & (CommandStack.POST_EXECUTE | CommandStack.POST_REDO | CommandStack.POST_UNDO)) != 0) {
                updateSelectionActions(getSelectionActions());

                Command command = event.getCommand();
                if (CommandInspector.fireContentModified(command)) {
                    String[] affectedElements = CommandInspector.getAffectedElements(command);
                    fireContentModified(affectedElements);
                }
            }
        }
    }

    private void updateSelectionActions(List<String> actionIds) {
        ActionRegistry registry = getActionRegistry();
        Iterator iter = actionIds.iterator();
        SelectionChangedEvent evt = new SelectionChangedEvent(getEditPartViewer(),
                getEditPartViewer().getSelection());
        while (iter.hasNext()) {
            IAction action = registry.getAction(iter.next());
            if (action instanceof AbstractAction) {
                AbstractAction aa = (AbstractAction) action;
                if (aa.isListeningSelection())
                    aa.selectionChanged(evt);
            }
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.nokia.tools.screen.ui.editor.ScreenEditorPart#disposeContent()
     */
    @Override
    protected void disposeContent() {
        if (mediator != null) {
            mediator.disposeOldContents();
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.IPropertyListener#propertyChanged(java.lang.Object,
     *      int)
     */
    public void propertyChanged(Object source, int propertyId) {
        firePropertyChange(propertyId);
    }

    public IEmbeddedEditorPart createEmbeddedEditor(final IEmbeddedEditorDescriptor desc,
            final IEditorInput editorInput) {
        if (desc == null) {
            return null;
        }

        IEmbeddedEditorPart embeddedEditor = (IEmbeddedEditorPart) ThreadUtils
                .syncDisplayExec(new IInvokable.Adapter() {

                    public Object invoke() {
                        return desc.createEditorPart(Series60EditorPart.this, editorInput);
                    }
                });
        embeddedEditor.addPropertyListener(this);
        IContentService adapter = (IContentService) embeddedEditor.getAdapter(IContentService.class);
        if (adapter != null) {
            adapter.addContentListener(mediator);
        }
        return embeddedEditor;
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.nokia.tools.screen.ui.editor.ScreenEditorPart#superSetInput(org.eclipse.ui.IEditorInput)
     */
    @Override
    protected void superSetInput(IEditorInput input) {
        super.superSetInput(input);
        setPartName(null != getProject() ? getProject().getName() : "");
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.nokia.tools.screen.ui.editor.ScreenEditorPart#showEditorInput(org.eclipse.ui.IEditorInput,
     *      boolean)
     */
    public void showEditorInput(final IEditorInput editorInput, final boolean isNew) {
        if (!isNew && getEditorInput().equals(editorInput)) {
            return;
        }
        try {
            new ProgressMonitorDialog(getSite().getShell()).run(!isNew, false, new IRunnableWithProgress() {

                public void run(final IProgressMonitor monitor)
                        throws InvocationTargetException, InterruptedException {
                    beginProgressMonitorProgress(editorInput, monitor);
                    final GraphicalViewer viewer = mediator.getViewer(editorInput, monitor);
                    boolean refreshGallery = viewer != graphicalViewer;
                    if (refreshGallery) {
                        mediator.clearGalleryScreens();
                    }
                    if (viewer == null) {
                        try {
                            mediator.initialize(editorInput, monitor);
                        } catch (final Exception e) {
                            processException(e);
                            return;
                        }
                        setEditorInputWhileInProgressMonitor(editorInput);
                    }
                    monitor.worked(ScreenModelMediator.OTHER_WORK * 3 / 5);

                    refreshElements(isNew, monitor, viewer);
                    if (refreshGallery) {
                        refreshGallery();
                    }
                }

            });
        } catch (Exception e) {
            e.printStackTrace();
            S60WorkspacePlugin.error(e);
        }
    }

    private void beginProgressMonitorProgress(final IEditorInput editorInput, final IProgressMonitor monitor) {
        monitor.beginTask(MessageFormat.format(EditorMessages.Editor_LoadingTheme, editorInput.getName()),
                ScreenModelMediator.TOTAL_WORK);
    }

    private void refreshElements(final boolean isNew, final IProgressMonitor monitor,
            final GraphicalViewer viewer) {
        getSite().getShell().getDisplay().syncExec(new Runnable() {

            /*
             * (non-Javadoc)
             * 
             * @see java.lang.Runnable#run()
             */
            public void run() {
                if (viewer == null) {
                    refreshEditor(isNew, monitor);
                } else {
                    viewer.deselectAll();
                    bringToFront(isNew, viewer);
                }
            }
        });
    }

    private void setEditorInputWhileInProgressMonitor(final IEditorInput editorInput) {
        getSite().getShell().getDisplay().syncExec(new Runnable() {

            /*
             * (non-Javadoc)
             * 
             * @see java.lang.Runnable#run()
             */
            public void run() {
                setInput(editorInput);
            }
        });
    }

    private void processException(final Exception e) {
        S60WorkspacePlugin.error(e);
        getSite().getShell().getDisplay().syncExec(new Runnable() {

            public void run() {
                MessageDialogWithTextContent.openError(getSite().getShell(),
                        EditorMessages.Error_Editor_Initialize_Contents,
                        EditorMessages.Error_Editor_Initialize_Contents, e);
            }
        });
    }

    public List<IContentData> getSelectedData() {
        List<IContentData> data = new ArrayList<IContentData>();
        if (graphicalViewer != null) {
            for (Object part : graphicalViewer.getSelectedEditParts()) {
                IScreenElement element = JEMUtil.getScreenElement(part);
                if (element != null) {
                    data.add(element.getData());
                }
            }
        }
        return data;
    }

    protected void reloadContent() {
        try {
            new ProgressMonitorDialog(getSite().getShell()).run(false, false, new IRunnableWithProgress() {

                /*
                * (non-Javadoc)
                * 
                * @see org.eclipse.jface.operation.IRunnableWithProgress#run(org.eclipse.core.runtime.IProgressMonitor)
                */
                public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
                    monitor.beginTask(
                            MessageFormat.format(EditorMessages.Editor_ReloadTheme, getEditorInput().getName()),
                            ScreenModelMediator.TOTAL_WORK);

                    refreshEditor(false, monitor);
                    refreshGallery();
                    monitor.done();
                }
            });
        } catch (Exception e) {
            S60WorkspacePlugin.error(e);
        }
    }

    /**
     * based on the content data rebuilds the screen
     */
    protected void refreshEditor(boolean isNew, IProgressMonitor monitor) {
        IContentData currentScreen = mediator.getScreenByViewer(graphicalViewer);
        List<IContentData> selectedData = getSelectedData();

        removeFigureListeners();
        mediator.disposeViewers();

        try {
            mediator.rebuildModel(monitor);
            GraphicalViewer viewer = null;
            if (currentScreen != null) {
                for (IGalleryScreen screen : mediator.getGalleryScreens()) {
                    if (screen.getName().equals(currentScreen.getName())) {
                        viewer = mediator.getViewer(screen.getData(), false, monitor);
                        break;
                    }
                }
            }
            if (viewer == null) {
                viewer = mediator.getDefaultViewer(monitor);
            }
            if (viewer == null) {
                MessageDialog.openError(getSite().getShell(), EditorMessages.Editor_Error_ScreenNotAvailable_Title,
                        EditorMessages.Editor_Error_ScreenNotAvailable_Message);
                return;
            }

            bringToFront(isNew, viewer);

            if (viewer != null) {
                EditPart root = viewer.getContents();

                for (IContentData selected : selectedData) {
                    EditPart part = ScreenUtil.findPartForData(root, selected);
                    if (part != null) {
                        viewer.select(part);
                    } else if (selected.getId() != null) {
                        for (Object obj : viewer.getEditPartRegistry().values()) {
                            IScreenElement element = JEMUtil.getScreenElement(obj);
                            if (element != null && selected.getId().equals(element.getData().getId())) {
                                viewer.select((EditPart) obj);
                                break;
                            }
                        }
                    }
                }
            }
        } catch (ContentException e) {
            S60WorkspacePlugin.error(e);
            MessageDialog.openError(getSite().getShell(), EditorMessages.Error_Editor_No_Screens,
                    EditorMessages.Error_Editor_No_Screens);
            return;
        }
    }

    protected void refreshViewer(GraphicalViewer viewer) {
        bringToFront(false, viewer);
        refreshGallery();
    }

    /**
     * Re-generates the gallery.
     */
    protected void refreshGallery() {
        galleryAdapter.notifyGalleryChanged();
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.nokia.tools.screen.ui.editor.ScreenEditorPart#createContentOutlinePage(org.eclipse.gef.ui.parts.TreeViewer)
     */
    @Override
    protected BaseContentOutlinePage createContentOutlinePage(TreeViewer viewer) {
        return new Series60ContentOutlinePage(viewer);
    }

    protected ScreenModelMediator getMediator() {
        return mediator;
    }

    /**
     * Global gallery adapter used for notifying gallery changed events.
     *
     */
    class GalleryAdapter implements IGalleryAdapter {

        private Set<IGalleryListener> listeners = new HashSet<IGalleryListener>(1);

        /*
         * (non-Javadoc)
         * 
         * @see com.nokia.tools.s60.views.IGalleryAdapter#addGalleryListener(com.nokia.tools.s60.views.IGalleryAdapter.IGalleryListener)
         */
        public void addGalleryListener(IGalleryListener listener) {
            listeners.add(listener);
        }

        /*
         * (non-Javadoc)
         * 
         * @see com.nokia.tools.s60.views.IGalleryAdapter#removeGalleryListener(com.nokia.tools.s60.views.IGalleryAdapter.IGalleryListener)
         */
        public void removeGalleryListener(IGalleryListener listener) {
            listeners.remove(listener);
        }

        /*
         * (non-Javadoc)
         * 
         * @see com.nokia.tools.s60.views.IGalleryAdapter#notifiyGalleryChanged()
         */
        public void notifyGalleryChanged() {
            for (final IGalleryListener listener : listeners) {
                getSite().getShell().getDisplay().asyncExec(new Runnable() {

                    /*
                     * (non-Javadoc)
                     * 
                     * @see java.lang.Runnable#run()
                     */
                    public void run() {
                        listener.galleryChanged(mediator);
                    }
                });
            }
        }
    }

    public void doubleClick(final EditPart editPart) {

        String ids[] = { OpenGraphicsEditorAction.ID, EditImageInBitmapEditorAction.ID,
                EditImageInSVGEditorAction.ID, SetColorAction.ID };
        for (String a : ids) {
            IAction action = getActionRegistry().getAction(a);
            if (action != null && action.isEnabled()) {
                action.run();
                break;
            }
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.part.ISetSelectionTarget#selectReveal(org.eclipse.jface.viewers.ISelection)
     */
    public void selectReveal(ISelection selection) {
        if (!selection.isEmpty()) {
            StructuredSelection select = (StructuredSelection) selection;
            if (select.getFirstElement() instanceof IContentData) {
                List<Object> data = new ArrayList<Object>();
                for (Iterator iter = select.iterator(); iter.hasNext();) {
                    Object obj = iter.next();
                    if (obj instanceof IContentData) {
                        data.add(obj);
                    }
                }

                if (!selectAndRevealData(data.toArray(new IContentData[0]), null))
                    throw new RuntimeException(EditorMessages.Editor_Error_NoPreviewScreen);
            }
        } else {
            getEditPartViewer().deselectAll();
        }
    }

    public void fireRootContentChanged(IContent content) {
        if (contentService != null) {
            contentService.fireRootContentChanged(content);
        }
    }

    private int showThirdPartyIconPage() {
        String linkAddress = "com.nokia.tools.theme.s60.ui.preferences.ThirdPartyIconsPrefPage";
        PreferenceDialog prefdlg = PreferencesUtil.createPreferenceDialogOn(Display.getCurrent().getActiveShell(),
                linkAddress, new String[] { linkAddress }, null);

        int openStatus = prefdlg.open();
        prefdlg.close();
        return openStatus;
    }

}