/**
   * DOCUMENT ME!
   *
   * @param mapContext DOCUMENT ME!
   * @param layer DOCUMENT ME!
   * @param duplicate DOCUMENT ME!
   * @throws ReadDriverException
   * @throws EditionException DOCUMENT ME!
   * @throws DriverIOException DOCUMENT ME!
   */
  public void saveToShp(MapContext mapContext, Annotation_Layer layer, String duplicate)
      throws ReadDriverException {
    try {
      JFileChooser jfc = new JFileChooser();
      SimpleFileFilter filterShp =
          new SimpleFileFilter("shp", PluginServices.getText(this, "shp_files"));
      jfc.setFileFilter(filterShp);

      if (jfc.showSaveDialog((Component) PluginServices.getMainFrame())
          == JFileChooser.APPROVE_OPTION) {
        File newFile = jfc.getSelectedFile();
        String path = newFile.getAbsolutePath();

        if (newFile.exists()) {
          int resp =
              JOptionPane.showConfirmDialog(
                  (Component) PluginServices.getMainFrame(),
                  PluginServices.getText(this, "fichero_ya_existe_seguro_desea_guardarlo"),
                  PluginServices.getText(this, "guardar"),
                  JOptionPane.YES_NO_OPTION);

          if (resp != JOptionPane.YES_OPTION) {
            return;
          }
        }

        if (!(path.toLowerCase().endsWith(".shp"))) {
          path = path + ".shp";
        }

        newFile = new File(path);

        SelectableDataSource sds = layer.getRecordset();
        FieldDescription[] fieldsDescrip = sds.getFieldsDescription();

        ShpWriter writer = (ShpWriter) LayerFactory.getWM().getWriter("Shape Writer");
        Driver driver = null;

        SHPLayerDefinition lyrDefPoint = new SHPLayerDefinition();
        lyrDefPoint.setFieldsDesc(fieldsDescrip);

        File filePoints = new File(path);
        lyrDefPoint.setFile(filePoints);
        lyrDefPoint.setName(filePoints.getName());
        lyrDefPoint.setShapeType(FShape.POINT);
        writer.setFile(filePoints);
        writer.initialize(lyrDefPoint);
        driver = getOpenAnnotationDriver(filePoints);
        writeFeatures(mapContext, layer, writer, driver, duplicate);
      }
    } catch (InitializeWriterException e) {
      throw new ReadDriverException(layerAnnotation.getName(), e);
    } catch (DriverLoadException e) {
      throw new ReadDriverException(layerAnnotation.getName(), e);
    } catch (IOException e) {
      throw new ReadDriverException(layerAnnotation.getName(), e);
    }
  }
  @Override
  public void export(MapContext mapContext, FLyrVect layer) {
    try {
      JFileChooser jfc = new JFileChooser(lastPath);
      SimpleFileFilter filterShp =
          new SimpleFileFilter("dxf", PluginServices.getText(this, "dxf_files"));
      jfc.setFileFilter(filterShp);
      if (jfc.showSaveDialog((Component) PluginServices.getMainFrame())
          == JFileChooser.APPROVE_OPTION) {
        File newFile = jfc.getSelectedFile();
        String path = newFile.getAbsolutePath();
        if (!(path.toLowerCase().endsWith(".dxf"))) {
          path = path + ".dxf";
        }
        newFile = new File(path);

        DxfWriter writer = (DxfWriter) LayerFactory.getWM().getWriter("DXF Writer");
        SHPLayerDefinition lyrDef = new SHPLayerDefinition();
        SelectableDataSource sds = layer.getRecordset();
        FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
        lyrDef.setFieldsDesc(fieldsDescrip);
        lyrDef.setFile(newFile);
        lyrDef.setName(newFile.getName());
        lyrDef.setShapeType(layer.getShapeType());
        writer.setFile(newFile);
        writer.initialize(lyrDef);
        writer.setProjection(layer.getProjection());
        DxfFieldsMapping fieldsMapping = new DxfFieldsMapping();
        // TODO: Recuperar aqu� los campos del cuadro de di�logo.
        writer.setFieldMapping(fieldsMapping);
        DXFMemoryDriver dxfDriver = new DXFMemoryDriver();
        dxfDriver.open(newFile);
        writeFeatures(mapContext, layer, writer, dxfDriver);
        String fileName = newFile.getAbsolutePath();
        lastPath = fileName.substring(0, fileName.lastIndexOf(File.separatorChar));
      }

    } catch (ReadDriverException e) {
      NotificationManager.addError(e.getMessage(), e);
    } catch (InitializeWriterException e) {
      NotificationManager.addError(e.getMessage(), e);
    } catch (DriverLoadException e) {
      NotificationManager.addError(e.getMessage(), e);
    }
  }
  public boolean launchGeoprocess() {
    FLyrVect inputLayer = geoProcessingConvexHullPanel.getInputLayer();
    FLayers layers = geoProcessingConvexHullPanel.getFLayers();
    File outputFile = null;
    try {
      outputFile = geoProcessingConvexHullPanel.getOutputFile();
    } catch (FileNotFoundException e3) {
      String error = PluginServices.getText(this, "Error_entrada_datos");
      String errorDescription = PluginServices.getText(this, "Error_seleccionar_resultado");
      geoProcessingConvexHullPanel.error(errorDescription, error);
      return false;
    }
    if (outputFile == null || (outputFile.getAbsolutePath().length() == 0)) {
      String error = PluginServices.getText(this, "Error_entrada_datos");
      String errorDescription = PluginServices.getText(this, "Error_seleccionar_resultado");
      geoProcessingConvexHullPanel.error(errorDescription, error);
      return false;
    }
    if (outputFile.exists()) {
      if (!geoProcessingConvexHullPanel.askForOverwriteOutputFile(outputFile)) {
        return false;
      }
    }
    ConvexHullGeoprocess convexHull = new ConvexHullGeoprocess();
    convexHull.setFirstOperand(inputLayer);

    SHPLayerDefinition definition = (SHPLayerDefinition) convexHull.createLayerDefinition();
    definition.setFile(outputFile);
    ShpSchemaManager schemaManager = new ShpSchemaManager(outputFile.getAbsolutePath());
    IWriter writer = null;
    try {
      writer = getShpWriter(definition);
    } catch (Exception e1) {
      String error = PluginServices.getText(this, "Error_escritura_resultados");
      String errorDescription = PluginServices.getText(this, "Error_preparar_escritura_resultados");
      geoProcessingConvexHullPanel.error(errorDescription, error);
      return false;
    }
    convexHull.setResultLayerProperties(writer, schemaManager);
    HashMap params = new HashMap();
    boolean onlySelected = geoProcessingConvexHullPanel.isConvexHullOnlySelected();
    params.put("layer_selection", new Boolean(onlySelected));
    try {
      convexHull.setParameters(params);
      convexHull.checkPreconditions();
      IMonitorableTask task1 = convexHull.createTask();
      if (task1 == null) {
        return false;
      }
      AddResultLayerTask task2 = new AddResultLayerTask(convexHull);
      task2.setLayers(layers);
      MonitorableDecoratorMainFirst globalTask = new MonitorableDecoratorMainFirst(task1, task2);
      if (globalTask.preprocess()) PluginServices.cancelableBackgroundExecution(globalTask);

    } catch (GeoprocessException e) {
      String error = PluginServices.getText(this, "Error_ejecucion");
      String errorDescription = PluginServices.getText(this, "Error_fallo_geoproceso");
      errorDescription = "<html>" + errorDescription + ":<br>" + e.getMessage() + "</html>";
      geoProcessingConvexHullPanel.error(errorDescription, error);
      return false;
    }
    return true;
  }