package com.codeaffine.extras.launch.internal.dialog; import static com.codeaffine.extras.launch.internal.Images.RUNNING; import static com.codeaffine.extras.launch.internal.dialog.LaunchConfigLabelProvider.LabelMode.LIST; import static org.eclipse.jface.viewers.IDecoration.BOTTOM_RIGHT; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.ui.DebugUITools; import org.eclipse.debug.ui.IDebugModelPresentation; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.resource.LocalResourceManager; import org.eclipse.jface.viewers.DecorationOverlayIcon; import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.StyledString; import org.eclipse.jface.viewers.StyledString.Styler; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Display; import com.codeaffine.extras.launch.internal.Images; public class LaunchConfigLabelProvider extends LabelProvider implements IStyledLabelProvider { public enum LabelMode { LIST, DETAIL } private static final Styler ADDITIONAL_INFO_STYLER = StyledString.QUALIFIER_STYLER; private final LocalResourceManager resourceManager; private final DuplicatesDetector duplicatesDetector; private final LabelMode labelMode; private final IDebugModelPresentation debugModelPresentation; public LaunchConfigLabelProvider( Display display, DuplicatesDetector duplicatesDetector, LabelMode labelMode ) { this.resourceManager = new LocalResourceManager( JFaceResources.getResources( display ) ); this.duplicatesDetector = duplicatesDetector; this.labelMode = labelMode; this.debugModelPresentation = DebugUITools.newDebugModelPresentation(); } @Override public Image getImage( Object element ) { Image result; if( isNonExistingLaunchConfig( element ) ) { result = null; } else { result = debugModelPresentation.getImage( element ); } if( isRunning( element ) ) { result = decorateImage( result ); } return result; } @Override public String getText( Object element ) { return getStyledText( element ).toString(); } @Override public StyledString getStyledText( Object element ) { StyledString result; if( element instanceof ILaunchConfiguration ) { result = getStyledString( ( ILaunchConfiguration )element ); } else { result = new StyledString( String.valueOf( element ) ); } return result; } @Override public void dispose() { debugModelPresentation.dispose(); super.dispose(); } protected boolean isRunning( Object element ) { boolean result = false; if( element instanceof ILaunchConfiguration ) { result = LaunchConfigs.isRunning( ( ILaunchConfiguration )element ); } return result; } private static boolean isNonExistingLaunchConfig( Object element ) { return element instanceof ILaunchConfiguration && !( ( ILaunchConfiguration )element ).exists(); } private Image decorateImage( Image image ) { Image result = null; if( image != null ) { ImageDescriptor imageDescriptor = Images.getImageDescriptor( RUNNING ); DecorationOverlayIcon overlay = new DecorationOverlayIcon( image, imageDescriptor, BOTTOM_RIGHT ); result = resourceManager.createImage( overlay ); } return result; } private StyledString getStyledString( ILaunchConfiguration launchConfig ) { StyledString result; if( labelMode == LIST ) { result = getListStyledString( launchConfig ); } else { result = getDetailStyledString( launchConfig ); } return result; } private StyledString getListStyledString( ILaunchConfiguration launchConfig ) { StyledString result; result = new StyledString( debugModelPresentation.getText( launchConfig ) ); if( duplicatesDetector.isDuplicateElement( launchConfig ) ) { result.append( " - ", ADDITIONAL_INFO_STYLER ); if( launchConfig.getFile() != null ) { result.append( getContainerName( launchConfig ), ADDITIONAL_INFO_STYLER ); } else { result.append( getTypeName( launchConfig ), ADDITIONAL_INFO_STYLER ); } } return result; } private StyledString getDetailStyledString( ILaunchConfiguration launchConfig ) { StyledString result; result = new StyledString( debugModelPresentation.getText( launchConfig ) ); result.append( " - ", ADDITIONAL_INFO_STYLER ); result.append( getTypeName( launchConfig ), ADDITIONAL_INFO_STYLER ); if( launchConfig.getFile() != null ) { result.append( " (", ADDITIONAL_INFO_STYLER ); result.append( getContainerName( launchConfig ), ADDITIONAL_INFO_STYLER ); result.append( ")", ADDITIONAL_INFO_STYLER ); } return result; } private static String getTypeName( ILaunchConfiguration configuration ) { String result = "Unknown Launch Configuration Type"; try { result = configuration.getType().getName(); } catch( CoreException ignore ) { } return result; } private static String getContainerName( ILaunchConfiguration launchConfig ) { return launchConfig.getFile().getParent().getFullPath().makeRelative().toPortableString(); } }