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 java.util.List;
018
019import org.eclipse.swt.SWT;
020import org.eclipse.swt.custom.ScrolledComposite;
021import org.eclipse.swt.layout.GridData;
022import org.eclipse.swt.layout.GridLayout;
023import org.eclipse.swt.widgets.Composite;
024import org.eclipse.swt.widgets.Label;
025import org.eclipse.swt.widgets.Table;
026import org.eclipse.swt.widgets.TableColumn;
027import org.eclipse.swt.widgets.TableItem;
028import org.eclipse.swt.widgets.Text;
029
030import hdf.hdf5lib.H5;
031import hdf.hdf5lib.HDF5Constants;
032import hdf.object.Dataset;
033import hdf.object.Datatype;
034import hdf.object.Group;
035import hdf.object.HObject;
036import hdf.object.h5.H5Link;
037import hdf.object.nc2.NC2Group;
038import hdf.view.ViewProperties;
039import hdf.view.DataView.DataViewManager;
040
041public class DefaultGroupMetaDataView extends DefaultLinkMetaDataView implements MetaDataView {
042
043    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(DefaultGroupMetaDataView.class);
044
045    public DefaultGroupMetaDataView(Composite parentComposite, DataViewManager viewer, HObject theObj) {
046        super(parentComposite, viewer, theObj);
047    }
048
049    @Override
050    protected void addObjectSpecificContent() {
051        super.addObjectSpecificContent();
052
053        Group g = (Group) dataObject;
054        List<?> mlist = g.getMemberList();
055        int n = mlist.size();
056
057        log.trace("addObjectSpecificContent(): group object extra info mlist size = {}", n);
058
059        Label label;
060
061        if (isH5) {
062            StringBuilder objCreationStr = new StringBuilder("Creation Order NOT Tracked");
063
064            long ocplID = -1;
065            try {
066                if (g.isRoot()) {
067                    ocplID = H5.H5Fget_create_plist(g.getFID());
068                }
069                else {
070                    long oid = -1;
071                    try {
072                        oid = g.open();
073                        if (oid >= 0) {
074                            ocplID = H5.H5Gget_create_plist(oid);
075                        }
076                    }
077                    finally {
078                        g.close(oid);
079                    }
080                }
081                if (ocplID >= 0) {
082                    int creationOrder = H5.H5Pget_link_creation_order(ocplID);
083                    log.trace("createGeneralObjectInfoPane(): creationOrder={}", creationOrder);
084                    if ((creationOrder & HDF5Constants.H5P_CRT_ORDER_TRACKED) > 0) {
085                        objCreationStr.setLength(0);
086                        objCreationStr.append("Creation Order Tracked");
087                        if ((creationOrder & HDF5Constants.H5P_CRT_ORDER_INDEXED) > 0)
088                            objCreationStr.append(" and Indexed");
089                    }
090                }
091            }
092            finally {
093                H5.H5Pclose(ocplID);
094            }
095
096            /* Creation order section */
097            label = new Label(generalObjectInfoPane, SWT.LEFT);
098            label.setFont(curFont);
099            label.setText("Link Creation Order: ");
100
101            Text text = new Text(generalObjectInfoPane, SWT.SINGLE | SWT.BORDER);
102            text.setEditable(false);
103            text.setFont(curFont);
104            text.setText(objCreationStr.toString());
105            text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
106        }
107        if (isN3) {
108            StringBuilder objDimensionStr = new StringBuilder("No Dimensions");
109            int[] listDimSelector = { 0, 0, 1};
110            try {
111                List ncDimensions = ((NC2Group)g).getMetadata(listDimSelector);
112                if (ncDimensions != null) {
113                    int listCnt = ncDimensions.size();
114                    log.trace("createGeneralObjectInfoPane(): ncDimensions={}", listCnt);
115                    if (listCnt > 0)
116                        objDimensionStr.setLength(0);
117                    for (int i = 0; i < listCnt; i++) {
118                        objDimensionStr.append(((NC2Group)g).netcdfDimensionString(i));
119                        if (i < listCnt - 1)
120                            objDimensionStr.append("\n");
121                    }
122                }
123            }
124            catch (Exception e) {
125                log.debug("Error retrieving dimensions of object '" + dataObject.getName() + "':", e);
126            }
127
128            /* Dimensions section */
129            label = new Label(generalObjectInfoPane, SWT.LEFT);
130            label.setFont(curFont);
131            label.setText("Dimensions: ");
132
133            ScrolledComposite dimensionScroller = new ScrolledComposite(generalObjectInfoPane, SWT.V_SCROLL | SWT.BORDER);
134            dimensionScroller.setExpandHorizontal(true);
135            dimensionScroller.setExpandVertical(true);
136            dimensionScroller.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 5, 1));
137
138            Text text = new Text(dimensionScroller, SWT.MULTI | SWT.BORDER);
139            text.setEditable(false);
140            text.setFont(curFont);
141            text.setText(objDimensionStr.toString());
142            text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
143            dimensionScroller.setContent(text);
144
145            StringBuilder objEnumTypedefStr = new StringBuilder("No Enums");
146            int[] listEnumSelector = { 0, 0, 0, 1};
147            try {
148                List ncEnums = ((NC2Group)g).getMetadata(listEnumSelector);
149                if (ncEnums != null) {
150                    int listCnt = ncEnums.size();
151                    log.trace("createGeneralObjectInfoPane(): ncEnums={}", listCnt);
152                    if (listCnt > 0)
153                        objEnumTypedefStr.setLength(0);
154                    for (int i = 0; i < listCnt; i++) {
155                        objEnumTypedefStr.append(((NC2Group)g).netcdfTypedefString(i));
156                        if (i < listCnt - 1)
157                            objEnumTypedefStr.append("\n");
158                    }
159                }
160            }
161            catch (Exception e) {
162                log.debug("Error retrieving enums of object '" + dataObject.getName() + "':", e);
163            }
164
165            /* Dimensions section */
166            label = new Label(generalObjectInfoPane, SWT.LEFT);
167            label.setFont(curFont);
168            label.setText("Enums: ");
169
170            ScrolledComposite enumScroller = new ScrolledComposite(generalObjectInfoPane, SWT.V_SCROLL | SWT.BORDER);
171            enumScroller.setExpandHorizontal(true);
172            enumScroller.setExpandVertical(true);
173            enumScroller.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 5, 1));
174
175            text = new Text(enumScroller, SWT.MULTI | SWT.BORDER);
176            text.setEditable(false);
177            text.setFont(curFont);
178            text.setText(objEnumTypedefStr.toString());
179            text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
180            enumScroller.setContent(text);
181        }
182        org.eclipse.swt.widgets.Group groupInfoGroup = new org.eclipse.swt.widgets.Group(generalObjectInfoPane, SWT.NONE);
183        groupInfoGroup.setFont(curFont);
184        groupInfoGroup.setText("Group Members");
185        groupInfoGroup.setLayout(new GridLayout(1, true));
186        groupInfoGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
187
188        if (g.getNumberOfMembersInFile() < ViewProperties.getMaxMembers()) {
189            label = new Label(groupInfoGroup, SWT.RIGHT);
190            label.setFont(curFont);
191            label.setText("Number of members: " + n);
192        }
193        else {
194            label = new Label(groupInfoGroup, SWT.RIGHT);
195            label.setFont(curFont);
196            label.setText("Number of members: " + n + " (in memory)," + "" + g.getNumberOfMembersInFile() + " (in file)");
197        }
198
199        String[] columnNames = { "Name", "Type" };
200
201        Table memberTable = new Table(groupInfoGroup, SWT.BORDER);
202        memberTable.setLinesVisible(true);
203        memberTable.setHeaderVisible(true);
204        memberTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
205        memberTable.setFont(curFont);
206
207        for (int i = 0; i < columnNames.length; i++) {
208            TableColumn column = new TableColumn(memberTable, SWT.NONE);
209            column.setText(columnNames[i]);
210            column.setMoveable(false);
211        }
212
213        if (mlist != null && n > 0) {
214            String rowData[][] = new String[n][2];
215            for (int i = 0; i < n; i++) {
216                HObject theObj = (HObject) mlist.get(i);
217                rowData[i][0] = theObj.getName();
218                if (theObj instanceof Group) {
219                    rowData[i][1] = "Group";
220                }
221                else if (theObj instanceof Dataset) {
222                    rowData[i][1] = "Dataset";
223                }
224                else if (theObj instanceof Datatype) {
225                    rowData[i][1] = "Datatype";
226                }
227                else if (theObj instanceof H5Link) {
228                    rowData[i][1] = "Link";
229                }
230                else
231                    rowData[i][1] = "Unknown";
232            }
233
234            for (int i = 0; i < rowData.length; i++) {
235                TableItem item = new TableItem(memberTable, SWT.NONE);
236                item.setFont(curFont);
237                item.setText(0, rowData[i][0]);
238                item.setText(1, rowData[i][1]);
239            }
240
241            // set cell height for large fonts
242            // int cellRowHeight = Math.max(16,
243            // table.getFontMetrics(table.getFont()).getHeight());
244            // table.setRowHeight(cellRowHeight);
245        }
246
247        for (int i = 0; i < columnNames.length; i++) {
248            memberTable.getColumn(i).pack();
249        }
250    }
251
252}