com.siteview.mde.internal.ui.editor.schema.SchemaIdentifierAttributeDetails.java Source code

Java tutorial

Introduction

Here is the source code for com.siteview.mde.internal.ui.editor.schema.SchemaIdentifierAttributeDetails.java

Source

/*******************************************************************************
 * Copyright (c) 2008 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 API and implementation
 *******************************************************************************/
package com.siteview.mde.internal.ui.editor.schema;

import java.util.Vector;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.window.Window;
import com.siteview.mde.internal.core.ischema.*;
import com.siteview.mde.internal.core.schema.*;
import com.siteview.mde.internal.core.util.PDESchemaHelper;
import com.siteview.mde.internal.ui.MDEPlugin;
import com.siteview.mde.internal.ui.MDEUIMessages;
import com.siteview.mde.internal.ui.editor.FormEntryAdapter;
import com.siteview.mde.internal.ui.editor.FormLayoutFactory;
import com.siteview.mde.internal.ui.parts.FormEntry;
import org.eclipse.swt.SWT;
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.*;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.forms.IFormColors;
import org.eclipse.ui.forms.widgets.FormToolkit;

public class SchemaIdentifierAttributeDetails extends SchemaAttributeDetails {

    private FormEntry fReferenceEntry;
    private TableViewer fRestrictionsTable;
    private Button fAddRestriction;
    private Button fRemoveRestriction;

    public SchemaIdentifierAttributeDetails(ElementSection section) {
        super(section);
    }

    // TODO we should reuse our attribute tables when possible
    protected void createTypeDetails(Composite parent, FormToolkit toolkit) {
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.heightHint = 40;
        gd.horizontalIndent = FormLayoutFactory.CONTROL_HORIZONTAL_INDENT;
        fReferenceEntry = new FormEntry(parent, toolkit, MDEUIMessages.SchemaStringAttributeDetails_reference,
                MDEUIMessages.SchemaAttributeDetails_browseButton, false, 11);

        Color foreground = toolkit.getColors().getColor(IFormColors.TITLE);
        Label label = toolkit.createLabel(parent,
                MDEUIMessages.SchemaIdentifierAttributeDetails_additionalRestrictions);
        label.setForeground(foreground);
        gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
        gd.horizontalIndent = 11;
        gd.verticalIndent = 2;
        label.setLayoutData(gd);

        // create restrictions
        Composite tableComp = toolkit.createComposite(parent);
        GridLayout layout = new GridLayout();
        layout.marginHeight = layout.marginWidth = 0;
        tableComp.setLayout(layout);
        tableComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        Table table = toolkit.createTable(tableComp, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL);
        gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.heightHint = 40;
        gd.horizontalIndent = FormLayoutFactory.CONTROL_HORIZONTAL_INDENT;
        table.setLayoutData(gd);
        fRestrictionsTable = new TableViewer(table);
        fRestrictionsTable.setContentProvider(new SchemaAttributeContentProvider());
        fRestrictionsTable.setLabelProvider(new LabelProvider());

        Composite resButtonComp = toolkit.createComposite(parent);
        layout = new GridLayout();
        layout.marginHeight = layout.marginWidth = 0;
        resButtonComp.setLayout(layout);
        resButtonComp.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
        fAddRestriction = toolkit.createButton(resButtonComp, MDEUIMessages.SchemaAttributeDetails_addRestButton,
                SWT.NONE);
        fRemoveRestriction = toolkit.createButton(resButtonComp,
                MDEUIMessages.SchemaAttributeDetails_removeRestButton, SWT.NONE);
        fAddRestriction.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        fRemoveRestriction.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    }

    public void updateFields(ISchemaObject object) {
        if (!(object instanceof SchemaAttribute))
            return;
        super.updateFields(object);

        String basedOn = getAttribute().getBasedOn();
        if ((basedOn != null) && (basedOn.length() > 0)) {
            fReferenceEntry.setValue(basedOn, true);
        } else {
            fReferenceEntry.setValue("", true); //$NON-NLS-1$
        }

        boolean editable = isEditableElement();
        fReferenceEntry.setEditable(editable);

        fRestrictionsTable.setInput(new Object());
        fRestrictionsTable.getControl().setEnabled(editable);
        fAddRestriction.setEnabled(editable);
        fRemoveRestriction.setEnabled(!fRestrictionsTable.getSelection().isEmpty() && editable);
    }

