org.eclipse.emf.cdo.internal.ui.dialogs.PackageManagerDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.emf.cdo.internal.ui.dialogs.PackageManagerDialog.java

Source

/***************************************************************************
 * Copyright (c) 2004 - 2008 Eike Stepper, Germany.
 * 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:
 *    Eike Stepper - initial API and implementation
 **************************************************************************/
package org.eclipse.emf.cdo.internal.ui.dialogs;

import org.eclipse.emf.cdo.CDOSession;
import org.eclipse.emf.cdo.common.model.CDOPackage;
import org.eclipse.emf.cdo.internal.ui.SharedIcons;
import org.eclipse.emf.cdo.internal.ui.actions.RegisterFilesystemPackagesAction;
import org.eclipse.emf.cdo.internal.ui.actions.RegisterGeneratedPackagesAction;
import org.eclipse.emf.cdo.internal.ui.actions.RegisterWorkspacePackagesAction;
import org.eclipse.emf.cdo.ui.CDOItemProvider;
import org.eclipse.emf.cdo.util.CDOPackageRegistry;
import org.eclipse.emf.cdo.util.CDOPackageType;
import org.eclipse.emf.cdo.util.CDOPackageTypeRegistry;

import org.eclipse.net4j.util.ObjectUtil;
import org.eclipse.net4j.util.ui.UIUtil;

import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.impl.EPackageImpl;

import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.BaseLabelProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IWorkbenchPage;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

/**
 * @author Eike Stepper
 */
public class PackageManagerDialog extends TitleAreaDialog {
    private static final int REGISTER_GENERATED_PACKAGES_ID = IDialogConstants.CLIENT_ID + 1;

    private static final int REGISTER_WORKSPACE_PACKAGES_ID = IDialogConstants.CLIENT_ID + 2;

    private static final int REGISTER_FILESYSTEM_PACKAGES_ID = IDialogConstants.CLIENT_ID + 3;

    private static final String TITLE = "CDO Package Manager";

    private static final String EMPTY = "";

    private IWorkbenchPage page;

    private CDOSession session;

    private TableViewer viewer;

    public PackageManagerDialog(IWorkbenchPage page, CDOSession session) {
        super(new Shell(page.getWorkbenchWindow().getShell()));
        this.page = page;
        this.session = session;
        setShellStyle(getShellStyle() | SWT.APPLICATION_MODAL | SWT.MAX | SWT.TITLE | SWT.RESIZE);
    }

    @Override
    protected void configureShell(Shell newShell) {
        super.configureShell(newShell);
        newShell.setText(TITLE);
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        Composite composite = (Composite) super.createDialogArea(parent);
        setTitle(CDOItemProvider.getSessionLabel(session));
        setTitleImage(SharedIcons.getImage(SharedIcons.WIZBAN_PACKAGE_MANAGER));

        viewer = new TableViewer(composite, SWT.NONE);
        Table table = viewer.getTable();

        table.setHeaderVisible(true);
        table.setLayoutData(UIUtil.createGridData());
        addColumn(table, "Package", 400, SWT.LEFT);
        addColumn(table, "Registry", 80, SWT.CENTER);
        addColumn(table, "Repository", 80, SWT.CENTER);

        viewer.setContentProvider(new ContentProvider());
        viewer.setLabelProvider(new LabelProvider());
        viewer.setInput(session);

        return composite;
    }

    @Override
    protected void createButtonsForButtonBar(Composite parent) {
        createButton(parent, REGISTER_GENERATED_PACKAGES_ID, "Generated...", false);
        createButton(parent, REGISTER_WORKSPACE_PACKAGES_ID, "Workspace...", false);
        createButton(parent, REGISTER_FILESYSTEM_PACKAGES_ID, "Filesystem...", false);
        createButton(parent, IDialogConstants.CLOSE_ID, IDialogConstants.CLOSE_LABEL, false);
    }

    @Override
    protected void buttonPressed(int buttonId) {
        switch (buttonId) {
        case REGISTER_GENERATED_PACKAGES_ID:
            new RegisterGeneratedPackagesAction(page, session) {
                @Override
                protected void postRegistration(List<EPackage> ePackages) {
                    refreshViewer();
                }
            }.run();
            break;

        case REGISTER_WORKSPACE_PACKAGES_ID:
            new RegisterWorkspacePackagesAction(page, session) {
                @Override
                protected void postRegistration(List<EPackage> ePackages) {
                    refreshViewer();
                }
            }.run();
            break;

        case REGISTER_FILESYSTEM_PACKAGES_ID:
            new RegisterFilesystemPackagesAction(page, session) {
                @Override
                protected void postRegistration(List<EPackage> ePackages) {
                    refreshViewer();
                }
            }.run();
            break;

        case IDialogConstants.CLOSE_ID:
            close();
            break;
        }
    }

    protected Image getContentIcon(Content content) {
        return null;
    }

