The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Padre::Plugin::Catalyst::Panel;

use strict;
use warnings;

our $VERSION = '0.09';

use Padre::Wx ();
use Wx        ();
use base 'Wx::Panel';

sub new {
	my $class = shift;
	my $main  = shift;
	my $self  = $class->SUPER::new( Padre::Current->main->bottom );

	require Scalar::Util;
	$self->{main} = $main;
	Scalar::Util::weaken( $self->{main} );

	# main container
	my $box = Wx::BoxSizer->new(Wx::wxVERTICAL);

	# top box, holding buttons, icons and checkboxes
	my $top_box = Wx::BoxSizer->new(Wx::wxHORIZONTAL);

	# visual led showing server state
	my $led = Wx::StaticBitmap->new( $self, -1, Wx::wxNullBitmap );
	$led->SetBitmap( $self->led('red') );
	$top_box->Add( $led, 0, Wx::wxALIGN_CENTER_VERTICAL );
	$self->{led} = $led;

	# button to toggle server
	my $button = Wx::Button->new( $self, -1, Wx::gettext('Start Server') );

	#Wx::Event::EVT_BUTTON( $self, $button, \&Padre::Plugin::Catalyst::toggle_server );
	Wx::Event::EVT_BUTTON(
		$self, $button,
		sub {
			my $panel = shift;
			if ( $panel->{button}->GetLabel eq Wx::gettext('Start Server') ) {
				$panel->{main}->on_start_server;
			} else {
				$panel->{main}->on_stop_server;
			}
		},
	);
	$top_box->Add( $button, 0, Wx::wxALIGN_CENTER_VERTICAL );

	# checkbox to auto-restart
	my $checkbox = Wx::CheckBox->new( $self, -1, Wx::gettext('auto-restart') );
	Wx::Event::EVT_CHECKBOX( $self, $checkbox, sub { shift->{config}->{auto_restart} ^= 1 } );
	$top_box->Add( $checkbox, 0, Wx::wxALIGN_CENTER_VERTICAL );

	# finishing up the top_box
	#$box->Add( $top_box, 1, Wx::wxGROW );
	$box->Add( $top_box, 0, Wx::wxALIGN_LEFT | Wx::wxALIGN_CENTER_VERTICAL );

	# output panel for server
	require Padre::Wx::Output;
	my $output = Padre::Wx::Output->new($self);
	$box->Add( $output, 1, Wx::wxGROW );

	# wrapping it up
	$self->SetSizer($box);

	# holding on to some objects we'll need to manipulate later on
	$self->{output}   = $output;
	$self->{button}   = $button;
	$self->{checkbox} = $checkbox;

	return $self;
}

sub output { return shift->{output} }

sub gettext_label { return Wx::gettext('Catalyst Dev Server') }

sub toggle_panel {
	my ( $self, $enable ) = (@_);

	my $new_label = [ Wx::gettext('Stop Server'), Wx::gettext('Start Server') ];

	$self->{checkbox}->Enable($enable);
	$self->{button}->SetLabel( $new_label->[$enable] );

	$self->{led}->SetBitmap( $self->led( $enable == 1 ? 'red' : 'green' ) );
}

# dirty hack to allow seamless use of Padre::Wx::Output
sub bottom { return $_[0] }

