package net.sf.eclipsefp.haskell.ui.properties;
import java.util.Collection;
import java.util.List;
import net.sf.eclipsefp.haskell.buildwrapper.types.CabalPackage;
import net.sf.eclipsefp.haskell.buildwrapper.types.Component;
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.jface.dialogs.Dialog;
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.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
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.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.model.WorkbenchViewerComparator;
/**
* <p>Allows adding a dependency to a library</p>
*
* @author JP Moresmau
*/
public class ImportLibrariesAddDialog extends Dialog {
private final CabalPackage cabalPackage=new CabalPackage( );
private final Collection<CabalPackage> pkgs;
private final List<Component> components;
public ImportLibrariesAddDialog( final Shell parentShell,final Collection<CabalPackage> pkgs, final List<Component> components) {
super( parentShell );
this.pkgs=pkgs;
this.components=components;
}
@Override
protected Control createButtonBar( final Composite parent ) {
Control c=super.createButtonBar( parent );
getButton( OK ).setEnabled( false );
return c;
}
@Override
protected int getShellStyle() {
return super.getShellStyle() | SWT.RESIZE;
}
@Override
protected void configureShell( final Shell newShell ) {
super.configureShell( newShell );
newShell.setText( UITexts.libraries_add_title );
}
@Override
protected Control createDialogArea( final Composite parent ) {
Composite c=(Composite)super.createDialogArea( parent );
Label l=new Label(c,SWT.NONE);
l.setText( UITexts.libraries_add_available_title );
final TableViewer tv=new TableViewer( c,SWT.SINGLE | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL );
tv.setContentProvider( new ArrayContentProvider() );
tv.setComparator( new WorkbenchViewerComparator() );
tv.setLabelProvider( new LabelProvider(){
@Override
public Image getImage(final Object element) {
if (element instanceof CabalPackage){
return HaskellUIImages.getImage(((CabalPackage)element).isExposed() ? IImageNames.PACKAGE:IImageNames.HIDDEN_PACKAGE);
}
return super.getImage( element );
}
}
);
tv.setInput( pkgs );
GridData gd=new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
gd.heightHint=200;
gd.widthHint=260;
tv.getTable().setLayoutData( gd );
Group gCompo=new Group(c,SWT.NONE);
gCompo.setText( UITexts.libraries_add_component_title );
GridData gdCompo=new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL);
gCompo.setLayoutData( gdCompo );
gCompo.setLayout( new GridLayout( 1, true ) );
Button bAll=new Button(gCompo,SWT.RADIO);
bAll.setText( UITexts.libraries_add_component_all );
GridData gdAll=new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL);
bAll.setLayoutData( gdAll );
Button bSelected=new Button(gCompo,SWT.RADIO);
bSelected.setText( UITexts.libraries_add_component_selected );
GridData gdSelected=new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL);
bSelected.setLayoutData( gdSelected );
final ListViewer lvLCompo=new ListViewer( gCompo,SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER );
GridData gdLCompo=new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL);
gdLCompo.horizontalIndent=20;
lvLCompo.getList().setLayoutData( gdLCompo );
lvLCompo.setComparator( new WorkbenchViewerComparator() );
lvLCompo.setLabelProvider( new LabelProvider() );
lvLCompo.setContentProvider( new ArrayContentProvider() );
lvLCompo.setInput( components );
bAll.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
lvLCompo.getList().setEnabled( false );
cabalPackage.setComponents( components.toArray( new Component[components.size()] ) );
}
});
bSelected.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
lvLCompo.getList().setEnabled( true );
}
});
bAll.setSelection( true );
bAll.notifyListeners( SWT.Selection, new Event() );
lvLCompo.addSelectionChangedListener( new ISelectionChangedListener() {
@Override
public void selectionChanged( final SelectionChangedEvent event ) {
Object[] objs=((IStructuredSelection)event.getSelection()).toArray();
Component[] cps=new Component[objs.length];
for (int a=0;a<objs.length;a++){
cps[a]=(Component)objs[a];
}
cabalPackage.setComponents(cps);
}
});
Group gVersion=new Group(c,SWT.NONE);
gVersion.setText( UITexts.libraries_add_version_title );
GridData gdVersion=new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL);
gVersion.setLayoutData( gdVersion );
gVersion.setLayout( new GridLayout( 2, true ) );
Button bNone=new Button(gVersion,SWT.RADIO);
bNone.setText( UITexts.none);
GridData gdNone=new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL);
gdNone.horizontalSpan=2;
bNone.setLayoutData( gdNone );
Button bSpecific=new Button(gVersion,SWT.RADIO);
bSpecific.setText( UITexts.libraries_add_version_specific );
GridData gdSpecific=new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL);
bSpecific.setLayoutData( gdSpecific );
final Text tSpecific=new Text(gVersion,SWT.BORDER);
GridData gdTSpecific=new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL);
tSpecific.setLayoutData( gdTSpecific );
bNone.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
tSpecific.setEnabled( false );
cabalPackage.setVersion( "" );
}
});
bSpecific.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
tSpecific.setEnabled( true );
if (tSpecific.getText().length()>0){
cabalPackage.setVersion( tSpecific.getText() );
} else {
IStructuredSelection sel=(IStructuredSelection)tv.getSelection();
if (!sel.isEmpty()){
CabalPackage cp=(CabalPackage)sel.getFirstElement();
tSpecific.setText( "== "+ cp.getVersion() );
}
}
}
});
tSpecific.addModifyListener( new ModifyListener() {
@Override
public void modifyText( final ModifyEvent e ) {
cabalPackage.setVersion( tSpecific.getText() );
}
});
bNone.setSelection( true );
bNone.notifyListeners( SWT.Selection, new Event() );
tv.addSelectionChangedListener( new ISelectionChangedListener() {
@Override
public void selectionChanged( final SelectionChangedEvent event ) {
CabalPackage cp=(CabalPackage)((IStructuredSelection)event.getSelection()).getFirstElement();
cabalPackage.setName( cp.getName() );
cabalPackage.setExposed( cp.isExposed() );
if (tSpecific.isEnabled()){
tSpecific.setText("== "+ cp.getVersion() );
cabalPackage.setVersion( tSpecific.getText() );
} else {
cabalPackage.setVersion("");
}
getButton( OK ).setEnabled( true );
}
});
return c;
}
public CabalPackage getCabalPackage() {
return cabalPackage;
}
}