/******************************************************************************* * Copyright (c) 2012-2015 INRIA. * 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: * Generoso Pagano - initial API and implementation ******************************************************************************/ package fr.inria.soctrace.framesoc.ui.dialogs; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.List; import fr.inria.soctrace.lib.model.Tool; import fr.inria.soctrace.lib.utils.IdManager; import fr.inria.soctrace.lib.utils.IdManager.Direction; /** * Dialog to manage Framesoc tools: * <ul> * <li>Browse, Add, Edit, Remove non plugin tool. * <li>Browse plugin tools. * </ul> * * @author "Generoso Pagano <generoso.pagano@inria.fr>" */ public class ManageToolsComposite extends Composite { /** * Tools map, always synchronized with the viewer. */ private Map<Integer, Tool> toolsMap; /** * Installed tool names. Names are unique for tools. */ private Set<String> oldToolNames; /** * The viewer */ private ListViewer listViewer; /** * For added tools we use temporary negative IDs. Actual ID are assigned by * the Dialog user. */ private IdManager newToolIdManager; private final int TMP_START_ID = -1000; /** * Edit button. Disabled when plugin tools are selected. */ private Button btnEdit; private Button btnRemove; /** * Constructor * * @param parentShell * shell * @param tools * tools map: it will be copied */ public ManageToolsComposite(Composite parentComposite, Map<Integer, Tool> tools) { super(parentComposite, SWT.NONE); oldToolNames = new HashSet<String>(); toolsMap = new HashMap<Integer, Tool>(); Iterator<Entry<Integer, Tool>> iterator = tools.entrySet().iterator(); while (iterator.hasNext()) { Entry<Integer, Tool> pair = iterator.next(); toolsMap.put(pair.getKey(), pair.getValue()); oldToolNames.add(pair.getValue().getName()); } newToolIdManager = new IdManager(); newToolIdManager.setNextId(TMP_START_ID); newToolIdManager.setDirection(Direction.DESCENDING); } public void createPartControl() { this.setLayout(new GridLayout(2, false)); this.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); // list listViewer = new ListViewer(this, SWT.BORDER | SWT.V_SCROLL | SWT.MULTI); listViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { IStructuredSelection selection = (IStructuredSelection) listViewer .getSelection(); if (selection.size() > 1) { btnEdit.setEnabled(false); btnRemove.setEnabled(false); return; } Tool tool = (Tool) selection.getFirstElement(); if (tool == null) return; if (tool.isPlugin()) { btnEdit.setEnabled(false); btnRemove.setEnabled(false); } else { btnEdit.setEnabled(true); btnRemove.setEnabled(true); } } }); listViewer.setContentProvider(new ArrayContentProvider()); listViewer.setInput(toolsMap.values()); listViewer.setSorter(new ViewerSorter()); listViewer.setLabelProvider(new LabelProvider() { @Override public String getText(Object element) { Tool t = (Tool) element; return (oldToolNames.contains(t.getName()) ? "" : "*") + t.getName(); } // TODO: different icon for plugins and bin }); List list = listViewer.getList(); list.setLayoutData( new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); // buttons Composite compositeButton = new Composite(this, SWT.NONE); compositeButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); compositeButton.setLayout(new GridLayout(1, false)); Button btnAdd = new Button(compositeButton, SWT.NONE); btnAdd.setText("Add"); btnAdd.setToolTipText("Add an external tool to the system"); btnAdd.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); btnAdd.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { EditToolDialog dialog = new EditToolDialog(getShell()); if (dialog.open() != Window.OK) return; Tool tool = new Tool(newToolIdManager.getNextId()); tool.setCommand(dialog.getToolCommand()); tool.setName(dialog.getToolName()); tool.setType(dialog.getToolType()); tool.setDoc(dialog.getToolDoc()); toolsMap.put(tool.getId(), tool); listViewer.refresh(false); } }); btnEdit = new Button(compositeButton, SWT.NONE); btnEdit.setText("Edit"); btnEdit.setToolTipText("Edit external tool details"); btnEdit.setEnabled(false); btnEdit.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); btnEdit.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { IStructuredSelection selection = (IStructuredSelection) listViewer .getSelection(); Tool tool = (Tool) selection.getFirstElement(); // show a dialog to edit the tool EditToolDialog dialog = new EditToolDialog(getShell(), tool .getName(), tool.getCommand(), tool.getType(), tool .getDoc()); if (dialog.open() != Window.OK) return; tool.setCommand(dialog.getToolCommand()); tool.setName(dialog.getToolName()); tool.setType(dialog.getToolType()); tool.setDoc(dialog.getToolDoc()); toolsMap.put(tool.getId(), tool); listViewer.refresh(false); } }); btnRemove = new Button(compositeButton, SWT.NONE); btnRemove.setText("Remove"); btnRemove.setToolTipText("Remove external tool"); btnRemove.setEnabled(false); btnRemove.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); btnRemove.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { IStructuredSelection selection = (IStructuredSelection) listViewer .getSelection(); Iterator<?> it = selection.iterator(); while (it.hasNext()) { toolsMap.remove(((Tool) it.next()).getId()); } listViewer.refresh(false); } }); } /** * Get the updated list of tools. * * @return the updated list of tools */ public Map<Integer, Tool> getNewTools() { return toolsMap; } }