107 lines
3.6 KiB
C++
107 lines
3.6 KiB
C++
//===--- TextInput.h - Main Interface ---------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file defines the main interface for the TextInput library.
|
|
//
|
|
// Axel Naumann <axel@cern.ch>, 2011-05-12
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef TEXTINPUT_TEXTINPUT_H
|
|
#define TEXTINPUT_TEXTINPUT_H
|
|
|
|
#include <stddef.h>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
namespace textinput {
|
|
class Colorizer;
|
|
class Display;
|
|
class EditorRange;
|
|
class FunKey;
|
|
class InputData;
|
|
class Reader;
|
|
class TextInputContext;
|
|
class TabCompletion;
|
|
|
|
// Main interface to textinput library.
|
|
class TextInput {
|
|
public:
|
|
// State of input
|
|
enum EReadResult {
|
|
kRRNone, // uninitialized
|
|
kRRReadEOLDelimiter, // end of line is entered, can take input
|
|
kRRCharLimitReached, // SetMaxPendingCharsToRead() of input are read
|
|
kRRNoMorePendingInput, // no input available
|
|
kRREOF // end of file has been reached
|
|
};
|
|
|
|
TextInput(Reader& reader, Display& display,
|
|
const char* histFile = 0);
|
|
~TextInput();
|
|
|
|
// Getters
|
|
const TextInputContext* GetContext() const { return fContext; }
|
|
bool IsInputHidden() const { return fHidden; }
|
|
|
|
size_t GetMaxPendingCharsToRead() const { return fMaxChars; }
|
|
bool IsReadingAllPendingChars() const { return fMaxChars == (size_t) -1; }
|
|
bool IsBlockingUntilEOL() const { return fMaxChars == 0; }
|
|
|
|
// Setters
|
|
void SetPrompt(const char* p);
|
|
void HideInput(bool hidden = true) { fHidden = hidden; }
|
|
void SetColorizer(Colorizer* c);
|
|
void SetCompletion(TabCompletion* tc);
|
|
void SetFunctionKeyHandler(FunKey* fc);
|
|
|
|
void SetMaxPendingCharsToRead(size_t nMax) { fMaxChars = nMax; }
|
|
void SetReadingAllPendingChars() { fMaxChars = (size_t) -1; }
|
|
void SetBlockingUntilEOL() { fMaxChars = 0; }
|
|
|
|
// Read interface
|
|
EReadResult ReadInput();
|
|
EReadResult GetReadState() const { return fLastReadResult; }
|
|
char GetLastKey() const { return fLastKey; }
|
|
const std::string& GetInput();
|
|
void TakeInput(std::string& input); // Take and reset input
|
|
bool AtEOL() const { return fLastReadResult == kRRReadEOLDelimiter || AtEOF(); }
|
|
bool AtEOF() const { return fLastReadResult == kRREOF; }
|
|
bool HavePendingInput() const;
|
|
|
|
// Display interface
|
|
void Redraw();
|
|
void UpdateDisplay(const EditorRange& r);
|
|
void DisplayInfo(const std::vector<std::string>& lines);
|
|
void HandleResize();
|
|
|
|
void GrabInputOutput() const;
|
|
void ReleaseInputOutput() const;
|
|
|
|
// History interface
|
|
bool IsAutoHistAddEnabled() const { return fAutoHistAdd; }
|
|
void EnableAutoHistAdd(bool enable = true) { fAutoHistAdd = enable; }
|
|
void AddHistoryLine(const char* line);
|
|
|
|
private:
|
|
void EmitSignal(char c, EditorRange& r);
|
|
void ProcessNewInput(const InputData& in, EditorRange& r);
|
|
void DisplayNewInput(EditorRange& r, size_t& oldCursorPos);
|
|
|
|
bool fHidden; // whether input should be shown
|
|
bool fAutoHistAdd; // whether input should be added to history
|
|
char fLastKey; // most recently read key
|
|
size_t fMaxChars; // Num chars to read; 0 for blocking, -1 for all available
|
|
EReadResult fLastReadResult; // current input state
|
|
TextInputContext* fContext; // context object
|
|
mutable bool fActive; // whether textinput is controlling input/output
|
|
bool fNeedPromptRedraw; // whether the prompt should be redrawn on next attach
|
|
};
|
|
}
|
|
#endif
|