package com.redhat.ceylon.eclipse.code.editor; import static com.redhat.ceylon.eclipse.code.editor.EditorActionIds.RESTORE_PREVIOUS; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.action.Action; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.ui.texteditor.ITextEditor; class RestorePreviousSelectionAction extends Action { private CeylonEditor editor; private List<IRegion> previous = new ArrayList<IRegion>(); private boolean restoring; public RestorePreviousSelectionAction() { this(null); } @Override public boolean isEnabled() { return super.isEnabled() && editor!=null; } public RestorePreviousSelectionAction(CeylonEditor editor) { super("Select Enclosing"); setActionDefinitionId(RESTORE_PREVIOUS); setEditor(editor); } private void setEditor(ITextEditor editor) { if (editor instanceof CeylonEditor) { this.editor = (CeylonEditor) editor; this.editor.getSelectionProvider() .addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { if (!restoring) { IRegion r = RestorePreviousSelectionAction.this.editor.getSelection(); if (r.getLength()==0) { previous.clear(); } previous.add(r);//new Region(r.getOffset(), r.getLength())); if (previous.size()>20) { previous.remove(0); } setEnabled(previous.size()>1); } } }); } else { this.editor= null; } setEnabled(false); } @Override public void run() { if (previous.size()>0) { previous.remove(previous.size()-1); } if (previous.size()>0) { IRegion r = previous.get(previous.size()-1); restoring=true; editor.selectAndReveal(r.getOffset(), r.getLength()); restoring=false; setEnabled(previous.size()>1); } } }