com.nokia.carbide.cpp.uiq.ui.viewwizard.ViewWizardManager.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.carbide.cpp.uiq.ui.viewwizard.ViewWizardManager.java

Source

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "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: 
*
*/
/* START_USECASES: CU1, CU2 END_USECASES */
package com.nokia.carbide.cpp.uiq.ui.viewwizard;

import com.nokia.carbide.cpp.uiq.ui.UIQUserInterfacePlugin;
import com.nokia.carbide.internal.api.templatewizard.ui.IWizardDataPage;
import com.nokia.carbide.internal.api.templatewizard.ui.TemplateWizard;
import com.nokia.carbide.template.engine.ITemplate;
import com.nokia.cpp.internal.api.utils.core.Check;
import com.nokia.cpp.internal.api.utils.core.Logging;
import com.nokia.cpp.internal.api.utils.ui.UITaskUtils;
import com.nokia.sdt.component.*;
import com.nokia.sdt.component.adapter.CommonAttributes;
import com.nokia.sdt.component.adapter.IAttributes;
import com.nokia.sdt.component.event.IEventDescriptor;
import com.nokia.sdt.component.symbian.ComponentProvider;
import com.nokia.sdt.component.symbian.properties.CompoundPropertySource;
import com.nokia.sdt.datamodel.IDesignerDataModel;
import com.nokia.sdt.datamodel.adapter.*;
import com.nokia.sdt.datamodel.adapter.IEventBinding;
import com.nokia.sdt.datamodel.util.ModelUtils;
import com.nokia.sdt.displaymodel.IDisplayModel;
import com.nokia.sdt.editor.EditorServices;
import com.nokia.sdt.editor.IDesignerDataModelEditor;
import com.nokia.sdt.emf.dm.*;
import com.nokia.sdt.sourcegen.*;
import com.nokia.sdt.symbian.dm.*;
import com.nokia.sdt.symbian.ui.UIPlugin;
import com.nokia.sdt.symbian.workspace.ISymbianProjectContext;
import com.nokia.sdt.symbian.workspace.impl.ProjectContextProvider;
import com.nokia.sdt.workspace.*;

import org.eclipse.cdt.core.model.*;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.*;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWizard;
import org.eclipse.ui.views.properties.IPropertySource;

import java.lang.reflect.InvocationTargetException;
import java.util.*;

public class ViewWizardManager {
    // store keys
    public static final String PROJECT_NAME_KEY = "PROJECT_NAME"; //$NON-NLS-1$
    public static final String PROJECT_KEY = "PROJECT"; //$NON-NLS-1$
    public static final String APPNAME_KEY = "APPLICATION_NAME"; //$NON-NLS-1$
    public static final String LANGUAGE_ID_KEY = "LANGUAGE_ID"; //$NON-NLS-1$
    public static final String APPUID_KEY = "APP_UID"; //$NON-NLS-1$
    public static final String ROOT_MODEL_KEY = "ROOT_MODEL"; //$NON-NLS-1$
    public static final String COMPONENT_SET_KEY = "COMPONENT_SET"; //$NON-NLS-1$
    public static final String CONTENT_COMPONENT_KEY = "CONTENT_COMPONENT"; //$NON-NLS-1$
    public static final String ROOT_CONTAINER_KEY = "ROOT_CONTAINER"; //$NON-NLS-1$
    public static final String CUSTOMIZER_COMMAND_FACTORY_KEY = "CUSTOMIZER_COMMAND_FACTORY"; //$NON-NLS-1$
    public static final String CONTAINER_BASENAME_KEY = "CONTAINER_BASENAME"; //$NON-NLS-1$
    public static final String UI_CONFIGURATION_MODE_KEY = "UI_CONFIGURATION_MODE"; //$NON-NLS-1$
    public static final String CONTAINER_TYPE_KEY = "CONTAINER_TYPE"; //$NON-NLS-1$
    public static final String LAYOUT_MANAGER_TYPE_KEY = "LAYOUT_MANAGER_TYPE"; //$NON-NLS-1$
    public static final String CONTAINER_COMPONENT_KEY = "CONTAINER_COMPONENT"; //$NON-NLS-1$
    public static final String TEMP_DATA_MODEL_KEY = "TEMP_DATA_MODEL"; //$NON-NLS-1$
    public static final String VIEW_MODEL_KEY = "VIEW_MODEL"; //$NON-NLS-1$
    public static final String DEFAULT_EVENT_HANDER_BODIES_KEY = "DEFAULT_EVENT_HANDLERS"; //$NON-NLS-1$
    public static final String MMP_FILE_PATH_KEY = "MMP_FILE_PATH"; //$NON-NLS-1$

    public static final String MODEL_EXTENSION = ".uidesign"; //$NON-NLS-1$

    // component IDs
    public static final String APPLICATION_COMPONENT_ID = UIQModelUtils.UIQ_APPLICATION;
    public static final String APPLICATION_DOCUMENT_COMPONENT_ID = UIQModelUtils.UIQ_APPLICATION_DOCUMENT;
    public static final String APPLICATION_UI_COMPONENT_ID = UIQModelUtils.UIQ_APPLICATION_UI;

    public static final String VIEWDIALOGBASE_COMPONENT_ID = UIQModelUtils.UIQ_VIEWDIALOGBASE;
    public static final String VIEW_COMPONENT_ID = UIQModelUtils.UIQ_CQIKVIEW;
    public static final String SINGLEPAGEVIEW_COMPONENT_ID = UIQModelUtils.UIQ_CQIKSINGLEPAGEVIEW;
    public static final String MULTIPAGEVIEW_COMPONENT_ID = UIQModelUtils.UIQ_CQIKMULTIPAGEVIEW;
    public static final String VIEWDIALOG_COMPONENT_ID = UIQModelUtils.UIQ_CQIKVIEWDIALOG;
    public static final String SIMPLEDIALOG_COMPONENT_ID = UIQModelUtils.UIQ_CQIKSIMPLEDIALOG;

    public static final String VIEW_CONFIGURATIONS_GROUP = UIQModelUtils.UIQ_VIEW_CONFIGURATIONS_GROUP;
    public static final String VIEW_CONFIGURATION = UIQModelUtils.UIQ_VIEW_CONFIGURATION;
    public static final String VIEW_LAYOUTS_GROUP = UIQModelUtils.UIQ_VIEW_LAYOUTS_GROUP;
    public static final String VIEW_LAYOUT = UIQModelUtils.UIQ_VIEW_LAYOUT;
    public static final String VIEW_PAGE = UIQModelUtils.UIQ_VIEW_PAGE;

    public static final String SIMPLEDIALOG_CONFIGURATIONS_GROUP = UIQModelUtils.UIQ_SIMPLEDIALOG_CONFIGURATIONS_GROUP;
    public static final String SIMPLEDIALOG_CONFIGURATION = UIQModelUtils.UIQ_SIMPLEDIALOG_CONFIGURATION;
    public static final String SIMPLEDIALOG_CONTAINERS_GROUP = UIQModelUtils.UIQ_SIMPLEDIALOG_CONTAINERS_GROUP;

    public static final String CQIKCONTAINER = UIQModelUtils.UIQ_CQIKCONTAINER;
    public static final String CONTROL_COLLECTION = UIQModelUtils.UIQ_CONTROL_COLLECTION;
    public static final String COMMAND_LISTS_GROUP = UIQModelUtils.UIQ_COMMAND_LISTS_GROUP;
    public static final String COMMAND_LIST = UIQModelUtils.UIQ_COMMAND_LIST;
    public static final String COMMAND_ID = UIQModelUtils.UIQ_COMMAND_ID;
    public static final String COMMAND = UIQModelUtils.UIQ_COMMAND;

