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.user.client.ui.HasEnabled;
023import com.google.gwt.user.client.ui.Widget;
024import gwt.material.design.client.base.HasWaves;
025import gwt.material.design.client.base.Waves;
026import gwt.material.design.client.constants.WavesType;
027
028/**
029 * @author Ben Dol
030 */
031public class WavesMixin<T extends Widget & HasWaves> extends AbstractMixin<T> implements HasWaves {
032
033    private WavesType waves;
034
035    public WavesMixin(final T widget) {
036        super(widget);
037    }
038
039    @Override
040    public void setUiObject(T uiObject) {
041        super.setUiObject(uiObject);
042
043        // Apply waves to the ui object
044        setWaves(waves);
045    }
046
047    @Override
048    public void setWaves(WavesType waves) {
049        uiObject.removeStyleName(Waves.WAVES_STYLE);
050        if (this.waves != null) {
051            uiObject.removeStyleName(this.waves.getCssName());
052        }
053
054        this.waves = waves;
055
056        if (waves != null) {
057            boolean enabled = !(uiObject instanceof HasEnabled) || ((HasEnabled) uiObject).isEnabled();
058            if (enabled) {
059                uiObject.addStyleName(Waves.WAVES_STYLE);
060            }
061
062            uiObject.addStyleName(waves.getCssName());
063            if (enabled) {
064                Waves.detectAndApply(uiObject);
065            }
066        }
067    }
068
069    @Override
070    public WavesType getWaves() {
071        return waves;
072    }
073}