/*
 * Copyright 2000-2012 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.formatting;

import com.intellij.openapi.util.TextRange;
import org.jetbrains.annotations.NotNull;

/**
 * Internal interface for creating spacing instances.
 */

interface SpacingFactory {

  @NotNull
  Spacing createSpacing(int minSpaces,
                               int maxSpaces,
                               int minLineFeeds,
                               boolean keepLineBreaks,
                               int keepBlankLines);

  @NotNull
  Spacing getReadOnlySpacing();
  
  @NotNull
  Spacing createDependentLFSpacing(int minSpaces,
                                   int maxSpaces,
                                   @NotNull TextRange dependencyRange,
                                   boolean keepLineBreaks,
                                   int keepBlankLines,
                                   @NotNull DependentSpacingRule rule);

  @NotNull
  Spacing createSafeSpacing(boolean keepLineBreaks,
                            int keepBlankLines);

  @NotNull
  Spacing createKeepingFirstColumnSpacing(final int minSpaces,
                                          final int maxSpaces,
                                          final boolean keepLineBreaks,
                                          final int keepBlankLines);

  @NotNull
  Spacing createSpacing(final int minSpaces, final int maxSpaces, final int minLineFeeds, final boolean keepLineBreaks,
                     final int keepBlankLines, final int prefLineFeeds);
}
