mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-06 14:27:16 +00:00
(svn r25692) -Add: Replacement of a part of the edit box text with a new string.
This commit is contained in:
parent
30867c487f
commit
d15c1c5d4a
@ -311,9 +311,9 @@ struct IConsoleWindow : Window
|
|||||||
return ES_HANDLED;
|
return ES_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void InsertTextString(int wid, const char *str, bool marked, const char *caret)
|
virtual void InsertTextString(int wid, const char *str, bool marked, const char *caret, const char *insert_location, const char *replacement_end)
|
||||||
{
|
{
|
||||||
if (_iconsole_cmdline.InsertString(str, marked, caret)) {
|
if (_iconsole_cmdline.InsertString(str, marked, caret, insert_location, replacement_end)) {
|
||||||
IConsoleWindow::scroll = 0;
|
IConsoleWindow::scroll = 0;
|
||||||
IConsoleResetHistoryPos();
|
IConsoleResetHistoryPos();
|
||||||
this->SetDirty();
|
this->SetDirty();
|
||||||
|
@ -71,7 +71,7 @@ extern Dimension _cur_resolution;
|
|||||||
extern Palette _cur_palette; ///< Current palette
|
extern Palette _cur_palette; ///< Current palette
|
||||||
|
|
||||||
void HandleKeypress(uint keycode, WChar key);
|
void HandleKeypress(uint keycode, WChar key);
|
||||||
void HandleTextInput(const char *str, bool marked = false, const char *caret = NULL);
|
void HandleTextInput(const char *str, bool marked = false, const char *caret = NULL, const char *insert_location = NULL, const char *replacement_end = NULL);
|
||||||
void HandleCtrlChanged();
|
void HandleCtrlChanged();
|
||||||
void HandleMouseEvents();
|
void HandleMouseEvents();
|
||||||
void CSleep(int milliseconds);
|
void CSleep(int milliseconds);
|
||||||
|
@ -153,13 +153,23 @@ bool Textbuf::InsertChar(WChar key)
|
|||||||
* @param str String to insert.
|
* @param str String to insert.
|
||||||
* @param marked Replace the currently marked text with the new text.
|
* @param marked Replace the currently marked text with the new text.
|
||||||
* @param caret Move the caret to this point in the insertion string.
|
* @param caret Move the caret to this point in the insertion string.
|
||||||
|
* @param insert_location Position at which to insert the string.
|
||||||
|
* @param replacement_end Replace all characters from #insert_location up to this location with the new string.
|
||||||
* @return True on successful change of Textbuf, or false otherwise.
|
* @return True on successful change of Textbuf, or false otherwise.
|
||||||
*/
|
*/
|
||||||
bool Textbuf::InsertString(const char *str, bool marked, const char *caret)
|
bool Textbuf::InsertString(const char *str, bool marked, const char *caret, const char *insert_location, const char *replacement_end)
|
||||||
{
|
{
|
||||||
uint16 insertpos = (marked && this->marklength != 0) ? this->markpos : this->caretpos;
|
uint16 insertpos = (marked && this->marklength != 0) ? this->markpos : this->caretpos;
|
||||||
|
if (insert_location != NULL) {
|
||||||
|
insertpos = insert_location - this->buf;
|
||||||
|
if (insertpos > this->bytes) return NULL;
|
||||||
|
|
||||||
if (marked) this->DiscardMarkedText(str == NULL);
|
if (replacement_end != NULL) {
|
||||||
|
this->DeleteText(insertpos, replacement_end - this->buf, str == NULL);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (marked) this->DiscardMarkedText(str == NULL);
|
||||||
|
}
|
||||||
|
|
||||||
if (str == NULL) return false;
|
if (str == NULL) return false;
|
||||||
|
|
||||||
@ -219,6 +229,42 @@ bool Textbuf::InsertClipboard()
|
|||||||
return this->InsertString(utf8_buf, false);
|
return this->InsertString(utf8_buf, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete a part of the text.
|
||||||
|
* @param from Start of the text to delete.
|
||||||
|
* @param to End of the text to delete.
|
||||||
|
* @param update Set to true if the internal state should be updated.
|
||||||
|
*/
|
||||||
|
void Textbuf::DeleteText(uint16 from, uint16 to, bool update)
|
||||||
|
{
|
||||||
|
uint c = 0;
|
||||||
|
const char *s = this->buf + from;
|
||||||
|
while (s < this->buf + to) {
|
||||||
|
Utf8Consume(&s);
|
||||||
|
c++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Strip marked characters from buffer. */
|
||||||
|
memmove(this->buf + from, this->buf + to, this->bytes - to);
|
||||||
|
this->bytes -= to - from;
|
||||||
|
this->chars -= c;
|
||||||
|
|
||||||
|
/* Fixup caret if needed. */
|
||||||
|
if (this->caretpos > from) {
|
||||||
|
if (this->caretpos <= to) {
|
||||||
|
this->caretpos = from;
|
||||||
|
} else {
|
||||||
|
this->caretpos -= to - from;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (update) {
|
||||||
|
this->UpdateStringIter();
|
||||||
|
this->UpdateCaretPosition();
|
||||||
|
this->UpdateMarkedText();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Discard any marked text.
|
* Discard any marked text.
|
||||||
* @param update Set to true if the internal state should be updated.
|
* @param update Set to true if the internal state should be updated.
|
||||||
@ -227,35 +273,8 @@ void Textbuf::DiscardMarkedText(bool update)
|
|||||||
{
|
{
|
||||||
if (this->markend == 0) return;
|
if (this->markend == 0) return;
|
||||||
|
|
||||||
/* Count marked characters. */
|
this->DeleteText(this->markpos, this->markend, update);
|
||||||
uint c = 0;
|
this->markpos = this->markend = this->markxoffs = this->marklength = 0;
|
||||||
const char *s = this->buf + this->markpos;
|
|
||||||
while (s < this->buf + this->markend) {
|
|
||||||
Utf8Consume(&s);
|
|
||||||
c++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Strip marked characters from buffer. */
|
|
||||||
memmove(this->buf + this->markpos, this->buf + this->markend, this->bytes - this->markend);
|
|
||||||
this->bytes -= this->markend - this->markpos;
|
|
||||||
this->chars -= c;
|
|
||||||
|
|
||||||
/* Fixup caret if needed. */
|
|
||||||
if (this->caretpos > this->markpos) {
|
|
||||||
if (this->caretpos <= this->markend) {
|
|
||||||
this->caretpos = this->markpos;
|
|
||||||
} else {
|
|
||||||
this->caretpos -= this->markend - this->markpos;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this->markpos = this->markend = 0;
|
|
||||||
|
|
||||||
if (update) {
|
|
||||||
this->UpdateStringIter();
|
|
||||||
this->UpdateCaretPosition();
|
|
||||||
this->UpdateMarkedText();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Update the character iter after the text has changed. */
|
/** Update the character iter after the text has changed. */
|
||||||
|
@ -56,7 +56,7 @@ struct Textbuf {
|
|||||||
bool InsertClipboard();
|
bool InsertClipboard();
|
||||||
|
|
||||||
bool InsertChar(uint32 key);
|
bool InsertChar(uint32 key);
|
||||||
bool InsertString(const char *str, bool marked, const char *caret = NULL);
|
bool InsertString(const char *str, bool marked, const char *caret = NULL, const char *insert_location = NULL, const char *replacement_end = NULL);
|
||||||
|
|
||||||
bool DeleteChar(uint16 keycode);
|
bool DeleteChar(uint16 keycode);
|
||||||
bool MovePos(uint16 keycode);
|
bool MovePos(uint16 keycode);
|
||||||
@ -73,6 +73,8 @@ private:
|
|||||||
|
|
||||||
bool CanDelChar(bool backspace);
|
bool CanDelChar(bool backspace);
|
||||||
|
|
||||||
|
void DeleteText(uint16 from, uint16 to, bool update);
|
||||||
|
|
||||||
void UpdateStringIter();
|
void UpdateStringIter();
|
||||||
void UpdateWidth();
|
void UpdateWidth();
|
||||||
void UpdateCaretPosition();
|
void UpdateCaretPosition();
|
||||||
|
@ -2620,12 +2620,12 @@ void HandleCtrlChanged()
|
|||||||
* @param wid Edit box widget.
|
* @param wid Edit box widget.
|
||||||
* @param str Text string to insert.
|
* @param str Text string to insert.
|
||||||
*/
|
*/
|
||||||
/* virtual */ void Window::InsertTextString(int wid, const char *str, bool marked, const char *caret)
|
/* virtual */ void Window::InsertTextString(int wid, const char *str, bool marked, const char *caret, const char *insert_location, const char *replacement_end)
|
||||||
{
|
{
|
||||||
QueryString *query = this->GetQueryString(wid);
|
QueryString *query = this->GetQueryString(wid);
|
||||||
if (query == NULL) return;
|
if (query == NULL) return;
|
||||||
|
|
||||||
if (query->text.InsertString(str, marked, caret) || marked) {
|
if (query->text.InsertString(str, marked, caret, insert_location, replacement_end) || marked) {
|
||||||
this->SetWidgetDirty(wid);
|
this->SetWidgetDirty(wid);
|
||||||
this->OnEditboxChanged(wid);
|
this->OnEditboxChanged(wid);
|
||||||
}
|
}
|
||||||
@ -2637,11 +2637,11 @@ void HandleCtrlChanged()
|
|||||||
* @param marked Is the input a marked composition string from an IME?
|
* @param marked Is the input a marked composition string from an IME?
|
||||||
* @param caret Move the caret to this point in the insertion string.
|
* @param caret Move the caret to this point in the insertion string.
|
||||||
*/
|
*/
|
||||||
void HandleTextInput(const char *str, bool marked, const char *caret)
|
void HandleTextInput(const char *str, bool marked, const char *caret, const char *insert_location, const char *replacement_end)
|
||||||
{
|
{
|
||||||
if (!EditBoxInGlobalFocus()) return;
|
if (!EditBoxInGlobalFocus()) return;
|
||||||
|
|
||||||
_focused_window->InsertTextString(_focused_window->window_class == WC_CONSOLE ? 0 : _focused_window->nested_focus->index, str, marked, caret);
|
_focused_window->InsertTextString(_focused_window->window_class == WC_CONSOLE ? 0 : _focused_window->nested_focus->index, str, marked, caret, insert_location, replacement_end);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -496,7 +496,7 @@ public:
|
|||||||
bool SetFocusedWidget(int widget_index);
|
bool SetFocusedWidget(int widget_index);
|
||||||
|
|
||||||
EventState HandleEditBoxKey(int wid, WChar key, uint16 keycode);
|
EventState HandleEditBoxKey(int wid, WChar key, uint16 keycode);
|
||||||
virtual void InsertTextString(int wid, const char *str, bool marked, const char *caret);
|
virtual void InsertTextString(int wid, const char *str, bool marked, const char *caret, const char *insert_location, const char *replacement_end);
|
||||||
|
|
||||||
void HandleButtonClick(byte widget);
|
void HandleButtonClick(byte widget);
|
||||||
int GetRowFromWidget(int clickpos, int widget, int padding, int line_height = -1) const;
|
int GetRowFromWidget(int clickpos, int widget, int padding, int line_height = -1) const;
|
||||||
|
Loading…
Reference in New Issue
Block a user