org.eclipse.epf.authoring.ui.forms.ConfigViewPage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.epf.authoring.ui.forms.ConfigViewPage.java

Source

//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 IBM Corporation and others.
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// which accompanies this distribution, and is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// Contributors:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.authoring.ui.forms;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.epf.authoring.ui.AuthoringUIHelpContexts;
import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
import org.eclipse.epf.authoring.ui.AuthoringUIResources;
import org.eclipse.epf.authoring.ui.dialogs.ConfigurationAddViewsDialog;
import org.eclipse.epf.authoring.ui.dialogs.ConfigurationOrderDialog;
import org.eclipse.epf.authoring.ui.editors.ConfigurationEditor;
import org.eclipse.epf.authoring.ui.editors.ConfigurationEditorInput;
import org.eclipse.epf.authoring.ui.filters.ProcessViewFilter;
import org.eclipse.epf.authoring.ui.providers.ConfigurationLabelProvider;
import org.eclipse.epf.authoring.ui.views.ConfigurationViewFilter;
import org.eclipse.epf.common.serviceability.Logger;
import org.eclipse.epf.library.edit.IFilter;
import org.eclipse.epf.library.edit.TngAdapterFactory;
import org.eclipse.epf.library.edit.command.IActionManager;
import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
import org.eclipse.epf.uma.ContentCategory;
import org.eclipse.epf.uma.MethodConfiguration;
import org.eclipse.epf.uma.UmaPackage;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
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.IEditorSite;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.FormColors;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.editor.FormPage;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.Section;

/**
 * Page for customizing publishing views
 * 
 * @author Shilpa Toraskar
 * @author Jinhua Xi
 * @since 1.0
 * fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=173827
 * fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=174260
 */
public class ConfigViewPage extends FormPage {

    private MethodConfiguration config = null;

    private String formPrefix = AuthoringUIResources.configViewPage_configuration;

    private FormToolkit toolkit;

    private CTabFolder tabFolder;
    private CTabItem tabDefaultviewItem;

    private Button removeButton, makeDefaultButton, orderButton;

    private Object selectedItem = null;

    private IActionManager actionMgr = null;

    private Logger logger = null;

    /**
     * Creates an instance
     * @param editor
     */
    public ConfigViewPage(FormEditor editor) {
        super(editor, AuthoringUIResources.configViewPage_configurationViews,
                AuthoringUIResources.configViewPage_views);
    }

    /**
     * @see org.eclipse.ui.forms.editor.FormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
     */
    public void init(IEditorSite site, IEditorInput input) {
        setSite(site);
        setInput(input);

        ConfigurationEditorInput configInput = (ConfigurationEditorInput) input;
        config = configInput.getConfiguration();

        actionMgr = ((ConfigurationEditor) getEditor()).getActionManager();

        // get plugin logger
        logger = AuthoringUIPlugin.getDefault().getLogger();
    }

    /**
     * @see org.eclipse.ui.forms.editor.FormPage#createFormContent(org.eclipse.ui.forms.IManagedForm)
     */
    protected void createFormContent(IManagedForm managedForm) {
        ScrolledForm form = managedForm.getForm();
        form.setText(formPrefix + config.getName());
        toolkit = managedForm.getToolkit();
        form.getBody().setLayout(new GridLayout());

        // Create the view section.
        Section viewSection = toolkit.createSection(form.getBody(),
                Section.DESCRIPTION | Section.TWISTIE | Section.EXPANDED | Section.TITLE_BAR);
        GridData td = new GridData(GridData.FILL_BOTH);
        viewSection.setLayoutData(td);
        viewSection.setText(AuthoringUIResources.configViewPage_configurationViewSectionTitle);
        viewSection.setDescription(AuthoringUIResources.configViewPage_configurationViewSectionMessage);
        viewSection.setLayout(new GridLayout());

        Composite parent = toolkit.createComposite(viewSection);
        parent.setLayoutData(new GridData(GridData.FILL_BOTH));
        parent.setLayout(new GridLayout());
        viewSection.setClient(parent);

        PlatformUI.getWorkbench().getHelpSystem().setHelp(parent.getParent(),
                AuthoringUIHelpContexts.CONFIGURATION_EDITOR_ALL_CONTEXT);

        // create button pane
        createButtonPane(parent);

        // create tabfolder pane
        createTabPane(parent);

        toolkit.paintBordersFor(parent);
        loadData();
    }

