/*
* Copyright (C) 2011 Brockmann Consult GmbH (info@brockmann-consult.de)
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 3 of the License, or (at your option)
* any later version.
* This program 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 General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, see http://www.gnu.org/licenses/
*/
package org.esa.snap.rcp.preferences.layer;
import com.bc.ceres.binding.Property;
import com.bc.ceres.binding.PropertySet;
import com.bc.ceres.glayer.support.ImageLayer;
import com.bc.ceres.swing.TableLayout;
import com.bc.ceres.swing.binding.BindingContext;
import com.bc.ceres.swing.binding.Enablement;
import com.bc.ceres.swing.binding.PropertyEditorRegistry;
import org.esa.snap.rcp.preferences.DefaultConfigController;
import org.esa.snap.rcp.preferences.Preference;
import org.esa.snap.rcp.preferences.PreferenceUtils;
import org.esa.snap.ui.product.ProductSceneView;
import org.netbeans.spi.options.OptionsPanelController;
import org.openide.util.HelpCtx;
import javax.swing.Box;
import javax.swing.JComponent;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Insets;
/**
* * Panel handling image layer preferences. Sub-panel of the "Layer"-panel.
*
* @author thomas
*/
@OptionsPanelController.SubRegistration(location = "LayerPreferences",
displayName = "#Options_DisplayName_LayerImage",
keywords = "#Options_Keywords_LayerImage",
keywordsCategory = "Layer",
id = "LayerImage")
@org.openide.util.NbBundle.Messages({
"Options_DisplayName_LayerImage=Image Layer",
"Options_Keywords_LayerImage=layer, image"
})
public final class ImageLayerController extends DefaultConfigController {
/**
* Preferences key for the background color
*/
public static final String PROPERTY_KEY_IMAGE_BG_COLOR = "image.background.color";
/**
* Preferences key for showing image border
*/
public static final String PROPERTY_KEY_IMAGE_BORDER_SHOWN = "image.border.shown";
/**
* Preferences key for image border size
*/
public static final String PROPERTY_KEY_IMAGE_BORDER_SIZE = "image.border.size";
/**
* Preferences key for image border color
*/
public static final String PROPERTY_KEY_IMAGE_BORDER_COLOR = "image.border.color";
/**
* Preferences key for showing pixel image border
*/
public static final String PROPERTY_KEY_PIXEL_BORDER_SHOWN = "pixel.border.shown";
/**
* Preferences key for pixel border size
*/
public static final String PROPERTY_KEY_PIXEL_BORDER_SIZE = "pixel.border.size";
/**
* Preferences key for pixel border color
*/
public static final String PROPERTY_KEY_PIXEL_BORDER_COLOR = "pixel.border.color";
private JComponent[] imageBorderColorComponents;
private JComponent[] pixelBorderColorComponents;
protected PropertySet createPropertySet() {
return createPropertySet(new ImageLayerBean());
}
@Override
protected JPanel createPanel(BindingContext context) {
TableLayout tableLayout = new TableLayout(2);
tableLayout.setTableAnchor(TableLayout.Anchor.NORTHWEST);
tableLayout.setTablePadding(new Insets(4, 10, 0, 0));
tableLayout.setTableFill(TableLayout.Fill.BOTH);
tableLayout.setColumnWeightX(1, 1.0);
tableLayout.setCellColspan(1, 0, 2);
tableLayout.setCellColspan(4, 0, 2);
JPanel pageUI = new JPanel(tableLayout);
PropertyEditorRegistry registry = PropertyEditorRegistry.getInstance();
Property backgroundColor = context.getPropertySet().getProperty(PROPERTY_KEY_IMAGE_BG_COLOR);
Property showImageBorder = context.getPropertySet().getProperty(PROPERTY_KEY_IMAGE_BORDER_SHOWN);
Property imageBorderSize = context.getPropertySet().getProperty(PROPERTY_KEY_IMAGE_BORDER_SIZE);
Property imageBorderColor = context.getPropertySet().getProperty(PROPERTY_KEY_IMAGE_BORDER_COLOR);
Property showPixelBorder = context.getPropertySet().getProperty(PROPERTY_KEY_PIXEL_BORDER_SHOWN);
Property pixelBorderSize = context.getPropertySet().getProperty(PROPERTY_KEY_PIXEL_BORDER_SIZE);
Property pixelBorderColor = context.getPropertySet().getProperty(PROPERTY_KEY_PIXEL_BORDER_COLOR);
JComponent[] backgroundColorComponents = PreferenceUtils.createColorComponents(backgroundColor);
JComponent[] showImageBorderComponents = registry.findPropertyEditor(showImageBorder.getDescriptor()).createComponents(showImageBorder.getDescriptor(), context);
JComponent[] imageBorderSizeComponents = registry.findPropertyEditor(imageBorderSize.getDescriptor()).createComponents(imageBorderSize.getDescriptor(), context);
imageBorderColorComponents = PreferenceUtils.createColorComponents(imageBorderColor);
JComponent[] showPixelBorderComponents = registry.findPropertyEditor(showPixelBorder.getDescriptor()).createComponents(showPixelBorder.getDescriptor(), context);
JComponent[] pixelBorderSizeComponents = registry.findPropertyEditor(pixelBorderSize.getDescriptor()).createComponents(pixelBorderSize.getDescriptor(), context);
pixelBorderColorComponents = PreferenceUtils.createColorComponents(pixelBorderColor);
// row 0
pageUI.add(backgroundColorComponents[0]);
pageUI.add(backgroundColorComponents[1]);
// row 1
pageUI.add(showImageBorderComponents[0]);
// row 2
pageUI.add(imageBorderSizeComponents[1]);
pageUI.add(imageBorderSizeComponents[0]);
// row 3
pageUI.add(imageBorderColorComponents[0]);
pageUI.add(imageBorderColorComponents[1]);
// row 4
pageUI.add(showPixelBorderComponents[0]);
// row 5
pageUI.add(pixelBorderSizeComponents[1]);
pageUI.add(pixelBorderSizeComponents[0]);
// row 6
pageUI.add(pixelBorderColorComponents[0]);
pageUI.add(pixelBorderColorComponents[1]);
// row 7+
pageUI.add(tableLayout.createVerticalSpacer());
JPanel parent = new JPanel(new BorderLayout());
parent.add(pageUI, BorderLayout.CENTER);
parent.add(Box.createHorizontalStrut(100), BorderLayout.EAST);
return parent;
}
@Override
protected void configure(BindingContext context) {
Enablement enablementImageBorderSize = context.bindEnabledState(PROPERTY_KEY_IMAGE_BORDER_SIZE, false, PROPERTY_KEY_IMAGE_BORDER_SHOWN, false);
context.getPropertySet().getProperty(PROPERTY_KEY_IMAGE_BORDER_SHOWN).addPropertyChangeListener(evt -> {
enablementImageBorderSize.apply();
for (JComponent imageBorderColorComponent : imageBorderColorComponents) {
imageBorderColorComponent.setEnabled(((Boolean) evt.getNewValue()));
}
});
Enablement enablementPixelBorderSize = context.bindEnabledState(PROPERTY_KEY_PIXEL_BORDER_SIZE, false, PROPERTY_KEY_PIXEL_BORDER_SHOWN, false);
context.getPropertySet().getProperty(PROPERTY_KEY_PIXEL_BORDER_SHOWN).addPropertyChangeListener(evt -> {
enablementPixelBorderSize.apply();
for (JComponent pixelBorderColorComponent : pixelBorderColorComponents) {
pixelBorderColorComponent.setEnabled(((Boolean) evt.getNewValue()));
}
});
for (JComponent imageBorderColorComponent : imageBorderColorComponents) {
imageBorderColorComponent.setEnabled(ImageLayer.DEFAULT_BORDER_SHOWN);
}
}
@Override
public HelpCtx getHelpCtx() {
return new HelpCtx("layer");
}
@SuppressWarnings("UnusedDeclaration")
static class ImageLayerBean {
@Preference(label = "Background colour",
key = PROPERTY_KEY_IMAGE_BG_COLOR)
Color backgroundColor = ProductSceneView.DEFAULT_IMAGE_BACKGROUND_COLOR;
@Preference(label = "Show image border",
key = PROPERTY_KEY_IMAGE_BORDER_SHOWN)
boolean showImageBorder = ImageLayer.DEFAULT_BORDER_SHOWN;
@Preference(label = "Image border size",
key = PROPERTY_KEY_IMAGE_BORDER_SIZE)
double imageBorderSize = ImageLayer.DEFAULT_BORDER_WIDTH;
@Preference(label = "Image border colour",
key = PROPERTY_KEY_IMAGE_BORDER_COLOR)
Color imageBorderColor = ImageLayer.DEFAULT_BORDER_COLOR;
@Preference(label = "Show pixel borders in magnified views",
key = PROPERTY_KEY_PIXEL_BORDER_SHOWN)
boolean showPixelBorder = ImageLayer.DEFAULT_PIXEL_BORDER_SHOWN;
@Preference(label = "Pixel border size",
key = PROPERTY_KEY_PIXEL_BORDER_SIZE)
double pixelBorderSize = ImageLayer.DEFAULT_PIXEL_BORDER_WIDTH;
@Preference(label = "Pixel border colour",
key = PROPERTY_KEY_PIXEL_BORDER_COLOR)
Color pixelBorderColor = ImageLayer.DEFAULT_PIXEL_BORDER_COLOR;
}
}