/*
 * Copyright 2000-2013 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.lang.Language;
import com.intellij.openapi.editor.EditorSettings;
import com.intellij.openapi.editor.ex.EditorEx;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;

import javax.swing.*;

/**
 * Provides default implementation for {@link EditorTextFieldProvider} service and applies available
 * {@link EditorCustomization customizations} if necessary.
 *
 * @author Denis Zhdanov
 * @since Aug 20, 2010 3:21:03 PM
 */
public class EditorTextFieldProviderImpl implements EditorTextFieldProvider {
  @NotNull
  @Override
  public EditorTextField getEditorField(@NotNull Language language, @NotNull Project project,
                                        @NotNull final Iterable<EditorCustomization> features) {
    return new MyEditorTextField(language, project, features);
  }

  private static class MyEditorTextField extends LanguageTextField {

    @NotNull private final Iterable<EditorCustomization> myCustomizations;

    MyEditorTextField(@NotNull Language language, @NotNull Project project, @NotNull Iterable<EditorCustomization> customizations) {
      super(language, project, "", false);
      myCustomizations = customizations;
    }

    @Override
    protected EditorEx createEditor() {
      final EditorEx ex = super.createEditor();
      ex.getScrollPane().setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
      ex.setHorizontalScrollbarVisible(true);
      applyDefaultSettings(ex);
      applyCustomizations(ex);
      return ex;
    }

    private static void applyDefaultSettings(EditorEx ex) {
      EditorSettings settings = ex.getSettings();
      settings.setAdditionalColumnsCount(3);
      settings.setVirtualSpace(false);
    }

    private void applyCustomizations(@NotNull EditorEx editor) {
      for (EditorCustomization customization : myCustomizations) {
        customization.customize(editor);
      }
    }

    @Override
    protected boolean isOneLineMode() {
      return false;
    }
  }
}
