    001/*****************************************************************************
    002 * Copyright by The HDF Group.                                               *
    003 * Copyright by the Board of Trustees of the University of Illinois.         *
    004 * All rights reserved.                                                      *
    005 *                                                                           *
    006 * This file is part of the HDF Java Products distribution.                  *
    007 * The full copyright notice, including terms governing use, modification,   *
    008 * and redistribution, is contained in the files COPYING and Copyright.html. *
    009 * COPYING can be found at the root of the source code distribution tree.    *
    010 * Or, see https://support.hdfgroup.org/products/licenses.html               *
    011 * If you do not have access to either file, you may request a copy from     *
    012 * help@hdfgroup.org.                                                        *
    013 ****************************************************************************/
    014
    015package hdf.view.MetaDataView;
    016
    017import org.eclipse.swt.SWT;
    018import org.eclipse.swt.events.TraverseEvent;
    019import org.eclipse.swt.events.TraverseListener;
    020import org.eclipse.swt.layout.GridData;
    021import org.eclipse.swt.layout.GridLayout;
    022import org.eclipse.swt.widgets.Composite;
    023import org.eclipse.swt.widgets.Event;
    024import org.eclipse.swt.widgets.Label;
    025import org.eclipse.swt.widgets.Listener;
    026import org.eclipse.swt.widgets.Text;
    027
    028import hdf.object.FileFormat;
    029import hdf.object.Group;
    030import hdf.object.HObject;
    031import hdf.object.h5.H5Link;
    032import hdf.view.Tools;
    033import hdf.view.DataView.DataViewManager;
    034
    035public class DefaultLinkMetaDataView extends DefaultBaseMetaDataView implements MetaDataView {
    036
    037    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(DefaultLinkMetaDataView.class);
    038
    039    public DefaultLinkMetaDataView(Composite parentComposite, DataViewManager viewer, HObject theObj) {
    040        super(parentComposite, viewer, theObj);
    041    }
    042
    043    @Override
    044    protected void addObjectSpecificContent() {
    045        /* For HDF5 links, add a box to allow changing of the link target */
    046        if (dataObject.getLinkTargetObjName() != null) {
    047            org.eclipse.swt.widgets.Group linkTargetGroup = new org.eclipse.swt.widgets.Group(generalObjectInfoPane, SWT.NONE);
    048            linkTargetGroup.setFont(curFont);
    049            linkTargetGroup.setText("Link Target Info");
    050            linkTargetGroup.setLayout(new GridLayout(2, false));
    051
    052            /*
    053             * If this object is purely a link, meaning a soft/external/other link that does
    054             * not point to an existing object, allow the Link Target Info Group to take up
    055             * all the available vertical space in the MetaDataView.
    056             *
    057             * Otherwise, if this link points to an existing object, it will not be an
    058             * instanceof H5Link. Rather, it will be an instanceof Dataset, instanceof
    059             * Group, etc. and will contain the information necessary to determine that the
    060             * object is really a link.
    061             *
    062             * In this case, we don't allow the Link Target Info Group to take up all the
    063             * available vertical space, in order to allow other object Metadata information
    064             * to be comfortable displayed in the MetaDataView.
    065             */
    066            if (dataObject instanceof H5Link)
    067                linkTargetGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
    068            else
    069                linkTargetGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
    070
    071            Label label = new Label(linkTargetGroup, SWT.LEFT);
    072            label.setFont(curFont);
    073            label.setText("Link To Target: ");
    074
    075            final Text linkTarget = new Text(linkTargetGroup, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL);
    076            linkTarget.setFont(curFont);
    077            linkTarget.setText(dataObject.getLinkTargetObjName());
    078            linkTarget.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
    079            linkTarget.addTraverseListener(new TraverseListener() {
    080                @Override
    081                public void keyTraversed(TraverseEvent e) {
    082                    if (e.detail == SWT.TRAVERSE_RETURN) {
    083                        changeLinkTarget(linkTarget.getText());
    084                    }
    085                }
    086            });
    087            linkTarget.addListener(SWT.FocusOut, new Listener() {
    088                @Override
    089                public void handleEvent(Event arg0) {
    090                    changeLinkTarget(linkTarget.getText());
    091                }
    092            });
    093        }
    094    }
    095
    096    private void changeLinkTarget(String linkTargetName) {
    097        Group pgroup = null;
    098        try {
    099            pgroup = (Group) dataObject.getFileFormat().get(dataObject.getPath());
    100        }
    101        catch (Exception ex) {
    102            log.debug("addObjectSpecificContent(): parent group get failure:", ex);
    103        }
    104
    105        if (pgroup == null) {
    106            log.debug("addObjectSpecificContent(): parent group is null");
    107            display.beep();
    108            Tools.showError(display.getShells()[0], "Select", "Parent group is null.\nLink target change failed.");
    109            return;
    110        }
    111
    112        if (linkTargetName != null)
    113            linkTargetName = linkTargetName.trim();
    114
    115        int linkType = Group.LINK_TYPE_SOFT;
    116        if (dataObject.getLinkTargetObjName().contains(FileFormat.FILE_OBJ_SEP))
    117            linkType = Group.LINK_TYPE_EXTERNAL;
    118        else if ((linkTargetName != null) && (linkTargetName.equals("/"))) { // do not allow to link to the root
    119            display.beep();
    120            Tools.showError(display.getShells()[0], "Select", "Link to root not allowed.\nLink target change failed.");
    121            return;
    122        }
    123
    124        // no change
    125        if ((linkTargetName != null) && (linkTargetName.equals(dataObject.getLinkTargetObjName())))
    126            return;
    127
    128        // invalid name
    129        if (linkTargetName == null || linkTargetName.length() < 1) return;
    130
    131        try {
    132            dataObject.getFileFormat().createLink(pgroup, dataObject.getName(), linkTargetName, linkType);
    133            dataObject.setLinkTargetObjName(linkTargetName);
    134        }
    135        catch (Exception ex) {
    136            log.debug("addObjectSpecificContent(): createLink() failure:", ex);
    137            display.beep();
    138            Tools.showError(display.getShells()[0], "Select", "Link target change failed." + ex.getMessage());
    139            return;
    140        }
    141
    142        Tools.showInformation(display.getShells()[0], "Link target changed.", "Reload file to display changes.");
    143    }
    144
    145}