// Copyright (c) 2005-2006, 2009 by the projectusus.org contributors
// This software is released under the terms and conditions
// of the Eclipse Public License (EPL) 1.0.
// See http://www.eclipse.org/legal/epl-v10.html for details.
package org.projectusus.ui.internal.yellowcount;
import static org.eclipse.swt.SWT.BOLD;
import org.eclipse.jface.resource.ColorRegistry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.part.ViewPart;
import org.projectusus.core.IUsusModelListener;
import org.projectusus.core.basis.YellowCountCache;
import org.projectusus.core.basis.YellowCountResult;
import org.projectusus.core.statistics.UsusModelProvider;
/**
* A simple view that displays the current yellow count to the user.
*
* @author Leif Frenzel
*/
public class YellowCountView extends ViewPart {
private StyledText styledText;
private IUsusModelListener listener;
private final ColorRegistry colorRegistry = new ColorRegistry();
// interface methods of ViewPart
// //////////////////////////////
@Override
public void createPartControl( final Composite parent ) {
styledText = new StyledText( parent, SWT.WRAP );
styledText.setEditable( false );
styledText.setBackground( getBackgroundColor() );
listener = new IUsusModelListener() {
public void ususModelChanged() {
display( YellowCountCache.yellowCountCache().getResult() );
}
};
UsusModelProvider.ususModel().addUsusModelListener( listener );
display( YellowCountCache.yellowCountCache().getResult() );
}
@Override
public void setFocus() {
if( styledText != null && !styledText.isDisposed() ) {
styledText.setFocus();
}
}
@Override
public void dispose() {
UsusModelProvider.ususModel().removeUsusModelListener( listener );
super.dispose();
}
// helping methods
// ////////////////
private void display( final YellowCountResult countResult ) {
final String displayString = countResult.toString();
Display.getDefault().asyncExec( new Runnable() {
public void run() {
if( styledText != null && !styledText.isDisposed() ) {
styledText.setText( displayString );
styledText.setBackground( getBackgroundColor() );
styledText.setStyleRange( createStyleRange( countResult ) );
styledText.redraw();
}
}
} );
}
private Color getBackgroundColor() {
int fade = YellowCountCache.yellowCountCache().getResult().getYellowCount();
RGB rgb = new RGB( 255, 255, Math.max( 255 - fade, 0 ) );
if( !colorRegistry.hasValueFor( rgb.toString() ) ) {
colorRegistry.put( rgb.toString(), rgb );
}
return colorRegistry.get( rgb.toString() );
}
private StyleRange createStyleRange( YellowCountResult countResult ) {
Color foreground = styledText.getForeground();
Color background = styledText.getBackground();
int position = countResult.getFormattedCountPosition();
int length = countResult.getFormattedCountLength();
return new StyleRange( position, length, foreground, background, BOLD );
}
}