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

外挂编程

开发平台:

Windows_Unix

  1. #########################################################################
  2. #  OpenKore - WxWidgets Interface
  3. #
  4. #  Copyright (c) 2005,2007 OpenKore development team 
  5. #
  6. #  This program is free software; you can redistribute it and/or modify
  7. #  it under the terms of the GNU General Public License as published by
  8. #  the Free Software Foundation; either version 2 of the License, or
  9. #  (at your option) any later version.
  10. #
  11. #  This program is distributed in the hope that it will be useful,
  12. #  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. #  GNU General Public License for more details.
  15. #
  16. #  $Revision$
  17. #  $Id$
  18. #
  19. #########################################################################
  20. ##
  21. # MODULE DESCRIPTION: Notebook page child used by DockNotebook
  22. #
  23. # This is class is a mostly-private class used by Interface::Wx::DockNotebook.
  24. # The only function you are allowed to use is $page->set().
  25. package Interface::Wx::DockNotebook::Page;
  26. use strict;
  27. use Wx ':everything';
  28. use Wx::Event qw(EVT_CLOSE EVT_SET_FOCUS);
  29. use base qw(Wx::Panel);
  30. use Interface::Wx::TitleBar;
  31. sub new {
  32. my ($class, $parent, $show_buttons, $title) = @_;
  33. my $self = $class->SUPER::new($parent, -1);
  34. my $vbox = $self->{vbox} = new Wx::BoxSizer(wxVERTICAL);
  35. my $titlebar = new Interface::Wx::TitleBar($self, $title, !$show_buttons);
  36. $titlebar->onDetach(&onDetach, $self);
  37. $titlebar->onClose(&onClose, $self);
  38. $self->{title} = $title;
  39. $self->{show_buttons} = $show_buttons;
  40. $vbox->Add($titlebar, 0, wxGROW);
  41. $vbox->SetItemMinSize($titlebar, -1, $titlebar->{size});
  42. $self->SetSizer($vbox);
  43. my $sub = sub { $self->onFocus(@_); };
  44. EVT_SET_FOCUS($self, $sub);
  45. EVT_SET_FOCUS($titlebar, $sub);
  46. return $self;
  47. }
  48. ##
  49. # $page->set(child)
  50. # child: A child control.
  51. #
  52. # Add a child control to this notebook page.
  53. # See $docknotebook->newPage() for information.
  54. sub set {
  55. my ($self, $child) = @_;
  56. return if ($self->{child});
  57. $self->{child} = $child;
  58. $self->{vbox}->Add($child, 1, wxGROW);
  59. $self->{vbox}->Layout;
  60. }
  61. ###### Private ######
  62. sub getDock {
  63. my $self = shift;
  64. my $parent = $self->GetParent;
  65. $parent = $parent->GetParent if (!$parent->isa("Interface::Wx::DockNotebook"));
  66. return $parent;
  67. }
  68. sub onDetach {
  69. my $self = shift;
  70. my $dock = $self->getDock;
  71. my $dialog = $self->{dialog} = new Wx::Dialog($self->GetGrandParent, -1, $self->{title},
  72. wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER);
  73. $self->{dialog} = $dialog;
  74. EVT_CLOSE($dialog, sub { $self->onDialogClose($dock); });
  75. $self->{child}->Reparent($dialog);
  76. $dialog->Layout;
  77. $dialog->Show(1);
  78. $dock->closePage($self);
  79. push @{$dock->{dialogs}}, $self;
  80. if ($^O eq 'MSWin32') {
  81. $self->{child}->Layout;
  82. $self->{child}->Fit;
  83. my $size = $self->{child}->GetBestSize;
  84. my $w = $size->GetWidth;
  85. my $h = $size->GetHeight;
  86. $w = 150 if ($w < 150);
  87. $h = 150 if ($h < 150);
  88. $dialog->SetClientSize($w, $h);
  89. }
  90. }
  91. sub onDialogClose {
  92. my ($self, $dock) = @_;
  93. $self->{dialog}->Show(0);
  94. $self->{dialog}->Destroy;
  95. for (my $i = 0; $i < @{$dock->{dialogs}}; $i++) {
  96. if ($dock->{dialogs}[$i] eq $self) {
  97. delete $dock->{dialogs}[$i];
  98. return;
  99. }
  100. }
  101. }
  102. sub onClose {
  103. my $self = shift;
  104. $self->getDock->closePage($self);
  105. }
  106. sub onFocus {
  107. my ($self, undef, $event) = @_;
  108. if ($self->{child}) {
  109. $self->{child}->SetFocus;
  110. } else {
  111. $event->Skip;
  112. }
  113. }
  114. 1;