Input.pm.svn-base
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:3k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. #########################################################################
  2. #  OpenKore - WxWidgets Interface
  3. #  Text input control with history support
  4. #
  5. #  Copyright (c) 2004,2007 OpenKore development team 
  6. #
  7. #  This program is free software; you can redistribute it and/or modify
  8. #  it under the terms of the GNU General Public License as published by
  9. #  the Free Software Foundation; either version 2 of the License, or
  10. #  (at your option) any later version.
  11. #
  12. #  This program is distributed in the hope that it will be useful,
  13. #  but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. #  GNU General Public License for more details.
  16. #
  17. #
  18. #  $Revision$
  19. #  $Id$
  20. #
  21. #########################################################################
  22. package Interface::Wx::Input;
  23. use strict;
  24. use Wx ':everything';
  25. use base qw(Wx::TextCtrl);
  26. use Wx::Event qw(EVT_TEXT_ENTER EVT_KEY_DOWN);
  27. use Settings;
  28. use Commands;
  29. use constant MAX_INPUT_HISTORY => 150;
  30. sub new {
  31. my $class = shift;
  32. my $parent = shift;
  33. my $self = $class->SUPER::new($parent, 923, '',
  34. wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER);
  35. $self->{history} = [];
  36. $self->{historyIndex} = -1;
  37. EVT_TEXT_ENTER($self, 923, &_onEnter);
  38. EVT_KEY_DOWN($self, &_onUpdown);
  39. return $self;
  40. }
  41. sub onEnter {
  42. my $self = shift;
  43. $self->{class} = shift;
  44. $self->{func} = shift;
  45. }
  46. sub _onEnter {
  47. my $self = shift;
  48. my $text = $self->GetValue;
  49. if ($self->{func}) {
  50. $self->{func}->($self->{class}, $text);
  51. }
  52. $self->Remove(0, -1);
  53. if (!@{$self->{history}} || $self->{history}[0] ne $text) {
  54. unshift(@{$self->{history}}, $text) if ($text ne "");
  55. }
  56. pop @{$self->{history}} if (@{$self->{history}} > MAX_INPUT_HISTORY);
  57. $self->{historyIndex} = -1;
  58. undef $self->{currentInput};
  59. }
  60. sub _onUpdown {
  61. my $self = shift;
  62. my $event = shift;
  63. if ($event->GetKeyCode == WXK_UP) {
  64. if ($self->{historyIndex} < $#{$self->{history}}) {
  65. $self->{currentInput} = $self->GetValue if (!defined $self->{currentInput});
  66. $self->{historyIndex}++;
  67. $self->SetValue($self->{history}[$self->{historyIndex}]);
  68. $self->SetInsertionPointEnd;
  69. }
  70. } elsif ($event->GetKeyCode == WXK_DOWN) {
  71. if ($self->{historyIndex} > 0) {
  72. $self->{historyIndex}--;
  73. $self->SetValue($self->{history}[$self->{historyIndex}]);
  74. $self->SetInsertionPointEnd;
  75. } elsif ($self->{historyIndex} == 0) {
  76. $self->{historyIndex} = -1;
  77. $self->SetValue($self->{currentInput});
  78. undef $self->{currentInput};
  79. $self->SetInsertionPointEnd;
  80. }
  81. } elsif ($event->GetKeyCode == WXK_TAB && !$event->ShiftDown) {
  82. my $pos = $self->GetInsertionPoint;
  83. my $pre = substr($self->GetValue, 0, $pos);
  84. my $post = substr($self->GetValue, $pos);
  85. my $completed = Commands::complete($pre);
  86. $self->SetValue($completed . $post);
  87. $self->SetInsertionPoint(length($completed));
  88. } elsif ($event->GetKeyCode == WXK_TAB && $event->ShiftDown) {
  89. my $parent = $self->GetParent;
  90. my $targetBox;
  91. $targetBox = $parent->FindWindow('targetBox') if ($parent);
  92. $targetBox->SetFocus if ($targetBox);
  93. } elsif ($event->GetKeyCode == WXK_PAGEDOWN && $event->ControlDown) {
  94. my $parent = $self->GetParent;
  95. my $notebook;
  96. $notebook = $parent->FindWindow('notebook') if ($parent);
  97. $notebook->nextPage if ($notebook);
  98. } elsif ($event->GetKeyCode == WXK_PAGEUP && $event->ControlDown) {
  99. my $parent = $self->GetParent;
  100. my $notebook;
  101. $notebook = $parent->FindWindow('notebook') if ($parent);
  102. $notebook->prevPage if ($notebook);
  103. } else {
  104. $event->Skip;
  105. }
  106. }
  107. 1;