/*
 * 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.lang.ant.config.impl.configuration;

import com.intellij.lang.ant.config.impl.AllJarsUnderDirEntry;
import com.intellij.lang.ant.config.impl.AntClasspathEntry;
import com.intellij.lang.ant.config.impl.SinglePathEntry;
import com.intellij.ui.ListUtil;
import com.intellij.util.config.AbstractProperty;
import com.intellij.util.config.ListProperty;

import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class AntClasspathEditorPanel extends JPanel {
  private ListProperty<AntClasspathEntry> myClasspathProperty;
  private final Form myForm = new Form();
  private UIPropertyBinding.Composite myBinding;

  public AntClasspathEditorPanel() {
    super(new BorderLayout());
    add(myForm.myWholePanel, BorderLayout.CENTER);
  }

  public UIPropertyBinding setClasspathProperty(ListProperty<AntClasspathEntry> classpathProperty) {
    myClasspathProperty = classpathProperty;
    myBinding = new UIPropertyBinding.Composite();
    UIPropertyBinding.OrderListBinding<AntClasspathEntry> classpathBinding = myBinding.bindList(myForm.myClasspathList, myClasspathProperty);
    classpathBinding.addAddManyFacility(myForm.myAddButton,
                                        new SinglePathEntry.AddEntriesFactory(myForm.myClasspathList));
    classpathBinding.addAddManyFacility(myForm.myAddAllInDir,
                                        new AllJarsUnderDirEntry.AddEntriesFactory(myForm.myClasspathList));
    myBinding.addBinding(new UIPropertyBinding() {
      public void loadValues(AbstractProperty.AbstractPropertyContainer container) {
      }

      public void apply(AbstractProperty.AbstractPropertyContainer container) {
      }

      public void beDisabled() {
        myForm.enableButtons(false);
      }

      public void beEnabled() {
        myForm.enableButtons(true);
      }

      public void addAllPropertiesTo(Collection<AbstractProperty> properties) {
      }
    });
    return myBinding;
  }

  public static class Form {
    private JButton myAddButton;
    private JButton myAddAllInDir;
    private JButton myRemoveButton;
    private JButton myMoveUpButton;
    private JButton myMoveDownButton;
    private JPanel myWholePanel;
    private JList myClasspathList;
    private final ArrayList<ListUtil.Updatable> myUpdatables = new ArrayList<ListUtil.Updatable>();

    public Form() {
      myClasspathList.setCellRenderer(new AntUIUtil.ClasspathRenderer());

      myUpdatables.add(ListUtil.addRemoveListener(myRemoveButton, myClasspathList));
      myUpdatables.add(ListUtil.addMoveUpListener(myMoveUpButton, myClasspathList));
      myUpdatables.add(ListUtil.addMoveDownListener(myMoveDownButton, myClasspathList));
    }

    public void enableButtons(boolean enable) {
      for (Iterator<ListUtil.Updatable> iterator = myUpdatables.iterator(); iterator.hasNext();) {
        ListUtil.Updatable updatable = iterator.next();
        updatable.enable(enable);
      }
    }
  }

  public JComponent getPreferedFocusComponent() {
    return myForm.myClasspathList;
  }
}