    // property IDs
    public static final String UID_PROPERTY_NAME = "uid"; //$NON-NLS-1$
    public static final String CAPTION_PROPERTY_NAME = "caption"; //$NON-NLS-1$
    public static final String SHORT_CAPTION_PROPERTY_NAME = "shortCaption"; //$NON-NLS-1$
    public static final String DOCUMENT_BASE_PROPERTY_NAME = "documentBase"; //$NON-NLS-1$

    public static final String VIEWDIALOGBASE_PROPERTY_BASECLASSINFO = "baseClassInfo"; //$NON-NLS-1$
    public static final String VIEWDIALOG_PROPERTY_BASECLASSLIBRARY = "baseClassLibrary"; //$NON-NLS-1$
    public static final String VIEWDIALOG_PROPERTY_BASECLASSHEADER = "baseClassHeader"; //$NON-NLS-1$
    public static final String VIEWDIALOG_PROPERTY_BASECLASSNAME = "baseClassName"; //$NON-NLS-1$
    public static final String VIEW_PROPERTY_TYPE = "type"; //$NON-NLS-1$

    public static final String UICONFIGURATION_PROPERTY_UICONFIG = "uiconfig"; //$NON-NLS-1$
    public static final String UICONFIGURATION_PROPERTY_COMMANDLIST = "commandList"; //$NON-NLS-1$
    public static final String UICONFIGURATION_PROPERTY_VIEWORCONTAINER = "viewOrContainer"; //$NON-NLS-1$

    public static final String CQIKCONTAINER_PROPERTY_SCROLLABLE = "scrollable"; //$NON-NLS-1$

    public static final String COMMANDID_PROPERTY_USERCOMMANDID = "commandId"; //$NON-NLS-1$
    public static final String COMMANDID_PROPERTY_SYSTEMCOMMANDID = "systemCommandId"; //$NON-NLS-1$

    public static final String COMMAND_PROPERTY_TYPE = "type"; //$NON-NLS-1$
    public static final String COMMAND_PROPERTY_STATEFLAGS = "stateFlags"; //$NON-NLS-1$
    public static final String COMMAND_PROPERTY_STATEFLAGS_DEBUGONLY = "EQikCmdFlagDebugOnly"; //$NON-NLS-1$
    public static final String COMMAND_PROPERTY_TEXT = "text"; //$NON-NLS-1$
    public static final String COMMAND_PROPERTY_SHORTTEXT = "shortText"; //$NON-NLS-1$
    public static final String COMMAND_PROPERTY_COMMANDID = "commandId"; //$NON-NLS-1$

    // constants
    private static final String CHANGE_ITEM_HANDLER_NAME = "HandleChangeSelectedSettingItemL";//$NON-NLS-1$
    private static final String SELECTED_EVENT_ID = "selected"; //$NON-NLS-1$
    private static final String CLASS_NAME_PREFIX = "C";//$NON-NLS-1$
    private static final String APPLICATION_INSTANCE_NAME_POSTFIX = "Application";//$NON-NLS-1$
    private static final String APPLICATION_DOCUMENT_INSTANCE_NAME_POSTFIX = "Document";//$NON-NLS-1$
    private static final String APPLICATION_UI_INSTANCE_NAME_POSTFIX = "AppUi";//$NON-NLS-1$

    private static final String VIEW_CONSTANT_TYPE_SINGLEPAGE = "singlePage";//$NON-NLS-1$
    private static final String VIEW_CONSTANT_TYPE_MULTIPAGE = "multiPage";//$NON-NLS-1$
    private static final String VIEW_CONSTANT_TYPE_DIALOG = "dialog";//$NON-NLS-1$

    private static final String LIBRARY_VIEWS = "QikCore.lib";//$NON-NLS-1$
    private static final String LIBRARY_SIMPLEDIALOG = "qikdlg.lib";//$NON-NLS-1$

    private static final String HEADER_VIEW_SINGLEPAGE = "QikViewBase.h";//$NON-NLS-1$
    private static final String HEADER_VIEW_MULTIPAGE = "QikMultiPageViewBase.h";//$NON-NLS-1$
    private static final String HEADER_VIEW_DIALOG = "QikViewDialog.h";//$NON-NLS-1$
    private static final String HEADER_SIMPLEDIALOG = "QikSimpleDialog.h";//$NON-NLS-1$

    private static final String CLASS_VIEW_MULTIPAGE = "CQikMultiPageViewBase";//$NON-NLS-1$
    private static final String CLASS_VIEW_SINGLEPAGE = "CQikViewBase";//$NON-NLS-1$
    private static final String CLASS_VIEW_DIALOG = "CQikViewDialog";//$NON-NLS-1$
    private static final String CLASS_SIMPLEDIALOG = "CQikSimpleDialog";//$NON-NLS-1$

    // template keys
    public static final String TEMPLATE_KEY_APPUI_NAME = "appUiName"; //$NON-NLS-1$

    public static final int DEFAULT_HEIGHT = 208;
    public static final int DEFAULT_WIDTH = 176;

    // help context ids
    public static final String APPLICATION_DEFINITION_PAGE = "application_properties_page";//$NON-NLS-1$
    public static final String INITIAL_CONTENT_PAGE = "design_selection_page";//$NON-NLS-1$
    public static final String CUSTOMIZER_PAGE = "content_variants_page";//$NON-NLS-1$
    public static final String CONTAINER_SELECTION_PAGE = "container_page";//$NON-NLS-1$

    private ApplicationDefinitionPage appDefinitionPage;
    private InitialContentPage initialContentPage;
    private CustomizerPage customizerPage;
    private ContainerSelectionPage containerSelectionPage;
    private IComponentCustomizerUI customizerUI;
    private ViewWizardPageBase currentPage;
    private boolean extantRootModel;
    private Language appLanguages[];

    // not using dialog settings because no need for persistence, 
    // and can't store obj refs in DialogSettings
    private Map dataStore;

    private DesignerDataModelProvider dataModelProvider;
    private IComponentProvider componentProvider;

    private List pages;

    private IWizard wizard;
    private ITemplate template;

    static class DefaultEventBinding {
        private IDesignerDataModel dataModel;
        private IComponentInstance instance;
        private String eventName;
        private String handlerName;
        private String handlerText;

        public DefaultEventBinding(IDesignerDataModel model, IComponentInstance instance, String eventName,
                String handlerName, String handlerText) {
            this.dataModel = model;
            this.instance = instance;
            this.eventName = eventName;
            this.handlerName = handlerName;
            this.handlerText = handlerText;
        }

        /** Create the event binding and commit it to the data model */
        public void createEventBinding() {
            IComponentEventDescriptorProvider eventProvider = ModelUtils
                    .getComponentEventDescriptorProvider(instance.getEObject());
            IEventDescriptor descriptor = eventProvider.findEventDescriptor(eventName);
            Command command = dataModel.createAddEventBindingCommand(instance.getEObject(), descriptor,
                    handlerName);
            Check.checkState(command.canExecute());
            command.execute();
        }

        /** Get the bound event */
        public IEventBinding getEventBinding() {
            return instance.findEventBinding(eventName);
        }

