public boolean doSaveChartAction() {

    String file = Export.getFile("Save chart data into file", "*.csv", true);
    if (file == null) {
      return true;
    }
    boolean ok = cview.export(file);
    // mask.write(file);
    if (!ok) {
      GuiUtils.showNonModalMsg("Problem writing chart to file...");
    } else {
      GuiUtils.showNonModalMsg("Wrote chart to file " + file);
    }
    return false;
  }
  public boolean doSelectCoord() throws HeadlessException {

    SingleCoordSelectionPanel pan = new SingleCoordSelectionPanel();
    // pan.setMaxX(this.expContext.getNrcols());
    // pan.setMaxY(this.expContext.getNrrows());
    if (maincont.getAbsDataAreaCoord() != null) {
      pan.setCoord1(maincont.getAbsDataAreaCoord());
    }
    int ans =
        JOptionPane.showConfirmDialog(
            this, pan, "Enter a selection:", JOptionPane.OK_CANCEL_OPTION);
    if (ans == JOptionPane.CANCEL_OPTION) {
      return true;
    }
    // RELATIVE to current sub experiment
    WellCoordinate c1 =
        new WellCoordinate(
            pan.getCoord1().getCol() - maincont.getExp().getColOffset(),
            pan.getCoord1().getRow() - maincont.getExp().getRowOffset());
    WellCoordinate c2 = c1.add(100, 100);
    WellSelection sel = new WellSelection(c1, c2);
    WellCoordinate abs = pan.getCoord1();
    if (maincont.getAbsDataAreaCoord() != null && abs.equals(maincont.getAbsDataAreaCoord())) {
      GuiUtils.showNonModalMsg("Same coordinates, I won't to anything", "Process");
      return true;
    }
    maincont.setAbsDataAreaCoord(abs);

    LookupUtils.publish(wellSelectionContent, sel);

    return false;
  }
 public boolean export() {
   if (imagePanel == null) {
     GuiUtils.showNonModalMsg("Got no image to export yet...");
     return false;
   }
   String file = FileTools.getFile("Save image to a file", "*.*", null, true);
   return export(file);
 }
 protected boolean getExpContext() {
   //  Exception e = new Exception("showing stack trace");
   //   p(ErrorHandler.getString(e));
   if (expContext == null) {
     expContext = GlobalContext.getContext().getExperimentContext();
   }
   if (expContext == null) {
     GuiUtils.showNonModalMsg("Got no experiment context from global contexet");
     return false;
   }
   maincont = ExplorerContext.getCurContext(expContext);
   info.setText(expContext.getRawDir());
   this.btnreload.setToolTipText(
       "Reload data from dir " + expContext.getRawDir() + " at " + maincont.getAbsDataAreaCoord());
   return true;
 }
 public boolean export(String file) {
   if (file == null || file.length() < 3) {
     GuiUtils.showNonModalMsg("I need to know if it is a .png or a .jpg file");
     return false;
   }
   if (imagePanel == null) {
     return false;
   }
   File f = new File(file);
   String ext = file.substring(file.length() - 3);
   RenderedImage image = myCreateImage();
   try {
     return ImageIO.write(image, ext, f);
   } catch (IOException ex) {
     err("Could not write image to file " + f, ex);
   }
   return false;
 }
  private void subtractActionPerformed(
      java.awt.event.ActionEvent evt) { // GEN-FIRST:event_subtractActionPerformed

    RasterData data = maincont.getData();
    if (data == null) {
      JOptionPane.showMessageDialog(this, "I have no data yet to subtract anything from :-)");
      return;
    }
    if (subtract_type == null) {
      subtract_type = maincont.getFiletype();
    }
    FlowSelection pan =
        new FlowSelection(
            "Select the flow and file type you wish to subtract from the currently selected data");
    pan.setFlow(subtract_flow);
    pan.setFiletype(subtract_type);
    int ans =
        JOptionPane.showConfirmDialog(
            this,
            pan,
            "Data Subtraction",
            JOptionPane.OK_CANCEL_OPTION,
            JOptionPane.QUESTION_MESSAGE);
    if (ans != JOptionPane.OK_OPTION) {
      return;
    }

    subtract_flow = pan.getFlow();
    subtract_type = pan.getFiletype();
    // otherwise load the data and then subtract
    RasterData sub = null;
    DataAccessManager manager = DataAccessManager.getManager(maincont.getExp().getWellContext());
    try {
      p("Loading subregion, RELATIVE coord " + maincont.getRelativeDataAreaCoord());
      sub =
          manager.getRasterDataForArea(
              null,
              maincont.getRasterSize(),
              maincont.getRelativeDataAreaCoord(),
              pan.getFlow(),
              pan.getFiletype(),
              null,
              0,
              -1);
      // now subtract first frame
    } catch (Exception ex) {
      p("Error when loading: " + ErrorHandler.getString(ex));
    }
    if (sub == null) {
      JOptionPane.showMessageDialog(
          this,
          "I could not load flow "
              + pan.getFlow()
              + ", "
              + pan.getFiletype()
              + ", @ "
              + maincont.getAbsDataAreaCoord());
      return;
    }
    String what = "raw";
    if (this.automatic_nn) {
      GuiUtils.showNonModalMsg("Computing NN before subtraction");
      sub = computeNN(null, sub);
      what = "NN subtracted";
    }

    data.subtract(sub);
    JOptionPane.showMessageDialog(
        this,
        "I subtracted the "
            + what
            + " data from "
            + pan.getFlow()
            + ", "
            + pan.getFiletype()
            + ", @ "
            + maincont.getAbsDataAreaCoord());
    this.rasterViewUpdate();
  } // GEN-LAST:event_subtractActionPerformed
  public void rasterViewCreate(boolean load, String title) {
    p("=========rasterViewCreate called: load=" + load);
    // if (load) {
    //  Exception e = new Exception("Tracing call");
    //   p(ErrorHandler.getString(e));
    //  }
    if (!getExpContext()) {
      return;
    }
    if (load) {
      if (selection != null)
        GuiUtils.showNonModalMsg(
            "Loading "
                + selection
                + " for "
                + maincont.getFiletype()
                + ", flow "
                + maincont.getFlow(),
            "Process");
    }

    String base = "?";
    if (maincont.getFiletype() == RawType.ACQ) {
      base = "" + maincont.getExp().getWellContext().getBase(maincont.getFlow());
    }
    this.flowPanel.setToolTipText(
        "<html>Base for flow "
            + maincont.getFlow()
            + ":"
            + base
            + "<br>Flow order: "
            + maincont.getExp().getFlowOrder()
            + "</html>");

    raster = new RasterView(maincont, load);

    this.panImage.removeAll();
    panImage.add(raster);
    // repaint();
    //  p("adding raster view");
    if (load) {
      this.getUserPreferences();
    }
    raster.update(load, maincont);

    // paintImmediately(0,0,1000,1000);
    panImage.repaint();
    raster.repaint();

    if (load) {
      title = "Raw data";
    }
    title += " flow " + maincont.getFlow() + "=" + base;
    chartViewCreate(title);

    invalidate();
    revalidate();
    // this.paintAll(getGraphics());
    repaint();
    if (load) {
      if (this.automatic_nn) {
        p("also doing nn - disable nn");
        this.btnNN.setEnabled(false);
        btnNN.setText("");
        btnNN.setToolTipText(
            "Automatically computing NN - check Explorer Options if you wish to change it!");
        RasterData data = computeNN(null);
        maincont.setData(data);
        rasterViewCreate(
            false,
            "After masked neighbor subtraction, span="
                + maincont.getSpan()
                + ", BG mask="
                + maincont.getBgMask());
      } else {
        this.btnNN.setEnabled(true);
        btnNN.setText("Compute NN");
        btnNN.setToolTipText(
            "Click to compute NN bg subtraction - check Explorer Options if you wish <b>automate</b> this!");
      }
    }
  }
  private RasterData computeNN(ProgressListener prog, RasterData rawdata) {
    //   p("computeNN. Maincont is: " + maincont);
    if (rawdata == null) {
      GuiUtils.showNonModalDialog(
          "<html>I see no data yet - did you already pick a region?<br>"
              + "(Even if you see something somewhere, if you didn't actually select a region, it might just show some sample data)</html>",
          "No data - region selected?");
      return null;
    }
    RasterData nndata = null;
    try {
      if (maincont == null) {
        maincont = ExplorerContext.getCurContext(expContext);
      }
      int span = Math.max(1, this.maincont.getSpan());
      NearestNeighbor nn = new NearestNeighbor(span, maincont.getMedianFunction());
      BitMask ignore = maincont.getIgnoreMask();
      BitMask take = maincont.getBgMask();

      if (take != null && take == ignore) {
        JOptionPane.showMessageDialog(
            this,
            "You select the same mask for ignore and bg :-). \nYou should select another mask for the bg (or you get a null result. I will just return the old data.");
        return rawdata;
      }
      if (take != null && take.computePercentage() < 1) {
        int ans =
            JOptionPane.showConfirmDialog(
                this,
                "<html>The bg mask only has "
                    + take.computePercentage()
                    + "% wells, do you want to still use it?"
                    + "<br><b>Did you already select a region?</b>"
                    + "<br>You might want to use the MaskEditor (and <b>refresh</b> the masks possibly) to check them</html>",
                "Few wells",
                JOptionPane.OK_CANCEL_OPTION);
        if (ans == JOptionPane.CANCEL_OPTION) {
          return rawdata;
        }
      }
      maincont.setBgMask(take);
      maincont.setIgnoreMask(ignore);
      if (prog != null)
        prog.setMessage(
            "Masked neighbor subtraction: ignore mask " + ignore + " and empty mask " + take);
      // RasterData nndata = nn.compute(rawdata, mask, prog, span);

      //   p("calling computebetter");
      // if (boxslow.isSelected()) nndata =nn.computeSlow(rawdata, ignore, take, prog, span);
      nndata = nn.computeBetter(rawdata, ignore, take, prog, span);

    } catch (Exception e) {
      p("Error with nn: " + ErrorHandler.getString(e));
      JOptionPane.showMessageDialog(
          this,
          "I was not able to do the masked neighbor subtraction:\n" + ErrorHandler.getString(e));
      return null;
    }
    if (nndata == null) {
      JOptionPane.showMessageDialog(
          this,
          "I was not able to do the masked neighbor subtraction - I got no error but also no result :-) ");
    }
    return nndata;
  }