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

外挂编程

开发平台:

Windows_Unix

  1. #########################################################################
  2. #  OpenKore - WxWidgets Interface
  3. #  Console control
  4. #
  5. #  Copyright (c) 2004 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: 6238 $
  19. #  $Id: Console.pm 6238 2008-03-07 17:10:37Z lastclick $
  20. #
  21. #########################################################################
  22. ##
  23. # MODULE DESCRIPTION: Console control.
  24. #
  25. # This control emulates a console, similar to xterm/gnome-terminal/the DOS box.
  26. # It supports automatic scrolling, colored text, and a bounded scrollback buffer.
  27. package Interface::Wx::Console;
  28. use strict;
  29. use Wx ':everything';
  30. use Wx::RichText;
  31. use base qw(Wx::RichTextCtrl);
  32. use encoding 'utf8';
  33. use Globals qw(%consoleColors);
  34. use Utils::StringScanner;
  35. use constant STYLE_SLOT => 4;
  36. use constant MAX_LINES => 1000;
  37. our %fgcolors;
  38. ##
  39. # Interface::Wx::Console->new(Wx::Window parent)
  40. #
  41. # Create a new Interface::Wx::Console control, with $parent as its parent
  42. # control.
  43. sub new {
  44. my ($class, $parent) = @_;
  45. my $self = $class->SUPER::new($parent, -1, '',
  46. wxDefaultPosition, wxDefaultSize,
  47. wxTE_MULTILINE | wxVSCROLL | wxTE_NOHIDESEL);
  48. $self->SetEditable(0);
  49. $self->BeginSuppressUndo();
  50. $self->SetForegroundColour(wxWHITE);
  51. $self->SetBackgroundColour(wxBLACK);
  52. $self->{defaultStyle} = new Wx::TextAttrEx();
  53. $self->{defaultStyle}->SetTextColour($self->GetForegroundColour());
  54. $self->{defaultStyle}->SetBackgroundColour($self->GetBackgroundColour());
  55. my $font;
  56. if (Wx::wxMSW()) {
  57. $font = new Wx::Font(9, wxMODERN, wxNORMAL, wxNORMAL, 0, 'Courier New');
  58. } else {
  59. $font = new Wx::Font(10, wxMODERN, wxNORMAL, wxNORMAL, 0, 'MiscFixed');
  60. }
  61. $self->setFont($font);
  62. $self->{inputStyle} = {
  63. color => new Wx::Colour(200, 200, 200)
  64. };
  65. return $self;
  66. }
  67. ##
  68. # void $Interface_Wx_Console->setFont(Wx::Font font)
  69. #
  70. # Set the font used in this console.
  71. sub setFont {
  72. my ($self, $font) = @_;
  73. return unless $font->Ok;
  74. $self->{font} = $font;
  75. my $bold = new Wx::Font(
  76. $font->GetPointSize(),
  77. $font->GetFamily(),
  78. $font->GetStyle(),
  79. wxBOLD,
  80. $font->GetUnderlined(),
  81. $font->GetFaceName()
  82. );
  83. $self->{boldFont} = $bold;
  84. $self->{defaultStyle}->SetFont($font);
  85. $self->SetBasicStyleEx($self->{defaultStyle});
  86. $self->Refresh();
  87. foreach my $colorName (keys %fgcolors) {
  88. delete $fgcolors{$colorName}[STYLE_SLOT];
  89. }
  90. }
  91. ##
  92. # void $Wx_Interface_Console->selectFont(Wx::Window parent)
  93. #
  94. # Show a font dialog and let the user pick a font. This font
  95. # will be used in this console.
  96. sub selectFont {
  97. my ($self, $parent) = @_;
  98. my $fontData = new Wx::FontData;
  99. $fontData->SetInitialFont($self->{font});
  100. $fontData->EnableEffects(0);
  101. my $dialog = new Wx::FontDialog($parent, $fontData);
  102. $dialog->Show();
  103. if ($dialog->ShowModal == wxID_OK) {
  104. $self->setFont($dialog->GetFontData->GetChosenFont());
  105. }
  106. $dialog->Destroy();
  107. }
  108. sub copyLastLines {
  109. my ($self, $limit) = @_;
  110. my $startLine = $self->GetNumberOfLines() - $limit;
  111. my $startPos = $self->XYToPosition(0, $startLine < 0 ? 0 : $startLine);
  112. my $endPos = $self->XYToPosition(0, $self->GetNumberOfLines() - 1);
  113. $self->SetSelection($startPos, $endPos);
  114. $self->Copy();
  115. }
  116. sub determineFontStyle {
  117. my ($self, $type, $domain) = @_;
  118. if ($type eq 'input') {
  119. return $self->{inputStyle};
  120. } elsif ($consoleColors{$type}) {
  121. my $result;
  122. $domain = 'default' if (!$consoleColors{$type}{$domain});
  123. my $colorName = $consoleColors{$type}{$domain};
  124. if ($fgcolors{$colorName} && $colorName ne "default" && $colorName ne "reset") {
  125. if ($fgcolors{$colorName}[STYLE_SLOT]) {
  126. $result = $fgcolors{$colorName}[STYLE_SLOT];
  127. } else {
  128. $result = {
  129. color => new Wx::Colour(
  130. $fgcolors{$colorName}[0],
  131. $fgcolors{$colorName}[1],
  132. $fgcolors{$colorName}[2]),
  133. bold => $fgcolors{$colorName}[3]
  134. };
  135. $fgcolors{$colorName}[STYLE_SLOT] = $result;
  136. }
  137. }
  138. else {
  139. $result = {
  140. color => new Wx::Colour(255, 255, 255)
  141. };
  142. $fgcolors{$colorName}[STYLE_SLOT] = $result;
  143. }
  144. return $result;
  145. }
  146. }
  147. sub isAtBottom {
  148. my ($self) = @_;
  149. return $self->IsPositionVisible($self->GetLastPosition()-5);
  150. }
  151. sub finalizePrinting {
  152. my ($self, $wasAtBottom) = @_;
  153. # Limit the number of lines in the console.
  154. if ($self->GetNumberOfLines() > MAX_LINES) {
  155. my $linesToDelete = $self->GetNumberOfLines() - MAX_LINES;
  156. my $pos = $self->XYToPosition(0, $linesToDelete + MAX_LINES / 10);
  157. $self->Remove(0, $pos);
  158. }
  159. $self->ShowPosition($self->GetLastPosition()) if ($wasAtBottom);
  160. }
  161. ##
  162. # void $Interface_Wx_Console->add(String type, String message, String domain)
  163. #
  164. # Print a text to this console, with the given type and domain. See the
  165. # logging framework (@MODULE(Log)) for more information about message
  166. # types and message domains.
  167. sub add {
  168. my ($self, $type, $msg, $domain) = @_;
  169. my $atBottom = $self->isAtBottom();
  170. # Apply the appropriate font style, then add the text, then revert
  171. # back to the previous font style.
  172. my $style = $self->determineFontStyle($type, $domain);
  173. if ($style) {
  174. $self->BeginTextColour($style->{color});
  175. $self->BeginBold() if ($style->{bold});
  176. }
  177. $self->AppendText($msg);
  178. if ($style) {
  179. $self->EndTextColour();
  180. $self->EndBold() if ($style->{bold});
  181. }
  182. $self->finalizePrinting($atBottom);
  183. }
  184. sub addColoredText {
  185. my ($self, $text) = @_;
  186. my $atBottom = $self->isAtBottom();
  187. my $style = new Wx::TextAttrEx();
  188. $style->SetTextColour(wxBLACK);
  189. $style->SetBackgroundColour(wxWHITE);
  190. $self->BeginStyle($style);
  191. my $scanner = new Utils::StringScanner($text);
  192. my $colorCodeEncountered;
  193. while (!$scanner->eos()) {
  194. my $text = $scanner->scanUntil(qr/^[a-fA-F0-9]{6}/o);
  195. if (defined($text) && length($text) > 0) {
  196. # Process text.
  197. $self->AppendText($text);
  198. } else {
  199. $text = $scanner->scan(qr/^[a-fA-F0-9]{6}/o);
  200. if (defined $text) {
  201. # Process color code.
  202. $text =~ /([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/i;
  203. $self->EndTextColour() if ($colorCodeEncountered);
  204. $self->BeginTextColour(new Wx::Colour(hex($1), hex($2), hex($3)));
  205. $colorCodeEncountered = 1;
  206. } else {
  207. # Process text until end-of-string.
  208. $self->AppendText($scanner->rest());
  209. $scanner->terminate();
  210. }
  211. }
  212. }
  213. $self->EndTextColour() if ($colorCodeEncountered);
  214. $self->EndStyle();
  215. $self->finalizePrinting($atBottom);
  216. }
  217. #####################################
  218. # Maps color names to color codes and font weights.
  219. # Format: [R, G, B, bold]
  220. %fgcolors = (
  221. 'reset' => [255, 255, 255],
  222. 'default' => [255, 255, 255],
  223. 'black' => [0, 0, 0],
  224. 'darkgray' => [85, 85, 85],
  225. 'darkgrey' => [85, 85, 85],
  226. 'darkred' => [170, 0, 0],
  227. 'red' => [255, 0, 0, 1],
  228. 'darkgreen' => [0, 170, 0],
  229. 'green' => [0, 255, 0],
  230. 'brown' => [170, 85, 0],
  231. 'yellow' => [255, 255, 85],
  232. 'darkblue' => [85, 85, 255],
  233. 'blue' => [122, 154, 225],
  234. 'darkmagenta' => [170, 0, 170],
  235. 'magenta' => [255, 85, 255],
  236. 'darkcyan' => [0, 170, 170],
  237. 'cyan' => [85, 255, 255],
  238. 'gray' => [170, 170, 170],
  239. 'grey' => [170, 170, 170],
  240. 'white' => [255, 255, 255, 1],
  241. );
  242. 1;