# and now some xpm icons for the server leds
sub led {
	my ( $self, $color ) = (@_);

	my @red = (
		'20 20 192 2',   '  	c None',    '. 	c #DE9898',  '+ 	c #EC9D9D', '@ 	c #FA9C9C',
		'# 	c #FD9898',  '$ 	c #FC8B8B', '% 	c #F67979',  '& 	c #E46A6A', '* 	c #CD5757',
		'= 	c #C88989',  '- 	c #F9ACAC', '; 	c #FFB8B8',  '> 	c #FFBEBE', ', 	c #FEBDBD',
		'\' 	c #FFB5B5', ') 	c #FFA6A6', '! 	c #FE9393',  '~ 	c #FF7D7D', '{ 	c #FF6868',
		'] 	c #E85151',  '^ 	c #BB3D3D', '/ 	c #DE9797',  '( 	c #FAACAC', '_ 	c #FFC2C2',
		': 	c #FFD1D1',  '< 	c #FED9D9', '[ 	c #FFD8D8',  '} 	c #FFCECE', '| 	c #FFBDBD',
		'1 	c #FFA8A8',  '2 	c #FF8E8E', '3 	c #FF7575',  '4 	c #FF5D5D', '5 	c #FF4646',
		'6 	c #BD7B7B',  '7 	c #FFA2A2', '8 	c #FFBCBC',  '9 	c #FFD4D4', '0 	c #FFE5E5',
		'a 	c #FFEDED',  'b 	c #FFE2E2', 'c 	c #FFD0D0',  'd 	c #FFB7B7', 'e 	c #FF9C9C',
		'f 	c #FF8080',  'g 	c #FF6666', 'h 	c #FF4F4F',  'i 	c #F33A3A', 'j 	c #F28F8F',
		'k 	c #FFA9A9',  'l 	c #FEC6C6', 'm 	c #FFDFDF',  'n 	c #FFF0F0', 'o 	c #FFFAFA',
		'p 	c #FFF8F8',  'q 	c #FFDADA', 'r 	c #FFC0C0',  's 	c #FFA3A3', 't 	c #FF8787',
		'u 	c #FF6B6B',  'v 	c #FF5252', 'w 	c #FF3D3D',  'x 	c #D77C7C', 'y 	c #FD8C8C',
		'z 	c #FFAAAA',  'A 	c #FFC7C7', 'B 	c #FFE0E0',  'C 	c #FFF2F2', 'D 	c #FFFCFC',
		'E 	c #FFEFEF',  'F 	c #FFDCDC', 'G 	c #FFA5A5',  'H 	c #FF8888', 'I 	c #FF6C6C',
		'J 	c #FF5454',  'K 	c #FF3E3E', 'L 	c #FF2B2B',  'M 	c #C26A6A', 'N 	c #FFC1C1',
		'O 	c #FFD9D9',  'P 	c #FFEAEA', 'Q 	c #FFF3F3',  'R 	c #FFE8E8', 'S 	c #FFD5D5',
		'T 	c #FFA1A1',  'U 	c #FF8585', 'V 	c #FF6969',  'W 	c #FF5151', 'X 	c #A83838',
		'Y 	c #F25F5F',  'Z 	c #FF7E7E', '` 	c #FF9999',  ' .	c #FFB4B4', '..	c #FFCACA',
		'+.	c #FFB0B0',  '@.	c #FF9797', '#.	c #FF7C7C',  '$.	c #FF6363', '%.	c #FF4D4D',
		'&.	c #FF3A3A',  '*.	c #FE2B2B', '=.	c #E52525',  '-.	c #FB5A5A', ';.	c #FF7272',
		'>.	c #FF8A8A',  ',.	c #FFC3C3', '\'.	c #FFB3B3', ').	c #FF9F9F', '!.	c #FF7070',
		'~.	c #FF5A5A',  '{.	c #FF4747', '].	c #FF3535',  '^.	c #FF2727', '/.	c #E32727',
		'(.	c #F14C4C',  '_.	c #FF7777', ':.	c #FF8B8B',  '<.	c #FFAFAF', '[.	c #FFAEAE',
		'}.	c #FFA7A7',  '|.	c #FF9A9A', '1.	c #FF7676',  '2.	c #FF6262', '3.	c #FF2E2E',
		'4.	c #FF2323',  '5.	c #E22222', '6.	c #D24343',  '7.	c #FF7474', '8.	c #FF8181',
		'9.	c #FF8C8C',  '0.	c #FF9191', 'a.	c #FF7373',  'b.	c #FF5353', 'c.	c #FF4343',
		'd.	c #FF2828',  'e.	c #FE1E1E', 'f.	c #E71A1A',  'g.	c #FE5151', 'h.	c #FF7171',
		'i.	c #FF5E5E',  'j.	c #FF4444', 'k.	c #FF3737',  'l.	c #FE2222', 'm.	c #FF1414',
		'n.	c #EF3939',  'o.	c #FE3F3F', 'p.	c #FF4949',  'q.	c #FF5858', 'r.	c #FF5B5B',
		's.	c #FF4040',  't.	c #FF3636', 'u.	c #FF2C2C',  'v.	c #FF1A1A', 'w.	c #CB2727',
		'x.	c #C73636',  'y.	c #FF2F2F', 'z.	c #FE3838',  'A.	c #FF4242', 'B.	c #FF4545',
		'C.	c #FF3F3F',  'D.	c #FF3939', 'E.	c #FF3232',  'F.	c #FF2929', 'G.	c #FF1C1C',
		'H.	c #FF1010',  'I.	c #C53535', 'J.	c #FF2D2D',  'K.	c #FF3131', 'L.	c #FF3333',
		'M.	c #FF2A2A',  'N.	c #FF2525', 'O.	c #FE1F1F',  'P.	c #FE1A1A', 'Q.	c #FF1111',
		'R.	c #B03737',  'S.	c #FF1E1E', 'T.	c #FE2424',  'U.	c #FF2424', 'V.	c #FF2121',
		'W.	c #FF1717',  'X.	c #FF0808', 'Y.	c #DE2424',  'Z.	c #F21F1F', '`.	c #FF1818',
		' +	c #FF1616',  '.+	c #FF1313', '++	c #EE1A1A',  '@+	c #D22222', '#+	c #983C3C',
		'$+	c #963E3E',  '%+	c #963D3D', '&+	c #983A3A',
		'                                        ',
		'                                        ',
		'            . + @ # $ % & *             ',
		'        = - ; > , \' ) ! ~ { ] ^         ',
		'      / ( _ : < [ } | 1 2 3 4 5 ^       ',
		'    6 7 8 9 0 a a b c d e f g h i ^     ',
		'    j k l m n o p a q r s t u v w ^     ',
		'  x y z A B C D o E F _ G H I J K L ^   ',
		'  M H G N O P Q C R S | T U V W w L X   ',
		'  Y Z `  ...q b b [ A +.@.#.$.%.&.*.=.  ',
		'  -.;.>.T \' ,.....N \'.).H !.~.{.].^./.  ',
		'  (.$._.:.e 1 <.[.}.|.>.1.2.h K 3.4.5.  ',
		'  6.v $.7.8.9.0.0.9.8.a.$.b.c.].d.e.f.  ',
		'  ^ c.g.4 { h.3 3 h.V i.W j.k.L l.m.^   ',
		'    n.o.p.W q.r.r.q.v p.s.t.u.4.v.w.^   ',
		'    x.y.z.K A.B.B.c.C.D.E.F.4.G.H.^     ',
		'      I.^.J.K.L.L.E.3.M.N.O.P.Q.^       ',
		'        R.S.4.T.N.U.V.S.P.W.X.^         ',
		'          ^ Y.Z.`.`. +.+++@+^           ',
		'              ^ #+$+%+&+^               ',
	);

	# I'm too lazy to create a green XPM
	my @green = ();
	foreach (@red) {
		my $color = $_;
		$color =~ s/#(\w\w)(\w\w)/#$2$1/;
		push @green, $color;
	}

	my $led = {
		red   => \@red,
		green => \@green,
	};

	return Wx::Bitmap->newFromXPM( $led->{$color} )
		if exists $led->{$color};

	return;
}



1;