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

use Qt 2.0;

@ISA = qw(Qt::ListViewItem);

sub new {
    my($class, $parent, $filename) = @_;
    my $self = $class->SUPER::new($parent);

    $self->{'readable'} = 1;
    if($filename) {
	$self->{'p'} = $parent;
	$self->{'f'} = $filename;
    } else {
	$self->{'p'} = undef;
	$self->{'f'} = "/";
    }

    return $self;
}

sub setOpen {
    my $self = shift;
    my $o = shift;

    if($o && !$self->childCount()) {
	my $s = $self->fullName();
	unless(-r $s) {
	    $self->{'readable'} = 0;
	    return;
	}

	if(opendir(FILES, $s)) {
	    my $f;
	    while(defined($f = readdir(FILES))) {
		my $name = "$s/$f";
		if($f eq '.' || $f eq '..') {}
		elsif(-l $name) {
		    Qt::ListViewItem->new($self, $f, "Symbolic Link");
		} elsif(-d $name) {
		    Directory->new($self, $f);
		} else {
		    Qt::ListViewItem->new($self, $f, (-f $name) ? "File" : "Special");
		}
	    }
	    closedir(FILES);
	}
    }

    $self->SUPER::setOpen($o);
}

sub setup {
    my $self = shift;
    $self->setExpandable(1);
    $self->SUPER::setup();
}

sub fullName {
    my $self = shift;
    my $s;
    if($self->{'p'}) {
	$s = $self->{'p'}->fullName() . $self->{'f'} . "/";
    } else {
	$s = "/";
    }
    return $s;
}

sub text {
    my $self = shift;
    my $column = shift;

    if($column == 0) {
	return $self->{'f'};
    } elsif($self->{'readable'}) {
	return "Directory";
    } else {
	return "Unreadable Directory";
    }
}