    /**
     * 
     * @param parent
     */
    private void createTabPane(Composite parent) {
        tabFolder = new CTabFolder(parent, SWT.FLAT | SWT.TOP | SWT.BORDER);
        tabFolder.setLayout(new GridLayout());
        tabFolder.setLayoutData(new GridData(GridData.FILL_BOTH));

        // set tabfolder background color
        Color selectedColor = toolkit.getColors().getColor(FormColors.TB_BG);
        tabFolder.setSelectionBackground(new Color[] { selectedColor, toolkit.getColors().getBackground() },
                new int[] { 50 });

        toolkit.paintBordersFor(tabFolder);

    }

    /**
     * 
     * @param parent
     */
    private void createButtonPane(Composite parent) {
        Composite buttonPane = toolkit.createComposite(parent);
        buttonPane.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        buttonPane.setLayout(new GridLayout(4, false));

        Button addButton = toolkit.createButton(buttonPane, AuthoringUIResources.configViewPage_addViewButtonText,
                SWT.NONE);
        {
            GridData gridData = new GridData(GridData.BEGINNING);
            addButton.setLayoutData(gridData);
        }
        addButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                // ConfigProcessViewDialog fd = new
                // ConfigProcessViewDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
                // config);
                // ConfigProcessViewDialog.setDefaultImage(Display.getCurrent().getActiveShell().getImage());
                IFilter filter = new ProcessViewFilter(config, null, FilterConstants.ALL_ELEMENTS);
                ConfigurationAddViewsDialog fd = new ConfigurationAddViewsDialog(
                        PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
                fd.setTypes(getTypes());
                fd.setTitle(AuthoringUIResources.ConfigProcessViewDialog_SelectCategories);
                fd.setInput(config);
                fd.setFilter(filter);
                fd.setExistingElements(config.getProcessViews());
                fd.setContentProvider(
                        new AdapterFactoryContentProvider(
                                TngAdapterFactory.INSTANCE.getItemsFilter_AdapterFactory(filter)),
                        TngAdapterFactory.INSTANCE.getItemsFilter_ComposedAdapterFactory());
                fd.setBlockOnOpen(true);
                fd.open();
                List views = fd.getSelectedItems();

                // add view to configuration
                for (Iterator itor = views.iterator(); itor.hasNext();) {
                    Object obj = itor.next();
                    if (obj instanceof ContentCategory) {

                        if (config.getProcessViews().contains((ContentCategory) obj)) {
                            String name = ((ContentCategory) obj).getName();
                            String title = AuthoringUIResources.configViewPageViewExistsDialog_title;
                            String message = AuthoringUIResources
                                    .bind(AuthoringUIResources.configViewPageViewExistsDialog_message, name);
                            AuthoringUIPlugin.getDefault().getMsgDialog().displayWarning(title, message);
                        } else {
                            boolean status = actionMgr.doAction(IActionManager.ADD, config,
                                    UmaPackage.eINSTANCE.getMethodConfiguration_ProcessViews(),
                                    (ContentCategory) obj, -1);
                            if (status) {
                                addView((ContentCategory) obj);
                            }
                        }
                    }
                }
            }
        });

        // remove button
        removeButton = toolkit.createButton(buttonPane, AuthoringUIResources.configViewPage_removeViewButtonText,
                SWT.NONE);
        {
            GridData gridData = new GridData(GridData.BEGINNING);
            removeButton.setLayoutData(gridData);
        }
        removeButton.setEnabled(false);
        removeButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                removeView();
            }
        });

        // make default button
        makeDefaultButton = toolkit.createButton(buttonPane,
                AuthoringUIResources.configViewPage_makeDefaultButtonText, SWT.NONE);
        {
            GridData gridData = new GridData(GridData.BEGINNING);
            makeDefaultButton.setLayoutData(gridData);
        }
        makeDefaultButton.setEnabled(false);
        makeDefaultButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                makeDefaultView();
            }
        });

        orderButton = toolkit.createButton(buttonPane, AuthoringUIResources.orderButton_text, SWT.NONE);
        {
            GridData gridData = new GridData(GridData.BEGINNING);
            removeButton.setLayoutData(gridData);
        }
        orderButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                ConfigurationOrderDialog dlg = new ConfigurationOrderDialog(Display.getCurrent().getActiveShell(),
                        config, getActionManager());
                int ret = dlg.open();
                if (ret == Window.OK)
                    refresh();
            }
        });

        toolkit.paintBordersFor(buttonPane);
    }

    /**
     * Remove the selected view
     * 
     */
    private void removeView() {
        CTabItem item = tabFolder.getSelection();
        if (item == null)
            return;

        // don't change default view if the view is not removed.
        // 155025 - error when removing the view in configuration
        String itemText = item.getText();
        String title = AuthoringUIResources.configViewPageRemoveViewDialog_title;
        String message = AuthoringUIResources.bind(AuthoringUIResources.configViewPageRemoveViewDialog_message,
                item.getText());
        boolean ret = AuthoringUIPlugin.getDefault().getMsgDialog().displayConfirmation(title, message);

        if (!ret) {
            return;
        }

        boolean removeDefault = false;
        if (tabDefaultviewItem != null && item == tabDefaultviewItem) {
            removeDefault = true;
        }

        List views = config.getProcessViews();
        // if there is a default view tab, and it's the one slected to be removed
        if (removeDefault) {
            String defaultText = " " //$NON-NLS-1$
                    + AuthoringUIResources.processDescription_default;
            int idx = itemText.lastIndexOf(defaultText);
            if (idx > 0) {
                itemText = itemText.substring(0, idx);
            }
        }

        for (Iterator itor = views.iterator(); itor.hasNext();) {
            ContentCategory category = (ContentCategory) itor.next();

            if (category.getName().equals(itemText)) {
                // remove it from views
                actionMgr.doAction(IActionManager.REMOVE, config,
                        UmaPackage.eINSTANCE.getMethodConfiguration_ProcessViews(), category, -1);

                ContentCategory defaultView = config.getDefaultView();

                if ((defaultView != null) && (defaultView.equals(category))) {
                    if (views.size() > 0) {
                        actionMgr.doAction(IActionManager.SET, config,
                                UmaPackage.eINSTANCE.getMethodConfiguration_DefaultView(),
                                (ContentCategory) views.get(0), -1);
                    } else {
                        actionMgr.doAction(IActionManager.SET, config,
                                UmaPackage.eINSTANCE.getMethodConfiguration_DefaultView(), null, -1);
                    }
                }
                // remove tab item
                item.dispose();
                break;
            }
        }

        views = config.getProcessViews();
        if ((views == null) || (views.size() <= 0)) {
            removeButton.setEnabled(false);
            makeDefaultButton.setEnabled(false);
        }

        // make the 1st tab as the default view if the default one is removed
        if (removeDefault) {
            Control[] tabList = tabFolder.getTabList();
            if (tabList != null && tabList.length > 0) {
                tabFolder.setSelection(0);
                makeDefaultView();
            }
        }
    }

    /**
     * Add view
     * 
     * @param obj
     */
    private void addView(ContentCategory obj) {
        selectedItem = obj;
        Composite composite = new Composite(tabFolder, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        composite.setLayout(layout);
        composite.setLayoutData(new GridData(GridData.FILL_BOTH));

        TreeViewer treeViewer = new TreeViewer(composite, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
        treeViewer.getTree().setLayout(new GridLayout());
        treeViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));

        IFilter configFilter = new ConfigurationViewFilter(config, treeViewer);
        AdapterFactory adapterFactory = TngAdapterFactory.INSTANCE
                .getConfigurationView_AdapterFactory(configFilter);

        AdapterFactoryContentProvider contentProvider = new AdapterFactoryContentProvider(adapterFactory) {
            public Object[] getElements(Object object) {
                // Get the adapter from the factory.
                ITreeItemContentProvider itemProvider = (ITreeItemContentProvider) adapterFactory
                        .adapt(selectedItem, ITreeItemContentProvider.class);

                return itemProvider.getChildren(selectedItem).toArray();
                // return itemProvider.getElements(selectedItem).toArray();
            }
        };

        treeViewer.setContentProvider(contentProvider);
        treeViewer.setLabelProvider(new ConfigurationLabelProvider(config, adapterFactory));
        try {
            treeViewer.setInput(config);
        } catch (Exception ex) {
            logger.logError("Error creating treeviewer for config", ex); //$NON-NLS-1$
        }

        CTabItem item = new CTabItem(tabFolder, SWT.TOP);
        item.setText(((ContentCategory) obj).getName());
        item.setControl(composite);

        // make all buttons enabled
        removeButton.setEnabled(true);
        makeDefaultButton.setEnabled(true);

        toolkit.paintBordersFor(composite);
        tabFolder.setSelection(item);
    }

    /**
     * Make selected as default view
     * 
     */
    private void makeDefaultView() {
        CTabItem item = tabFolder.getSelection();
        List views = config.getProcessViews();
        for (Iterator itor = views.iterator(); itor.hasNext();) {
            ContentCategory category = (ContentCategory) itor.next();
            if (category.getName().equals(item.getText())) {
                clearDefaultViewIndicator();
                // make that view default
                actionMgr.doAction(IActionManager.SET, config,
                        UmaPackage.eINSTANCE.getMethodConfiguration_DefaultView(), category, -1);
                setDefaultViewIndicator(item);
                break;
            }
        }
    }

    /**
     * Load initial data
     * 
     */
    private void loadData() {
        // get process views
        List views = config.getProcessViews();
        for (Iterator itor = views.iterator(); itor.hasNext();) {
            // create view in UI
            addView((ContentCategory) itor.next());
        }

        // get default view
        ContentCategory defaultView = config.getDefaultView();
        int cnt = tabFolder.getItemCount();
        if (defaultView != null) {
            // if default view is defined, select that view
            CTabItem[] items = tabFolder.getItems();
            for (int i = 0; i < items.length; i++) {
                String name = items[i].getText();
                if (name.equals(defaultView.getName())) {
                    tabFolder.setSelection(items[i]);
                    setDefaultViewIndicator(items[i]);
                    break;
                }
            }
        } else if (cnt > 0) {
            // else select first view
            tabFolder.setSelection(0);
        }
    }

    private void refresh() {
        ContentCategory defaultView = config.getDefaultView();
        String defaultViewName = ""; //$NON-NLS-1$
        if (defaultView != null) {
            defaultViewName = defaultView.getName();
            clearDefaultViewIndicator();
        }
        String selectedView = tabFolder.getSelection().getText();
        Map origViews = new HashMap();
        for (int i = 0; i < tabFolder.getItemCount(); i++) {
            CTabItem item = tabFolder.getItem(i);
            origViews.put(item.getText(), item.getControl());
        }
        List views = config.getProcessViews();
        int index = 0;
        int selectedIndex = 0;
        for (Iterator itor = views.iterator(); itor.hasNext() && index < tabFolder.getItemCount();) {
            String view = ((ContentCategory) itor.next()).getName();
            CTabItem item = tabFolder.getItem(index++);
            item.setText(view);
            item.setControl((Control) origViews.get(view));
            if (view.equals(defaultViewName))
                setDefaultViewIndicator(item);
            if (view.equals(selectedView))
                selectedIndex = index - 1;
        }
        tabFolder.setSelection(selectedIndex);
    }

    /**
     * This method removes the appended "(default)" from the tab for the default
     * view. This method must be called before changing the default view!
     */
    private void clearDefaultViewIndicator() {
        ContentCategory defaultView = config.getDefaultView();
        if (defaultView != null) {
            String defaultViewTabName = defaultView.getName() + " " //$NON-NLS-1$
                    + AuthoringUIResources.processDescription_default;
            CTabItem[] items = tabFolder.getItems();
            for (int i = 0; i < items.length; i++) {
                String name = items[i].getText();
                if (name.equals(defaultViewTabName)) {
                    items[i].setText(defaultView.getName());
                }
            }
        }
    }

    /**
     * This method appends "(default)" to the tab of the default view.
     */
    private void setDefaultViewIndicator(CTabItem item) {
        tabDefaultviewItem = item;

        String name = item.getText() + " " //$NON-NLS-1$
                + AuthoringUIResources.processDescription_default;
        item.setText(name);
    }

    private String[] getTypes() {
        String[] Categories = new String[] { FilterConstants.CUSTOM_CATEGORIES, FilterConstants.ALL_ELEMENTS,
                FilterConstants.DISCIPLINES, FilterConstants.DOMAINS, FilterConstants.ROLESETS,
                FilterConstants.WORKPRODUCTTYPES, FilterConstants.TOOLS };
        return Categories;
    }

    protected IActionManager getActionManager() {
        return actionMgr;
    }

}