        /** Write the event handler to the file */
        public void writeEventHandler(IProjectContext pc) throws CoreException {
            IEventBinding binding = getEventBinding();
            Check.checkState(binding != null);
            SourceLocation location = pc.getSourceGenProvider().lookupEventBindingSource(binding);
            Check.checkState(location != null);

            ITranslationUnit tunit = (ITranslationUnit) CoreModel.getDefault().create(location.file);
            IBuffer buffer = tunit.getBuffer();

            char[] contents = tunit.getContents();

            // replace the TO-DO comment with the new one

            // replace the existing line with the handler text
            int endIdx = location.insertOffset;
            int endOffset = location.offset + location.length;
            while (endIdx < endOffset && contents[endIdx] != '\r' && contents[endIdx] != '\n')
                endIdx++;

            int currentTextLength = endIdx - location.insertOffset;
            buffer.replace(location.insertOffset, currentTextLength, handlerText);

            buffer.save(null, true);
            buffer.close();
            tunit.close();
        }
    }

    interface IProjectSelectionListener {
        void projectSelectionChanged(IProject project);
    }

    private List<IProjectSelectionListener> projectSelectionListeners;

    /**
     * 
     */
    public ViewWizardManager() {
        dataModelProvider = new DesignerDataModelProvider();
        ComponentSystem cs = ComponentSystem.getComponentSystem();
        try {
            componentProvider = cs.getProvider(ComponentProvider.PROVIDER_ID);
        } catch (CoreException e) {
            Check.reportFailure(Messages.getString("ViewWizard.ComponentProviderError"), e); //$NON-NLS-1$
        }
    }

    public Map getDataStore() {
        if (dataStore == null)
            dataStore = new HashMap();

        return dataStore;
    }

    public DesignerDataModelProvider getDataModelProvider() {
        return dataModelProvider;
    }

    public IComponentProvider getComponentProvider() {
        return componentProvider;
    }

    public void setCurrentPage(ViewWizardPageBase page) {
        currentPage = page;
    }

    public ViewWizardPageBase getCurrentPage() {
        return currentPage;
    }

    public List createPages(IWorkbenchWizard wizard, IWorkbench workbench, IStructuredSelection selectedResources) {
        this.wizard = wizard;
        if (pages == null) {
            pages = new ArrayList();
            appDefinitionPage = new ApplicationDefinitionPage(selectedResources, this);
            pages.add(appDefinitionPage);
            initialContentPage = new InitialContentPage(this);
            pages.add(initialContentPage);
            customizerPage = new CustomizerPage(this);
            pages.add(customizerPage);
            containerSelectionPage = new ContainerSelectionPage(this);
            pages.add(containerSelectionPage);
        }
        return pages;
    }

    public IWizardDataPage[] createAdditionalPages(IWorkbenchWizard wizard, IWorkbench workbench,
            IStructuredSelection selection) {
        createPages(wizard, workbench, selection);
        return getPages();
    }

    public IWizardDataPage[] getPages() {
        Check.checkContract(pages != null);
        return (IWizardDataPage[]) pages.toArray(new IWizardDataPage[pages.size()]);
    }

    private void createRootModelFromWizardData(ISymbianProjectContext symbianProjectContext, boolean isLegacy)
            throws Exception {
        IProject project = (IProject) getDataStore().get(PROJECT_KEY);
        Check.checkContract(project != null);
        IDesignerDataModel dataModel = getDataModelProvider().createTemporary();
        dataModel.setComponentSet(getComponentSet());

        // set rls as the default localization format
        dataModel.setProperty(SymbianModelUtils.SYMBIAN_LOCALIZATION_FILE_FORMAT,
                SymbianModelUtils.RLS_FILE_FORMAT);

        // set the language in the string bundle
        IDesignerData data = ((DesignerDataModel) dataModel).getDesignerData();
        Integer languageID = (Integer) getDataStore().get(LANGUAGE_ID_KEY);
        Language language = new Language(languageID.intValue());
        data.getStringBundle().setDefaultLanguage(language);
        symbianProjectContext.setCurrentLanguage(language);

        // set properties
        String baseName = (String) getDataStore().get(APPNAME_KEY);
        Check.checkContract(baseName != null);
        dataModel.setProperty(DesignerDataModel.ROOT_APPLICATION_NAME, baseName);
        WizardUtils.addSourceGenPropertiesFromTemplate(dataModel, template, isLegacy);

        IComponent applicationComponent = getComponentSet().lookupComponent(APPLICATION_COMPONENT_ID);
        String appInstanceName = baseName + APPLICATION_INSTANCE_NAME_POSTFIX;
        String appClassName = CLASS_NAME_PREFIX + appInstanceName; //$NON-NLS-1$
        EObject application = WizardUtils.addRootInstance(dataModel, applicationComponent, appInstanceName,
                appClassName); //$NON-NLS-1$
        IPropertySource propertySource = WizardUtils.getProperties(application);
        String appUID = (String) getDataStore().get(APPUID_KEY);
        if (appUID == null)
            appUID = getAppUIDFromTemplate();
        propertySource.setPropertyValue(UID_PROPERTY_NAME, appUID);
        propertySource.setPropertyValue(DOCUMENT_BASE_PROPERTY_NAME, baseName);

        IComponent applicationDocumentComponent = getComponentSet()
                .lookupComponent(APPLICATION_DOCUMENT_COMPONENT_ID);
        String documentInstanceName = baseName + APPLICATION_DOCUMENT_INSTANCE_NAME_POSTFIX;
        String documentClassName = CLASS_NAME_PREFIX + documentInstanceName;
        EObject document = WizardUtils.addChildObject(dataModel, applicationDocumentComponent, application,
                documentInstanceName, documentClassName, IDesignerDataModel.AT_END);

        IComponent appuiComponent = getAppUiComponent();
        String appUiName = baseName + APPLICATION_UI_INSTANCE_NAME_POSTFIX;
        String appUiClassName = CLASS_NAME_PREFIX + appUiName;
        EObject appui = WizardUtils.addChildObject(dataModel, appuiComponent, document, appUiName, appUiClassName,
                IDesignerDataModel.AT_END);
        propertySource = WizardUtils.getProperties(appui);
        propertySource.setPropertyValue(SHORT_CAPTION_PROPERTY_NAME, baseName);
        propertySource.setPropertyValue(CAPTION_PROPERTY_NAME, baseName);

        if (template != null)
            template.getTemplateValues().put(TEMPLATE_KEY_APPUI_NAME, appUiName);
        dataModel.setProperty(DesignerDataModel.ROOT_CONTAINER_OVERRIDE_ID, appUiName);

        getDataStore().put(ROOT_MODEL_KEY, dataModel);
    }

    private String getAppUIDFromTemplate() {
        Check.checkState(template != null);
        String appUID = (String) template.getTemplateValues().get("uid3"); //$NON-NLS-1$
        Check.checkState(appUID != null);
        return appUID.toLowerCase();
    }

