001/* 002 * #%L 003 * GwtMaterial 004 * %% 005 * Copyright (C) 2015 - 2017 GwtMaterialDesign 006 * %% 007 * Licensed under the Apache License, Version 2.0 (the "License"); 008 * you may not use this file except in compliance with the License. 009 * You may obtain a copy of the License at 010 * 011 * http://www.apache.org/licenses/LICENSE-2.0 012 * 013 * Unless required by applicable law or agreed to in writing, software 014 * distributed under the License is distributed on an "AS IS" BASIS, 015 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 016 * See the License for the specific language governing permissions and 017 * limitations under the License. 018 * #L% 019 */ 020package gwt.material.design.client.base.mixin; 021 022import com.google.gwt.dom.client.Style; 023import com.google.gwt.user.client.ui.Widget; 024import gwt.material.design.client.base.HasFlexbox; 025import gwt.material.design.client.base.helper.BrowserPrefixHelper; 026import gwt.material.design.client.constants.*; 027 028/** 029 * Mixin for Flexbox layout 030 * 031 * @author chriswjones 032 */ 033public class FlexboxMixin<T extends Widget & HasFlexbox> extends AbstractMixin<T> implements HasFlexbox { 034 035 public FlexboxMixin(T uiObject) { 036 super(uiObject); 037 } 038 039 private Display displayValueBeforeHidden; 040 041 @Override 042 public void setGwtDisplay(Style.Display display) { 043 setDisplay(Display.parse(display)); 044 } 045 046 @Override 047 public void setDisplay(Display display) { 048 if (display == null) { 049 displayValueBeforeHidden = null; 050 uiObject.getElement().getStyle().clearDisplay(); 051 return; 052 } 053 054 if (display != Display.NONE) { 055 displayValueBeforeHidden = display; 056 } 057 058 if (display.equals(Display.FLEX)) { 059 String[] displayValues = {"-webkit-box", "-moz-box", "-ms-box", "-webkit-flex", "-moz-flex", "flex"}; 060 for (String d : displayValues) { 061 uiObject.getElement().getStyle().setProperty("display", d); 062 } 063 return; 064 } 065 066 if (display.getGwtDisplay() != null) { 067 uiObject.getElement().getStyle().setDisplay(display.getGwtDisplay()); 068 } else { 069 uiObject.getElement().getStyle().clearDisplay(); 070 } 071 } 072 073 @Override 074 public void setVisible(boolean visible) { 075 uiObject.setVisible(visible); 076 077 // setVisible(false) sets display:none, if the control is flex before hidden 078 // we need to reset to display:flex when the control is made visible again 079 if (displayValueBeforeHidden != null && visible) { 080 setDisplay(displayValueBeforeHidden); 081 } 082 } 083 084 @Override 085 public void setFlexDirection(FlexDirection flexDirection) { 086 boolean isCurrentlyVisible = uiObject.isVisible(); 087 088 if (flexDirection != null) { 089 setDisplay(Display.FLEX); 090 } 091 BrowserPrefixHelper.updateStyleProperties(uiObject.getElement(), 092 new String[]{"MsFlexDirection", "WebkitFlexDirection", "MozFlexDirection", "flexDirection"}, 093 flexDirection != null ? flexDirection.getValue() : null); 094 095 // Updating the display to Flex will set display:flex and override the visibility of the control 096 // this ensures that if you setVisible(false) it will not become visible unless calling setVisible(true) 097 if (!isCurrentlyVisible) { 098 setVisible(false); 099 } 100 } 101 102 @Override 103 public void setFlex(Flex flex) { 104 if (flex == null) { 105 setFlexGrow(null); 106 setFlexShrink(null); 107 setFlexBasis(null); 108 return; 109 } 110 111 setFlexGrow(flex.getGrow()); 112 setFlexShrink(flex.getShrink()); 113 setFlexBasis(flex.getBasis()); 114 } 115 116 @Override 117 public void setFlexGrow(Integer flexGrow) { 118 BrowserPrefixHelper.updateStyleProperties(uiObject.getElement(), 119 new String[]{"MsFlexGrow", "WebkitFlexGrow", "MozFlexGrow", "flexGrow"}, 120 flexGrow != null ? flexGrow.toString() : null); 121 } 122 123 @Override 124 public void setFlexShrink(Integer flexShrink) { 125 BrowserPrefixHelper.updateStyleProperties(uiObject.getElement(), 126 new String[]{"MsFlexShrink", "WebkitFlexShrink", "MozFlexShrink", "flexShrink"}, 127 flexShrink != null ? flexShrink.toString() : null); 128 } 129 130 @Override 131 public void setFlexBasis(String flexBasis) { 132 BrowserPrefixHelper.updateStyleProperties(uiObject.getElement(), 133 new String[]{"MsFlexBasis", "WebkitFlexBasis", "MozFlexBasis", "flexBasis"}, flexBasis); 134 } 135 136 @Override 137 public void setFlexOrder(Integer flexOrder) { 138 BrowserPrefixHelper.updateStyleProperties(uiObject.getElement(), 139 new String[]{"MsFlexOrder", "WebkitOrder", "MozFlexOrder", "order"}, 140 flexOrder != null ? flexOrder.toString() : null); 141 } 142 143 @Override 144 public void setFlexWrap(FlexWrap flexWrap) { 145 BrowserPrefixHelper.updateStyleProperties(uiObject.getElement(), 146 new String[]{"MsFlexWrap", "WebkitFlexWrap", "MozFlexWrap", "flexWrap"}, 147 flexWrap != null ? flexWrap.getValue() : null); 148 } 149 150 @Override 151 public void setFlexAlignContent(FlexAlignContent flexAlignContent) { 152 BrowserPrefixHelper.updateStyleProperties(uiObject.getElement(), 153 "MsFlexLinePack", new String[]{"WebkitAlignContent", "MozFlexAlignContent", "alignContent"}, flexAlignContent); 154 } 155 156 @Override 157 public void setFlexAlignSelf(FlexAlignSelf flexAlignSelf) { 158 BrowserPrefixHelper.updateStyleProperties(uiObject.getElement(), 159 "MsFlexItemAlign", new String[]{"WebkitAlignSelf", "MozFlexItemAlign", "alignSelf"}, flexAlignSelf); 160 } 161 162 @Override 163 public void setFlexAlignItems(FlexAlignItems flexAlignItems) { 164 BrowserPrefixHelper.updateStyleProperties(uiObject.getElement(), 165 "MsFlexAlign", new String[]{"WebkitAlignItems", "MozFlexAlign", "alignItems"}, flexAlignItems); 166 } 167 168 @Override 169 public void setFlexJustifyContent(FlexJustifyContent flexJustifyContent) { 170 BrowserPrefixHelper.updateStyleProperties(uiObject.getElement(), 171 "MsFlexPack", new String[]{"WebkitJustifyContent", "MozJustifyContent", "justifyContent"}, flexJustifyContent); 172 } 173}