package com.sonatype.buildserver.eclipse.ui.view;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
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.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.maven.ide.eclipse.ui.common.dialogs.RemoteResourceLookupDialog;
import com.sonatype.buildserver.eclipse.ui.HudsonImages;
import com.sonatype.buildserver.eclipse.ui.HudsonUtils;
import com.sonatype.buildserver.eclipse.ui.Messages;
import com.sonatype.buildserver.monitor.HudsonManager;
import com.sonatype.buildserver.monitor.HudsonMonitor;
import com.sonatype.buildserver.monitor.CompositeMonitor;
import org.hudsonci.rest.model.project.ProjectDTO;
extends RemoteResourceLookupDialog
{
private CheckboxTableViewer viewer;
private Text filterText;
private String filter = "";
private CompositeMonitor monitor;
private Set<Object> selectedJobs = new HashSet<Object>();
private Set<ProjectDTO> allJobs = new HashSet<ProjectDTO>();
private String baseServerUrl;
private HudsonMonitor serverMonitor;
private Button selectAllButton;
private Button deselectAllButton;
private IStructuredContentProvider contentProvider;
{
super( parentShell, null );
setServerName( Messages.jobSubscriptionDialog_buildServer );
setLoadButtonText( Messages.jobSubscriptionDialog_loadJobs );
setReadyToLoadMessage( Messages.jobSubscriptionDialog_clickLoadNow );
setResourceLabelText( Messages.jobSubscriptionDialog_availableJobs );
setSelectMessage( Messages.jobSubscriptionDialog_selectJobs );
setTitle( Messages.jobSubscriptionDialog_title );
this.monitor = monitor;
}
{
StringTokenizer tok = new StringTokenizer( description, "\n\r\f" );
if ( tok.countTokens() > 1 )
return tok.nextToken() + ELLIPSIS;
return description;
}
@Override
{
filterText = new Text( parent, SWT.BORDER | SWT.SEARCH );
final ModifyListener mlist = new ModifyListener()
{
{
filter = filterText.getText().trim();
viewer.refresh();
viewer.setCheckedElements( selectedJobs.toArray() );
}
};
filterText.setText( Messages.JobSubscriptionDialog_filter_hint );
filterText.setForeground( Display.getCurrent().getSystemColor( SWT.COLOR_GRAY ) );
filterText.addFocusListener( new FocusListener()
{
{
filterText.removeModifyListener( mlist );
if (filter.length() == 0) {
filterText.setText( Messages.JobSubscriptionDialog_filter_hint );
filterText.setForeground( Display.getCurrent().getSystemColor( SWT.COLOR_GRAY ) );
}
}
{
if (filter.length() == 0) {
filterText.setText( "" );
filterText.setForeground( null );
}
filterText.addModifyListener( mlist );
}
});
filterText.setData( "name", "filterText" );
filterText.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false ) );
filterText.setEnabled( false );
viewer = CheckboxTableViewer.newCheckList( parent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION );
GridData gd = new GridData( SWT.FILL, SWT.FILL, true, true );
gd.heightHint = 400;
gd.widthHint = 400;
viewer.getControl().setLayoutData( gd );
contentProvider = new JobContentProvider();
viewer.setContentProvider(contentProvider);
viewer.setLabelProvider( new LabelProvider()
{
@Override
{
if ( element instanceof ProjectDTO )
{
ProjectDTO job = (ProjectDTO) element;
if (!job.isEnabled()) {
return HudsonImages.NOT_BUILT_IMAGE;
}
return HudsonImages.getImage( HudsonImages.EMPTY );
}
return super.getImage( element );
}
@Override
public String
getText( Object element )
{
if ( element instanceof ProjectDTO )
{
ProjectDTO job = (ProjectDTO) element;
String description = job.getDescription();
String name = job.getName();
return ( description == null || description.length() == 0 ) ? name
: NLS.bind( Messages.jobSubscriptionDialog_labelTemplate, name,
shortenDescription( HudsonUtils.stripHtml( description ) ) );
}
return super.getText( element );
}
} );
viewer.addCheckStateListener( new ICheckStateListener()
{
{
int loc = 0;
Object element = viewer.getElementAt( loc );
while (element != null) {
if (viewer.getChecked( element )) {
selectedJobs.add( element );
} else {
selectedJobs.remove( element );
}
loc++;
element = viewer.getElementAt( loc );
}
}
} );
Composite composite = new Composite( parent, SWT.NONE );
composite.setLayout( new GridLayout( 2, true ) );
composite.setLayoutData( new GridData( SWT.RIGHT, SWT.BOTTOM, false, false ) );
selectAllButton = new Button( composite, SWT.PUSH );
selectAllButton.setData( "name", "selectAllButton" );
selectAllButton.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, false, false ) );
selectAllButton.setText( Messages.jobSubscriptionDialog_selectAll );
selectAllButton.addSelectionListener( new SelectionAdapter()
{
@Override
{
int index = 0;
Object o = viewer.getElementAt( index );
while (o != null) {
selectedJobs.add( o );
viewer.setChecked(o, true);
index = index + 1;
o = viewer.getElementAt( index );
}
}
} );
deselectAllButton = new Button( composite, SWT.PUSH );
deselectAllButton.setData( "name", "deselectAllButton" );
deselectAllButton.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, false, false ) );
deselectAllButton.setText( Messages.jobSubscriptionDialog_deselectAll );
deselectAllButton.addSelectionListener( new SelectionAdapter()
{
@Override
{
int index = 0;
Object o = viewer.getElementAt( index );
while (o != null) {
selectedJobs.remove( o );
viewer.setChecked(o, false);
index = index + 1;
o = viewer.getElementAt( index );
}
}
} );
return viewer.getTable();
}
@Override
protected Object
loadResources( String url, IProgressMonitor monitor )
throws Exception
{
baseServerUrl = url;
serverMonitor = this.monitor.getMonitor( url );
if ( serverMonitor == null )
serverMonitor = HudsonManager.addHudsonMonitor( URI.create( url ), null);
Collection<ProjectDTO> jobs = serverMonitor.getAllJobs();
Collection<ProjectDTO> filter = new ArrayList<ProjectDTO>();
for (ProjectDTO j : jobs) {
if (!HudsonUtils.isMatrixConfig( j )) {
filter.add(j);
}
}
return filter.toArray( new ProjectDTO[filter.size()] );
}
@Override
{
viewer.setInput( input );
if ( input == null || baseServerUrl == null )
{
viewer.getTable().setEnabled( false );
selectAllButton.setEnabled( false );
deselectAllButton.setEnabled( false );
return;
}
assert input instanceof ProjectDTO[];
Collection<String> monitoredJobs = serverMonitor.getMonitoredJobIds();
List<ProjectDTO> jobsToSelect = new ArrayList<ProjectDTO>();
allJobs.clear();
for ( ProjectDTO job : (ProjectDTO[]) input )
{
allJobs.add( job );
if ( monitoredJobs.contains( job.getName() ) )
{
jobsToSelect.add( job );
}
}
selectedJobs.clear();
selectedJobs.addAll( jobsToSelect );
viewer.setCheckedElements( selectedJobs.toArray() );
filterText.setEnabled( true );
selectAllButton.setEnabled( true );
deselectAllButton.setEnabled( true );
}
{
return baseServerUrl;
}
@Override
{
return HudsonUtils.restExceptionToString( e, null );
}
{
List<String> list = new ArrayList<String>();
for ( Object o : selectedJobs )
{
if ( o instanceof ProjectDTO )
{
list.add( ( (ProjectDTO) o ).getName() );
}
}
serverMonitor.setMonitoredJobs( list );
return serverMonitor;
}
{
public void inputChanged( Viewer viewer, Object oldInput, Object newInput )
{
updateOkState(newInput != null);
}
{
}
{
Object[] elements = new Object[0];
boolean enable = true;
if ( inputElement == null )
{
enable = false;
elements = new Object[] { Messages.jobSubscriptionDialog_empty_noServerSelected };
}
else if ( inputElement instanceof ProjectDTO[] )
{
String filterExpression = filter.toLowerCase();
if ( filterExpression.length() == 0 )
{
elements = (Object[]) inputElement;
if ( elements.length == 0 )
{
elements = new Object[] { Messages.jobSubscriptionDialog_empty_noJobsAvailable };
enable = false;
}
}
else
{
List<ProjectDTO> filteredProjectDTOs = new ArrayList<ProjectDTO>();
for ( ProjectDTO job : (ProjectDTO[]) inputElement )
{
if ( job.getName().toLowerCase().startsWith( filterExpression ) )
{
filteredProjectDTOs.add( job );
}
}
elements = filteredProjectDTOs.toArray();
if ( elements.length == 0 )
{
elements = new Object[] { Messages.jobSubscriptionDialog_empty_noMatchingJobs };
enable = false;
}
}
}
viewer.getTable().setEnabled( enable );
return elements;
}
}
}