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}