blob: facc12cc4dce7ee0ac78a8547c90aa58044a0166 [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.facet.impl.ui;
import com.intellij.facet.ui.FacetEditor;
import com.intellij.facet.ui.MultipleFacetEditorHelper;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.ui.DocumentAdapter;
import com.intellij.util.NotNullFunction;
import com.intellij.util.ui.ThreeStateCheckBox;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import java.util.ArrayList;
import java.util.List;
/**
* @author nik
*/
public class MultipleFacetEditorHelperImpl implements MultipleFacetEditorHelper {
private static final Logger LOG = Logger.getInstance("#com.intellij.facet.ui.MultipleFacetSettingsEditor");
private final List<AbstractBinding> myBindings = new ArrayList<AbstractBinding>();
@Override
public void bind(@NotNull ThreeStateCheckBox common, @NotNull FacetEditor[] editors, @NotNull NotNullFunction<FacetEditor, JCheckBox> fun) {
List<JCheckBox> checkBoxesList = new ArrayList<JCheckBox>();
for (FacetEditor editor : editors) {
checkBoxesList.add(fun.fun(editor));
}
CheckBoxBinding checkBoxBinding = new CheckBoxBinding(common, checkBoxesList);
myBindings.add(checkBoxBinding);
}
@Override
public void bind(@NotNull JTextField common, @NotNull FacetEditor[] editors, @NotNull NotNullFunction<FacetEditor, JTextField> fun) {
List<JTextField> componentsList = new ArrayList<JTextField>();
for (FacetEditor editor : editors) {
componentsList.add(fun.fun(editor));
}
TextFieldBinding binding = new TextFieldBinding(common, componentsList);
myBindings.add(binding);
}
@Override
public void bind(@NotNull JComboBox common, @NotNull FacetEditor[] editors, @NotNull NotNullFunction<FacetEditor, JComboBox> fun) {
List<JComboBox> componentsList = new ArrayList<JComboBox>();
for (FacetEditor editor : editors) {
componentsList.add(fun.fun(editor));
}
CombobBoxBinding binding = new CombobBoxBinding(common, componentsList);
myBindings.add(binding);
}
@Override
public void unbind() {
for (AbstractBinding binding : myBindings) {
binding.unbind();
}
myBindings.clear();
}
private static abstract class AbstractBinding {
public abstract void unbind();
}
private static class CheckBoxBinding extends AbstractBinding implements ActionListener {
private final ThreeStateCheckBox myCommon;
private final List<JCheckBox> myCheckBoxesList;
private final List<Boolean> myInitialValues;
public CheckBoxBinding(final ThreeStateCheckBox common, final List<JCheckBox> checkBoxesList) {
LOG.assertTrue(!checkBoxesList.isEmpty());
myCommon = common;
myCheckBoxesList = checkBoxesList;
Boolean initialValue = checkBoxesList.get(0).isSelected();
myInitialValues = new ArrayList<Boolean>();
for (JCheckBox checkBox : checkBoxesList) {
boolean value = checkBox.isSelected();
myInitialValues.add(value);
if (initialValue != null && value != initialValue) {
initialValue = null;
}
}
if (initialValue != null) {
common.setThirdStateEnabled(false);
common.setSelected(initialValue);
}
else {
common.setThirdStateEnabled(true);
common.setState(ThreeStateCheckBox.State.DONT_CARE);
}
myCommon.addActionListener(this);
}
@Override
public void actionPerformed(final ActionEvent e) {
ThreeStateCheckBox.State state = myCommon.getState();
for (int i = 0; i < myCheckBoxesList.size(); i++) {
boolean value = state == ThreeStateCheckBox.State.SELECTED ? true : state == ThreeStateCheckBox.State.NOT_SELECTED ? false : myInitialValues.get(i);
JCheckBox checkBox = myCheckBoxesList.get(i);
if (value != checkBox.isSelected()) {
ButtonModel model = checkBox.getModel();
model.setArmed(true);
model.setPressed(true);
model.setPressed(false);
model.setArmed(false);
}
}
}
@Override
public void unbind() {
myCommon.removeActionListener(this);
}
}
private static class TextFieldBinding extends AbstractBinding {
private final JTextField myCommon;
private final List<JTextField> myTextFields;
private final List<String> myInitialValues;
private final DocumentAdapter myListener;
private TextFieldBinding(final JTextField common, final List<JTextField> textFields) {
LOG.assertTrue(!textFields.isEmpty());
myCommon = common;
myTextFields = textFields;
String initialValue = myTextFields.get(0).getText();
myInitialValues = new ArrayList<String>();
for (JTextField field : myTextFields) {
String value = field.getText();
myInitialValues.add(value);
if (initialValue != null && !initialValue.equals(value)) {
initialValue = null;
}
}
common.setText(initialValue != null ? initialValue : "");
myListener = new DocumentAdapter() {
@Override
protected void textChanged(final DocumentEvent e) {
TextFieldBinding.this.textChanged();
}
};
myCommon.getDocument().addDocumentListener(myListener);
}
protected void textChanged() {
String value = myCommon.getText();
for (int i = 0; i < myTextFields.size(); i++) {
myTextFields.get(i).setText(value.length() == 0 ? myInitialValues.get(i) : value);
}
}
@Override
public void unbind() {
myCommon.getDocument().removeDocumentListener(myListener);
}
}
private static class CombobBoxBinding extends AbstractBinding implements ItemListener {
private final JComboBox myCommon;
private final List<JComboBox> myComponentsList;
private final List<Object> myInitialValues;
public CombobBoxBinding(final JComboBox common, final List<JComboBox> componentsList) {
LOG.assertTrue(!componentsList.isEmpty());
myCommon = common;
myComponentsList = componentsList;
JComboBox first = componentsList.get(0);
Object initialValue = first.getSelectedItem();
myInitialValues = new ArrayList<Object>();
for (JComboBox component : componentsList) {
Object item = component.getSelectedItem();
myInitialValues.add(item);
if (initialValue != null && !initialValue.equals(item)) {
initialValue = null;
}
}
common.setSelectedItem(initialValue);
common.addItemListener(this);
}
@Override
public void unbind() {
myCommon.removeItemListener(this);
}
@Override
public void itemStateChanged(final ItemEvent e) {
Object item = myCommon.getSelectedItem();
for (int i = 0; i < myComponentsList.size(); i++) {
myComponentsList.get(i).setSelectedItem(item != null ? item : myInitialValues.get(i));
}
}
}
}