    private void createViewModelFromWizardData(Language language) throws Exception {
        IProject project = (IProject) getDataStore().get(PROJECT_KEY);
        Check.checkContract(project != null);
        DesignerDataModel dataModel = (DesignerDataModel) getDataModelProvider().createTemporary();
        dataModel.setComponentSet(getComponentSet());

        // ensure the view model's string bundle is synched with the application and the
        // current language is set
        ILocalizedStringBundle stringBundle = dataModel.getDesignerData().getStringBundle();
        if (appLanguages != null) {
            for (Language l : appLanguages) {
                stringBundle.addLocalizedStringTable(l);
            }
        }
        stringBundle.setDefaultLanguage(language);

        // set properties
        IDesignerDataModel rootModel = (IDesignerDataModel) getDataStore().get(ROOT_MODEL_KEY);
        WizardUtils.addSourceGenPropertiesFromModel(dataModel, rootModel);

        String rootComponentId = ((IComponent) getDataStore().get(CONTENT_COMPONENT_KEY)).getId();
        IComponent rootComponent = null;
        EObject rootInstance = null;
        if (rootComponentId.equals(SINGLEPAGEVIEW_COMPONENT_ID)
                || rootComponentId.equals(MULTIPAGEVIEW_COMPONENT_ID)
                || rootComponentId.equals(VIEWDIALOG_COMPONENT_ID)) {

            rootComponent = getComponentSet().lookupComponent(VIEW_COMPONENT_ID);
            String rootClassName = getViewRootClassName();
            rootInstance = WizardUtils.addRootInstance(dataModel, rootComponent, getViewRootName(), rootClassName);

            IPropertySource rootInstanceProperties = WizardUtils.getProperties(rootInstance);
            setIsAppUIContainerPropertyFromAttribute(getComponentSet().lookupComponent(rootComponentId),
                    rootInstanceProperties);
            if (rootComponentId.equals(SINGLEPAGEVIEW_COMPONENT_ID)) {
                rootInstanceProperties.setPropertyValue(VIEW_PROPERTY_TYPE, VIEW_CONSTANT_TYPE_SINGLEPAGE);
                setBaseClassInfoProperty(rootInstanceProperties, LIBRARY_VIEWS, HEADER_VIEW_SINGLEPAGE,
                        CLASS_VIEW_SINGLEPAGE);

            } else if (rootComponentId.equals(MULTIPAGEVIEW_COMPONENT_ID)) {
                rootInstanceProperties.setPropertyValue(VIEW_PROPERTY_TYPE, VIEW_CONSTANT_TYPE_MULTIPAGE);
                setBaseClassInfoProperty(rootInstanceProperties, LIBRARY_VIEWS, HEADER_VIEW_MULTIPAGE,
                        CLASS_VIEW_MULTIPAGE);

            } else if (rootComponentId.equals(VIEWDIALOG_COMPONENT_ID)) {
                rootInstanceProperties.setPropertyValue(VIEW_PROPERTY_TYPE, VIEW_CONSTANT_TYPE_DIALOG);
                setBaseClassInfoProperty(rootInstanceProperties, LIBRARY_VIEWS, HEADER_VIEW_DIALOG,
                        CLASS_VIEW_DIALOG);
            }

            IComponent viewConfigurationsComponent = getComponentSet().lookupComponent(VIEW_CONFIGURATIONS_GROUP);
            String viewConfigurationsName = "viewConfigurations";//$NON-NLS-1$
            EObject viewConfigurations = WizardUtils.addChildObject(dataModel, viewConfigurationsComponent,
                    rootInstance, viewConfigurationsName, null, IDesignerDataModel.AT_END);

            IComponent viewConfigurationComponent = getComponentSet().lookupComponent(VIEW_CONFIGURATION);
            String viewConfigurationName = "viewConfiguration1";//$NON-NLS-1$
            EObject viewConfiguration = WizardUtils.addChildObject(dataModel, viewConfigurationComponent,
                    viewConfigurations, viewConfigurationName, null, IDesignerDataModel.AT_END);

            IPropertySource viewConfigurationProperties = WizardUtils.getProperties(viewConfiguration);
            viewConfigurationProperties.setPropertyValue(UICONFIGURATION_PROPERTY_UICONFIG,
                    getDataStore().get(UI_CONFIGURATION_MODE_KEY));
            viewConfigurationProperties.setPropertyValue(UICONFIGURATION_PROPERTY_COMMANDLIST, "commandList1");//$NON-NLS-1$

            IComponent viewLayoutsComponent = getComponentSet().lookupComponent(VIEW_LAYOUTS_GROUP);
            String viewLayoutsName = "viewLayouts";//$NON-NLS-1$
            EObject viewLayouts = WizardUtils.addChildObject(dataModel, viewLayoutsComponent, rootInstance,
                    viewLayoutsName, null, IDesignerDataModel.AT_END);

            IComponent viewLayoutComponent = getComponentSet().lookupComponent(VIEW_LAYOUT);
            String viewLayoutName = "viewLayout1";//$NON-NLS-1$
            EObject viewLayout = WizardUtils.addChildObject(dataModel, viewLayoutComponent, viewLayouts,
                    viewLayoutName, null, IDesignerDataModel.AT_END);
            viewConfigurationProperties.setPropertyValue(UICONFIGURATION_PROPERTY_VIEWORCONTAINER, viewLayoutName);

            /*IComponent viewPageComponent = getComponentSet().lookupComponent(VIEW_PAGE);
            String viewPageName = "viewPage1";//$NON-NLS-1$
            EObject viewPage = 
               WizardUtils.addChildObject(dataModel, viewPageComponent, viewLayout, 
              viewPageName, null, IDesignerDataModel.AT_END);*/

            EObject container = WizardUtils.getSpecificObject(CQIKCONTAINER, dataModel);
            IPropertySource containerProperties = WizardUtils.getProperties(container);
            containerProperties.setPropertyValue(CQIKCONTAINER_PROPERTY_SCROLLABLE,
                    getDataStore().get(CONTAINER_TYPE_KEY));

            createLayoutManager(dataModel, container);
        } else if (rootComponentId.equals(SIMPLEDIALOG_COMPONENT_ID)) {
            rootComponent = getComponentSet().lookupComponent(SIMPLEDIALOG_COMPONENT_ID);
            String rootClassName = getViewRootClassName();
            rootInstance = WizardUtils.addRootInstance(dataModel, rootComponent, getViewRootName(), rootClassName);

            IPropertySource rootInstanceProperties = WizardUtils.getProperties(rootInstance);
            setIsAppUIContainerPropertyFromAttribute(rootComponent, rootInstanceProperties);
            setBaseClassInfoProperty(rootInstanceProperties, LIBRARY_SIMPLEDIALOG, HEADER_SIMPLEDIALOG,
                    CLASS_SIMPLEDIALOG);

            IComponent dialogConfigurationsComponent = getComponentSet()
                    .lookupComponent(SIMPLEDIALOG_CONFIGURATIONS_GROUP);
            String dialogConfigurationsName = "dialogConfigurations";//$NON-NLS-1$
            EObject dialogConfigurations = WizardUtils.addChildObject(dataModel, dialogConfigurationsComponent,
                    rootInstance, dialogConfigurationsName, null, IDesignerDataModel.AT_END);

            IComponent dialogConfigurationComponent = getComponentSet().lookupComponent(SIMPLEDIALOG_CONFIGURATION);
            String dialogConfigurationName = "dialogConfiguration1";//$NON-NLS-1$
            EObject dialogConfiguration = WizardUtils.addChildObject(dataModel, dialogConfigurationComponent,
                    dialogConfigurations, dialogConfigurationName, null, IDesignerDataModel.AT_END);
            IPropertySource dialogConfigurationProperties = WizardUtils.getProperties(dialogConfiguration);
            dialogConfigurationProperties.setPropertyValue(UICONFIGURATION_PROPERTY_UICONFIG,
                    getDataStore().get(UI_CONFIGURATION_MODE_KEY));
            dialogConfigurationProperties.setPropertyValue(UICONFIGURATION_PROPERTY_COMMANDLIST, "commandList1");//$NON-NLS-1$

            IComponent dialogContainersComponent = getComponentSet().lookupComponent(SIMPLEDIALOG_CONTAINERS_GROUP);
            String dialogCotnainersName = "containersGroup";//$NON-NLS-1$
            EObject dialogContainers = WizardUtils.addChildObject(dataModel, dialogContainersComponent,
                    rootInstance, dialogCotnainersName, null, IDesignerDataModel.AT_END);

            IComponent containerComponent = getComponentSet().lookupComponent(CQIKCONTAINER);
            String containerName = "container1";//$NON-NLS-1$
            EObject container = WizardUtils.addChildObject(dataModel, containerComponent, dialogContainers,
                    containerName, null, IDesignerDataModel.AT_END);
            IPropertySource containerProperties = WizardUtils.getProperties(container);
            containerProperties.setPropertyValue(CQIKCONTAINER_PROPERTY_SCROLLABLE,
                    getDataStore().get(CONTAINER_TYPE_KEY));
            dialogConfigurationProperties.setPropertyValue(UICONFIGURATION_PROPERTY_VIEWORCONTAINER, containerName);

            createLayoutManager(dataModel, container);
        }

        addControlCollectionToViewModel(dataModel, rootInstance);
        addCommandRelatedInstances(dataModel, rootInstance, rootComponentId);

        IDisplayModel displayModel = dataModel.getDisplayModelForRootContainer(rootInstance);
        WizardUtils.addDefaultBoundsToInstance(rootInstance, displayModel, DEFAULT_WIDTH, DEFAULT_HEIGHT);

        getDataStore().put(VIEW_MODEL_KEY, dataModel);
    }

