/*
 * Copyright 2016 The Bazel Authors. All rights reserved.
 *
 * 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.google.idea.blaze.base.ui;

import com.intellij.ide.util.BrowseFilesListener;
import com.intellij.openapi.ui.ComponentWithBrowseButton;
import com.intellij.openapi.ui.TextComponentAccessor;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.TextFieldWithStoredHistory;

import javax.annotation.Nullable;

/**
 * A file selector panel with text field, browse button and stored history.
 */
public class FileSelectorWithStoredHistory extends ComponentWithBrowseButton<TextFieldWithStoredHistory> {

  public static FileSelectorWithStoredHistory create(String historyKey, String title) {
    TextFieldWithStoredHistory textField = new TextFieldWithStoredHistory(historyKey);
    return new FileSelectorWithStoredHistory(textField, title);
  }

  private FileSelectorWithStoredHistory(TextFieldWithStoredHistory textField, String title) {
    super(textField, null);

    addBrowseFolderListener(
      title,
      "",
      null,
      BrowseFilesListener.SINGLE_FILE_DESCRIPTOR,
      TextComponentAccessor.TEXT_FIELD_WITH_STORED_HISTORY_WHOLE_TEXT);
  }

  /**
   * Set the text without altering the history.
   */
  public void setText(@Nullable String text) {
    if (text == null) {
      getChildComponent().reset();
    } else {
      getChildComponent().setText(text);
    }
  }

  public void setTextWithHistory(@Nullable String text) {
    setText(text);
    if (text != null) {
      getChildComponent().addCurrentTextToHistory();
    }
  }

  @Nullable
  public String getText() {
    String text = getChildComponent().getText();
    return StringUtil.nullize(text);
  }
}
