blob: 8bb009b729a38bbea4d01c8f38822c200e7c195e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 2016 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Mathieu Denis <mathieu.denis@polymtl.ca> - Initial API and implementation
*******************************************************************************/
package org.eclipse.tracecompass.tmf.ui.widgets.tabsview;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.tracecompass.tmf.ui.viewers.ITmfViewer;
/**
* Allows the user to create multiple tabs which makes it look like folders. It
* simplifies the management of the viewer contained in each tab.
*
* The indexing of the viewers is based on their name.
*
* @author Mathieu Denis
*/
public class TmfViewerFolder extends Composite {
/**
* The list of viewers in the folder
*/
private final HashMap<String, ITmfViewer> fViewers;
/**
* The parent folder that contains all viewers
*/
private CTabFolder fFolder;
/**
* Constructor with empty style
*
* @param parent
* The parent composite
*/
public TmfViewerFolder(Composite parent) {
this(parent, SWT.NONE);
}
/**
* Constructor
*
* @param parent
* The parent composite
* @param style
* The style of the view that will be created
*/
public TmfViewerFolder(Composite parent, int style) {
super(parent, style);
setLayout(new FillLayout());
fViewers = new LinkedHashMap<>();
initFolder();
}
/**
* Disposes of all the viewers contained in the folder and restart to a
* clean state.
*/
public void clear() {
for (ITmfViewer viewer : fViewers.values()) {
viewer.dispose();
}
fViewers.clear();
fFolder.dispose();
initFolder();
}
/**
* Create a new tab that will hold the viewer content. The viewer name will
* be used as the name for the tab. The viewer ID must be unique and can be
* used to retrieve the viewer from the folder.
*
* The parent of the viewer control must be the folder returned by
* {@link #getParentFolder()}
*
* @param viewer
* The viewer to put in the new tab
* @param viewerID
* The ID that will be assigned to this viewer for easy
* retrieving
* @param style
* The style of the widget to build
* @return true on success, false otherwise
*/
public boolean addTab(ITmfViewer viewer, String viewerID, int style) {
if (fFolder == null
|| viewer.getControl().getParent() != fFolder
|| fViewers.containsKey(viewerID)) {
return false;
}
CTabItem item = new CTabItem(fFolder, style);
item.setText(viewer.getName());
item.setControl(viewer.getControl());
// Register the viewer in the map to dispose it at closing time
fViewers.put(viewerID, viewer);
return true;
}
/**
* Gets the folder that will be use as the parent of tabs that will hold the
* viewer.
*
* In order to be able to add new tabs in this view, the parent of the
* viewer control has to be this composite.
*
* @return the folder composite to use as the parent for the viewer control
* to create.
*/
public Composite getParentFolder() {
return fFolder;
}
/**
* Gets a viewer based on his name.
*
* @param viewerName
* The name of the viewer to find in the folder
* @return The viewer which name is viewerName, or null if there is no such
* viewer
*/
public ITmfViewer getViewer(String viewerName) {
return fViewers.get(viewerName);
}
/**
* Gets the current shown viewer
*
* @return the current shown viewer
*
* @since 4.3
*/
public @Nullable ITmfViewer getViewer() {
int index = fFolder.getSelectionIndex();
fViewers.entrySet();
int i = 0;
for (Entry<String, ITmfViewer> entry : fViewers.entrySet()) {
if (i == index) {
return entry.getValue();
}
i++;
}
return null;
}
/**
* Gets the viewers list contained in the folder view. The list can return
* the viewers in any order. It is not to be assumed that the viewers are
* returned in the same order as they were inserted.
*
* @return a collection of viewers contained in this view.
*/
public Collection<ITmfViewer> getViewers() {
return fViewers.values();
}
/**
* Selects the tab at the specified index from the insertion order
*
* @param index
* The index of the tab to be selected
* @throws SWTException
* <ul>
* <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed
* </li>
* <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
* thread that created the receiver</li>
* </ul>
*/
public void setSelection(int index) throws SWTException {
fFolder.setSelection(index);
}
/**
* Initializes the folder or put it a back to a clean state.
*/
private void initFolder() {
if (fFolder != null) {
fFolder.dispose();
}
fFolder = new CTabFolder(this, SWT.LEFT | SWT.BORDER);
fFolder.setSimple(false);
}
}