BBS-Perm

 view release on metacpan or  search on metacpan

lib/BBS/Perm/Plugin/Feed.pm  view on Meta::CPAN

package BBS::Perm::Plugin::Feed;

use warnings;
use strict;
use Carp;
use Gtk2;
use Glib qw/TRUE FALSE/;
use File::Slurp;
use Encode;

sub new {
    my ( $class, %args ) = @_;
    my $self = {};
    bless $self, ref $class || $class;

    my $entry  = Gtk2::Entry->new;
    my $label  = Gtk2::Label->new_with_mnemonic( $args{label} || '_Feed: ' );
    my $widget = $args{widget} || Gtk2::HBox->new;
    $widget->pack_start( $label, FALSE, FALSE, 0 );
    $widget->pack_start( $entry, TRUE,  TRUE,  0 );
    $entry->signal_connect( changed => sub { $self->_update_store } );
    my $entry_c = Gtk2::EntryCompletion->new;
    $entry->set_completion($entry_c);
    my $store = Gtk2::ListStore->new('Glib::String');

    $entry_c->set_model($store);
    $entry_c->set_text_column(0);
    $entry_c->set_popup_completion(TRUE);
    $entry_c->set_inline_completion(TRUE);
    $self->{entry}    = $entry;
    $self->{label}    = $label;
    $self->{_entry_c} = $entry_c;
    $self->{_store}   = $store;
    $self->{widget}   = $widget;
    return $self;
}

sub _update_store {
    my $self  = shift;
    my $store = $self->{_store};
    my $text  = $self->{entry}->get_text;
    $store->clear;
    if ( $text =~ m{^([^:]*.*/)} ) {
        my $dir = $1;
        my $dh;
        opendir $dh, $1;

        my @names = map { $dir . $_ }
          grep { ( $_ !~ /^\./ ) && ( -d "$dir/$_" || -T "$dir/$_" ) }
          readdir $dh;
        for (@names) {
            my $iter = $store->append;
            $store->set( $iter, 0, $_ );
        }
        closedir $dh;
    }
}

sub text {
    my $self  = shift;
    my $input = $self->entry->get_text;
    my $text;

    my $encoding = 'utf8';    # default is utf8
    if ( $ENV{LLC_ALL} && $ENV{LLC_ALL} =~ /\.(.*)$/ ) {
        $encoding = lc $1;
    }
    elsif ( $ENV{LANG} && $ENV{LANG} =~ /\.(.*)$/ ) {
        $encoding = lc $1;
    }

    if ( $input =~ /^\s*:\s*(.*)/ ) {
        $text = decode $encoding, `$1`;
    }
    elsif ( -f $input ) {
        $text = decode $encoding, read_file($input);
    }
    else {
        carp 'bad input';
    }
    return $text;
}

sub widget {
    return shift->{widget};
}

sub AUTOLOAD {



( run in 2.440 seconds using v1.01-cache-2.11-cpan-364913b4093 )