package com.codeaffine.extras.workingset.internal; import static com.codeaffine.extras.workingset.internal.Images.WORKING_SET_WIZBAN; import static org.eclipse.jface.dialogs.Dialog.applyDialogFont; import static org.eclipse.jface.layout.GridDataFactory.swtDefaults; import static org.eclipse.jface.viewers.StructuredSelection.EMPTY; import static org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.fieldassist.ContentProposalAdapter; import org.eclipse.jface.fieldassist.TextContentAdapter; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.text.FindReplaceDocumentAdapterContentProposalProvider; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IWorkingSet; import org.eclipse.ui.dialogs.IWorkingSetPage; import org.eclipse.ui.fieldassist.ContentAssistCommandAdapter; import com.codeaffine.extras.workingset.internal.ValidationStatus.Severity; public class DynamicWorkingSetPage extends WizardPage implements IWorkingSetPage { private final ProjectsProvider projectsProvider; private final Validator validator; private boolean visible; private IWorkingSet workingSet; Composite composite; Text nameText; Text patternText; Label previewLabel; TableViewer previewViewer; PreviewLabelProvider previewLabelProvider; public DynamicWorkingSetPage() { this( new WorkspaceProjectsProvider(), new JdtFeature(), new DynamicWorkingSetFactory() ); } public DynamicWorkingSetPage( ProjectsProvider projectsProvider, JdtFeature jdtFeature, WorkingSetFactory workingSetFactory ) { super( "DynamicWorkingSetWizardPage" ); this.projectsProvider = projectsProvider; this.validator = new Validator( projectsProvider, jdtFeature ); this.workingSet = workingSetFactory.createWorkingSet(); setTitle( "Dynamic Project Working Set" ); setDescription( "Enter a pattern to include matching projects in this working set" ); setImageDescriptor( Images.getImageDescriptor( WORKING_SET_WIZBAN ) ); } @Override public void createControl( Composite parent ) { createControls( parent ); defineTabOrder(); attachListeners(); layoutControls(); setControl( composite ); applyDialogFont( composite ); applySelection(); } @Override public void setVisible( boolean visible ) { super.setVisible( visible ); if( visible ) { updateVisibleState(); updateStatusMessage( new ValidationStatus( Severity.NONE, "" ) ); setPageComplete( false ); } } @Override public void finish() { workingSet.setName( getPatternText() ); workingSet.setLabel( getNameText() ); } @Override public IWorkingSet getSelection() { return workingSet; } @Override public void setSelection( IWorkingSet workingSet ) { this.workingSet = workingSet; } private void createControls( Composite parent ) { composite = new Composite( parent, SWT.NONE ); Label nameLabel = new Label( composite, SWT.NONE ); nameLabel.setText( "&Name" ); nameText = new Text( composite, SWT.BORDER ); Label patternLabel = new Label( composite, SWT.NONE ); patternLabel.setText( "&Pattern" ); patternText = new Text( composite, SWT.BORDER ); installPatternContentAssist(); previewLabel = new Label( composite, SWT.NONE ); previewLabel.setText( "Preview" ); previewViewer = new TableViewer( composite, SWT.SINGLE | SWT.FULL_SELECTION | SWT.BORDER ); previewViewer.getControl().setBackground( getWidgetBackgroundColor() ); previewViewer.getControl().addListener( SWT.FocusOut, new PreviewFocusOutListener() ); previewLabelProvider = new PreviewLabelProvider( getShell().getDisplay() ); previewViewer.setLabelProvider( previewLabelProvider ); previewViewer.setContentProvider( ArrayContentProvider.getInstance() ); previewViewer.setInput( projectsProvider.getProjects() ); previewViewer.setComparator( new PreviewComparator( "" ) ); } private void layoutControls() { composite.setLayout( GridLayoutFactory.swtDefaults().numColumns( 2 ).spacing( 10, 5 ).create() ); swtDefaults().align( SWT.FILL, SWT.TOP ).grab( true, false ).applyTo( composite ); swtDefaults().align( SWT.FILL, SWT.CENTER ).grab( true, false ).applyTo( nameText ); swtDefaults().align( SWT.FILL, SWT.CENTER ).grab( true, false ).applyTo( patternText ); swtDefaults().align( SWT.FILL, SWT.TOP ).grab( false, false ).indent( 0, 10 ).applyTo( previewLabel ); swtDefaults() .align( SWT.FILL, SWT.FILL ) .grab( true, true ) .indent( 0, 10 ) .hint( SWT.DEFAULT, getPreferredPreviewViewerHeight() ) .applyTo( previewViewer.getControl() ); } private int getPreferredPreviewViewerHeight() { return 10 * previewViewer.getTable().getItemHeight(); } private void installPatternContentAssist() { ContentProposalAdapter contentAssist = new ContentAssistCommandAdapter( patternText, new TextContentAdapter(), new FindReplaceDocumentAdapterContentProposalProvider( true ), CONTENT_ASSIST_PROPOSALS, new char[]{ '\\', '[', '(' }, true ); contentAssist.setEnabled( true ); } private void defineTabOrder() { composite.setTabList( new Control[] { nameText, patternText } ); } private void attachListeners() { nameText.addListener( SWT.Modify, new NameModifyListener() ); patternText.addListener( SWT.Modify, new PatternModifyListener() ); } private void applySelection() { if( workingSet != null ) { nameText.setText( workingSet.getLabel() ); patternText.setText( workingSet.getName() ); } } private ValidationStatus validate() { return validator.validate( workingSet, getNameText(), getPatternText() ); } private void updateVisibleState() { if( !this.visible ) { this.visible = true; nameText.setFocus(); } } @SuppressWarnings("incomplete-switch") private void updateStatusMessage( ValidationStatus validationStatus ) { if( visible ) { int messageType = IMessageProvider.NONE; String message = null; switch( validationStatus.getSeverity() ) { case ERROR: messageType = IMessageProvider.ERROR; message = validationStatus.getMessage(); break; case WARNING: messageType = IMessageProvider.WARNING; message = validationStatus.getMessage(); break; } setMessage( message, messageType ); setPageComplete( validationStatus.getSeverity() != Severity.ERROR ); } } private void updatePreview() { String pattern = getPatternText(); previewLabelProvider.setPattern( pattern ); previewViewer.setComparator( new PreviewComparator( pattern ) ); } private String getPatternText() { return patternText.getText().trim(); } private String getNameText() { return nameText.getText().trim(); } private Color getWidgetBackgroundColor() { return getShell().getDisplay().getSystemColor( SWT.COLOR_WIDGET_BACKGROUND ); } private class NameModifyListener implements Listener { @Override public void handleEvent( Event event ) { updateStatusMessage( validate() ); } } private class PatternModifyListener implements Listener { @Override public void handleEvent( Event event ) { updateStatusMessage( validate() ); updatePreview(); } } private class PreviewFocusOutListener implements Listener { @Override public void handleEvent( Event event ) { previewViewer.setSelection( EMPTY ); } } }