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

# Implements a toolbar with a small amount of extra intelligence.
# Please note that currently this toolbar class is ONLY suitable for
# use as the toolbar for the main window and is not reusable.

use 5.008;
use strict;
use warnings;
use Params::Util      ();
use Padre::Current    ();
use Padre::Wx         ();
use Padre::Wx::Icon   ();
use Padre::Wx::Editor ();
use Padre::Constant   ();

our $VERSION = '1.00';
our @ISA     = qw{
	Padre::Wx::Role::Main
	Wx::ToolBar
};

# NOTE: Something is wrong with dockable toolbars on Windows
#       so disable them for now.
use constant DOCKABLE => !Padre::Constant::WIN32;





######################################################################
# Construction

sub new {
	my $class  = shift;
	my $main   = shift;
	my $config = $main->config;

	# Prepare the style
	my $style = Wx::TB_HORIZONTAL | Wx::TB_FLAT | Wx::TB_NODIVIDER | Wx::BORDER_NONE;
	if ( DOCKABLE and not $config->main_lockinterface ) {
		$style = $style | Wx::TB_DOCKABLE;
	}

	# Create the parent Wx object
	my $self = $class->SUPER::new(
		$main,
		-1,
		Wx::DefaultPosition,
		Wx::DefaultSize,
		$style,
		5050,
	);

	# Default icon size is 16x15 for Wx, to use the 16x16 GPL
	# icon sets we need to be SLIGHTLY bigger.
	$self->SetToolBitmapSize( Wx::Size->new( 16, 16 ) );

	# This is a very first step to create a customizable toolbar.
	# Actually there is no dialog for editing this parameter, if
	# anyone wants to change the toolbar, it needs to be done manuelly
	# within config.yml.
	my @tools = split /\;/, $config->main_toolbar_items;

	foreach my $item (@tools) {
		if ( $item eq '|' ) {
			$self->add_separator;

		} elsif ( $item =~ /^(.+?)\((.*)\)$/ ) {
			$self->add_tool_item(
				action => "$1",
				args   => split( /\,/, $2 ),
			);

		} elsif ( $item =~ /^(.+?)$/ ) {
			$self->add_tool_item(
				action => "$1",
			);

		} else {

			# Silently ignore bad toolbar elements (for now)
			# warn( 'Unknown toolbar item: ' . $item );
		}
	}

	return $self;
}





######################################################################
# Main Methods

# Because some tools may not work, we only want to draw the separator
# for real once we are absolutely sure there is a real tool after it.
sub add_separator {
	$_[0]->{separator} = 1;
}

# Add a tool item to the toolbar re-using Padre menu action name
sub add_tool_item {
	my $self = shift;
	my %args = @_;

	# Find the action, silently aborting if it is unusable
	my $actions = $self->ide->actions;
	my $action  = $actions->{ $args{action} } or return;
	my $icon    = $action->toolbar_icon or return;

	# Make sure the item list if initialised
	unless ( Params::Util::_HASH0( $self->{item_list} ) ) {
		$self->{item_list} = {};
	}

	# The ID code should be unique otherwise it can break the event
	# system. If set to -1 such as in the default call below,
	# it will override any previous item with that id.
	my $id = Wx::NewId();
	$self->{item_list}->{$id} = $action;

	# If there is a delayed separator, add it now
	if ( $self->{separator} ) {
		$self->AddSeparator;
		$self->{separator} = 0;
	}

	# Create the tool
	$self->AddTool(
		$id,
		'',
		Padre::Wx::Icon::find($icon),
		$action->label_text,
	);

	# Add the optional event hook
	Wx::Event::EVT_TOOL(
		$self->main,
		$id,
		$action->menu_event,
	);

	return $id;
}

sub refresh {
	my $self     = shift;
	my $current  = Padre::Current::_CURRENT(@_);
	my $editor   = $current->editor;
	my $document = $current->document;
	my $modified = ( defined $document and $document->is_modified );
	my $text     = defined Params::Util::_STRING( $current->text );
	my $file     = ( defined $document and defined $document->file and defined $document->file->filename );

	foreach my $item ( keys( %{ $self->{item_list} } ) ) {
		my $action = $self->{item_list}->{$item};
		if ( $action->{need_editor} and not $editor ) {
			$self->EnableTool( $item, 0 );

		} elsif ( $action->{need_file} and not $file ) {
			$self->EnableTool( $item, 0 );

		} elsif ( $action->{need_modified} and not $modified ) {
			$self->EnableTool( $item, 0 );

		} elsif ( $action->{need_selection} and not $text ) {
			$self->EnableTool( $item, 0 );

		} elsif ( $action->{need} and not $action->{need}->($current) ) {
			$self->EnableTool( $item, 0 );

		} else {
			$self->EnableTool( $item, 1 );
		}
	}

	return;
}

1;

# Copyright 2008-2013 The Padre development team as listed in Padre.pm.
# LICENSE
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Perl 5 itself.