    private void setIsAppUIContainerPropertyFromAttribute(IComponent rootComponent,
            IPropertySource rootInstanceProperties) {
        IAttributes attributes = (IAttributes) rootComponent.getAdapter(IAttributes.class);
        if (attributes != null
                && attributes.getAttribute(UIQModelUtils.VIEWDIALOG_ATTRIBUTE_ISAPPUICONTAINER) != null) {
            rootInstanceProperties.setPropertyValue(UIQModelUtils.VIEWDIALOG_PROPERTY_ISAPPUICONTAINER,
                    attributes.getAttribute(UIQModelUtils.VIEWDIALOG_ATTRIBUTE_ISAPPUICONTAINER));
        }
    }

    private void setBaseClassInfoProperty(IPropertySource rootInstanceProperties, String library, String header,
            String name) {
        CompoundPropertySource baseClassInfo = (CompoundPropertySource) rootInstanceProperties
                .getPropertyValue(VIEWDIALOGBASE_PROPERTY_BASECLASSINFO);
        baseClassInfo.setPropertyValue(VIEWDIALOG_PROPERTY_BASECLASSLIBRARY, library);
        baseClassInfo.setPropertyValue(VIEWDIALOG_PROPERTY_BASECLASSHEADER, header);
        baseClassInfo.setPropertyValue(VIEWDIALOG_PROPERTY_BASECLASSNAME, name);
    }

    private void createLayoutManager(DesignerDataModel dataModel, EObject container) {
        String requiredLayoutManagerType = (String) getDataStore().get(LAYOUT_MANAGER_TYPE_KEY);
        EObject layoutManager = WizardUtils.getObjectWithAttribute(CommonAttributes.IS_LAYOUT_MANAGER, "true", //$NON-NLS-1$
                dataModel);
        boolean createLayoutManager = true;
        if (layoutManager != null) {
            if (((INode) layoutManager).getComponentId().equals(requiredLayoutManagerType))
                createLayoutManager = false;
            else {
                EList children = ((INode) container).getChildren();
                children.remove(layoutManager);
            }
        }
        if (createLayoutManager) {
            IComponent layoutManagerComponent = getComponentSet().lookupComponent(requiredLayoutManagerType);
            String layoutManagerName = layoutManagerComponent.getInstanceNameRoot() + "1";//$NON-NLS-1$
            layoutManager = WizardUtils.addChildObject(dataModel, layoutManagerComponent, container,
                    layoutManagerName, null, IDesignerDataModel.AT_END);
        }
    }

    private void addControlCollectionToViewModel(DesignerDataModel dataModel, EObject rootInstance) {
        IComponent controlCollectionComponent = getComponentSet().lookupComponent(CONTROL_COLLECTION);
        String controlCollectionName = "controlCollection";//$NON-NLS-1$
        EObject controlCollection = WizardUtils.addChildObject(dataModel, controlCollectionComponent, rootInstance,
                controlCollectionName, null, IDesignerDataModel.AT_END);
    }

    private void addCommandRelatedInstances(DesignerDataModel dataModel, EObject rootInstance,
            String rootComponentId) {
        IComponent commandListsGroupComponent = getComponentSet().lookupComponent(COMMAND_LISTS_GROUP);
        String commandListsGroupName = "commandLists";//$NON-NLS-1$
        EObject commandListsGroup = WizardUtils.addChildObject(dataModel, commandListsGroupComponent, rootInstance,
                commandListsGroupName, null, IDesignerDataModel.AT_END);

        IComponent commandListComponent = getComponentSet().lookupComponent(COMMAND_LIST);
        String commandListName = "commandList1";//$NON-NLS-1$
        EObject commandList = WizardUtils.addChildObject(dataModel, commandListComponent, commandListsGroup,
                commandListName, null, IDesignerDataModel.AT_END);

        if (!rootComponentId.equals(VIEWDIALOG_COMPONENT_ID)) {
            IComponent commandIdComponent = getComponentSet().lookupComponent(COMMAND_ID);
            String commandIdName = "exitCommandId";//$NON-NLS-1$
            EObject commandId = WizardUtils.addChildObject(dataModel, commandIdComponent, commandListsGroup,
                    commandIdName, null, IDesignerDataModel.AT_END);
            IPropertySource commandIdProperties = WizardUtils.getProperties(commandId);
            commandIdProperties.setPropertyValue(COMMANDID_PROPERTY_USERCOMMANDID, "");//$NON-NLS-1$
            commandIdProperties.setPropertyValue(COMMANDID_PROPERTY_SYSTEMCOMMANDID, "EEikCmdExit");//$NON-NLS-1$

            IComponent commandComponent = getComponentSet().lookupComponent(COMMAND);
            String commandName = "exitCommand";//$NON-NLS-1$
            EObject command = WizardUtils.addChildObject(dataModel, commandComponent, commandList, commandName,
                    null, IDesignerDataModel.AT_END);
            IPropertySource commandProperties = WizardUtils.getProperties(command);
            commandProperties.setPropertyValue(COMMAND_PROPERTY_TYPE, "Screen");//$NON-NLS-1$
            IPropertySource stateFlagsProperties = (IPropertySource) commandProperties
                    .getPropertyValue(COMMAND_PROPERTY_STATEFLAGS);
            stateFlagsProperties.setPropertyValue(COMMAND_PROPERTY_STATEFLAGS_DEBUGONLY, "true");//$NON-NLS-1$
            commandProperties.setPropertyValue(COMMAND_PROPERTY_TEXT, "Exit");//$NON-NLS-1$
            commandProperties.setPropertyValue(COMMAND_PROPERTY_SHORTTEXT, "Exit");//$NON-NLS-1$
            commandProperties.setPropertyValue(COMMAND_PROPERTY_COMMANDID, "exitCommandId");//$NON-NLS-1$
        }
    }

