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