1 /* 2 * ShadowBorder.java 3 * 4 * Copyright (C) 2021 by RStudio, PBC 5 * 6 * Unless you have received this program directly from RStudio pursuant 7 * to the terms of a commercial license agreement with RStudio, then 8 * this program is licensed to you under the terms of version 3 of the 9 * GNU Affero General Public License. This program is distributed WITHOUT 10 * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT, 11 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the 12 * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details. 13 * 14 */ 15 package org.rstudio.core.client.theme; 16 17 import com.google.gwt.dom.client.DivElement; 18 import com.google.gwt.dom.client.Document; 19 import com.google.gwt.dom.client.Style; 20 import com.google.gwt.user.client.ui.Composite; 21 import com.google.gwt.user.client.ui.LayoutPanel; 22 import org.rstudio.core.client.theme.res.ThemeResources; 23 import org.rstudio.core.client.theme.res.ThemeStyles; 24 25 /** 26 * Creates the visual effect of a "window" with shadowed border and 27 * titlebar. This widget isn't designed to contain any content, but 28 * rather be layered behind the content that should be shadowed (see 29 * WindowFrame). 30 */ 31 class ShadowBorder extends Composite 32 { ShadowBorder()33 public ShadowBorder() 34 { 35 ThemeStyles styles = ThemeResources.INSTANCE.themeStyles(); 36 37 layout_ = new LayoutPanel(); 38 39 addPanel(styles.NW(), LEFT, TOP); 40 addPanel(styles.N(), CENTER, TOP); 41 addPanel(styles.NE(), RIGHT, TOP); 42 addPanel(styles.W(), LEFT, MIDDLE); 43 addPanel(styles.C(), CENTER, MIDDLE); 44 addPanel(styles.E(), RIGHT, MIDDLE); 45 addPanel(styles.SW(), LEFT, BOTTOM); 46 addPanel(styles.S(), CENTER, BOTTOM); 47 addPanel(styles.SE(), RIGHT, BOTTOM); 48 49 initWidget(layout_); 50 } 51 addPanel(String styleName, int halign, int valign)52 private DivElement addPanel(String styleName, int halign, int valign) 53 { 54 DivElement div = Document.get().createDivElement(); 55 div.setClassName(styleName); 56 57 Style style = div.getStyle(); 58 style.setPosition(Style.Position.ABSOLUTE); 59 60 switch (halign) 61 { 62 case LEFT: 63 style.setPropertyPx("left", 0); 64 style.setPropertyPx("width", 10); 65 break; 66 case CENTER: 67 style.setPropertyPx("left", 10); 68 style.setPropertyPx("right", 10); 69 break; 70 case RIGHT: 71 style.setPropertyPx("right", 0); 72 style.setPropertyPx("width", 10); 73 break; 74 } 75 switch (valign) 76 { 77 case TOP: 78 style.setPropertyPx("top", 0); 79 style.setPropertyPx("height", 26); 80 break; 81 case MIDDLE: 82 style.setPropertyPx("top", 26); 83 style.setPropertyPx("bottom", 26); 84 break; 85 case BOTTOM: 86 style.setPropertyPx("bottom", 0); 87 style.setPropertyPx("height", 26); 88 } 89 90 layout_.getElement().appendChild(div); 91 return div; 92 } 93 94 private final LayoutPanel layout_; 95 96 private static final int LEFT=0, CENTER=1, RIGHT=2; 97 private static final int TOP=0, MIDDLE=1, BOTTOM=2; 98 99 public static final int TOP_SHADOW_WIDTH = 3, 100 LEFT_SHADOW_WIDTH = 3, 101 RIGHT_SHADOW_WIDTH = 3, 102 BOTTOM_SHADOW_WIDTH = 5, 103 TITLEBAR_REGION_BOTTOM = 26, 104 CONTENT_REGION_TOP = 26; 105 } 106