/**
   * Función para pruebas. Convierte los ficheros generados por la función cachear en ficheros tif
   * para comprobar que están bien generados.
   *
   * @param grf
   * @param pageBuffer
   * @param pageLines
   * @throws IOException
   */
  private void convertBufferToTif(String fileName, AffineTransform at, IBuffer buffer)
      throws IOException, InterruptedException, RasterDriverException {
    IDataWriter dataWriter1 = new WriterBufferServer(buffer);
    GeoRasterWriter grw = null;
    try {
      Params params = GeoRasterWriter.getWriter(fileName).getParams();
      params.changeParamValue("blocksize", "7"); // posición 7 del array -> 512
      params.changeParamValue("tfw", "false");
      params.changeParamValue("interleave", new Integer(1)); // posición 1 del array -> PIXEL
      grw =
          GeoRasterWriter.getWriter(
              dataWriter1,
              fileName,
              buffer.getBandCount(),
              at,
              buffer.getWidth(),
              buffer.getHeight(),
              buffer.getDataType(),
              params,
              null);

    } catch (NotSupportedExtensionException e) {
      throw new RasterDriverException("");
    }
    grw.dataWrite();
    grw.writeClose();
  }
  /** Asignamos los valores del PropertiesComponent al Params seleccionado */
  public void RefreshDataProperties() {
    if (actualParam == -1) return;

    ArrayList listValues = getFilterPanel().getPropertiesComponent().getValues();

    Params params = ((ParamStruct) paramsList.get(actualParam)).getFilterParam();
    for (int j = 0; j < listValues.size(); j++) {
      PropertyStruct ps = (PropertyStruct) listValues.get(j);
      params.changeParamValue(ps.getKey(), ps.getNewValue());
    }
  }
  /**
   * Cambiar el panel de propiedades central por el nuevo panel, segun el filtro seleccionado que se
   * pasa por parámetro.
   *
   * @param filter
   */
  public void changePanel(String filter) {
    int posParam = getParamSelected(filter);

    RefreshDataProperties();
    actualParam = posParam;

    PropertiesComponent propertiesComponent = new PropertiesComponent();

    if (posParam != -1) {
      Params params = ((ParamStruct) paramsList.get(actualParam)).getFilterParam();
      if (params != null) {
        Param paramPanel = params.getParamById("Panel");
        if (paramPanel != null && paramPanel.defaultValue instanceof RegistrableFilterListener)
          ((RegistrableFilterListener) paramPanel.defaultValue).addFilterUIListener(this);
        RasterToolsUtil.loadPropertiesFromWriterParams(
            propertiesComponent, params, new String[] {"FilterName"});
      }
    }
    getFilterPanel().setNewPropertiesComponent(propertiesComponent, filter);
  }
  /**
   * Aqui se seleccionan que filtros se van a aplicar y se devuelven en forma de ArrayList tanto
   * para el dibujado como cuando aceptan o aplican el panel.
   *
   * @param rendering
   * @return
   */
  public ArrayList applyFilters(IRasterRendering rendering) {
    ArrayList listFilterUsed = new ArrayList();

    RasterFilterList filterList = new RasterFilterList();
    filterList.setEnv(rendering.getRenderFilterList().getEnv());
    RasterFilterListManager stackManager = new RasterFilterListManager(filterList);

    // Conservamos filtros no visibles ya existentes
    ArrayList filtersInit = getFilterPanel().getLayerVisualStatus().getLast().getFilterStatus();
    for (int i = 0; i < filtersInit.size(); i++) {
      // Si es visible no hacemos nada
      if (((RasterFilter) filtersInit.get(i)).isVisible()) continue;

      RasterFilter obj = null;
      for (int j = 0; j < stackManager.getRasterFilterList().size(); j++) {
        Class classFilter = (Class) stackManager.getRasterFilterList().get(j);
        try {
          obj = (RasterFilter) classFilter.newInstance();
          if (obj.getName().equals(((RasterFilter) filtersInit.get(i)).getName())) break;
        } catch (InstantiationException e) {
          RasterToolsUtil.messageBoxError("error_creando_filtro", this, e);
        } catch (IllegalAccessException e) {
          RasterToolsUtil.messageBoxError("error_creando_filtro", this, e);
        }
      }

      // Si no encontramos el filtro apropiado, nos olvidamos de el
      if (obj == null) continue;

      // Si no es visible tenemos que conservar el filtro
      try {
        Params params =
            (Params)
                ((RasterFilter) filtersInit.get(i))
                    .getUIParams(((RasterFilter) filtersInit.get(i)).getName())
                    .clone();
        // Añado el parametro RenderBands a los parametros del filtro
        String rgb =
            rendering.getRenderBands()[0]
                + " "
                + rendering.getRenderBands()[1]
                + " "
                + rendering.getRenderBands()[2];
        params.setParam("RenderBands", rgb, 0, null);
        params.setParam("alphaBand", new Integer(rendering.getAlphaBandNumber()), 0, null);

        ParamStruct newParam = new ParamStruct();
        newParam.setFilterClass(obj.getClass());
        newParam.setFilterName(((RasterFilter) filtersInit.get(i)).getName());
        newParam.setFilterParam(params);
        listFilterUsed.add(newParam);
      } catch (CloneNotSupportedException e) {
      }
    }

    // Metemos los filtros seleccionados en el panel
    ListModel list = getFilterPanel().getMainPanel().getTreeListContainer().getListModel();
    for (int i = 0; i < list.getSize(); i++) {
      Hashtable hastTable = getFilterPanel().getMainPanel().getTreeListContainer().getMap();
      for (int j = 0; j < paramsList.size(); j++) {
        boolean active = true;
        Param param = ((ParamStruct) paramsList.get(j)).getFilterParam().getParamById("enabled");
        if ((param != null)
            && param.defaultValue instanceof Boolean
            && ((((Boolean) param.defaultValue).booleanValue()) == false)) active = false;
        if (active) {
          if (((ParamStruct) paramsList.get(j))
              .getFilterName()
              .equals(hastTable.get(list.getElementAt(i)))) {
            try {
              Params params = (Params) ((ParamStruct) paramsList.get(j)).getFilterParam().clone();
              // Añado el parametro RenderBands a los parametros
              // del filtro
              String rgb =
                  rendering.getRenderBands()[0]
                      + " "
                      + rendering.getRenderBands()[1]
                      + " "
                      + rendering.getRenderBands()[2];
              params.setParam("RenderBands", rgb, 0, null);
              params.setParam("alphaBand", new Integer(rendering.getAlphaBandNumber()), 0, null);

              ParamStruct newParam = new ParamStruct();
              newParam.setFilterClass(((ParamStruct) paramsList.get(j)).getFilterClass());
              newParam.setFilterName(((ParamStruct) paramsList.get(j)).getFilterName());
              newParam.setFilterParam(params);
              listFilterUsed.add(newParam);
            } catch (CloneNotSupportedException e) {
            }
          }
        }
      }
    }
    return listFilterUsed;
  }