/*
* Geotoolkit - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2015, Geomatys
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotoolkit.gui.javafx.style.dynamicrange;
import java.util.ArrayList;
import java.util.List;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import org.geotoolkit.display2d.ext.dynamicrange.DynamicRangeSymbolizer;
import org.geotoolkit.gui.javafx.style.FXStyleElementController;
import org.geotoolkit.map.MapLayer;
/**
*
* @author Johann Sorel (Geomatys)
*/
public class FXDynamicRangeSymbolizer extends FXStyleElementController<DynamicRangeSymbolizer> {
@FXML
private FXDRChannel uiChannelR;
@FXML
private FXDRChannel uiChannelG;
@FXML
private FXDRChannel uiChannelB;
@FXML
private FXDRChannel uiChannelA;
@Override
public Class<DynamicRangeSymbolizer> getEditedClass() {
return DynamicRangeSymbolizer.class;
}
@Override
public DynamicRangeSymbolizer newValue() {
return new DynamicRangeSymbolizer();
}
@Override
public void initialize() {
super.initialize();
uiChannelR.lock(DynamicRangeSymbolizer.DRChannel.BAND_RED);
uiChannelG.lock(DynamicRangeSymbolizer.DRChannel.BAND_GREEN);
uiChannelB.lock(DynamicRangeSymbolizer.DRChannel.BAND_BLUE);
uiChannelA.lock(DynamicRangeSymbolizer.DRChannel.BAND_ALPHA);
final ChangeListener changeListener = (ChangeListener) (ObservableValue observable, Object oldValue, Object newValue) -> {
if(updating) return;
final DynamicRangeSymbolizer element = new DynamicRangeSymbolizer();
final List<DynamicRangeSymbolizer.DRChannel> channels = new ArrayList<>();
channels.add(uiChannelR.valueProperty().get());
channels.add(uiChannelG.valueProperty().get());
channels.add(uiChannelB.valueProperty().get());
channels.add(uiChannelA.valueProperty().get());
element.setChannels(channels);
value.set(element);
};
uiChannelR.valueProperty().addListener(changeListener);
uiChannelG.valueProperty().addListener(changeListener);
uiChannelB.valueProperty().addListener(changeListener);
uiChannelA.valueProperty().addListener(changeListener);
}
@Override
protected void updateEditor(DynamicRangeSymbolizer styleElement) {
if(styleElement!=null){
for(DynamicRangeSymbolizer.DRChannel c : styleElement.getChannels()){
final String cs = c.getColorSpaceComponent();
if(DynamicRangeSymbolizer.DRChannel.BAND_RED.equalsIgnoreCase(cs)){
uiChannelR.valueProperty().setValue(c);
}else if(DynamicRangeSymbolizer.DRChannel.BAND_GREEN.equalsIgnoreCase(cs)){
uiChannelG.valueProperty().setValue(c);
}else if(DynamicRangeSymbolizer.DRChannel.BAND_BLUE.equalsIgnoreCase(cs)){
uiChannelB.valueProperty().setValue(c);
}else if(DynamicRangeSymbolizer.DRChannel.BAND_ALPHA.equalsIgnoreCase(cs)){
uiChannelA.valueProperty().setValue(c);
}
}
}
}
@Override
public void setLayer(MapLayer layer) {
super.setLayer(layer);
uiChannelR.setLayer(layer);
uiChannelG.setLayer(layer);
uiChannelB.setLayer(layer);
uiChannelA.setLayer(layer);
}
@FXML
public void fitToData(ActionEvent event){
uiChannelR.fitToData();
uiChannelG.fitToData();
uiChannelB.fitToData();
uiChannelA.fitToData();
}
}