    /**
     * Get list of default event bindings
     * @return
     */
    private List getDefaultEventHandlerBodies() {
        Map store = getDataStore();
        List<DefaultEventBinding> bindings = (List<DefaultEventBinding>) store.get(DEFAULT_EVENT_HANDER_BODIES_KEY);
        if (bindings == null) {
            bindings = new ArrayList<DefaultEventBinding>();
            store.put(DEFAULT_EVENT_HANDER_BODIES_KEY, bindings);
        }
        return bindings;
    }

    /**
     * Edit source code, writing the bodies of selected event handlers
     * with our code.
     * @param pc 
     */
    private void writeDefaultEventHandlerBodies(IProjectContext pc) {
        if (pc.getSourceGenProvider() == null)
            return;
        List<DefaultEventBinding> bindings = getDefaultEventHandlerBodies();
        for (Iterator iter = bindings.iterator(); iter.hasNext();) {
            DefaultEventBinding bindingInfo = (DefaultEventBinding) iter.next();
            try {
                bindingInfo.writeEventHandler(pc);
            } catch (CoreException e) {
                IStatus status = Logging.newStatus(UIQUserInterfacePlugin.getDefault(), e);
                Logging.showErrorDialog(Messages.getString("ViewWizardManager.ErrorWritingEventHandlerTitle"), //$NON-NLS-1$
                        Messages.getString("ViewWizardManager.ErrorWritingEventHandlerMessage"), status); //$NON-NLS-1$
            }
        }
    }

    private IComponent getAppUiComponent() {
        return getComponentSet().lookupComponent(APPLICATION_UI_COMPONENT_ID);
    }

    private String getViewRootName() {
        return (String) getDataStore().get(CONTAINER_BASENAME_KEY);
    }

    private String getViewRootClassName() {
        return CLASS_NAME_PREFIX + getViewRootName();
    }

    private void addDesignReferenceToRootModel(IDesignerDataModel rootModel,
            IDesignerDataModelSpecifier viewDesignSpecifier) {
        Command command = SymbianModelUtils.addViewReference(rootModel, viewDesignSpecifier);
        if (command.canExecute())
            command.execute();

        command = UIQModelUtils.ensureInitialView(rootModel);
        if (command != null && command.canExecute()) {
            command.execute();
        }
    }

    // TODO: fix this -- it's intended to prevent two data models from being
    // generated at the same time, but it seems to conflict with the creation
    // of resources by sourcegen.
    static class DataModelConflictingRule implements ISchedulingRule {

        /* (non-Javadoc)
         * @see org.eclipse.core.runtime.jobs.ISchedulingRule#contains(org.eclipse.core.runtime.jobs.ISchedulingRule)
         */
        public boolean contains(ISchedulingRule rule) {
            return rule == this;
        }

        /* (non-Javadoc)
         * @see org.eclipse.core.runtime.jobs.ISchedulingRule#isConflicting(org.eclipse.core.runtime.jobs.ISchedulingRule)
         */
        public boolean isConflicting(ISchedulingRule rule) {
            return rule instanceof DataModelConflictingRule;
        }

    }

    public void generateModels(boolean minimalRootModel) {
        currentPage.leavingPage(null);
        ensureProjectExists();

        final IProject project = (IProject) getDataStore().get(PROJECT_KEY);
        Check.checkContract(project != null);
        ProjectContextProvider.beginProjectCreation(project);
        final WorkspaceContext wc = WorkspaceContext.getContext();
        final IProjectContext pc = wc.getContextForProject(project);
        Check.checkContract(pc != null);
        ProjectContextProvider.endProjectCreation(project);

        ISymbianProjectContext spc = (ISymbianProjectContext) pc.getAdapter(ISymbianProjectContext.class);

        if (!extantRootModel) {
            try {
                createRootModelFromWizardData(spc, minimalRootModel);
            } catch (Throwable t) {
                Check.reportFailure(Messages.getString("ViewWizard.RootModelCreateError"), t); //$NON-NLS-1$
            }
        }

        try {
            createViewModelFromWizardData(spc.getCurrentLanguage());
        } catch (Throwable t) {
            Check.reportFailure(Messages.getString("ViewWizard.ViewModelCreateError"), t); //$NON-NLS-1$
        }
    }

    /**
     * Save models and handle the delicate ordering of saving and sourcegen.
     * <p>
     * On initial project creation (newRootModel==true), we must write the root and view model
     * files to disk and refresh the project context without generating source, so that
     * both models are registered when sourcegen runs.
     * <p>
     * When creating a new view, the case is similar; we must register models before
     * updating source.
     *   
     * @param newRootModel
     * @param srcGenRoot true: generate source for root, false: don't
     * @param monitor the progress monitor
     */
    public void saveModels(boolean newRootModel, boolean srcGenRoot, IProgressMonitor monitor) {
        saveModelsOriginal(newRootModel, srcGenRoot, monitor);
        if (true)
            return;
        final IProject project = (IProject) getDataStore().get(PROJECT_KEY);
        Check.checkContract(project != null);
        final WorkspaceContext wc = WorkspaceContext.getContext();
        final IProjectContext pc = wc.getContextForProject(project);
        Check.checkContract(pc != null);
        ISymbianProjectContext spc = (ISymbianProjectContext) pc.getAdapter(ISymbianProjectContext.class);

        ISourceGenProvider sourceGenProvider = pc.getSourceGenProvider();

        // get root
        IDesignerDataModel rootModel = null;
        rootModel = (IDesignerDataModel) getDataStore().get(ROOT_MODEL_KEY);

        // turn off resource listening
        IDesignerDataModelEditor rootEditorBase = EditorServices.findEditorForModel(rootModel.getModelSpecifier());
        if (rootEditorBase != null)
            rootEditorBase.setListenToResourceChanges(false);

        IDesignerDataModelSpecifier viewSpecifier = createModelSpecifier(project, spc);

        // save view model without generating source
        IDesignerDataModel viewModel = null;
        //viewModel = (IDesignerDataModel) getDataStore().get(VIEW_MODEL_KEY);
        viewModel = saveViewModel(project, wc, pc, rootModel, viewSpecifier, monitor);

        // get or create specifier for root 
        IDesignerDataModelSpecifier rootModelSpecifier = null;
        if (newRootModel)
            rootModelSpecifier = spc.createNewRootModelSpecifier();
        else
            rootModelSpecifier = rootModel.getModelSpecifier();
        Check.checkState(rootModelSpecifier != null);

        // register view design reference in root model
        addDesignReferenceToRootModel(rootModel, viewSpecifier);

        // save root without generating source
        boolean rootGeneratedSource = WizardUtils.toggleSourceGeneration(rootModel, false);
        rootModel = saveRootModel(project, wc, rootModelSpecifier, monitor);
        WizardUtils.toggleSourceGeneration(rootModel, rootGeneratedSource);
        boolean viewGeneratedSource = WizardUtils.toggleSourceGeneration(rootModel, false);
        viewModel = saveViewModel(project, wc, pc, rootModel, viewSpecifier, monitor);
        WizardUtils.toggleSourceGeneration(rootModel, viewGeneratedSource);

        /*if (srcGenRoot) {
           WizardUtils.setupSourceGeneration(sourceGenProvider, rootModel, rootModel.getModelSpecifier());
           saveRootModel(project, wc, rootModelSpecifier, monitor);
        }*/

        // let project context detect the model changes
        pc.refresh(null);

        // ensure they're found...
        Check.checkState(pc.findSpecifierForPath(rootModelSpecifier.getPrimaryResourcePath()) != null);
        Check.checkState(pc.findSpecifierForPath(viewSpecifier.getPrimaryResourcePath()) != null);

        // now save again with sourcegen enabled

        // save view first, so root can access its RootAppUi resources
        //WizardUtils.setupSourceGeneration(sourceGenProvider, viewModel, viewSpecifier);
        //saveViewModel(project, wc, pc, rootModel, viewSpecifier, monitor);      

        // now save root
        if (srcGenRoot) {
            WizardUtils.setupSourceGeneration(sourceGenProvider, rootModel, rootModel.getModelSpecifier());
            saveRootModel(project, wc, rootModelSpecifier, monitor);

            WizardUtils.setupSourceGeneration(sourceGenProvider, viewModel, viewSpecifier);
            saveViewModel(project, wc, pc, rootModel, viewSpecifier, monitor);
        }

        // after all that, add default event handler code
        writeDefaultEventHandlerBodies(pc);

        // re-enable resource listening
        if (rootEditorBase != null)
            rootEditorBase.setListenToResourceChanges(true);

        // don't show editor opening progress, since wizard provides progress
        /*
        EditorServices.setStifleProgress(true);            
        try {
           try {
        if (newRootModel)
           rootModel.getModelSpecifier().openInEditor();
           } catch (CoreException e) {
        Check.reportFailure(Messages.getString("ViewWizard.RootModelOpenError"), e); //$NON-NLS-1$
           }
            
           // reload root editor if open
           if (rootEditorBase != null)
        rootEditorBase.reload();
            
           try {
        viewModel.getModelSpecifier().openInEditor();
           } catch (CoreException e) {
        Check.reportFailure(Messages.getString("ViewWizard.ViewModelOpenError"), e); //$NON-NLS-1$
           }
        } finally {
           EditorServices.setStifleProgress(false);            
        }*/
    }

