/****************************************************************************** * Copyright (c) 2011, 2015 Stephan Schwiebert and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Stephan Schwiebert - initial API and implementation * *******************************************************************************/ package org.eclipse.gef.cloudio.internal.ui.view; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; import org.eclipse.gef.cloudio.internal.ui.data.Type; import org.eclipse.jface.viewers.BaseLabelProvider; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.widgets.Display; /** * * @author sschwieb * */ public class TypeLabelProvider extends BaseLabelProvider implements IEditableCloudLabelProvider { private double maxOccurrences; private double minOccurrences; public enum Scaling { LINEAR, LOGARITHMIC; } private Map<Object, Color> colors = new HashMap<>(); private Map<Object, FontData[]> fonts = new HashMap<>(); private Random random = new Random(); protected List<Color> colorList; protected List<Font> fontList; protected List<Float> angles; private Scaling scaling = Scaling.LOGARITHMIC; public TypeLabelProvider() { colorList = new ArrayList<>(); fontList = new ArrayList<>(); angles = new ArrayList<>(); angles.add(0F); } @Override public String getLabel(Object element) { return ((Type) element).getString(); } @Override public double getWeight(Object element) { switch (scaling) { case LINEAR: return ((Type) element).getOccurrences() / maxOccurrences; case LOGARITHMIC: { double count = Math.log(((Type) element).getOccurrences() - minOccurrences + 1); if (count != 0) { count /= Math.log(maxOccurrences); } return count; } default: return 1; } } @Override public Color getColor(Object element) { Color color = colors.get(element); if (color == null) { color = colorList.get(random.nextInt(colorList.size())); colors.put(element, color); } return color; } public FontData[] getFontData(Object element) { FontData[] data = fonts.get(element); if (data == null) { data = fontList.get(random.nextInt(fontList.size())).getFontData(); fonts.put(element, data); } return data; } public void setMaxOccurrences(int occurrences) { this.maxOccurrences = occurrences; } public void setMinOccurrences(int occurrences) { this.minOccurrences = occurrences; } @Override public void dispose() { for (Color color : colorList) { color.dispose(); } for (Font font : fontList) { font.dispose(); } } public void setAngles(List<Float> angles) { this.angles = angles; } @Override public float getAngle(Object element) { float angle = angles.get(random.nextInt(angles.size())); return angle; } public void setColors(List<RGB> newColors) { if (newColors.isEmpty()) return; for (Color color : colorList) { color.dispose(); } colorList.clear(); colors.clear(); for (RGB color : newColors) { Color c = new Color(Display.getDefault(), color); colorList.add(c); } } public void setFonts(List<FontData> newFonts) { if (newFonts.isEmpty()) return; for (Font font : fontList) { font.dispose(); } fontList.clear(); fonts.clear(); for (FontData data : newFonts) { Font f = new Font(Display.getDefault(), data); fontList.add(f); } } @Override public String getToolTip(Object element) { return getLabel(element); } public void setScale(Scaling scaling) { this.scaling = scaling; } }