Update of /cvsroot/perl-win32-gui/Win32-GUI/samples In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7815/samples
Added Files: CustomDraw.pl Log Message: Reini Urban changes --- NEW FILE: CustomDraw.pl --- #!perl # CustomDraw example. Reini Urban 2006 use Win32::GUI; use Win32::GUI::CustomDraw; use FindBin; use File::Basename; use POSIX qw(strftime); $NEM = 1; $OLD_CUSTOMDRAW = 0; sub CLR_RED {0x0000FF}; sub CLR_GREEN {0x00FF00}; sub CLR_BLUE {0xFF0000}; sub CLR_WHITE {0xFFFFFF}; sub CLR_BLACK {0x000000}; sub CLR_GREY {0x888888}; $W = new Win32::GUI::Window( -title => "Win32::GUI::CustomDraw test", -left => 100, -top => 100, -width => 400, -height => 650, -name => "W", -dropfiles => 1, ) or print_and_die("new Window"); my @listview_opts = (-name =>'List', -list => 0, -report => 1, -pos => [0, 0], -height => $W->ScaleHeight - 35, -width => $W->ScaleWidth, -fullrowselect => 1, ); push @listview_opts, (-onCustomDraw => \&List_CustomDraw) if $NEM; $List = $W->AddListView(@listview_opts); $List->View(1); $W->AddButton(-name => 'Exit', -text => "Exit", -width => 60); $W->AddStatusBar(-name => 'Status', -text => "", -width => $W->ScaleWidth - 65); my $filewidth = $List->GetStringWidth("typicalfilename.pl") + 5; $List->InsertColumn(-align => 'left', -text => 'File', -subitem => 1, -width => $filewidth); $List->InsertColumn(-align => 'left', -text => 'No', -subitem => 2, -width => 25); $List->InsertColumn(-align => 'left', -text => 'Line', -subitem => 3, -width => $List->Width() - (22 + 25 + $filewidth)); $List->Hook(NM_CUSTOMDRAW, \&List_CustomDraw_Hook) if $OLD_CUSTOMDRAW; $List->SetFocus(); $W->Show; W_Resize(); $List->Clear(); $W->Status->Text("filling list ..."); $W->Status->Update; opendir(DIR, $FindBin::Bin); while (my $file = readdir DIR) { my $path = $FindBin::Bin . "\\" . $file; next unless ((-f $path) and ($path =~ /\.pl$/)); add_file($path, $file); last if $List->Count > 2000; # 2000 max } closedir DIR; $W->Status->Text("Add files with Drag & Drop"); $return = $W->Dialog(); print "Dialog: $return\n"; sub add_file { my ($path, $file) = @_; $file = basename($path) unless $file; open F, "< $path"; $W->Status->Text("reading $file ..."); $W->Status->Update; my $i = 1; while (my $line = <F>) { next if $line =~ /^\s*$/; next if $line =~ /^\s*#/; chomp $line; my $item = $List->Count(); $List->InsertItem(-item => $item, -text => $file); $List->Item($item)->SubItem(1)->Text($i); $List->Item($item)->SubItem(2)->Text(substr($line,0,255)); $List->EnsureVisible($item); last if $i++ > 200; # max 200 lines per file } close F; } sub List_CustomDraw { my ($win, $ctrl) = @_; if ($opts{debug} and !$opts{debug_ctrl}) { $opts{debug_ctrl}++; use Devel::Peek; Dump $win; Dump $ctrl, 20; } my $drawstage = $ctrl->{-drawstage}; my $item = $ctrl->{-item}; if ($drawstage == CDDS_PREPAINT) { return CDRF_NOTIFYITEMDRAW; } elsif ($drawstage == CDDS_ITEMPREPAINT) { my $line = $List->Item($item)->SubItem(2)->Text(); if ($line =~ /^sub\s+/) { # whole line $ctrl->TextColor(CLR_WHITE); $ctrl->BackColor(CLR_GREY); } elsif ($line =~ /^use\s+/) { return CDRF_NOTIFYSUBITEMDRAW; } elsif ($line =~ /die / or $line =~ /croak /) { return CDRF_NOTIFYSUBITEMDRAW; } else { return CDRF_DODEFAULT; } } elsif ($drawstage == (CDDS_ITEMPREPAINT | CDDS_SUBITEM) and ($ctrl->{-subitem} == 2)) { my $line = $List->Item($item)->SubItem(2)->Text(); if ($line =~ /^sub\s+/) { } elsif ($line =~ /^use\s+/) { $ctrl->TextColor(CLR_BLUE); } elsif ($line =~ /die / or $line =~ /croak /) { $ctrl->TextColor(CLR_RED); } else { return CDRF_DODEFAULT; } return CDRF_NEWFONT; } return CDRF_DODEFAULT; } # the old method via Hook sub List_CustomDraw_Hook { my ($object, $wParam, $lParam, $type, $msgcode) = @_; return if $type != WM_NOTIFY; return if $msgcode != NM_CUSTOMDRAW; if ($opts{debug} and !$opts{debug_ctrl}) { $opts{debug_ctrl}++; use Devel::Peek; Dump $win; Dump $ctrl, 20; } my ($drawstage, $item)= unpack("x12Ix20i", unpack("P40", pack("L", $lParam))); if ($drawstage == CDDS_PREPAINT) { return CDRF_NOTIFYITEMDRAW; } elsif ($drawstage == CDDS_ITEMPREPAINT) { my $line = $List->Item($item)->SubItem(2)->Text(); if ($line =~ /^sub\s+/) { # whole line substr($lParam,48,8,pack("II",CLR_WHITE,CLR_GREY)); $object->Result(CDRF_NEWFONT); } elsif ($line =~ /^use\s+/) { $object->Result(CDRF_NOTIFYSUBITEMDRAW); } elsif ($line =~ /die / or $line =~ /croak /) { $object->Result(CDRF_NOTIFYSUBITEMDRAW); } else { $object->Result(CDRF_DODEFAULT); } return 0; } elsif ($drawstage == (CDDS_ITEMPREPAINT | CDDS_SUBITEM) and ($ctrl->{-subitem} == 2)) { my $line = $List->Item($item)->SubItem(2)->Text(); my $clrText; if ($line =~ /^sub\s+/) { } elsif ($line =~ /^use\s+/) { $clrText = pack("II",CLR_BLUE,CLR_WHITE); } elsif ($line =~ /die / or $line =~ /croak /) { $clrText = pack("II",CLR_RED,CLR_WHITE); } else { $object->Result(CDRF_DODEFAULT); return 0; } substr($lParam,48,8,$clrText); $object->Result(CDRF_NEWFONT); return 0; } return 0; } sub print_and_die {use POSIX qw(strftime); my($text) = @_; my $err = Win32::GetLastError(); die "$text: Error $err\n"; } sub W_DropFiles { my $drop = shift; for (@{$drop->DragQueryFiles()}) { add_file($_); } } sub W_Resize { my $dx = $List->Width - $List->ColumnWidth(2); $List->Width($W->ScaleWidth); $List->Height($W->ScaleHeight() - $W->Status->Height); $List->ColumnWidth(2, $List->Width - $dx); $W->Status->Top($W->Height - $W->Status->Height - 2); $W->Exit->Top($W->ScaleHeight - $W->Status->Height - 1); $W->Exit->Left($W->ScaleWidth - 61); $W->Redraw(-1); $W->Exit->Redraw(-1); return 0; } sub Exit_Click { -1 };