/** * Copyright (c) 2012 by JP Moresmau * This code is made available under the terms of the Eclipse Public License, * version 1.0 (EPL). See http://www.eclipse.org/legal/epl-v10.html */ package net.sf.eclipsefp.haskell.ui.actions; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sf.eclipsefp.haskell.buildwrapper.BuildWrapperPlugin; import net.sf.eclipsefp.haskell.buildwrapper.types.Module; import net.sf.eclipsefp.haskell.buildwrapper.usage.UsageAPI; import net.sf.eclipsefp.haskell.ui.HaskellUIPlugin; import net.sf.eclipsefp.haskell.ui.internal.util.UITexts; import net.sf.eclipsefp.haskell.ui.util.HaskellUIImages; import net.sf.eclipsefp.haskell.ui.util.IImageNames; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.window.Window; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.IWorkbenchWindowActionDelegate; import org.eclipse.ui.PartInitException; import org.eclipse.ui.dialogs.ElementListSelectionDialog; import org.eclipse.ui.dialogs.FilteredList; import org.eclipse.ui.ide.IDE; /** * @author JP Moresmau * */ public class OpenModuleAction extends Action implements IWorkbenchWindowActionDelegate { private Shell shell; private IWorkbenchPage page; /** * */ public OpenModuleAction() { super(Platform.getResourceBundle( HaskellUIPlugin.getDefault().getBundle()).getString( "OpenModuleAction.label" )); } /* (non-Javadoc) * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction) */ @Override public void run( final IAction arg0 ) { //elsd.setFilter( filter ) UsageAPI api=BuildWrapperPlugin.getDefault().getUsageAPI(); if (api!=null){ ModuleListSelectionDialog elsd=new ModuleListSelectionDialog( shell); List<Module> mods=api.listLocalModules(); elsd.setElements( mods.toArray( new Module[mods.size()] ) ); int code=elsd.open(); if (Window.OK==code){ Object[] res=elsd.getResult(); for (Object o:res){ if (o instanceof Module){ Module mod=(Module)o; Long fileid=mod.getFileID(); if (fileid!=null){ IFile efile=api.getFile( fileid ); if (efile!=null){ try { IDE.openEditor( page, efile); } catch (PartInitException pie){ HaskellUIPlugin.log( pie ); } } } } } } } } /* (non-Javadoc) * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection) */ @Override public void selectionChanged( final IAction arg0, final ISelection arg1 ) { //NOOP } /* (non-Javadoc) * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose() */ @Override public void dispose() { shell=null; page=null; } /* (non-Javadoc) * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow) */ @Override public void init( final IWorkbenchWindow arg0 ) { shell=arg0.getShell(); page=arg0.getActivePage(); } private static class ModuleListSelectionDialog extends ElementListSelectionDialog { /** * table items that have the selection focus (show package name) */ private final Map<Integer,TableItem> lastTis=new HashMap<>(); public ModuleListSelectionDialog( final Shell parent ) { super( parent, new ModuleLabelProvider() ); setTitle( UITexts.OpenModuleAction_title ); setMessage( UITexts.OpenModuleAction_text ); setEmptyListMessage( UITexts.OpenModuleAction_nomodule ); setEmptySelectionMessage( UITexts.OpenModuleAction_nomodulesel ); setMultipleSelection( true ); setStatusLineAboveButtons( true ); setAllowDuplicates( true ); } /* (non-Javadoc) * @see org.eclipse.ui.dialogs.SelectionStatusDialog#configureShell(org.eclipse.swt.widgets.Shell) */ @Override protected void configureShell( final Shell shell ) { super.configureShell( shell ); shell.setImage( HaskellUIImages.getImage( IImageNames.HASKELL_MISC )); } /* (non-Javadoc) * @see org.eclipse.ui.dialogs.AbstractElementListSelectionDialog#createFilteredList(org.eclipse.swt.widgets.Composite) */ @Override protected FilteredList createFilteredList( final Composite parent ) { FilteredList fl=super.createFilteredList( parent ); fl.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e) { TableItem[] tis=((Table)e.widget).getItems(); Object[] obj=getSelectedElements(); int[] sels=getSelectionIndices(); /** * new focused table items */ Map<Integer,TableItem> newTis=new HashMap<>(); for (int a=0;a<sels.length;a++){ int idx=sels[a]; Module mod=(Module)obj[a]; TableItem ti=lastTis.remove( idx ); // change text if (ti==null){ tis[idx].setText( mod.getModuleName() +" - "+ mod.getPackageName() ); } newTis.put( idx, tis[idx] ); } // reset text to unselected for (Integer i:lastTis.keySet()){ TableItem ti=lastTis.get(i); if (ti!=null && !ti.isDisposed()){ String s=ti.getText(); int ix=s.indexOf( " - " ); if (ix>-1){ ti.setText( s.substring( 0,ix ) ); } } } lastTis.clear(); // new map lastTis.putAll( newTis ); } } ); return fl; } } private static class ModuleLabelProvider extends LabelProvider{ private final Image img; /** * */ public ModuleLabelProvider() { img=HaskellUIImages.getImage( IImageNames.MODULE ); } @Override public String getText(final Object element) { if (element instanceof Module){ Module mod=(Module)element; return mod.getModuleName(); } return super.getText( element ); } @Override public org.eclipse.swt.graphics.Image getImage(final Object element) { if (element instanceof Module){ return img; } return super.getImage( element ); } } }