/*
 * 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.ui;

import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.ui.components.JBTextField;

import javax.swing.*;
import javax.swing.event.DocumentEvent;
import java.awt.event.ActionListener;

public class FieldPanel extends AbstractFieldPanel {
  private final JTextField myTextField;

  public FieldPanel() {
    this(new JBTextField(30));
  }

  protected FieldPanel(JTextField textField) {
    super(textField);
    myTextField = textField;
    createComponent();
  }

  public FieldPanel(String labelText, final String viewerDialogTitle, ActionListener browseButtonActionListener, final Runnable documentListener) {
    this(new JBTextField(30), labelText, viewerDialogTitle, browseButtonActionListener, documentListener);
  }

  public FieldPanel(JTextField textField, String labelText, final String viewerDialogTitle, ActionListener browseButtonActionListener, final Runnable documentListener) {
    super(textField, labelText, viewerDialogTitle, browseButtonActionListener, documentListener);
    myTextField = textField;
    createComponent();
  }

  public void createComponent() {
    super.createComponent();
    TextFieldWithBrowseButton.MyDoClickAction doClickAction = getDoClickAction();
    if (doClickAction != null) {
      doClickAction.registerShortcut(getTextField());
    }

    myTextField.getDocument().addDocumentListener(new DocumentAdapter() {
      public void textChanged(DocumentEvent event) {
        if (getChangeListener() != null) {
          getChangeListener().run();
        }
      }
    });
  }

  public String getText() {
    return myTextField.getText();
  }

  public void setText(String text) {
    myTextField.setText(text);
  }

  public JTextField getTextField() {
    return myTextField;
  }

  public static FieldPanel create(String labelText, String viewerDialogTitle) {
    return create(labelText, viewerDialogTitle, null, null);
  }

  public static FieldPanel withPaths(String labelText, String viewerDialogTitle) {
    return withPaths(labelText, viewerDialogTitle, null, null);
  }

  public static FieldPanel withPaths(String labelText, String viewerDialogTitle, ActionListener browseButtonActionListener, Runnable documentListener) {
    FieldPanel fieldPanel = create(labelText, viewerDialogTitle, browseButtonActionListener, documentListener);
    InsertPathAction.addTo(fieldPanel.myTextField);
    return fieldPanel;
  }

  private static FieldPanel create(String labelText, String viewerDialogTitle, ActionListener browseButtonActionListener, Runnable documentListener) {
    return new FieldPanel(labelText, viewerDialogTitle, browseButtonActionListener, documentListener);
  }

  public void setEditable(boolean editable) {
    myTextField.setEditable(editable);
    for (JButton button : myButtons) {
      button.setEnabled(editable);
    }
  }
}
