private void filtrarMedio(String texto, DefaultMutableTreeNode raizArbol,
			DefaultMutableTreeNode raizNegativa, boolean filtrar) {
		int artista, albumes, canciones;
		artista = albumes = canciones = 0;
		DefaultMutableTreeNode nodoArtista, nodoAlbum, nodoCancion;
		DefaultMutableTreeNode nodoArtistaClon, nodoAlbumClon, nodoCancionClon;
		boolean filtrando = false;

		artista = raizArbol.getChildCount();
		for (int i = 0; i < artista; i++) {
			albumes = raizArbol.getChildAt(i).getChildCount();
			for (int j = 0; j < albumes; j++) {
				canciones = raizArbol.getChildAt(i).getChildAt(j)
						.getChildCount();
				for (int k = 0; k < canciones; k++) {
					nodoArtista = (DefaultMutableTreeNode) raizArbol
							.getChildAt(i);
					nodoAlbum = (DefaultMutableTreeNode) nodoArtista
							.getChildAt(j);
					nodoCancion = (DefaultMutableTreeNode) nodoAlbum
							.getChildAt(k);
					Archivo ar = (Archivo) nodoCancion.getUserObject();
					String[] opciones = biblio
							.opcionesPorNombre("criterio-busqueda");
					if (filtrar) {// si se esta filtrando... busque las que no
						// tengan coincidencias
						// filtrando = (ar.getNombreCortoArchivo().toLowerCase()
						// .indexOf(texto.toLowerCase()) < 0);
						filtrando = (ar.tieneEstosDatos(texto, opciones,
								filtrar));
					} else {// si se esta quitando el filtro... busque las
						// que tengan coincidencias
						filtrando = (ar.getNombreCortoArchivo().toLowerCase()
								.indexOf(texto.toLowerCase()) >= 0);
						filtrando = (ar.tieneEstosDatos(texto, opciones,
								filtrar));
					}
					if (filtrando) {
						/**
						 * Copiar nodos de un arbol a otro
						 */
						nodoArtistaClon = (DefaultMutableTreeNode) nodoArtista
								.clone();
						nodoAlbumClon = (DefaultMutableTreeNode) nodoAlbum
								.clone();
						nodoCancionClon = (DefaultMutableTreeNode) nodoCancion
								.clone();

						nodoArtistaClon = obtenerNodo(raizNegativa,
								nodoArtistaClon.toString());
						if (nodoArtistaClon == null) {
							nodoArtistaClon = (DefaultMutableTreeNode) nodoArtista
									.clone();
							raizNegativa.add(nodoArtistaClon);
						}

						nodoAlbumClon = obtenerNodo(nodoArtistaClon,
								nodoAlbumClon.toString());
						if (nodoAlbumClon == null) {
							nodoAlbumClon = (DefaultMutableTreeNode) nodoAlbum
									.clone();
							nodoArtistaClon.add(nodoAlbumClon);
						}

						nodoAlbumClon.add(nodoCancionClon);

						/**
						 * Borrar los nodos copiados
						 */
						modeloArbol.removeNodeFromParent(nodoCancion);
						canciones--;// acortar el ciclo por que
						k--;// acabo de eliminar un nodo
						if (nodoAlbum.getChildCount() == 0) {
							modeloArbol.removeNodeFromParent(nodoAlbum);
							albumes--;
							j--;
							if (nodoArtista.getChildCount() == 0) {
								modeloArbol.removeNodeFromParent(nodoArtista);
								artista--;
								i--;
							}
						}
					}
				}
			}
		}
		// esto es necesario para actualizar la estructura del arbol
		modeloArbol.reload();
		// esto expande todos los nodos del arbol
		expandirTodo(arbolPrincipal, true);
	}