    public void saveModelsOriginal(boolean newRootModel, boolean srcGenRoot, IProgressMonitor monitor) {
        final IProject project = (IProject) getDataStore().get(PROJECT_KEY);
        Check.checkContract(project != null);
        final WorkspaceContext wc = WorkspaceContext.getContext();
        final IProjectContext pc = wc.getContextForProject(project);
        Check.checkContract(pc != null);
        ISymbianProjectContext spc = (ISymbianProjectContext) pc.getAdapter(ISymbianProjectContext.class);

        ISourceGenProvider sourceGenProvider = pc.getSourceGenProvider();

        // get root
        IDesignerDataModel rootModel = null;
        rootModel = (IDesignerDataModel) getDataStore().get(ROOT_MODEL_KEY);

        // turn off resource listening
        IDesignerDataModelEditor rootEditor = EditorServices.findEditorForModel(rootModel.getModelSpecifier());
        if (rootEditor != null)
            rootEditor.setListenToResourceChanges(false);

        IDesignerDataModelSpecifier viewSpecifier = createModelSpecifier(project, spc);

        // save view model without generating source
        IDesignerDataModel viewModel = null;
        viewModel = saveViewModel(project, wc, pc, rootModel, viewSpecifier, monitor);

        // get or create specifier for root 
        IDesignerDataModelSpecifier rootModelSpecifier = null;
        if (newRootModel)
            rootModelSpecifier = spc.createNewRootModelSpecifier();
        else
            rootModelSpecifier = rootModel.getModelSpecifier();
        Check.checkState(rootModelSpecifier != null);

        // register view design reference in root model
        addDesignReferenceToRootModel(rootModel, viewSpecifier);

        // save root without generating source
        boolean rootGeneratedSource = WizardUtils.toggleSourceGeneration(rootModel, false);
        rootModel = saveRootModel(project, wc, rootModelSpecifier, monitor);
        WizardUtils.toggleSourceGeneration(rootModel, rootGeneratedSource);

        // let project context detect the model changes
        pc.refresh(null);

        // ensure they're found...
        Check.checkState(pc.findSpecifierForPath(rootModelSpecifier.getPrimaryResourcePath()) != null);
        Check.checkState(pc.findSpecifierForPath(viewSpecifier.getPrimaryResourcePath()) != null);

        // now save again with sourcegen enabled

        // save view first, so root can access its RootAppUi resources
        WizardUtils.setupSourceGeneration(sourceGenProvider, viewModel, viewSpecifier);
        saveViewModel(project, wc, pc, rootModel, viewSpecifier, monitor);

        // now save root
        if (srcGenRoot) {
            WizardUtils.setupSourceGeneration(sourceGenProvider, rootModel, rootModel.getModelSpecifier());
            saveRootModel(project, wc, rootModelSpecifier, monitor);
        }

        // after all that, add default event handler code
        writeDefaultEventHandlerBodies(pc);

        // re-enable resource listening
        if (rootEditor != null)
            rootEditor.setListenToResourceChanges(true);

        // don't show editor opening progress, since wizard provides progress

        EditorServices.setStifleProgress(true);
        try {
            try {
                if (newRootModel)
                    rootModel.getModelSpecifier().openInEditor();
            } catch (CoreException e) {
                Check.reportFailure(Messages.getString("ViewWizard.RootModelOpenError"), e); //$NON-NLS-1$
            }

            // reload root editor if open
            if (rootEditor != null)
                rootEditor.reload();

            try {
                viewModel.getModelSpecifier().openInEditor();
            } catch (CoreException e) {
                Check.reportFailure(Messages.getString("ViewWizard.ViewModelOpenError"), e); //$NON-NLS-1$
            }
        } finally {
            EditorServices.setStifleProgress(false);
        }
    }

    private IDesignerDataModel saveRootModel(final IProject project, final WorkspaceContext wc,
            IDesignerDataModelSpecifier rootSpecifier, IProgressMonitor monitor) {
        IDesignerDataModel rootModel;

        rootModel = (IDesignerDataModel) getDataStore().get(ROOT_MODEL_KEY);

        try {
            rootModel.saveModelAs(rootSpecifier, monitor);
            wc.projectChanged(project);
        } catch (Exception e) {
            Check.reportFailure(Messages.getString("ViewWizard.RootModelSaveError"), e); //$NON-NLS-1$
        }

        return rootModel;
    }

    /**
     * Get the name used to name the *.uidesign file.
     * @return filename base
     */
    private String getViewModelName() {
        String containerName = (String) getDataStore().get(CONTAINER_BASENAME_KEY);
        Check.checkContract(containerName != null);
        return containerName;
    }

    private IDesignerDataModel saveViewModel(final IProject project, final WorkspaceContext wc,
            final IProjectContext pc, IDesignerDataModel rootModel, IDesignerDataModelSpecifier viewSpecifier,
            IProgressMonitor monitor) {
        final IDesignerDataModel viewModel = (IDesignerDataModel) getDataStore().get(VIEW_MODEL_KEY);

        try {
            pc.refresh(null);
            monitor.beginTask(Messages.getString("ViewWizard.SavingViewDataModel"), 2 /* view, then root */); //$NON-NLS-1$
            viewModel.saveModelAs(viewSpecifier, new SubProgressMonitor(monitor, 1));
            monitor.worked(1);
            wc.projectChanged(pc.getProject());
        } catch (Exception e) {
            Check.reportFailure(Messages.getString("ViewWizard.ViewModelSaveError"), e); //$NON-NLS-1$
        }

        return viewModel;
    }

