package org.archstudio.archipelago2.core.outline.swt; import java.util.ArrayList; import java.util.List; import org.archstudio.archipelago2.IArchipelago2Outline; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; /** * Triggers an edit event on an element if it is clicked on once after it is already selected. * * @author sahendrickson@gmail.com (Scott A. Hendrickson) */ public class EditOnClickOfAlreadySelectedElement implements ISelectionChangedListener { /** The outline being edited. */ private final IArchipelago2Outline outline; /** The tree viewer on which to trigger edits. */ private final TreeViewer treeViewer; /** The most recent selection of elements in the tree viewer. */ private List<Object> previousSelection = new ArrayList<>(); /** The editor to trigger. */ private final EditObjRefNameInOutine editor; /** Set to <code>true</code> if editing was active on mouse down. */ private boolean wasEditingOnMouseDown = false; /** Set to <code>true</code> if the next selection event should. */ private boolean checkSelectionOnNextEvent = false; public EditOnClickOfAlreadySelectedElement(IArchipelago2Outline outline, final TreeViewer treeViewer, EditObjRefNameInOutine editor) { this.outline = outline; this.treeViewer = treeViewer; this.editor = editor; treeViewer.getTree().addMouseListener(new MouseAdapter() { @Override public void mouseDown(MouseEvent e) { wasEditingOnMouseDown = treeViewer.isCellEditorActive(); checkSelectionOnNextEvent = true; } }); treeViewer.addPostSelectionChangedListener(this); } @Override public void selectionChanged(SelectionChangedEvent event) { @SuppressWarnings("unchecked") List<Object> newSelection = ((IStructuredSelection) event.getSelection()).toList(); if (!wasEditingOnMouseDown && checkSelectionOnNextEvent) { if (previousSelection.equals(newSelection)) { for (final Object element : newSelection) { if (editor.canEdit(element)) { treeViewer.getTree().getDisplay().asyncExec(new Runnable() { @Override public void run() { outline.editElement(element, 0); } }); } break; } } } previousSelection = newSelection; checkSelectionOnNextEvent = false; } }