/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file LICENSE.rst or https://cmake.org/licensing for details.  */
#pragma once

#include "cmConfigure.h" // IWYU pragma: keep

#include <string>

#include "cmCursesStandardIncludes.h"
#include "cmCursesStringWidget.h"

class cmCursesMainForm;

class cmCursesPathWidget : public cmCursesStringWidget
{
public:
  cmCursesPathWidget(int width, int height, int left, int top);

  cmCursesPathWidget(cmCursesPathWidget const&) = delete;
  cmCursesPathWidget& operator=(cmCursesPathWidget const&) = delete;

  /**
   * This method is called when different keys are pressed. The
   * subclass can have a special implementation handler for this.
   */
  void OnTab(cmCursesMainForm* fm, WINDOW* w) override;
  void OnReturn(cmCursesMainForm* fm, WINDOW* w) override;
  void OnType(int& key, cmCursesMainForm* fm, WINDOW* w) override;

protected:
  std::string LastString;
  std::string LastGlob;
  bool Cycle;
  std::string::size_type CurrentIndex;
};
