use Win32::GUI; use Win32::Internet; require Win32::Sound; require Mail::Sender; ($DOShwnd, $DOShinstance) = GUI::GetPerlWindow(); #GUI::CloseWindow($DOShwnd); #GUI::Hide($DOShwnd); my $screen_width = Win32::GUI::GetSystemMetrics(0); my $screen_height = Win32::GUI::GetSystemMetrics(1); my $minwidth = 600; my $minheight = 240; if (@ARGV[0] eq "-t") { $test = 1; } my $dbv_icon = new Win32::GUI::Icon("gator.ico"); my $dbv_class = new Win32::GUI::Class( -name => "DatabaseViewer Class", -icon => $dbv_icon, ); my $DataMenu = new Win32::GUI::Menu( "&File" => "File", " > Retrieve &Data" => "GetData", " > -" => 0, " > E&xit" => "FileExit", "&Search" => "Search", " > Find &Name" => "FindName", " > Find &Building" => "FindBuilding", " > Find &Adapter" => "FindAdapter", "&Tools" => "Tools", " > Report &Problem" => "ReportProblem", ); $DataWindow = new Win32::GUI::Window( -name => "DataWindow", -top => ($screen_width - $minwidth)/2, -left => ($screen_height - $minheight)/2, -width => $minwidth, -height => $minheight, -title => "GatorNet Database Information", -menu => $DataMenu, -class => $dbv_class, ); $Status = $DataWindow->AddStatusBar( -name => "Status", -text => "GatorNet Database : Ready", ); $DataTab = $DataWindow->AddTabStrip( -left => 10, -top => 10, -width => $DataWindow->ScaleWidth - 105, -height => 175, -name => "DataTab", ); $DataTab->InsertItem(-text => "Name"); $DataTab->InsertItem(-text => "Building"); $DataTab->InsertItem(-text => "Adapter"); $DataWindow->AddLabel( -name => "FN_Label", -text => "First Name: ", -top => 55, -left => 25, ); $FirstName = $DataWindow->AddTextfield( -top => 52, -left => 90, -width => 115, -height => 23, -tabstop => 1, ); $DataWindow->AddLabel( -name => "LN_Label", -text => "Last Name: ", -top => 85, -left => 25, ); $LastName = $DataWindow->AddTextfield( -top => 82, -left => 90, -width => 115, -height => 23, -tabstop => 1, ); $DataWindow->AddLabel( -name => "Bld_Label", -text => "Building: ", -top => 55, -left => 25, ); $Building = $DataWindow->AddCombobox( -name => "Dropdown", -top => 52, -left => 90, -width => 125, -height => 110, -tabstop => 1, -style => WS_VISIBLE | 3 | WS_VSCROLL | WS_TABSTOP, ); $Building->InsertItem("Baldwin"); $Building->InsertItem("Brooks"); $Building->InsertItem("Caflish"); $Building->InsertItem("College Court"); $Building->InsertItem("Crawford"); $Building->InsertItem("Edwards"); $Building->InsertItem("PKP"); $Building->InsertItem("Ravine"); $Building->InsertItem("Schultz"); $Building->InsertItem("South Highland"); $Building->InsertItem("Walker"); $Building->InsertItem("Walker Annex"); $DataWindow->AddLabel( -name => "Adapt_Label", -text => "Adapter: ", -top => 55, -left => 25, ); $Adapter = $DataWindow->AddTextfield( -top => 52, -left => 90, -width => 115, -height => 23, -tabstop => 1, ); $FindNow = $DataWindow->AddButton( -name => "FindNow", -text => "F&ind Now", -top => 30, -left => $DataWindow->ScaleWidth - 83, -width => 71, -height => 25, ); $Stop = $DataWindow->AddButton( -name => "Stop", -text => "Sto&p", -top => 60, -left => $DataWindow->ScaleWidth - 83, -width => 71, -height => 25, ); $NewSearch = $DataWindow->AddButton( -name => "NewSearch", -text => "Ne&w Search", -top => 90, -left => $DataWindow->ScaleWidth - 83, -width => 71, -height => 25, ); $DataView = new Win32::GUI::ListView($DataWindow, -name => "DataView", -top => $DataWindow->ScaleHeight, -left => 0, -width => $DataWindow->ScaleWidth, -height => $DataWindow->ScaleHeight - 213, ); $DataView->InsertColumn( -name => "Col1", -inndex => 0, -width => 95, -text => "First Name", ); $DataView->InsertColumn( -index => 1, -subitem=> 1, -width => 95, -text => "Last Name", ); $DataView->InsertColumn( -index => 2, -subitem=> 1, -width => 100, -text => "Building", ); $DataView->InsertColumn( -index => 3, -subitem=> 1, -width => 55, -text => "Room", ); $DataView->InsertColumn( -index => 4, -subitem=> 1, -width => 114, -text => "Adapter Address", ); $DataView->InsertColumn( -index => 5, -subitem=> 1, -width => 117, -text => "IP Address", ); $Report = new Win32::GUI::Window( -name => "Report", -top => 100, -left => 100, -width => $minwidth - 50, -height => $minheight + 100, -title => "Report Problem", -class => $dbv_class, ); $Report->AddLabel( -name => "YN_Label", -text => "Your Name: ", -top => 5, -left => 5, ); $YourName = $Report->AddTextfield( -name => "YourName", -top => 2, -left => 70, -width => 300, -height => 23, -tabstop=> 1, ); $ReportMessage = $Report->AddRichEdit( -name => "Text", -text => $text, -left => 2, -top => 27, -width => $Report->ScaleWidth - 5, -height => $Report->ScaleHeight - 65, -style => WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL, -exstyle => WS_EX_CLIENTEDGE, ); $Send = $Report->AddButton( -name => "Send", -text => "&Send", -top => $Report->ScaleHeight - 30, -left => ($Report->ScaleWidth - 71)/2, -width => 71, -height => 25, ); $DataView->Hide(); $Status->Hide(); $Building->Select(-1); #$FindNow->Disable(); $Stop->Disable(); $NewSearch->Disable(); $DataTab->Select(0); &DataTab_Click; $resized = 0; $DataWindow->Show(); Win32::GUI::Dialog(); sub GetData_Click { $FindNow->Enable(); $NewSearch->Enable(); if ($test != 1) { $connect = new Win32::Internet(); $connect->FTP($FTP, "server", "userid", "password"); $FTP->Cd("directory"); $FTP->Ascii(); $FTP->Get("filename"); ($FTPErrNumb, $FTPErrText) = $FTP->Error(); $FTP->Close(); } $dataretrieved = 1; } sub FileExit_Click { exit(0); } sub FindName_Click { $DataTab->Select(0); &DataTab_Click; } sub FindBuilding_Click { $DataTab->Select(1); &DataTab_Click; } sub FindAdapter_Click { $DataTab->Select(2); &DataTab_Click; } sub ReportProblem_Click { $Send->Disable(); $Report->Show(); $Report->BringToFront(); $ReportMessage->Text(""); $YourName->Text(""); } sub DataWindow_Resize { $DataView->Resize($DataWindow->ScaleWidth, $DataWindow->ScaleHeight - 213); $Status->Resize($DataWindow->ScaleWidth, $Status->Height); $Status->Move(0, $DataWindow->ScaleHeight-$Status->Height); $DataTab->Resize($DataWindow->ScaleWidth - 105, 175); $FindNow->Move($DataWindow->ScaleWidth - 83, 30); $Stop->Move($DataWindow->ScaleWidth - 83, 60); $NewSearch->Move($DataWindow->ScaleWidth - 83, 90); } sub Report_Resize { $ReportMessage->Resize($Report->ScaleWidth - 5, $Report->ScaleHeight - 65); $Send->Move(($Report->ScaleWidth - 71)/2, $Report->ScaleHeight - 30); } sub DataTab_Click { if ($DataTab-> SelectedItem == 0) { $DataWindow->Bld_Label->Hide(); $Building->Hide(); $DataWindow->Adapt_Label->Hide(); $Adapter->Hide(); $DataWindow->FN_Label->Show(); $FirstName->Show(); $DataWindow->LN_Label->Show(); $LastName->Show(); $FirstName->SetFocus(); } if ($DataTab->SelectedItem == 1) { $DataWindow->FN_Label->Hide(); $FirstName->Hide(); $DataWindow->LN_Label->Hide(); $LastName->Hide(); $DataWindow->Adapt_Label->Hide(); $Adapter->Hide(); $DataWindow->Bld_Label->Show(); $Building->Show(); $Building->SetFocus(); } if ($DataTab->SelectedItem == 2) { $DataWindow->FN_Label->Hide(); $FirstName->Hide(); $DataWindow->LN_Label->Hide(); $LastName->Hide(); $DataWindow->Bld_Label->Hide(); $Building->Hide(); $DataWindow->Adapt_Label->Show(); $Adapter->Show(); $Adapter->SetFocus(); } } sub DataWindow_Terminate { exit(0); } sub FindNow_Click { my ($index,$fname,$lname,$build,$room,$adap,$ip); $lastcolumn = ""; if ($dataretrieved == 1) { if ($resized == 0) { $DataWindow->Resize($minwidth, $minheight + 118); } $DataView->View(1); $DataView->Clear(); $DataView->Show(); $Status->Show(); $Stop->Enable(); $index = 0; %data = ""; open (DATABASE, "database.txt"); while () { chomp; ($id,$fname,$lname,$build,$room,$adap,$ip) = split(/,/); if ($breakloop == 1) { last; } if ((($DataTab->SelectedItem == 0) && (lc(substr($fname,0,length($FirstName->Text))) eq lc($FirstName->Text)) && (lc(substr($lname,0,length($LastName->Text))) eq lc($LastName->Text))) || (($DataTab->SelectedItem == 1) && (lc($build) eq lc($Building->Text))) || (($DataTab->SelectedItem == 2) && (lc(substr($adap,0,length($Adapter->Text))) eq lc($Adapter->Text)))) { my @temp = split/,/,$_; s/^\d{1,3},//; $data{$temp[0]} = $_; $DataView->InsertItem(-item => $index, -text => "$fname"); $DataView->SetItem(-item => $index, -subitem => 1, -text => "$lname"); $DataView->SetItem(-item => $index, -subitem => 2, -text => "$build"); $DataView->SetItem(-item => $index, -subitem => 3, -text => "$room"); $DataView->SetItem(-item => $index, -subitem => 4, -text => "$adap"); $DataView->SetItem(-item => $index, -subitem => 5, -text => "$ip"); ++$index; } $DataView->Update(); $Status->Text("$index record(s) found"); } close DATABASE; $Stop->Disable(); $resized = 1; } else { Win32::Sound::Play("SystemDefault", SND_ASYNC); Win32::GUI::MessageBox(0,"You must retrieve the data from the network\r\nfirst. Goto File, Retrieve Data.","Error: No Data Loaded",64); } } sub Stop_Click { print "Stop button pressed\n"; $Stop->Disable(); $breakloop = 1; } sub NewSearch_Click { $FirstName->Text(""); $LastName->Text(""); $Building->Text(""); $Building->Select(-1); $Adapter->Text(""); $DataWindow->Resize($minwidth, $minheight); $DataView->Hide(); $DataView->Clear(); $Status->Hide(); $resized = 0; } sub Dropdown_Change { $Building->Text($Building->GetString($Building->SelectedItem)); } sub DataView_ColumnClick { my $column = shift; if ($lastcolumn == $column) { $sortorder = 1 - $sortorder; } else { $sortorder = 0; } my %sortcol = &NewList($column, %data); &SortListItem(\%data,\%sortcol); $lastcolumn = $column; } sub SortListItem { my ($data,$sortcol) = @_; my $check; my %data = %$data; my %sortcol = %$sortcol; $check = "$_" foreach (values %sortcol); $DataView->Clear(); $index = 0; if ($sortorder == 0) { foreach (sort { uc($sortcol{$a}) cmp uc($sortcol{$b}) } keys %sortcol) { my @newdata = split/,/,$data{$_}; ($fname,$lname,$build,$room,$adap,$ip) = @newdata; if ($fname ne "") { $DataView->InsertItem(-item => $index, -text => "$fname"); $DataView->SetItem(-item => $index, -subitem => 1, -text => "$lname"); $DataView->SetItem(-item => $index, -subitem => 2, -text => "$build"); $DataView->SetItem(-item => $index, -subitem => 3, -text => "$room"); $DataView->SetItem(-item => $index, -subitem => 4, -text => "$adap"); $DataView->SetItem(-item => $index, -subitem => 5, -text => "$ip"); $DataView->Update(); ++$index; } } } else { foreach (sort { uc($sortcol{$b}) cmp uc($sortcol{$a}) } keys %sortcol) { my @newdata = split/,/,$data{$_}; ($fname,$lname,$build,$room,$adap,$ip) = @newdata; if ($fname ne "") { $DataView->InsertItem(-item => $index, -text => "$fname"); $DataView->SetItem(-item => $index, -subitem => 1, -text => "$lname"); $DataView->SetItem(-item => $index, -subitem => 2, -text => "$build"); $DataView->SetItem(-item => $index, -subitem => 3, -text => "$room"); $DataView->SetItem(-item => $index, -subitem => 4, -text => "$adap"); $DataView->SetItem(-item => $index, -subitem => 5, -text => "$ip"); $DataView->Update(); ++$index; } } } } sub NewList { ## This creates another hash to use only for sorting purposes. my ($column,%sortcol) = @_; my $sortthis; foreach (keys %sortcol) { my @info = split /,/, $sortcol{$_}; $sortthis = $info[$column]; $sortcol{$_} = "$sortthis"; } return(%sortcol); } sub Report_Terminate { $ReportMessage->Text(""); $YourName->Text(""); $Report->Hide(); return; } sub YourName_Change { if ($YourName->Text() ne "") { $Send->Enable(); } else { $Send->Disable(); } } sub Send_Click { if ($ReportMessage->Text() eq "") { Win32::Sound::Play("SystemDefault", SND_ASYNC); Win32::GUI::MessageBox(0,"Message can not be left blank. Please\r\nenter a message and try again.",64); } else { $name = $YourName->Text; $message = $ReportMessage->Text; if ($test != 1) { ref ($sender = new Mail::Sender ({ from => $name, smtp => "mailserver"})); $sender->OpenMultipart({to => "recipient", subject => "Problem in Database"}); $sender->Body; $sender->Send($message); $sender->Send(<<'*END*'); *END* $sender->SendLine("\n$name"); $sender->Close; } $Report->Hide(); } }