    protected String getEPackageText(Object ePackage) {
        if (ePackage == EcorePackage.eINSTANCE) {
            return "ECORE";
        }

        if (ePackage.getClass() == EPackageImpl.class) {
            return "DYNAMIC";
        }

        String uri = EMPTY;
        if (ePackage instanceof EPackage.Descriptor) {
            CDOPackageRegistry registry = session.getPackageRegistry();
            for (Map.Entry<String, Object> entry : registry.entrySet()) {
                if (entry.getValue() == ePackage) {
                    uri = entry.getKey();
                    break;
                }
            }
        } else {
            uri = ((EPackage) ePackage).getNsURI();
        }

        CDOPackageType packageType = CDOPackageTypeRegistry.INSTANCE.get(uri);
        if (packageType == null) {
            return "?";
        }

        return packageType.toString();
    }

    protected String getCDOPackageText(CDOPackage cdoPackage) {
        if (cdoPackage.isSystem()) {
            return "SYSTEM";
        }

        if (!cdoPackage.isPersistent()) {
            return EMPTY;
        }

        return cdoPackage.isDynamic() ? "DYNAMIC" : "STATIC";
    }

    private void addColumn(Table table, String title, int width, int alignment) {
        TableColumn column = new TableColumn(table, alignment);
        column.setText(title);
        column.setWidth(width);
    }

    protected void refreshViewer() {
        page.getWorkbenchWindow().getShell().getDisplay().syncExec(new Runnable() {
            public void run() {
                try {
                    viewer.refresh();
                } catch (RuntimeException ignore) {
                }
            }
        });
    }

    /**
     * @author Eike Stepper
     */
    public class LabelProvider extends BaseLabelProvider implements ITableLabelProvider {
        public LabelProvider() {
        }

        public String getColumnText(Object element, int columnIndex) {
            if (element instanceof Content) {
                Content content = (Content) element;
                switch (columnIndex) {
                case 0:
                    return content.getPackageURI();
                case 1:
                    return content.getEPackage() == null ? EMPTY : getEPackageText(content.getEPackage());
                case 2:
                    return content.getCDOPackage() == null ? EMPTY : getCDOPackageText(content.getCDOPackage());
                }
            }

            return element.toString();
        }

        public Image getColumnImage(Object element, int columnIndex) {
            if (element instanceof Content) {
                Content content = (Content) element;
                if (columnIndex == 0) {
                    return getContentIcon(content);
                }
            }

            return null;
        }
    }

    /**
     * @author Eike Stepper
     */
    public static class ContentProvider implements IStructuredContentProvider {
        private static final Object[] NO_ELEMENTS = {};

        private CDOSession session;

        public ContentProvider() {
        }

        public void dispose() {
        }

        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            if (newInput instanceof CDOSession) {
                if (!ObjectUtil.equals(session, newInput)) {
                    session = (CDOSession) newInput;
                }
            }
        }

        public Object[] getElements(Object inputElement) {
            if (inputElement != session) {
                return NO_ELEMENTS;
            }

            Map<String, Content> map = new HashMap<String, Content>();
            for (Entry<String, Object> entry : session.getPackageRegistry().entrySet()) {
                String packageURI = entry.getKey();
                Content content = new Content(packageURI);
                map.put(packageURI, content);
                content.setEPackage(entry.getValue());
            }

            for (CDOPackage cdoPackage : session.getPackageManager().getPackages()) {
                String packageURI = cdoPackage.getPackageURI();
                Content content = map.get(packageURI);
                if (content == null) {
                    content = new Content(packageURI);
                    map.put(packageURI, content);
                }

                content.setCDOPackage(cdoPackage);
            }

            ArrayList<Content> list = new ArrayList<Content>(map.values());
            Collections.sort(list);
            return list.toArray(new Content[list.size()]);
        }
    }

    /**
     * @author Eike Stepper
     */
    public static final class Content implements Comparable<Content> {
        private String packageURI;

        private Object ePackage;

        private CDOPackage cdoPackage;

        public Content(String packageURI) {
            this.packageURI = packageURI;
        }

        public String getPackageURI() {
            return packageURI;
        }

        public Object getEPackage() {
            return ePackage;
        }

        public void setEPackage(Object ePackage) {
            this.ePackage = ePackage;
        }

        public CDOPackage getCDOPackage() {
            return cdoPackage;
        }

        public void setCDOPackage(CDOPackage cdoPackage) {
            this.cdoPackage = cdoPackage;
        }

        public int compareTo(Content content) {
            return packageURI.compareTo(content.packageURI);
        }

        @Override
        public boolean equals(Object obj) {
            if (obj == this) {
                return true;
            }

            if (obj instanceof Content) {
                Content that = (Content) obj;
                return ObjectUtil.equals(packageURI, that.packageURI);
            }

            return false;
        }

        @Override
        public int hashCode() {
            return ObjectUtil.hashCode(packageURI);
        }

        @Override
        public String toString() {
            return packageURI;
        }
    }
}