// Copyright (c) 2003-2005 by Leif Frenzel - see http://leiffrenzel.de
package net.sf.eclipsefp.haskell.ui.dialog;
import java.util.HashSet;
import java.util.Set;
import net.sf.eclipsefp.haskell.ui.HaskellUIPlugin;
import net.sf.eclipsefp.haskell.ui.internal.util.UITexts;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
/** <p>a dialog that allows the user to select from all folders in
* a Haskell project, starting from a given source folder.</p>
*
* @author Leif Frenzel
*/
public class FolderSelectionDialog extends ElementTreeSelectionDialog {
public FolderSelectionDialog( final Shell shell,
final IContainer rootContainer ) {
this(shell,rootContainer,false);
}
private boolean addAllowed=false;
public FolderSelectionDialog( final Shell shell,
final IContainer rootContainer ,final boolean addAllowed) {
super( shell, new DialogLabelProvider(), new FolderCP() );
setInput( rootContainer );
setTitle( UITexts.folder_title );
setMessage( UITexts.folder_message );
setEmptyListMessage( UITexts.folder_empty );
this.addAllowed=addAllowed;
}
/* (non-Javadoc)
* @see org.eclipse.ui.dialogs.ElementTreeSelectionDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createDialogArea( final Composite parent ) {
Composite composite=(Composite) super.createDialogArea( parent );
if (addAllowed){
final Button bAdd=new Button(composite,SWT.PUSH);
bAdd.setText( UITexts.folder_add );
bAdd.addSelectionListener( new SelectionAdapter() {
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected( final SelectionEvent e ) {
IStructuredSelection sel=(IStructuredSelection)getTreeViewer().getSelection();
Object o=sel.getFirstElement();
if (!(o instanceof IContainer)){
o=getTreeViewer().getInput();
}
if (o instanceof IContainer){
final IContainer f=(IContainer)o;
final Set<String> names=new HashSet<>();
try {
for (IResource r:f.members()){
names.add( r.getName() );
}
InputDialog id=new InputDialog( getShell(), UITexts.folder_add_title, UITexts.folder_add_title, "", new IInputValidator() {
@Override
public String isValid( final String arg0 ) {
String s=arg0.trim();
if (s.length()==0){
return UITexts.folder_add_empty;
} else if (names.contains( s )){
return UITexts.folder_add_duplicate;
}
return null;
}
} );
if (Window.OK==id.open()){
String s=id.getValue().trim();
IFolder f2=f.getFolder(new Path(s ));
f2.create( false, true,new NullProgressMonitor() );
getTreeViewer().refresh( f );
getTreeViewer().setSelection( new StructuredSelection( f2 ) );
}
}catch (CoreException ce){
HaskellUIPlugin.log( ce );
}
}
}
} );
}
return composite;
}
}