eu.abc4trust.ri.ui.user.view.CredentialAttributesView.java Source code

Java tutorial

Introduction

Here is the source code for eu.abc4trust.ri.ui.user.view.CredentialAttributesView.java

Source

//* Licensed Materials - Property of IBM, Miracle A/S, and            *
//* Alexandra Instituttet A/S                                         *
//* eu.abc4trust.pabce.1.14                                           *
//* (C) Copyright IBM Corp. 2012. All Rights Reserved.                *
//* (C) Copyright Miracle A/S, Denmark. 2012. All Rights Reserved.    *
//* (C) Copyright Alexandra Instituttet A/S, Denmark. 2012. All       *
//* Rights Reserved.                                                  *
//* US Government Users Restricted Rights - Use, duplication or       *
//* disclosure restricted by GSA ADP Schedule Contract with IBM Corp. *
//*                                                                   *
//* This file is licensed under the Apache License, Version 2.0 (the  *
//* "License"); you may not use this file except in compliance with   *
//* the License. You may obtain a copy of the License at:             *
//*   http://www.apache.org/licenses/LICENSE-2.0                      *
//* Unless required by applicable law or agreed to in writing,        *
//* software distributed under the License is distributed on an       *
//* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY            *
//* KIND, either express or implied.  See the License for the         *
//* specific language governing permissions and limitations           *
//* under the License.                                                *
//*/**/****************************************************************

package eu.abc4trust.ri.ui.user.view;

import java.net.MalformedURLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.xml.bind.DatatypeConverter;
import javax.xml.datatype.DatatypeConstants;

import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.graphics.Device;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.part.ViewPart;

import eu.abc4trust.returnTypes.ui.CredentialInUi;
import eu.abc4trust.ri.ui.user.utils.Messages;
import eu.abc4trust.ri.ui.user.utils.ResourceRegistryStore;
import eu.abc4trust.ri.ui.user.utils.UIUtil;
import eu.abc4trust.xml.Attribute;

public class CredentialAttributesView extends ViewPart implements ISelectionListener {

    public static final String ID = "eu.abc4trust.ui.user.view.credentialattributes"; //$NON-NLS-1$
    public static final String DATE_FORMAT = "dd-MM-yyyy";

    private CredentialInUi currentCredential;
    private Set<Image> imagesToDispose = new HashSet<Image>();

    private Composite partControlParent;
    private Composite viewContent;
    private Label defaultLabel;
    private Control focusElement;

    public CredentialAttributesView() {
        super();
        partControlParent = null;
        viewContent = null;
        currentCredential = null;
    }

    public void createPartControl(Composite parent) {
        //setPartName("Credential Attributes");
        partControlParent = parent;
        viewContent = createDefaultContent(partControlParent);

        getSite().getWorkbenchWindow().getSelectionService().addPostSelectionListener(this);
    }

    public void selectionChanged(IWorkbenchPart part, ISelection incoming) {
        if (incoming instanceof IStructuredSelection) {
            IStructuredSelection selection = (IStructuredSelection) incoming;
            if (selection.size() == 1) {
                Object o = selection.getFirstElement();

                if (o instanceof CredentialInUi) {
                    currentCredential = (CredentialInUi) o;
                    updateOutlineContent();
                    return;
                }
            }

            if (selection.size() == 0) {
                currentCredential = null;
                updateOutlineContent();
                return;
            }
        }
    }

    public void setFocus() {
        if (focusElement != null) { // should never be null (as long as the current credential has attributes)
            focusElement.setFocus();
        }
    }

    public void dispose() {
        getSite().getWorkbenchWindow().getSelectionService().removePostSelectionListener(this);
        super.dispose();
        for (Image i : imagesToDispose) {
            i.dispose();
        }
    }

    public void updateOutlineContent() {
        viewContent.dispose();
        if (currentCredential != null) {
            viewContent = createContent(partControlParent);
        } else {
            viewContent = createDefaultContent(partControlParent);
        }
        partControlParent.layout(true, true);
    }

    private Composite createDefaultContent(Composite parent) {
        Composite content = new Composite(parent, SWT.NONE);
        FormLayout formLayout = new FormLayout();
        formLayout.marginHeight = 3;
        formLayout.marginWidth = 3;
        content.setLayout(formLayout);

        defaultLabel = new Label(content, SWT.NONE);
        defaultLabel.setText(Messages.get().CredentialAttributesView_msg_credentialSelectionPrompt);

        FormData formData = new FormData();
        formData.left = new FormAttachment(0);
        formData.right = new FormAttachment(100);
        formData.top = new FormAttachment(0);
        formData.bottom = new FormAttachment(100);
        defaultLabel.setLayoutData(formData);

        focusElement = defaultLabel;
        return content;
    }

    private Composite createContent(Composite parent) {
        int firstColumWidth = 300; // TODO calculate dynamically by the widest column

        ScrolledComposite scrolledContent = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);