    public void hookListeners() {
        super.hookListeners();
        IActionBars actionBars = getPage().getMDEEditor().getEditorSite().getActionBars();
        fReferenceEntry.setFormEntryListener(new FormEntryAdapter(this, actionBars) {
            public void textValueChanged(FormEntry entry) {
                if (blockListeners())
                    return;
                getAttribute().setBasedOn(fReferenceEntry.getValue());
            }

            public void browseButtonSelected(FormEntry entry) {
                if (blockListeners())
                    return;
                doOpenSelectionDialog(fReferenceEntry);
            }
        });
        fAddRestriction.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                if (blockListeners())
                    return;
                NewRestrictionDialog dialog = new NewRestrictionDialog(getPage().getSite().getShell());
                if (dialog.open() != Window.OK)
                    return;
                String text = dialog.getNewRestriction();
                if (text != null && text.length() > 0) {
                    ISchemaSimpleType type = getAttribute().getType();
                    ChoiceRestriction res = (ChoiceRestriction) type.getRestriction();
                    Vector vres = new Vector();
                    if (res != null) {
                        Object[] currRes = res.getChildren();
                        for (int i = 0; i < currRes.length; i++) {
                            vres.add(currRes[i]);
                        }
                    }
                    vres.add(new SchemaEnumeration(getAttribute().getSchema(), text));
                    if (res == null)
                        res = new ChoiceRestriction(getAttribute().getSchema());
                    res.setChildren(vres);
                    if (type instanceof SchemaSimpleType)
                        ((SchemaSimpleType) type).setRestriction(res);
                    fRestrictionsTable.refresh();
                }
            }
        });
        fRemoveRestriction.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                if (blockListeners())
                    return;
                ISelection selection = fRestrictionsTable.getSelection();
                if (selection.isEmpty())
                    return;
                if (!(selection instanceof IStructuredSelection))
                    return;
                IStructuredSelection sselection = (IStructuredSelection) selection;
                Object[] aselection = sselection.toArray();
                ISchemaSimpleType type = getAttribute().getType();
                ChoiceRestriction res = (ChoiceRestriction) type.getRestriction();
                Vector vres = new Vector();
                if (res != null) {
                    Object[] currRes = res.getChildren();
                    for (int i = 0; i < currRes.length; i++) {
                        boolean stays = true;
                        for (int j = 0; j < aselection.length; j++) {
                            if (currRes[i].equals(aselection[j]))
                                stays = false;
                        }
                        if (stays)
                            vres.add(currRes[i]);
                    }
                    res.setChildren(vres);
                    if (type instanceof SchemaSimpleType) {
                        if (vres.size() == 0)
                            ((SchemaSimpleType) type).setRestriction(null);
                        else
                            ((SchemaSimpleType) type).setRestriction(res);
                    }
                    fRestrictionsTable.refresh();
                }
            }
        });
        fRestrictionsTable.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                if (blockListeners())
                    return;
                fRemoveRestriction
                        .setEnabled(getAttribute().getSchema().isEditable() && !event.getSelection().isEmpty());
            }
        });
    }

    private void doOpenSelectionDialog(FormEntry entry) {
        FilteredSchemaAttributeSelectionDialog dialog = new FilteredSchemaAttributeSelectionDialog(
                MDEPlugin.getActiveWorkbenchShell());
        int status = dialog.open();
        if (status == Window.OK) {
            Object[] result = dialog.getResult();
            Object object = result[0];
            if (object instanceof ISchemaAttribute) {
                ISchemaAttribute attribute = (ISchemaAttribute) object;
                String id = PDESchemaHelper.getReferenceIdentifier(attribute);
                entry.setValue(id);
                entry.commit();
            }
        }
    }

}