/**
* Copyright (c) 2014 - 2017 Frank Appel
* 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:
* Frank Appel - initial API and implementation
*/
package com.codeaffine.eclipse.ui.swt.theme;
import static com.codeaffine.eclipse.ui.swt.theme.FontLoader.FONT_FACE;
import org.eclipse.jface.resource.FontRegistry;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
/*
* Note that this is a highly experimental workaround. It tries to solve timing
* issues when applying the font-face in case that there are open editors on workbench
* startup. Without this code undetermined font faces would be applied, and only
* manually resetting the appropriate font preferences would fix the problem.
*/
class FontRegistryUpdater {
public void update( Shell shell ) {
shell.getDisplay().asyncExec( () -> {
shell.setRedraw( false );
try {
updateFontEntries( shell.getDisplay() );
} finally {
shell.setRedraw( true );
}
} );
}
private static void updateFontEntries( Display display ) {
FontRegistry fontRegistry = PlatformUI.getWorkbench().getThemeManager().getCurrentTheme().getFontRegistry();
if( fontRegistry.getFontData( "org.eclipse.jface.textfont" )[ 0 ].getName().equals( FONT_FACE ) ) {
updateFontEntry( display, fontRegistry, "org.eclipse.ui.workbench.texteditor.blockSelectionModeFont" );
updateFontEntry( display, fontRegistry, "org.eclipse.jface.textfont" );
updateFontEntry( display, fontRegistry, "org.eclipse.jdt.ui.editors.textfont" );
}
}
private static void updateFontEntry( Display display, FontRegistry fontRegistry, String symbolicName ) {
Font textFont = fontRegistry.get( symbolicName );
fontRegistry.put( symbolicName, display.getSystemFont().getFontData() );
display.readAndDispatch();
fontRegistry.put( symbolicName, textFont.getFontData() );
display.readAndDispatch();
}
}