        Composite content = new Composite(scrolledContent, SWT.NONE);
        FormLayout formLayout = new FormLayout();
        formLayout.marginHeight = 5;
        formLayout.marginWidth = 5;
        formLayout.spacing = 5;
        content.setLayout(formLayout);

        scrolledContent.setContent(content);
        scrolledContent.setExpandVertical(false);
        scrolledContent.setExpandHorizontal(false);

        Label imageLabel = new Label(content, SWT.NONE);
        Image image = null;
        try {
            // image = ResourceRegistryStore.getThumbnail(currentCredential.desc.getImageReference().toURL(), 200);
            image = ImageDescriptor.createFromURL(currentCredential.desc.getImageReference().toURL()).createImage();
            if (image != null && image.getBounds().width > 150) {
                ImageData scaledImage = image.internalImage.getImageData().scaledTo(150, 150);
                Device device = parent.getDisplay();
                image = new Image(device, scaledImage);
            }
            imagesToDispose.add(image);
            imageLabel.setImage(image);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }

        FormData formData = new FormData(SWT.DEFAULT, SWT.DEFAULT);
        formData.left = new FormAttachment(0);
        formData.top = new FormAttachment(0);
        imageLabel.setLayoutData(formData);
        Text typeLabel = new Text(content, SWT.SINGLE | SWT.READ_ONLY);
        typeLabel.setText(Messages.get().CredentialAttributesView_credentialType + ":"); //$NON-NLS-1$
        Text typeText = new Text(content, SWT.SINGLE | SWT.READ_ONLY);
        String credSpecUID = currentCredential.desc.getCredentialSpecificationUID().toString();
        String humanReadableCredSpecName = UIUtil
                .getHumanReadable(currentCredential.spec.spec.getFriendlyCredentialName());
        typeText.setText(humanReadableCredSpecName + " (" + credSpecUID + ")");

        formData = new FormData(firstColumWidth, SWT.DEFAULT); // width: 180
        formData.left = new FormAttachment(0);
        formData.top = new FormAttachment(typeText, 0, SWT.CENTER);
        typeLabel.setLayoutData(formData);
        formData = new FormData(SWT.DEFAULT, SWT.DEFAULT);
        formData.left = new FormAttachment(typeLabel);
        formData.top = new FormAttachment(imageLabel);
        typeText.setLayoutData(formData);
        typeText.setBackground(typeLabel.getBackground());

        Text issuerLabel = new Text(content, SWT.SINGLE | SWT.READ_ONLY);
        issuerLabel.setText(Messages.get().CredentialAttributesView_issuer + ":"); //$NON-NLS-1$
        Text issuerText = new Text(content, SWT.SINGLE | SWT.READ_ONLY);
        String issuerUID = currentCredential.desc.getIssuerParametersUID().toString();
        String humanReadableIssuerName = UIUtil.getHumanReadable(currentCredential.issuer.description);
        issuerText.setText(humanReadableIssuerName + " (" + issuerUID + ")");
        issuerText.setBackground(issuerLabel.getBackground());

        formData = new FormData(firstColumWidth, SWT.DEFAULT); // width: 180
        formData.left = new FormAttachment(0);
        formData.top = new FormAttachment(issuerText, 0, SWT.CENTER);
        issuerLabel.setLayoutData(formData);
        formData = new FormData(SWT.DEFAULT, SWT.DEFAULT);
        formData.left = new FormAttachment(issuerLabel);
        formData.top = new FormAttachment(typeText);
        issuerText.setLayoutData(formData);

        Text revocationLabel = new Text(content, SWT.SINGLE | SWT.READ_ONLY);
        revocationLabel.setText(Messages.get().CredentialAttributesView_revokedByIssuer + ":"); //$NON-NLS-1$
        Label revocationCheckboxOrText = new Label(content, SWT.NONE);
        if (currentCredential.spec.spec.isRevocable()) {
            // Show checkbox if the credential is revocable
            final boolean state = currentCredential.desc.isRevokedByIssuer();
            revocationCheckboxOrText
                    .setImage(ResourceRegistryStore.getImage(state ? ResourceRegistryStore.IMG_CHECKBOX_SELECTED
                            : ResourceRegistryStore.IMG_CHECKBOX_UNSELECTED)); // This is a workaround as disabled checkboxes are very light grey and almost invisible.
        } else {
            // Inform the user that the credential is not revocable
            revocationCheckboxOrText.setText(Messages.get().CredentialAttributesView_msg_notRevocable);
        }
        formData = new FormData(firstColumWidth, SWT.DEFAULT); // width: 180
        formData.left = new FormAttachment(0);
        formData.top = new FormAttachment(revocationCheckboxOrText, 0, SWT.CENTER);
        revocationLabel.setLayoutData(formData);
        formData = new FormData(SWT.DEFAULT, SWT.DEFAULT);
        formData.left = new FormAttachment(revocationLabel, 9);
        formData.top = new FormAttachment(issuerText);
        revocationCheckboxOrText.setLayoutData(formData);

