package com.redhat.ceylon.eclipse.code.editor; import static com.redhat.ceylon.eclipse.util.EditorUtil.getActivePage; import static com.redhat.ceylon.eclipse.util.EditorUtil.getDirtyEditors; import static com.redhat.ceylon.eclipse.util.EditorUtil.getFile; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.jdt.internal.ui.viewsupport.StorageLabelProvider; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.PopupDialog; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.graphics.Cursor; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.PartInitException; import org.eclipse.ui.ide.IDE; import com.redhat.ceylon.eclipse.util.EditorUtil; public class RecentFilesPopup extends PopupDialog { public static List<IFile> recents = new ArrayList<IFile>(); private Text filterText; private TableViewer list; RecentFilesPopup(Shell shell) { super(shell, SWT.NONE, true, false, false, false, false, "", null); } @Override protected Control createDialogArea(Composite parent) { GridLayout layout = new GridLayout(); layout.marginTop = 0; layout.marginLeft = 2; layout.marginRight = 2; layout.marginBottom = 2; parent.setLayout(layout); list = new TableViewer(parent, SWT.NO_TRIM|SWT.SINGLE|SWT.FULL_SELECTION); list.setFilters(new ViewerFilter[] {new ViewerFilter() { @Override public boolean select(Viewer viewer, Object parentElement, Object element) { return ((IFile) element).getName().toLowerCase() .startsWith(filterText.getText().toLowerCase()); } }}); list.setLabelProvider(new StorageLabelProvider() { @Override public String getText(Object element) { for (IEditorPart part: EditorUtil.getDirtyEditors()) { if (getFile(part.getEditorInput())==element) { return "*" + super.getText(element); } } return super.getText(element); } }); list.setContentProvider(ArrayContentProvider.getInstance()); list.getTable().setCursor(new Cursor(getShell().getDisplay(), SWT.CURSOR_HAND)); list.getTable().addListener(SWT.MouseMove, new Listener() { @Override public void handleEvent(Event event) { Rectangle bounds = event.getBounds(); TableItem item = list.getTable().getItem(new Point(bounds.x, bounds.y)); if (item!=null) { list.setSelection(new StructuredSelection(item.getData())); } } }); list.getTable().addKeyListener(new KeyListener() { @Override public void keyReleased(KeyEvent e) {} @Override public void keyPressed(KeyEvent e) { if (e.keyCode == 0x0D || e.keyCode == SWT.KEYPAD_CR) { // Enter key go(); } } }); list.getTable().addMouseListener(new MouseListener() { @Override public void mouseUp(MouseEvent e) { go(); } @Override public void mouseDown(MouseEvent e) {} @Override public void mouseDoubleClick(MouseEvent e) { go(); } }); List<IFile> files = new ArrayList<IFile>(recents); for (IEditorPart part: getDirtyEditors()) { IFile file = getFile(part.getEditorInput()); if (file!=null) { files.remove(file); files.add(0, file); } } list.setInput(files); if (files.isEmpty()) { filterText.setMessage("no files"); } else { list.setSelection(new StructuredSelection(files.get(0))); } return list.getControl(); } void go() { StructuredSelection selection = (StructuredSelection) list.getSelection(); IFile file = (IFile) selection.getFirstElement(); try { IDE.openEditor(getActivePage(), file); } catch (PartInitException e) { e.printStackTrace(); } close(); } @Override protected Control createTitleControl(Composite parent) { filterText= createFilterText(parent); return filterText; } protected Text getFilterText() { return filterText; } protected Text createFilterText(Composite parent) { filterText= new Text(parent, SWT.NONE); filterText.setMessage("type filter text"); Dialog.applyDialogFont(filterText); GridData data= new GridData(GridData.FILL_HORIZONTAL); data.horizontalAlignment= GridData.FILL; data.verticalAlignment= GridData.CENTER; filterText.setLayoutData(data); filterText.addKeyListener(new KeyListener() { public void keyPressed(KeyEvent e) { if (e.keyCode == 0x0D || e.keyCode == SWT.KEYPAD_CR) // Enter key go(); if (e.keyCode == SWT.ARROW_DOWN) list.getTable().setFocus(); if (e.keyCode == SWT.ARROW_UP) list.getTable().setFocus(); if (e.character == 0x1B) // ESC dispose(); } public void keyReleased(KeyEvent e) { // do nothing } }); filterText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { list.refresh(); Object elem = list.getElementAt(0); if (elem!=null) { list.setSelection(new StructuredSelection(elem)); } } }); return filterText; } public final void dispose() { close(); } public void widgetDisposed(DisposeEvent event) { list = null; filterText = null; } public void setFocus() { getShell().forceFocus(); filterText.setFocus(); } public static void addToHistory(IFile file) { if (file!=null) { if (!recents.contains(file)) { recents.add(file); if (recents.size()>10) { recents.remove(0); } } } } }