/* * DomMetrics.java * * Copyright (C) 2009-12 by RStudio, Inc. * * Unless you have received this program directly from RStudio pursuant * to the terms of a commercial license agreement with RStudio, then * this program is licensed to you under the terms of version 3 of the * GNU Affero General Public License. This program is distributed WITHOUT * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT, * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details. * */ package org.rstudio.core.client.dom; import com.google.gwt.dom.client.Style; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.RootPanel; import org.rstudio.core.client.Size; import org.rstudio.core.client.widget.FontSizer; public class DomMetrics { public static Size measureHTML(String html) { return measureHTML(html, "gwt-Label"); } public static Size measureHTML(String html, String styleName) { // create HTML widget which matches the specified style HTML measureHTML = new HTML(); measureHTML.setStyleName(styleName); measureHTML.getElement().getStyle().setFloat(Style.Float.LEFT); measureHTML.setWordWrap(false); // add it to the dom (hidden) RootPanel.get().add(measureHTML, -2000, -2000); // insert the text (preformatted) and measure it measureHTML.setHTML(html); Size textSize = new Size(measureHTML.getOffsetWidth(), measureHTML.getOffsetHeight()); RootPanel.get().remove(measureHTML); // return the size return textSize; } public static Size measureCode(String code) { return DomMetrics.measureHTML( "<pre>" + DomUtils.textToPreHtml(code) + "</pre>", "ace_editor " + FontSizer.getNormalFontSizeClass()); } public static Size adjustedElementSizeToDefaultMax() { Size size = new Size(Window.getClientWidth(), Window.getClientHeight()); size = DomMetrics.adjustedElementSize(size, null, 70, // pad 100); // client margin return size; } public static Size adjustedElementSize(Size contentSize, Size minimumSize, int contentPad, int clientMargin) { // add the padding contentSize = new Size(contentSize.width + contentPad, contentSize.height + contentPad); // enforce the minimum (if specified) if (minimumSize != null) { contentSize = new Size(Math.max(contentSize.width, minimumSize.width), Math.max(contentSize.height, minimumSize.height)); } // maximum is client area - (margin * 2) Size maximumSize = new Size(Window.getClientWidth() - (clientMargin*2), Window.getClientHeight() - (clientMargin*2)); int width = Math.min(contentSize.width, maximumSize.width); int height = Math.min(contentSize.height, maximumSize.height); return new Size(width, height); } public static Size adjustedCodeElementSize(String code, int contentPad, int clientMargin) { // line numbers final int LINE_NUMBERS_WIDTH = 100; // calculate the size of the text the adjust for line numbers Size textSize = DomMetrics.measureCode(code); textSize = new Size(textSize.width + LINE_NUMBERS_WIDTH, textSize.height); // compute the editor size Size minimumSize = new Size(300, 200); Size editorSize = DomMetrics.adjustedElementSize(textSize, minimumSize, contentPad, clientMargin); return editorSize; } }