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

import com.intellij.openapi.components.*;
import com.intellij.util.xmlb.XmlSerializerUtil;
import com.intellij.util.xmlb.annotations.Transient;
import org.jetbrains.annotations.NonNls;

import java.io.File;

@State(
  name = "UsageViewSettings",
  storages = {
    @Storage(
      file = StoragePathMacros.APP_CONFIG + "/other.xml"
    )}
)
public class UsageViewSettings implements PersistentStateComponent<UsageViewSettings> {
  @NonNls public String EXPORT_FILE_NAME = "report.txt";
  public boolean IS_EXPANDED = false;
  public boolean IS_SHOW_PACKAGES = true;
  public boolean IS_SHOW_METHODS = false;
  public boolean IS_AUTOSCROLL_TO_SOURCE = false;
  public boolean IS_FILTER_DUPLICATED_LINE = false;
  public boolean IS_SHOW_MODULES = false;
  public boolean IS_PREVIEW_USAGES = false;
  public boolean IS_SORT_MEMBERS_ALPHABETICALLY = true;
  public float PREVIEW_USAGES_SPLITTER_PROPORTIONS = 0.5f;

  public boolean GROUP_BY_USAGE_TYPE = true;
  public boolean GROUP_BY_MODULE = true;
  public boolean GROUP_BY_PACKAGE = true;
  public boolean GROUP_BY_FILE_STRUCTURE = true;
  public boolean GROUP_BY_SCOPE = false;

  public static UsageViewSettings getInstance() {
    return ServiceManager.getService(UsageViewSettings.class);
  }

  public boolean isExpanded() {
    return IS_EXPANDED;
  }

  public void setExpanded(boolean val) {
    IS_EXPANDED = val;
  }

  public boolean isShowPackages() {
    return IS_SHOW_PACKAGES;
  }

  public void setShowPackages(boolean val) {
    IS_SHOW_PACKAGES = val;
  }

  public boolean isShowMethods() {
    return IS_SHOW_METHODS;
  }

  public boolean isShowModules() {
    return IS_SHOW_MODULES;
  }

  public void setShowMethods(boolean val) {
    IS_SHOW_METHODS = val;
  }

  public void setShowModules(boolean val) {
    IS_SHOW_MODULES = val;
  }

  public boolean isFilterDuplicatedLine() {
    return IS_FILTER_DUPLICATED_LINE;
  }

  public void setFilterDuplicatedLine(boolean val) {
    IS_FILTER_DUPLICATED_LINE = val;
  }

  @Transient
  public String getExportFileName() {
    return EXPORT_FILE_NAME != null ? EXPORT_FILE_NAME.replace('/', File.separatorChar) : null;
  }

  public void setExportFileName(String s) {
    if (s != null){
      s = s.replace(File.separatorChar, '/');
    }
    EXPORT_FILE_NAME = s;
  }

  @Override
  public UsageViewSettings getState() {
    return this;
  }

  @Override
  public void loadState(final UsageViewSettings object) {
    XmlSerializerUtil.copyBean(object, this);
  }
}