    /**
     * @param project
     * @param spc
     * @return
     */
    private IDesignerDataModelSpecifier createModelSpecifier(final IProject project, ISymbianProjectContext spc) {
        String viewFileName = getViewModelName() + MODEL_EXTENSION;
        IFile viewFile = project.getFile(viewFileName);
        final IDesignerDataModelSpecifier viewSpecifier = spc.createNewModelSpecifier(viewFile);
        return viewSpecifier;
    }

    private void ensureProjectExists() {
        IProject project = null;
        if (!getDataStore().containsKey(PROJECT_KEY)) {
            String projectName = (String) getDataStore().get(PROJECT_NAME_KEY);
            Check.checkContract(projectName != null);
            IWorkspace workspace = ResourcesPlugin.getWorkspace();
            IWorkspaceRoot root = workspace.getRoot();
            project = root.getProject(projectName);
            Check.checkContract(project != null);
            getDataStore().put(PROJECT_KEY, project);
        } else
            project = (IProject) getDataStore().get(PROJECT_KEY);

        //      SymbianProjectUtils.addUIDesignerProjectNatureToProject(project);
    }

    public void disposePages() {
        for (Iterator<ViewWizardPageBase> iter = pages.iterator(); iter.hasNext();) {
            iter.next().dispose();
        }
    }

    public void disposeModels(boolean all) {
        disposeStoredModel(TEMP_DATA_MODEL_KEY);
        if (all || !extantRootModel) {
            disposeStoredModel(ROOT_MODEL_KEY);
        }
        disposeStoredModel(VIEW_MODEL_KEY);
    }

    public void disposeStoredModel(String modelKey) {
        IDesignerDataModel dataModel = (IDesignerDataModel) getDataStore().get(modelKey);
        if (dataModel != null) {
            dataModel.dispose();
            getDataStore().remove(modelKey);
        }
    }

    public IDesignerDataModel createEmptyViewModel() throws Exception {
        IDesignerDataModel dataModel = getDataModelProvider().createTemporary();
        dataModel.setComponentSet(getComponentSet());

        return dataModel;
    }

    public IComponentSet getComponentSet() {
        return (IComponentSet) getDataStore().get(COMPONENT_SET_KEY);
    }

    public boolean isLastPage(IWizardPage page) {
        return page.equals(containerSelectionPage);
    }

    public IWizardPage getNextPage(IWizardPage page) {
        if (page.equals(appDefinitionPage))
            return initialContentPage;

        if (page.equals(initialContentPage)) {
            if (customizerUI != null)
                return customizerPage;
            else
                return containerSelectionPage;
        }

        if (page.equals(customizerPage))
            return containerSelectionPage;

        return page.getWizard().getNextPage(page);
    }

    public IWizardPage getPreviousPage(IWizardPage page) {
        if (page.equals(appDefinitionPage))
            return page.getPreviousPage();

        if (page.equals(containerSelectionPage)) {
            if (customizerUI != null)
                return customizerPage;
            else
                return initialContentPage;
        }

        if (page.equals(customizerPage))
            return initialContentPage;

        if (page.equals(initialContentPage))
            return appDefinitionPage;

        return page.getWizard().getPreviousPage(page);
    }

    public IWizardPage getPage(String pageName) {
        IWizardPage page = wizard.getPage(pageName);
        if ((page == null) && (wizard instanceof TemplateWizard)) {
            WizardSelectionPage wizardSelectionPage = ((TemplateWizard) wizard).getChooseTemplatePage();
            IWizardNode selectedNode = wizardSelectionPage.getSelectedNode();
            IWizard nodeWizard = selectedNode.getWizard();
            page = nodeWizard.getPage(pageName);
        }

        return page;
    }

    public void setCustomizerUI(IComponentCustomizerUI customizerUI) {
        this.customizerUI = customizerUI;
        customizerPage.setCustomizerUI(customizerUI);
    }

    public boolean checkProjectWizard(boolean updateDataStore) {
        IWizardPage page = getPage("New Project Page"); //$NON-NLS-1$
        String projectName = null;
        if (page instanceof IWizardDataPage) {
            projectName = (String) ((IWizardDataPage) page).getPageValues().get("projectName"); //$NON-NLS-1$
            if ((projectName != null) && updateDataStore)
                getDataStore().put(PROJECT_NAME_KEY, projectName);
        }
        return projectName != null;
    }

    public void setTemplate(ITemplate template) {
        this.template = template;
    }

    public IWizard getWizard() {
        return wizard;
    }

    public void addProjectSelectionListener(IProjectSelectionListener listener) {
        if (projectSelectionListeners == null)
            projectSelectionListeners = new ArrayList<IProjectSelectionListener>();

        projectSelectionListeners.add(listener);
    }

    void fireProjectSelectionChanged(IProject project) {
        if (projectSelectionListeners == null)
            return;

        for (Iterator<IProjectSelectionListener> iter = projectSelectionListeners.iterator(); iter.hasNext();) {
            iter.next().projectSelectionChanged(project);
        }
    }

    public void setExtantRootModel(boolean hasRootModel) {
        extantRootModel = hasRootModel;
    }

    public void setApplicationLanguages(Language[] appLanguages) {
        this.appLanguages = appLanguages;
    }

    /**
     * Find collisions between existing sources and those generated by a new model.
     * @return list of project-relative paths
     */
    public List<IPath> getSourceCollisions() {
        WorkspaceContext wc = WorkspaceContext.getContext();
        final IProject project = (IProject) getDataStore().get(PROJECT_KEY);
        final IProjectContext pc = wc.getContextForProject(project);
        Check.checkContract(pc != null);
        final ISymbianProjectContext spc = (ISymbianProjectContext) pc.getAdapter(ISymbianProjectContext.class);
        final IDesignerDataModelSpecifier modelSpecifier = createModelSpecifier(project, spc);

        // create a separate provider so we don't disturb the existing one
        ISourceGenProvider provider;
        try {
            provider = SourceGenUtils.loadSourceGenProvider(SymbianModelUtils.SOURCEGEN_PROVIDER_ID, project);
        } catch (CoreException e) {
            UIPlugin.log(e);
            return Collections.EMPTY_LIST;
        }
        //pc.getSourceGenProvider();
        Check.checkContract(provider != null);

        final List<IPath> collisions = new ArrayList<IPath>();

        // check view model (use runnable to get busy notification)
        IDesignerDataModel model = (IDesignerDataModel) getDataStore().get(VIEW_MODEL_KEY);
        final ISourceGenSession session = SymbianModelUtils.createSourceGenSession(provider, model, modelSpecifier);
        UITaskUtils.runImmediately(new IRunnableWithProgress() {
            public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
                List<IPath> sources = session.scanForGeneratedSources(monitor);
                filterCollisions(collisions, project, sources);
            }
        });
        session.dispose();
        provider.dispose();

        return collisions;
    }

    /**
     * Check whether any of the files in sources exists in project.
     * @param project
     * @param sources
     * @return true: collisions found
     */
    private void filterCollisions(List<IPath> collisions, IProject project, List<IPath> sources) {
        for (Iterator iter = sources.iterator(); iter.hasNext();) {
            IPath path = (IPath) iter.next();
            IResource rsrc = project.findMember(path);
            if (rsrc != null && rsrc.exists())
                collisions.add(path);
        }
    }
}