/******************************************************************************* * Copyright (c) 2009-2013 CWI * 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 *******************************************************************************/ package org.rascalmpl.eclipse.library.vis.swt; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Device; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.widgets.Display; import org.rascalmpl.eclipse.library.vis.graphics.FontStyle; import org.rascalmpl.eclipse.library.vis.util.FigureColorUtils; import io.usethesource.vallang.IList; import io.usethesource.vallang.IListWriter; import io.usethesource.vallang.IValueFactory; import io.usethesource.vallang.type.TypeFactory; import org.rascalmpl.values.ValueFactoryFactory; public class SWTFontsAndColors { static IValueFactory vf = ValueFactoryFactory.getValueFactory(); private static TypeFactory tf = TypeFactory.getInstance(); public SWTFontsAndColors(IValueFactory factory) { vf = factory; } static private Device device = null; static private GC gc = null; private static void setGC(){ if(device == null){ device = Display.getCurrent(); if(device == null){ throw new Error("Trying to create get display from non-user interface thread!"); } } if(gc == null || gc.isDisposed()){ gc = new GC(device); } } static IList res = null; public static IList fontNames(){ System.err.println("fontNames"); Display.getDefault().syncExec(new Runnable(){ @Override public void run() { FontData[] fd = Display.getDefault().getFontList(null, true); IListWriter w = vf.listWriter(tf.stringType()); for(int i = 0; i < fd.length; i++){ System.err.println("adding " + fd[i].getName()); w.append(vf.string(fd[i].getName())); } res= w.done(); } }); return res; } public static double textAscent(String fontName, int fontSize, FontStyle... styles) { // TODO: optimize this FontData fd = new FontData(fontName, fontSize, FontStyle.toStyleMask(styles)); Font f = new Font(device, fd); setGC(); gc.setFont(f); double result = gc.getFontMetrics().getAscent(); f.dispose(); return result; } public static double textDescent(String fontName, int fontSize, FontStyle... styles) { // TODO: optimize this FontData fd = new FontData(fontName, fontSize, FontStyle.toStyleMask(styles)); Font f = new Font(device, fd); setGC(); gc.setFont(f); double result = gc.getFontMetrics().getDescent(); f.dispose(); return result; } public static double textWidth(String s, String fontName, int fontSize, FontStyle... styles) { // TODO: optimize this FontData fd = new FontData(fontName, fontSize, FontStyle.toStyleMask(styles)); Font f = new Font(device, fd); setGC(); gc.setFont(f); double result = gc.textExtent(s).x; f.dispose(); return result; } public static Color getRgbColor(int c) { setGC(); return getRgbColor(device, c); } public static Color getRgbColor(Device dc, int c) { return new Color(dc, FigureColorUtils.getRed(c), FigureColorUtils.getGreen(c), FigureColorUtils.getBlue(c)); } public static Color getColor(int which) { setGC(); return device.getSystemColor(which); } }