        // Create a label and appropriate further controls (text field, date element,
        // checkbox, etc.) for every attribute of the current credential
        List<Control> valueControls = new ArrayList<Control>();
        for (Attribute attribute : currentCredential.desc.getAttribute()) {
            Control valueControl = null; // Create the control already now for layouting the label correctly

            //////////////////////////////////////////////
            // Label showing the attribute name
            String attributeType = attribute.getAttributeDescription().getType().toString();
            String fallback;
            if (attributeType.equals("http://abc4trust.eu/wp2/abcschemav1.0/revocationhandle")) { //$NON-NLS-1$
                fallback = Messages.get().CredentialAttributesView_revocationHandle;
            } else {
                fallback = attributeType;
            }
            Text label = new Text(content, SWT.SINGLE | SWT.READ_ONLY);
            label.setText(UIUtil.getHumanReadable(attribute.getAttributeDescription().getFriendlyAttributeName(),
                    fallback) + ":"); //$NON-NLS-1$

            //////////////////////////////////////////////
            // Control (text field, date element, checkbox, etc.) showing the attribute value
            // TODO: properly support data types with different control types         
            //         URI dataType = attribute.getAttributeDescription().getDataType();
            //         if (dataType.equals(Date.class)) {
            //            // Attribute is a date
            //            Date d = (Date) currentCredential.getAttributeValue(attributeName);
            //            Calendar c = new GregorianCalendar();
            //            try {
            //               Date origin = Translator.DATE_FORMAT.parse(Constants.DATE_ORIGIN);
            //               c.setTime(origin);
            //               c.add(Calendar.YEAR, 1);
            //            } catch (ParseException e) {
            //               e.printStackTrace();
            //            }
            //            
            //            valueControl = new Text(content, SWT.SINGLE | SWT.READ_ONLY);
            //            if(c.getTime().after(d)) {
            //               ((Text)valueControl).setText("None");
            //            } else {
            //               SimpleDateFormat df = new SimpleDateFormat("EEEE, d MMMM yyyy 'at' HH:mm z");
            //               ((Text)valueControl).setText(df.format(d));
            //            }
            //            
            //            valueControl.setBackground(label.getBackground());
            //            
            //         } else if (dataType.equals(Boolean.class)) {
            //            // Attribute is a boolean value
            //            final boolean state = ((Boolean)currentCredential.getAttributeValue(attributeName)).booleanValue();
            //            valueControl = new Button(content, SWT.CHECK);
            //            valueControl.setBackground(label.getBackground());
            //            ((Button)valueControl).setSelection(state);
            //            ((Button)valueControl).addSelectionListener(new SelectionAdapter() {
            //               @Override
            //               // This is a workaround as "valueControl.setEnabled(false)" results
            //               // in a very light grey checkbox that is almost invisible.
            //               public void widgetSelected(SelectionEvent e) {
            //                  // e.doit = false; // does not work...
            //                  Button checkBox = ((Button) e.widget);
            //                  checkBox.setSelection(state);
            //               }
            //            });
            //            
            //         } else {
            // Attribute value is represented as text.
            valueControl = new Text(content, SWT.SINGLE | SWT.READ_ONLY);

            String textValue;
            String attributeDataType = attribute.getAttributeDescription().getDataType().toString().substring(3);
            if (attributeDataType.equals(DatatypeConstants.DATE.getLocalPart())) {
                Calendar c = DatatypeConverter.parseDate(attribute.getAttributeValue().toString());
                textValue = new SimpleDateFormat(DATE_FORMAT).format(c.getTime());
            } else {
                textValue = attribute.getAttributeValue().toString();
            }

            ((Text) valueControl).setText(textValue);
            valueControl.setBackground(label.getBackground());
            //         }

            //////////////////////////////////////////////
            // Lay out the controls
            formData = new FormData(firstColumWidth, SWT.DEFAULT); // width: 180
            formData.left = new FormAttachment(0);
            formData.top = new FormAttachment(valueControl, 0, SWT.CENTER);
            label.setLayoutData(formData);

            formData = new FormData();
            formData.left = new FormAttachment(label);
            if (valueControls.isEmpty()) {
                formData.top = new FormAttachment(revocationLabel);
            } else {
                // Attach the top of the valueControl to the bottom of the one above
                formData.top = new FormAttachment(valueControls.get(valueControls.size() - 1));
            }
            valueControl.setLayoutData(formData);

            // Remember the control to lay out subsequent ones right below it
            valueControls.add(valueControl);
        }

        ///////////////////////////////////////////////////////////////////////
        // Make the scrollbars work
        Point size = scrolledContent.getContent().computeSize(SWT.DEFAULT, SWT.DEFAULT);
        scrolledContent.getContent().setSize(size);
        scrolledContent.setMinSize(size);
        //scrolledContent.layout(true, true);

        focusElement = typeText;
        return scrolledContent;
    }
}