blob: 400c9998d9c1e40640d24858b32151d7bf54229b [file] [log] [blame]
/**
* Copyright (c) 2017 CEA.
* 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:
* CEA - initial API and implementation and/or initial documentation
*/
package org.eclipse.sensinact.studio.ui.common.notification;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.widgets.Display;
/**
* Caching class for fonts. Also deals with re-creating fonts should they have been disposed when the
* caller asks for a font.
*/
public class FontCache {
private static List<OneFont> _existing = new ArrayList<OneFont>();
/**
* Disposes all fonts and clears out the cache. Never call this unless you are shutting down your
* code/client/etc.
*/
public static void disposeAll() {
for (OneFont of : _existing) {
if (of.getFont() != null && !of.getFont().isDisposed()) {
of.getFont().dispose();
}
}
_existing.clear();
}
/**
* Gets a font from existing FontData
*
* @param fd FontData
* @return Font or null on error
*/
public static Font getFont(FontData fd) {
try {
boolean disposed = false;
OneFont toRemove = null;
for (OneFont of : _existing) {
if (of.matches(fd)) {
if (of.getFont().isDisposed()) {
disposed = true;
toRemove = of;
break;
}
return of.getFont();
}
}
if (disposed) {
_existing.remove(toRemove);
}
OneFont of = new OneFont(fd);
_existing.add(of);
return of.getFont();
} catch (Exception err) {
err.printStackTrace();
}
return null;
}
public static int getCount() {
return _existing.size();
}
/**
* Gets a font from an existing fonts data.
*
* @param font Font
* @return Font or null on error
*/
public static Font getFont(Font font) {
try {
if (font == null || font.isDisposed()) return null;
FontData fd = font.getFontData()[0];
return getFont(fd);
} catch (Exception err) {
err.printStackTrace();
}
return null;
}
/**
* Gets a font for a given font name and style.
*
* @param fontName Name of font
* @param height Height of font
* @param style Style of font
* @return Font or null on error
*/
public static Font getFont(String fontName, int height, int style) {
try {
boolean disposed = false;
OneFont toRemove = null;
for (OneFont of : _existing) {
if (of.getName().equals(fontName) && of.getHeight() == height && of.getStyle() == style) {
if (of.getFont().isDisposed()) {
disposed = true;
toRemove = of;
break;
}
return of.getFont();
}
}
if (disposed) {
_existing.remove(toRemove);
}
OneFont of = new OneFont(fontName, height, style);
_existing.add(of);
return of.getFont();
}
catch (Exception err) {
err.printStackTrace();
}
return null;
}
}
class OneFont {
private String _name;
private int _height;
private int _style;
private Font _font;
public OneFont(String name, int height, int style) {
_name = name;
_height = height;
_style = style;
_font = new Font(Display.getDefault(), name, height, style);
}
public OneFont(FontData fd) {
_name = fd.getName();
_height = fd.getHeight();
_style = fd.getStyle();
_font = new Font(Display.getDefault(), fd);
}
public String getName() {
return _name;
}
public int getHeight() {
return _height;
}
public int getStyle() {
return _style;
}
public void setFont(Font font) {
_font = font;
}
public Font getFont() {
return _font;
}
public boolean matches(FontData fd) {
return (fd.getName().equals(_name) && fd.getHeight() == _height && fd.getStyle() == _style);
}
@Override
public String toString() {
return "Font: " + _name + " " + _height + " " + _style;
}
}