Wrangler

 view release on metacpan or  search on metacpan

lib/Wrangler/Wx/FileBrowserTreeList.pm  view on Meta::CPAN

			#	pop(@selections);
				last;
			}

		}
	}

	my $lastId = $selections[-1];
	# Wrangler::debug("Last dir in listing is $lastId");

	## insert a placeholder item below dirs
	my $itemId = $filebrowser->InsertImageStringItem( $lastId,
		'New directory',
		$filebrowser->{images}->{ 'folder' }
	);
	$filebrowser->SetOurItemData($lastId, { ref_to_ => 'richlist type data' });
	$filebrowser->SetItemData($lastId, $lastId);

	# make sure the listing is scrolled, so the user can see the new item, and start label edit
	$filebrowser->EnsureVisible($itemId);
	$filebrowser->EditLabel($itemId);

	# this is all we can do here, the directory is actually created in OnEndLabelEdit()
	$filebrowser->{our_stash} = { mkdir => $itemId };
}

sub Rename {
	my $filebrowser = shift;

	my $w = $filebrowser->{wrangler};

	my @selections = $filebrowser->GetSelections(); # docs: wxPerl note: In wxPerl this method takes no parameters and returns a list of Wx::TreeItemIds. 
	my $selCnt = @selections;
	Wrangler::debug("FileBrowser: Rename: $selCnt items ");

	for(@selections){
		push(@{ $filebrowser->{our_stash}->{rename} }, {
			id	=> $_,
			file	=> $filebrowser->GetItemText($_),
		});
	}

	if($selCnt == 0){
		return;
	}elsif($selCnt == 1){
		# the actual rename is done in OnEndEditLabel()
		# (use the LabelEdit editor to handle the rename)
		$filebrowser->EditLabel( $selections[0] );
	}elsif($selCnt > 1){
		# use a more sophisticated dialogue for multi-renames
		require Wrangler::Dialog::MultiRename;
		my $dialog = Wrangler::Dialog::MultiRename->new($filebrowser->{our_stash}->{rename});

		if($dialog->ShowModal() == wxID_OK){
			if( $dialog->{pre}->IsModified || $dialog->{ins}->IsModified ){
				Wrangler::debug("Prepend/append-rename was used ");

				my $pre = $dialog->{pre}->GetValue();
				my $ins = $dialog->{ins}->GetValue();

				foreach my $item (@{ $filebrowser->{ourclipboard} }){
					my $oldpath = File::Spec->catfile( $filebrowser->{current_dir}, $item->{file});

					my ($file, $dirs, $suffix) = File::Basename::fileparse($item->{file}, qr/\.[^.]*/);

					my $newpath = File::Spec->catfile( $filebrowser->{current_dir}, $pre.$file.$ins.$suffix);

					next if $oldpath eq $newpath; # prevent that the update-internal-tree gets corrupted, and of course an unnecessary fs IO
					# todo: check this via the OnEditLabel dirty? function

					## do the actual rename
					$filebrowser->{wrangler}->{fs}->rename($oldpath, $newpath);

					## update the internal metadata tree
				#	$self->{tree}->{$newpath} = $self->{tree}->{$oldpath};
				#	delete($self->{tree}->{$oldpath});

					## update GUI
					Wrangler::debug("Wrangler::FileBrowser::rename(multi): rename($oldpath, $newpath) ");
					$filebrowser->SetItemText($item->{id}, $pre.$file.$ins.$suffix);
				}
			}elsif( $dialog->{multi}->IsModified ){
				Wrangler::debug("Pattern-rename was used ");

				my $multi = $dialog->{multi}->GetValue();
					$multi = decode_utf8($multi);	# decode
					Encode::_utf8_off($multi);	# then remove the utf8-flag the hard way
				my $oldlen = $dialog->{length};
				my $newlen = length($multi);
				Wrangler::debug("MULTI: $multi OLDLEN: $oldlen NEWLEN:$newlen");
			}
		}else{
			Wrangler::debug("Multiple rename CANCELd ");
		}

		# clear ourclipboard
		undef($filebrowser->{our_stash});

		# Fire the rename via the Event which are triggered by EditLabel OnBEginEdit / OnEndEdit
		# $filebrowser->EditLabel($selId);
	}
}


sub OurDelete {	# treelistctrl has a Delete() as well!
	my $filebrowser = shift;

	my $w = $filebrowser->{wrangler};

	my @selections = $filebrowser->GetSelections(); # docs: wxPerl note: In wxPerl this method takes no parameters and returns a list of Wx::TreeItemIds. 
	my $selCnt = @selections;
	return if $selCnt == 0;
	Wrangler::debug("FileBrowser: delete: $selCnt items ");

	# create a progress dialog
	my $pd = Wx::ProgressDialog->new("Deleting...", "Deleting...", $selCnt, $filebrowser, wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_REMAINING_TIME );

	my $cnt=1;
	for my $currId (@selections){
		my $richlist_item = $filebrowser->GetItemData( $currId )->GetData();
		my $path = $richlist_item->{'Filesystem::Path'};

		## just to be sure we don't del the 'up-dir'!
		## system's "rm" denies deleting it but rmtree, which we use here, inteprets it as a valid path and deletes it!
		if($path =~ /\.\.$/){
			Wrangler::debug("FileBrowser: skipped delete of the 'up-dir'! ");
			$pd->Update($_);
			next;
		}

		if( $richlist_item->{'Filesystem::Type'} eq 'Directory' ){
			Wrangler::debug("FileBrowser: delete ($cnt of $selCnt): currId:$currId, path:$path");

			## delete dir
	#		$w->{fs}->rmdir($path);
		}else{
			Wrangler::debug("FileBrowser: delete ($cnt of $selCnt): currId:$currId, path:$path");

			## delete file
	#		$w->{fs}->delete($path);
		}

		$filebrowser->DeleteChildren($currId);
		$filebrowser->Delete($currId);

		$pd->Update($cnt);
		$cnt++;
		last if $cnt > $selCnt;
	}

# select the 'next' item after the delete(s)
#	if($_ == $selCnt){
#		my $next_id = $filebrowser->GetNextItem($currId, wxLIST_NEXT_ALL);
#		$filebrowser->SetItemState( $next_id, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED );
#	}



( run in 2.760 seconds using v1.01-cache-2.11-cpan-81fc1098f69 )