/******************************************************************************* * Copyright (c) 2011, 2014 Frank Appel 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: * Frank Appel - initial API and implementation * EclipseSource - ongoing development ******************************************************************************/ package org.eclipse.rap.rwt.internal.textsize; import static org.eclipse.rap.rwt.internal.protocol.JsonUtil.createJsonArray; import static org.eclipse.rap.rwt.internal.service.ContextProvider.getApplicationContext; import static org.eclipse.rap.rwt.internal.textsize.MeasurementOperator.METHOD_MEASURE_ITEMS; import static org.eclipse.rap.rwt.internal.textsize.MeasurementOperator.PARAM_ITEMS; import static org.eclipse.rap.rwt.internal.textsize.MeasurementOperator.TYPE; import org.eclipse.rap.json.JsonArray; import org.eclipse.rap.json.JsonObject; import org.eclipse.rap.rwt.internal.protocol.ProtocolMessageWriter; import org.eclipse.rap.rwt.internal.protocol.ProtocolUtil; import org.eclipse.rap.rwt.internal.service.ContextProvider; import org.eclipse.rap.rwt.service.UISession; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.internal.graphics.FontUtil; public class MeasurementUtil { private static final String ATTR_OPERATOR = MeasurementUtil.class.getName() + "#operator"; public static void installMeasurementOperator( UISession uiSession ) { uiSession.setAttribute( ATTR_OPERATOR, new MeasurementOperator() ); } public static void appendStartupTextSizeProbe( ProtocolMessageWriter writer ) { JsonArray startupProbes = getStartupProbes(); if( !startupProbes.isEmpty() ) { JsonObject parameters = new JsonObject().add( PARAM_ITEMS, startupProbes ); writer.appendCall( TYPE, METHOD_MEASURE_ITEMS, parameters ); } } private static JsonArray getStartupProbes() { Probe[] probes = getApplicationContext().getProbeStore().getProbes(); JsonArray result = new JsonArray(); for( Probe probe : probes ) { result.add( createProbeParamObject( probe ) ); } return result; } public static void renderMeasurementItems() { getMeasurementOperator().renderMeasurementItems(); } static void addItemToMeasure( String toMeasure, Font font, int wrapWidth, int mode ) { FontData fontData = FontUtil.getData( font ); MeasurementItem newItem = new MeasurementItem( toMeasure, fontData, wrapWidth, mode ); getMeasurementOperator().addItemToMeasure( newItem ); } public static MeasurementOperator getMeasurementOperator() { UISession uiSession = ContextProvider.getUISession(); return ( MeasurementOperator )uiSession.getAttribute( ATTR_OPERATOR ); } static JsonArray createItemParamObject( MeasurementItem item ) { FontData fontData = item.getFontData(); JsonArray result = new JsonArray() .add( getId( item ) ) .add( item.getTextToMeasure() ) .add( createJsonArray( ProtocolUtil.parseFontName( fontData.getName() ) ) ) .add( fontData.getHeight() ) .add( ( fontData.getStyle() & SWT.BOLD ) != 0 ) .add( ( fontData.getStyle() & SWT.ITALIC ) != 0 ) .add( item.getWrapWidth() ) .add( isMarkup( item.getMode() ) ); return result; } static JsonArray createProbeParamObject( Probe probe ) { FontData fontData = probe.getFontData(); JsonArray result = new JsonArray() .add( getId( probe ) ) .add( probe.getText() ) .add( createJsonArray( ProtocolUtil.parseFontName( fontData.getName() ) ) ) .add( fontData.getHeight() ) .add( ( fontData.getStyle() & SWT.BOLD ) != 0 ) .add( ( fontData.getStyle() & SWT.ITALIC ) != 0 ) .add( -1 ) .add( true ); return result; } static String getId( Probe probe ) { return getId( probe.getFontData() ); } static String getId( MeasurementItem item ) { return "t" + Integer.toString( item.hashCode() ); } static String getId( FontData fontData ) { return "p" + Integer.toString( fontData.hashCode() ); } private static boolean isMarkup( int mode ) { return mode == TextSizeUtil.MARKUP_EXTENT; } private MeasurementUtil() { // prevent instance creation } }