/** * */ package icy.gui.inspector; import icy.action.CanvasActions; import icy.canvas.IcyCanvas; import icy.canvas.Layer; import icy.gui.component.button.IcyButton; import icy.gui.viewer.Viewer; import icy.main.Icy; import icy.system.thread.ThreadUtil; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.util.List; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSlider; import javax.swing.ScrollPaneConstants; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; /** * @author Stephane */ public class LayerControlPanel extends JPanel implements ChangeListener { /** * */ private static final long serialVersionUID = 6501341338561271486L; // GUI JSlider opacitySlider; IcyButton deleteButton; // internal final LayersPanel layerPanel; private JPanel optionsPanel; public LayerControlPanel(LayersPanel layerPanel) { super(); this.layerPanel = layerPanel; initialize(); opacitySlider.addChangeListener(this); } private void initialize() { setBorder(null); setLayout(new BorderLayout(0, 0)); JScrollPane scrollPane = new JScrollPane(); scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); add(scrollPane, BorderLayout.CENTER); final JPanel actionPanel = new JPanel(); scrollPane.setViewportView(actionPanel); scrollPane.setMaximumSize(new Dimension(32767, 100)); GridBagLayout gbl_actionPanel = new GridBagLayout(); gbl_actionPanel.columnWidths = new int[] {0, 0, 0, 0}; gbl_actionPanel.rowHeights = new int[] {0, 0, 0}; gbl_actionPanel.columnWeights = new double[] {1.0, 1.0, 0.0, Double.MIN_VALUE}; gbl_actionPanel.rowWeights = new double[] {1.0, 0.0, Double.MIN_VALUE}; actionPanel.setLayout(gbl_actionPanel); optionsPanel = new JPanel(); GridBagConstraints gbc_optionsPanel = new GridBagConstraints(); gbc_optionsPanel.gridwidth = 3; gbc_optionsPanel.insets = new Insets(0, 0, 5, 5); gbc_optionsPanel.fill = GridBagConstraints.BOTH; gbc_optionsPanel.gridx = 0; gbc_optionsPanel.gridy = 0; actionPanel.add(optionsPanel, gbc_optionsPanel); optionsPanel.setLayout(new BorderLayout(0, 0)); final JLabel lblOpacity = new JLabel(" Opacity "); GridBagConstraints gbc_lblOpacity = new GridBagConstraints(); gbc_lblOpacity.anchor = GridBagConstraints.WEST; gbc_lblOpacity.insets = new Insets(0, 0, 0, 5); gbc_lblOpacity.gridx = 0; gbc_lblOpacity.gridy = 1; actionPanel.add(lblOpacity, gbc_lblOpacity); opacitySlider = new JSlider(); opacitySlider.setPreferredSize(new Dimension(120, 23)); opacitySlider.setFocusable(false); opacitySlider.setMinimumSize(new Dimension(120, 23)); GridBagConstraints gbc_opacitySlider = new GridBagConstraints(); gbc_opacitySlider.fill = GridBagConstraints.HORIZONTAL; gbc_opacitySlider.insets = new Insets(0, 0, 0, 5); gbc_opacitySlider.gridx = 1; gbc_opacitySlider.gridy = 1; actionPanel.add(opacitySlider, gbc_opacitySlider); deleteButton = new IcyButton(CanvasActions.deleteLayersAction); deleteButton.setFlat(true); GridBagConstraints gbc_deleteButton = new GridBagConstraints(); gbc_deleteButton.anchor = GridBagConstraints.EAST; gbc_deleteButton.gridx = 2; gbc_deleteButton.gridy = 1; actionPanel.add(deleteButton, gbc_deleteButton); validate(); } public void refresh() { final List<Layer> selectedLayers = layerPanel.getSelectedLayers(); final boolean hasSelected = (selectedLayers.size() > 0); final boolean singleSelected = (selectedLayers.size() == 1); final Layer firstSelected = hasSelected ? selectedLayers.get(0) : null; // boolean canEdit = false; boolean canRemove = false; for (Layer layer : selectedLayers) { // canEdit |= !layer.isReadOnly(); canRemove |= layer.getCanBeRemoved(); } final boolean canRemovef = canRemove; ThreadUtil.invokeNow(new Runnable() { @Override public void run() { if (hasSelected) { opacitySlider.setValue((int) (firstSelected.getOpacity() * 100f)); opacitySlider.setEnabled(true); deleteButton.setEnabled(canRemovef); } else { opacitySlider.setEnabled(false); deleteButton.setEnabled(false); } optionsPanel.setVisible(false); optionsPanel.removeAll(); if (singleSelected) { final JPanel panel = firstSelected.getOverlay().getOptionsPanel(); if (panel != null) { optionsPanel.add(panel); optionsPanel.setVisible(true); } } if (getParent() != null) getParent().validate(); else revalidate(); } }); } @Override public void stateChanged(ChangeEvent e) { final Viewer viewer = Icy.getMainInterface().getActiveViewer(); if (viewer != null) { final IcyCanvas canvas = viewer.getCanvas(); if (canvas != null) { final List<Layer> selectedLayers = layerPanel.getSelectedLayers(); final int value = opacitySlider.getValue(); if (selectedLayers.size() > 0) { canvas.beginUpdate(); try { // set layer transparency for (Layer layer : selectedLayers) layer.setOpacity(value / 100f); } finally { canvas.endUpdate(); } } } } } }