/**
  * Populating the list of available filters in the comboBox from memory, so that the comboBox
  * reflects the filters that are currenty in memory.
  */
 private void buildFilterList() {
   while (fltList.itemsSize() > 0) {
     fltList.deleteItem(0);
   }
   fltList.addItems(Global.getPref().getFilterIDs());
   fltList.updateItems();
 }
  /**
   * React to the users input, create a filter and set the variable of the filter.
   *
   * @see Filter
   */
  public void onEvent(Event ev) {
    if (ev instanceof ControlEvent && ev.type == ControlEvent.PRESSED) {
      if (ev.target == btnCancel) {
        if (savedFiltersChanged) {
          Global.getPref().savePreferences();
          savedFiltersChanged = false;
        }
        fltList.select(-1);
        currentFilterID = "";
        this.close(0);
      } else if (ev.target == btnRoute) {

        File datei;
        FileChooser fc = new FileChooser(FileChooserBase.OPEN, Global.getProfile().dataDir);
        fc.setTitle(MyLocale.getMsg(712, "Select route file"));
        if (fc.execute() != FormBase.IDCANCEL) {
          datei = fc.getChosenFile();
          InfoBox inf = new InfoBox("Distance?", "Dist:", InfoBox.INPUT);
          inf.execute();
          Vm.showWait(true);
          Filter flt = new Filter();
          flt.doFilterRoute(datei, Convert.toDouble(inf.feedback.getText()));
        }
        Vm.showWait(false);
        fltList.select(-1);
        currentFilterID = "";
        this.close(0);

      } else if (ev.target == btnApply) {
        Vm.showWait(true);

        FilterData data = getDataFromScreen();
        Global.getProfile().setCurrentFilter(data);

        Filter flt = new Filter();
        flt.setFilter();
        flt.doFilter();
        if (savedFiltersChanged) {
          Global.getPref().savePreferences();
          savedFiltersChanged = false;
        }
        Global.mainTab.tbP.tc.scrollToVisible(0, 0);
        Vm.showWait(false);
        fltList.select(-1);
        currentFilterID = "";
        this.close(0);
      } else if (ev.target == btnSaveFlt) {
        String ID = fltList.getText();
        FilterData data = getDataFromScreen();
        MessageBox mBox;
        InputBox inp = new InputBox("ID");
        String newID = inp.input(ID, 20);
        if (newID != null && !newID.equals("")) {
          if (Global.getPref().hasFilter(newID)) {
            mBox =
                new MessageBox(
                    MyLocale.getMsg(221, "Overwrite Filter?"),
                    MyLocale.getMsg(222, "The filter already exists. Overwrite it?"),
                    FormBase.IDYES | FormBase.IDNO);
            if (mBox.execute() == FormBase.IDYES) {
              Global.getPref().addFilter(newID, data);
              savedFiltersChanged = true;
              buildFilterList();
            }
          } else {
            Global.getPref().addFilter(newID, data);
            savedFiltersChanged = true;
            buildFilterList();
          }
        }
      } else if (ev.target == btnDelFlt) {
        String ID = fltList.getText();
        if (!ID.equals("")) {
          FilterData data = Global.getPref().getFilter(ID);
          // We only need to delete anything, if there is already a filter of the id
          // in the list box. If not, just delete the text in the box.
          if (data != null) {
            MessageBox mBox =
                new MessageBox(
                    MyLocale.getMsg(223, "Delete filter?"),
                    ID + MyLocale.getMsg(224, " - Delete this filter?"),
                    FormBase.IDYES | FormBase.IDNO);
            if (mBox.execute() == FormBase.IDYES) {
              Global.getPref().removeFilter(ID);
              fltList.setText("");
              savedFiltersChanged = true;
              this.buildFilterList();
            }
          } else {
            fltList.setText("");
          }
        }
      } else if (ev.target == addiWptChk) { // Set all addi filters to value of main addi filter
        chkParking.setState(addiWptChk.state);
        chkStage.setState(addiWptChk.state);
        chkQuestion.setState(addiWptChk.state);
        chkFinal.setState(addiWptChk.state);
        chkTrailhead.setState(addiWptChk.state);
        chkReference.setState(addiWptChk.state);
        addiWptChk.bgColor = Color.White;
        addiWptChk.repaint();
      } else if (ev.target == btnBearing) cp.select(0);
      else if (ev.target == btnAttributes) cp.select(1);
      else if (ev.target == btnRatings) cp.select(2);
      else if (ev.target == btnTypes) cp.select(3);
      else if (ev.target == btnAddi) cp.select(4);
      else if (ev.target == btnContainer) cp.select(5);
      else if (ev.target == btnSearch) cp.select(6);
      else if (ev.target == btnCacheAttributes) cp.select(7);
      else if (ev.target == btnDeselect) {
        chkNW.state =
            chkNNW.state =
                chkN.state =
                    chkNNE.state =
                        chkNE.state =
                            chkENE.state =
                                chkE.state =
                                    chkESE.state =
                                        chkSE.state =
                                            chkSSE.state =
                                                chkS.state =
                                                    chkSSW.state =
                                                        chkSW.state =
                                                            chkWSW.state =
                                                                chkW.state = chkWNW.state = false;
        setColors();
        repaint();

      } else if (ev.target == btnSelect) {
        chkNW.state =
            chkNNW.state =
                chkN.state =
                    chkNNE.state =
                        chkNE.state =
                            chkENE.state =
                                chkE.state =
                                    chkESE.state =
                                        chkSE.state =
                                            chkSSE.state =
                                                chkS.state =
                                                    chkSSW.state =
                                                        chkSW.state =
                                                            chkWSW.state =
                                                                chkW.state = chkWNW.state = true;
        setColors();
        repaint();
      }
    }
    if (ev instanceof DataChangeEvent) {
      if (ev.target == fltList) {
        if (!currentFilterID.equals(fltList.getText())) {
          FilterData data = Global.getPref().getFilter(fltList.getText());
          if (data != null) {
            currentFilterID = fltList.getText();
            this.setData(data);
            this.repaintNow();
          }
        }
        //				Vm.debug("Event: "+ev.toString()+"; Target: "+ev.target+"; Liste: "+fltList.getText()+
        //						" (alt: "+fltList.oldText+")");
        // setColors();
      }
      setColors();
    }
  }
  public void setData(FilterData data) {

    //////////////////////////
    // Panel 1 - Bearing & Distance
    //////////////////////////
    if (data.getFilterDist().length() > 1) {
      if (data.getFilterDist().charAt(0) == 'L') chcDist.select(0);
      else chcDist.select(1);
      String dist = data.getFilterDist().substring(1);
      if (Global.getPref().metricSystem == Metrics.IMPERIAL) {
        double distValue = java.lang.Double.valueOf(dist).doubleValue();
        double newDistValue = Metrics.convertUnit(distValue, Metrics.KILOMETER, Metrics.MILES);
        dist = String.valueOf(newDistValue);
      }
      inpDist.setText(dist);
    } else {
      chcDist.select(0);
      inpDist.setText("");
    }
    String fltRose = data.getFilterRose();
    chkNW.state = fltRose.charAt(0) == '1';
    chkNNW.state = fltRose.charAt(1) == '1';
    chkN.state = fltRose.charAt(2) == '1';
    chkNNE.state = fltRose.charAt(3) == '1';

    chkNE.state = fltRose.charAt(4) == '1';
    chkENE.state = fltRose.charAt(5) == '1';
    chkE.state = fltRose.charAt(6) == '1';
    chkESE.state = fltRose.charAt(7) == '1';

    chkSE.state = fltRose.charAt(8) == '1';
    chkSSE.state = fltRose.charAt(9) == '1';
    chkS.state = fltRose.charAt(10) == '1';
    chkSSW.state = fltRose.charAt(11) == '1';

    chkSW.state = fltRose.charAt(12) == '1';
    chkWSW.state = fltRose.charAt(13) == '1';
    chkW.state = fltRose.charAt(14) == '1';
    chkWNW.state = fltRose.charAt(15) == '1';

    //////////////////////////
    // Panel 2 - Cache attributes
    //////////////////////////
    String fltVar = data.getFilterVar();
    chkArchived.state = fltVar.charAt(0) == '1';
    chkAvailable.state = fltVar.charAt(1) == '1';
    chkFound.state = fltVar.charAt(2) == '1';
    chkOwned.state = fltVar.charAt(3) == '1';
    chkNotArchived.state = fltVar.charAt(4) == '1';
    chkNotAvailable.state = fltVar.charAt(5) == '1';
    chkNotFound.state = fltVar.charAt(6) == '1';
    chkNotOwned.state = fltVar.charAt(7) == '1';
    chcStatus.setText(data.getFilterStatus());
    chkUseRegexp.setState(data.useRegexp());

    //////////////////////////
    // Panel 3 - Cache ratings
    //////////////////////////
    if (data.getFilterDiff().length() > 1) {
      if (data.getFilterDiff().charAt(0) == 'L') chcDiff.select(0);
      else if (data.getFilterDiff().charAt(0) == '=') chcDiff.select(1);
      else chcDiff.select(2);
      inpDiff.setText(data.getFilterDiff().substring(1));
    } else {
      chcDiff.select(0);
      inpDiff.setText("");
    }

    if (data.getFilterTerr().length() > 1) {
      if (data.getFilterTerr().charAt(0) == 'L') chcTerr.select(0);
      else if (data.getFilterTerr().charAt(0) == '=') chcTerr.select(1);
      else chcTerr.select(2);
      inpTerr.setText(data.getFilterTerr().substring(1));
    } else {
      chcTerr.select(0);
      inpTerr.setText("");
    }

    //////////////////////////
    // Panel 4 - Cache types
    //////////////////////////

    String fltType = data.getFilterType();
    chkTrad.state = fltType.charAt(0) == '1';
    chkMulti.state = fltType.charAt(1) == '1';
    chkVirtual.state = fltType.charAt(2) == '1';
    chkLetter.state = fltType.charAt(3) == '1';
    chkEvent.state = fltType.charAt(4) == '1';
    chkWebcam.state = fltType.charAt(5) == '1';
    chkMystery.state = fltType.charAt(6) == '1';
    chkEarth.state = fltType.charAt(7) == '1';
    chkLocless.state = fltType.charAt(8) == '1';
    chkMega.state = fltType.charAt(9) == '1';
    chkCustom.state = fltType.charAt(10) == '1';
    chkCito.state = fltType.charAt(17) == '1';
    chkWherigo.state = fltType.charAt(18) == '1';

    // Note addiWptState is set by setColors

    //////////////////////////
    // Panel 5 - Additional waypoints
    //////////////////////////
    chkParking.state = fltType.charAt(11) == '1';
    chkStage.state = fltType.charAt(12) == '1';
    chkQuestion.state = fltType.charAt(13) == '1';
    chkFinal.state = fltType.charAt(14) == '1';
    chkTrailhead.state = fltType.charAt(15) == '1';
    chkReference.state = fltType.charAt(16) == '1';
    addiWptChk.state = !fltType.substring(11, 17).equals("000000");

    //////////////////////////
    // Panel 6 - Cache container
    //////////////////////////
    String fltSize = data.getFilterSize();
    chkMicro.state = fltSize.charAt(0) == '1';
    chkSmall.state = fltSize.charAt(1) == '1';
    chkRegular.state = fltSize.charAt(2) == '1';
    chkLarge.state = fltSize.charAt(3) == '1';
    chkVeryLarge.state = fltSize.charAt(4) == '1';
    chkOther.state = fltSize.charAt(5) == '1';

    //////////////////////////
    // Panel 7 - Search
    //////////////////////////

    //////////////////////////
    // Panel 8 - Cache attributes
    //////////////////////////
    attV.setSelectionMasks(data.getFilterAttrYes(), data.getFilterAttrNo());
    chcAttrib.select(data.getFilterAttrChoice());

    // Adjust colors of buttons depending on which filters are active
    setColors();
  }
  public FilterScreen() {
    this.title = MyLocale.getMsg(700, "Set Filter");

    //////////////////////////
    // Panel 1 - Bearing & Distance
    //////////////////////////
    addTitle(pnlBearDist, MyLocale.getMsg(714, "Bearings & Distance"));
    pnlBearDist.addNext(
        new mLabel(MyLocale.getMsg(701, "Distance: ")),
        CellConstants.DONTSTRETCH,
        CellConstants.FILL);
    pnlBearDist.addNext(
        chcDist = new mChoice(new String[] {"<=", ">="}, 0),
        CellConstants.DONTSTRETCH,
        (CellConstants.DONTFILL | CellConstants.WEST));
    pnlBearDist.addLast(inpDist = new mInput(), CellConstants.DONTSTRETCH, CellConstants.FILL);
    pnlBearDist.addLast(new mLabel(""));
    pnlRose.addNext(chkNW = new mCheckBox("NW"), CellConstants.HSTRETCH, CellConstants.FILL);
    pnlRose.addNext(chkNNW = new mCheckBox("NNW"), CellConstants.HSTRETCH, CellConstants.FILL);
    pnlRose.addNext(chkN = new mCheckBox("N"), CellConstants.HSTRETCH, CellConstants.FILL);
    pnlRose.addLast(chkNNE = new mCheckBox("NNE"), CellConstants.HSTRETCH, CellConstants.FILL);

    pnlRose.addNext(chkNE = new mCheckBox("NE"), CellConstants.HSTRETCH, CellConstants.FILL);
    pnlRose.addNext(chkENE = new mCheckBox("ENE"), CellConstants.HSTRETCH, CellConstants.FILL);
    pnlRose.addNext(chkE = new mCheckBox("E "), CellConstants.HSTRETCH, CellConstants.FILL);
    pnlRose.addLast(chkESE = new mCheckBox("ESE"), CellConstants.HSTRETCH, CellConstants.FILL);

    pnlRose.addNext(chkSE = new mCheckBox("SE"), CellConstants.HSTRETCH, CellConstants.FILL);
    pnlRose.addNext(chkSSE = new mCheckBox("SSE"), CellConstants.HSTRETCH, CellConstants.FILL);
    pnlRose.addNext(chkS = new mCheckBox("S"), CellConstants.HSTRETCH, CellConstants.FILL);
    pnlRose.addLast(chkSSW = new mCheckBox("SSW"), CellConstants.HSTRETCH, CellConstants.FILL);

    pnlRose.addNext(chkSW = new mCheckBox("SW"), CellConstants.HSTRETCH, CellConstants.FILL);
    pnlRose.addNext(chkWSW = new mCheckBox("WSW"), CellConstants.HSTRETCH, CellConstants.FILL);
    pnlRose.addNext(chkW = new mCheckBox("W "), CellConstants.HSTRETCH, CellConstants.FILL);
    pnlRose.addLast(chkWNW = new mCheckBox("WNW"), CellConstants.HSTRETCH, CellConstants.FILL);
    pnlRose.addNext(
        btnDeselect = new mButton(MyLocale.getMsg(716, "Deselect all")),
        CellConstants.HSTRETCH,
        CellConstants.FILL);
    btnDeselect.setTag(SPAN, new Dimension(2, 1));
    pnlRose.addLast(
        btnSelect = new mButton(MyLocale.getMsg(717, "Select all")),
        CellConstants.HSTRETCH,
        CellConstants.FILL);
    pnlBearDist.addLast(pnlRose, CellConstants.STRETCH, CellConstants.FILL);

    //////////////////////////
    // Panel 2 - Cache attributes
    //////////////////////////
    addTitle(pnlAttributes, MyLocale.getMsg(720, "Status"));
    mLabel lblTitleAtt;
    pnlAttributes.addLast(
        lblTitleAtt = new mLabel(MyLocale.getMsg(715, "Show all caches with status:")),
        HSTRETCH,
        FILL);
    lblTitleAtt.setTag(SPAN, new Dimension(2, 1));
    pnlAttributes.addNext(
        chkArchived = new mCheckBox(MyLocale.getMsg(710, "Archived")),
        CellConstants.DONTSTRETCH,
        CellConstants.FILL);
    pnlAttributes.addLast(
        chkNotArchived = new mCheckBox(MyLocale.getMsg(729, "Nicht archiviert")),
        CellConstants.DONTSTRETCH,
        CellConstants.FILL);

    pnlAttributes.addNext(
        chkAvailable = new mCheckBox(MyLocale.getMsg(730, "Suchbar")),
        CellConstants.DONTSTRETCH,
        CellConstants.FILL);
    pnlAttributes.addLast(
        chkNotAvailable = new mCheckBox(MyLocale.getMsg(711, "Not available")),
        CellConstants.DONTSTRETCH,
        CellConstants.FILL);

    pnlAttributes.addNext(
        chkFound = new mCheckBox(MyLocale.getMsg(703, "Found")),
        CellConstants.DONTSTRETCH,
        CellConstants.FILL);
    pnlAttributes.addLast(
        chkNotFound = new mCheckBox(MyLocale.getMsg(731, "Noch nicht gefunden")),
        CellConstants.DONTSTRETCH,
        CellConstants.FILL);

    pnlAttributes.addNext(
        chkOwned = new mCheckBox(MyLocale.getMsg(707, "Owned")),
        CellConstants.DONTSTRETCH,
        CellConstants.FILL);
    pnlAttributes.addLast(
        chkNotOwned = new mCheckBox(MyLocale.getMsg(732, "Anderer Besitzer")),
        CellConstants.DONTSTRETCH,
        CellConstants.FILL);

    pnlAttributes.addNext(
        new mLabel(MyLocale.getMsg(307, "Status:")),
        CellConstants.DONTSTRETCH,
        (CellConstants.DONTFILL | CellConstants.WEST));
    pnlAttributes.addLast(
        chcStatus =
            new mComboBox(
                new String[] {
                  "",
                  MyLocale.getMsg(313, "Flag 1"),
                  MyLocale.getMsg(314, "Flag 2"),
                  MyLocale.getMsg(315, "Flag 3"),
                  MyLocale.getMsg(316, "Flag 4"),
                  MyLocale.getMsg(317, "Search"),
                  MyLocale.getMsg(318, "Found"),
                  MyLocale.getMsg(319, "Not Found"),
                  MyLocale.getMsg(320, "Owner")
                },
                0),
        CellConstants.HSTRETCH,
        (CellConstants.HFILL | CellConstants.WEST));
    pnlAttributes.addLast(chkUseRegexp = new mCheckBox(MyLocale.getMsg(299, "Regular expression")));

    //////////////////////////
    // Panel 3 - Cache ratings
    //////////////////////////
    addTitle(pnlRatings, MyLocale.getMsg(718, "Cache ratings"));
    pnlRatings.addNext(
        new mLabel(MyLocale.getMsg(702, "Difficulty: ")),
        CellConstants.DONTSTRETCH,
        CellConstants.FILL);
    pnlRatings.addNext(
        chcDiff = new mChoice(new String[] {"<=", "=", ">="}, 0),
        CellConstants.DONTSTRETCH,
        (CellConstants.DONTFILL | CellConstants.WEST));
    // pnlRatings.addLast(difIn = new mChoice(new String[]{"1.0", "1.5", "2.0", "2.5", "3.0", "3.5",
    // "4.0", "4.5", "5.0"},0),CellConstants.DONTSTRETCH,
    // (CellConstants.DONTFILL|CellConstants.WEST));
    pnlRatings.addLast(inpDiff = new mInput(), CellConstants.DONTSTRETCH, CellConstants.FILL);

    pnlRatings.addNext(new mLabel("Terrain: "), CellConstants.DONTSTRETCH, CellConstants.FILL);
    pnlRatings.addNext(
        chcTerr = new mChoice(new String[] {"<=", "=", ">="}, 0),
        CellConstants.DONTSTRETCH,
        (CellConstants.DONTFILL | CellConstants.WEST));
    // pnlRatings.addLast(terrIn = new mChoice(new String[]{"1.0", "1.5", "2.0", "2.5", "3.0",
    // "3.5", "4.0", "4.5", "5.0"},0),CellConstants.DONTSTRETCH,
    // (CellConstants.DONTFILL|CellConstants.WEST));
    pnlRatings.addLast(inpTerr = new mInput(), CellConstants.DONTSTRETCH, CellConstants.FILL);

    //////////////////////////
    // Panel 4 - Cache types
    //////////////////////////

    addTitle(pnlCacheTypes, MyLocale.getMsg(719, "Cache types"));
    pnlCacheTypes.addNext(addImg(GuiImageBroker.getTypeImage(CacheType.CW_TYPE_TRADITIONAL)));
    pnlCacheTypes.addNext(
        chkTrad = new mCheckBox("Traditonal"), CellConstants.DONTSTRETCH, CellConstants.FILL);

    pnlCacheTypes.addNext(addImg(GuiImageBroker.getTypeImage(CacheType.CW_TYPE_MULTI)));
    pnlCacheTypes.addLast(
        chkMulti = new mCheckBox("Multi"), CellConstants.DONTSTRETCH, CellConstants.FILL);

    pnlCacheTypes.addNext(addImg(GuiImageBroker.getTypeImage(CacheType.CW_TYPE_VIRTUAL)));
    pnlCacheTypes.addNext(
        chkVirtual = new mCheckBox("Virtual"), CellConstants.DONTSTRETCH, CellConstants.FILL);

    pnlCacheTypes.addNext(addImg(GuiImageBroker.getTypeImage(CacheType.CW_TYPE_LETTERBOX)));
    pnlCacheTypes.addLast(
        chkLetter = new mCheckBox("Letterbox"), CellConstants.DONTSTRETCH, CellConstants.FILL);

    pnlCacheTypes.addNext(addImg(GuiImageBroker.getTypeImage(CacheType.CW_TYPE_EVENT)));
    pnlCacheTypes.addNext(
        chkEvent = new mCheckBox("Event"), CellConstants.DONTSTRETCH, CellConstants.FILL);

    pnlCacheTypes.addNext(addImg(GuiImageBroker.getTypeImage(CacheType.CW_TYPE_WEBCAM)));
    pnlCacheTypes.addLast(
        chkWebcam = new mCheckBox("Webcam"), CellConstants.DONTSTRETCH, CellConstants.FILL);

    pnlCacheTypes.addNext(addImg(GuiImageBroker.getTypeImage(CacheType.CW_TYPE_UNKNOWN)));
    pnlCacheTypes.addNext(
        chkMystery = new mCheckBox("Mystery"), CellConstants.DONTSTRETCH, CellConstants.FILL);

    pnlCacheTypes.addNext(addImg(GuiImageBroker.getTypeImage(CacheType.CW_TYPE_EARTH)));
    pnlCacheTypes.addLast(
        chkEarth = new mCheckBox("Earth"), CellConstants.DONTSTRETCH, CellConstants.FILL);

    pnlCacheTypes.addNext(addImg(GuiImageBroker.getTypeImage(CacheType.CW_TYPE_LOCATIONLESS)));
    pnlCacheTypes.addNext(
        chkLocless = new mCheckBox("Locationless"), CellConstants.DONTSTRETCH, CellConstants.FILL);

    pnlCacheTypes.addNext(addImg(GuiImageBroker.getTypeImage(CacheType.CW_TYPE_MEGA_EVENT)));
    pnlCacheTypes.addLast(
        chkMega = new mCheckBox("Mega-Ev."), CellConstants.DONTSTRETCH, CellConstants.FILL);

    pnlCacheTypes.addNext(addImg(GuiImageBroker.getTypeImage(CacheType.CW_TYPE_CITO)));
    pnlCacheTypes.addNext(
        chkCito = new mCheckBox("Cito-Ev."), CellConstants.DONTSTRETCH, CellConstants.FILL);

    // pnlCacheTypes.addLast(addiWptChk = new mCheckBox("Add. Wpt"), CellConstants.DONTSTRETCH,
    // CellConstants.FILL);
    // pnlCacheTypes.addLast(new mLabel(""));
    pnlCacheTypes.addNext(addImg(GuiImageBroker.getTypeImage(CacheType.CW_TYPE_CUSTOM)));
    pnlCacheTypes.addLast(
        chkCustom = new mCheckBox("Custom"), CellConstants.DONTSTRETCH, CellConstants.FILL);

    pnlCacheTypes.addNext(addImg(GuiImageBroker.getTypeImage(CacheType.CW_TYPE_WHEREIGO)));
    pnlCacheTypes.addNext(
        chkWherigo = new myChkBox("WherIGo"), CellConstants.DONTSTRETCH, CellConstants.FILL);

    pnlCacheTypes.addNext(addImg(GuiImageBroker.getTypeImage(CacheType.CW_TYPE_DRIVE_IN)));
    pnlCacheTypes.addNext(
        addiWptChk = new myChkBox("Add. Wpt"), CellConstants.DONTSTRETCH, CellConstants.FILL);

    // addiWptChk.modify(0,NotAnEditor);
    //////////////////////////
    // Panel 5 - Addi waypoints
    //////////////////////////
    addTitle(pnlAddi, MyLocale.getMsg(726, "Additional waypoints"));
    pnlAddi.addNext(addImg(GuiImageBroker.getTypeImage(CacheType.CW_TYPE_PARKING)));
    pnlAddi.addNext(
        chkParking = new mCheckBox("Parking"), CellConstants.DONTSTRETCH, CellConstants.FILL);
    pnlAddi.addNext(addImg(GuiImageBroker.getTypeImage(CacheType.CW_TYPE_STAGE)));
    pnlAddi.addLast(
        chkStage = new mCheckBox("Stage"), CellConstants.DONTSTRETCH, CellConstants.FILL);
    pnlAddi.addNext(addImg(GuiImageBroker.getTypeImage(CacheType.CW_TYPE_QUESTION)));
    pnlAddi.addNext(
        chkQuestion = new mCheckBox("Question"), CellConstants.DONTSTRETCH, CellConstants.FILL);
    pnlAddi.addNext(addImg(GuiImageBroker.getTypeImage(CacheType.CW_TYPE_FINAL)));
    pnlAddi.addLast(
        chkFinal = new mCheckBox("Final"), CellConstants.DONTSTRETCH, CellConstants.FILL);
    pnlAddi.addNext(addImg(GuiImageBroker.getTypeImage(CacheType.CW_TYPE_TRAILHEAD)));
    pnlAddi.addNext(
        chkTrailhead = new mCheckBox("Trailhead"), CellConstants.DONTSTRETCH, CellConstants.FILL);
    pnlAddi.addNext(addImg(GuiImageBroker.getTypeImage(CacheType.CW_TYPE_REFERENCE)));
    pnlAddi.addLast(
        chkReference = new mCheckBox("Reference"), CellConstants.DONTSTRETCH, CellConstants.FILL);
    pnlAddi.addLast(new mLabel(""), VSTRETCH, FILL);

    //////////////////////////
    // Panel 6 - Cache container
    //////////////////////////
    addTitle(pnlContainer, MyLocale.getMsg(727, "Cache container"));
    pnlContainer.addLast(chkMicro = new mCheckBox("Micro"));
    pnlContainer.addLast(chkSmall = new mCheckBox("Small"));
    pnlContainer.addLast(chkRegular = new mCheckBox("Regular"));
    pnlContainer.addLast(chkLarge = new mCheckBox("Large"));
    pnlContainer.addLast(chkVeryLarge = new mCheckBox("Very Large"));
    pnlContainer.addLast(chkOther = new mCheckBox("Other"));

    //////////////////////////
    // Panel 7 - Search
    //////////////////////////
    addTitle(pnlSearch, "Search");
    pnlSearch.addLast(new mLabel("To be implemented"));

    //////////////////////////
    // Panel 8 - Cache attributes
    //////////////////////////

    if (MyLocale.getScreenHeight() > 240)
      addTitle(pnlCacheAttributes, MyLocale.getMsg(737, "Attributes"));
    pnlCacheAttributes.addNext(
        new mLabel(MyLocale.getMsg(739, "Filter on") + ":"),
        CellConstants.DONTSTRETCH,
        CellConstants.FILL);
    pnlCacheAttributes.addLast(
        chcAttrib =
            new mChoice(
                new String[] {
                  MyLocale.getMsg(740, "all"),
                  MyLocale.getMsg(741, "one"),
                  MyLocale.getMsg(742, "none")
                },
                0),
        CellConstants.DONTSTRETCH,
        (CellConstants.DONTFILL | CellConstants.WEST));

    attV = new AttributesSelector();
    pnlCacheAttributes.addLast(
        attV,
        CellConstants.STRETCH | CellConstants.LEFT /*|CellConstants.BORDER*/,
        CellConstants.STRETCH);
    attV.setSelectionMasks(0l, 0l);

    Frame frmScreen = new Frame();
    mLabel lblInfo;
    frmScreen
        .addLast(
            lblInfo =
                new mLabel(MyLocale.getMsg(725, "Note: Filters are additive, active filter=green")))
        .setTag(SPAN, new Dimension(2, 1));
    lblInfo.setTag(INSETS, new Insets(0, 0, 2, 0));
    frmScreen.borderStyle =
        UIConstants.BDR_RAISEDOUTER | UIConstants.BDR_SUNKENINNER | UIConstants.BF_BOTTOM;
    this.addLast(frmScreen, HSTRETCH, HFILL);

    CellPanel pnlButtons = new CellPanel();
    pnlButtons.addLast(new mLabel("Filter"));
    pnlButtons.addLast(btnBearing = new mButton(MyLocale.getMsg(721, "Bearing")));
    pnlButtons.addLast(btnAttributes = new mButton(MyLocale.getMsg(720, "Attributes")));
    pnlButtons.addLast(btnRatings = new mButton(MyLocale.getMsg(722, "Ratings")));
    pnlButtons.addLast(btnTypes = new mButton(MyLocale.getMsg(723, "Types")));
    pnlButtons.addLast(btnAddi = new mButton(MyLocale.getMsg(733, "Add. Wpt")));
    pnlButtons.addLast(btnContainer = new mButton(MyLocale.getMsg(724, "Container")));
    pnlButtons.addLast(btnCacheAttributes = new mButton(MyLocale.getMsg(738, "Attributes")));
    // Search ist für 0.9n noch deaktiviert
    // pnlButtons.addLast(btnSearch=new mButton("Search")); btnSearch.modify(Disabled,0);
    addNext(pnlButtons, HSTRETCH, FILL);

    cp.addItem(pnlBearDist, "Bear", null);
    cp.addItem(pnlAttributes, "Att", null);
    cp.addItem(pnlRatings, "DT", null);
    cp.addItem(pnlCacheTypes, "Type", null);
    cp.addItem(pnlAddi, "Addi", null);
    cp.addItem(pnlContainer, "Size", null);
    cp.addItem(pnlSearch, "Search", null);
    cp.addItem(pnlCacheAttributes, "Attr", null);
    addLast(cp, VSTRETCH, FILL);

    CellPanel savDelPanel = new CellPanel(); // Panel for "save" and "delete" button
    savDelPanel.equalWidths = true;
    mImage savImg = new mImage("clsave.png");
    savImg.transparentColor = new Color(255, 0, 0);
    savDelPanel.addNext(btnSaveFlt = new mButton(savImg), STRETCH, FILL);
    savDelPanel.addLast(btnDelFlt = new mButton(new mImage("trash.png")), STRETCH, FILL);
    Panel fltListPanel = new Panel();
    fltListPanel.addLast(fltList = new mChoice());
    fltListPanel.addLast(savDelPanel);
    CellPanel btPanel = new CellPanel();
    btPanel.equalWidths = true;
    btPanel.addNext(fltListPanel, CellConstants.STRETCH, CellConstants.FILL);
    btPanel.addNext(
        btnCancel = new mButton(MyLocale.getMsg(708, "Cancel")),
        CellConstants.STRETCH,
        CellConstants.FILL);
    btPanel.addLast(
        btnApply = new mButton(MyLocale.getMsg(709, "Apply")),
        CellConstants.STRETCH,
        CellConstants.FILL);
    //		btPanel.addLast(btnRoute = new mButton("Route"),CellConstants.STRETCH, CellConstants.FILL);
    addLast(
        btPanel.setTag(CellConstants.SPAN, new Dimension(3, 1)),
        CellConstants.STRETCH,
        CellConstants.FILL);

    int sw = MyLocale.getScreenWidth();
    int sh = MyLocale.getScreenHeight();
    Preferences pref = Global.getPref();
    int fs = pref.fontSize;
    int psx;
    int psy;
    if ((sw > 300) && (sh > 300)) {
      // larger screens: size according to fontsize
      psx = 240;
      psy = 260;
      if (fs > 12) {
        psx = 300;
        psy = 330;
      }
      if (fs > 17) {
        psx = 400;
        psy = 340;
      }
      if (fs > 23) {
        psx = 500;
        psy = 350;
      }
      setPreferredSize(psx, psy);
    } else {
      // small screens: fixed size
      if (sh > 240) setPreferredSize(240, 260);
      else setPreferredSize(240, 240);
    }
    cp.select(3);

    // Populating the comboBox of saved filters
    buildFilterList();
  }
  /**
   * Examines the filter screen and creates a FilterData object that represents the data entered in
   * the screen.
   */
  private FilterData getDataFromScreen() {
    FilterData data = new FilterData();
    data.setFilterVar(
        (chkArchived.state ? "1" : "0")
            + (chkAvailable.state ? "1" : "0")
            + (chkFound.state ? "1" : "0")
            + (chkOwned.state ? "1" : "0")
            + (chkNotArchived.state ? "1" : "0")
            + (chkNotAvailable.state ? "1" : "0")
            + (chkNotFound.state ? "1" : "0")
            + (chkNotOwned.state ? "1" : "0"));
    data.setFilterType(
        (chkTrad.state ? "1" : "0")
            + (chkMulti.state ? "1" : "0")
            + (chkVirtual.state ? "1" : "0")
            + (chkLetter.state ? "1" : "0")
            + (chkEvent.state ? "1" : "0")
            + (chkWebcam.state ? "1" : "0")
            + (chkMystery.state ? "1" : "0")
            + (chkEarth.state ? "1" : "0")
            + (chkLocless.state ? "1" : "0")
            + (chkMega.state ? "1" : "0")
            + (chkCustom.state ? "1" : "0")
            + (chkParking.state ? "1" : "0")
            + (chkStage.state ? "1" : "0")
            + (chkQuestion.state ? "1" : "0")
            + (chkFinal.state ? "1" : "0")
            + (chkTrailhead.state ? "1" : "0")
            + (chkReference.state ? "1" : "0")
            + (chkCito.state ? "1" : "0")
            + (chkWherigo.state ? "1" : "0"));
    data.setFilterRose(
        (chkNW.state ? "1" : "0")
            + (chkNNW.state ? "1" : "0")
            + (chkN.state ? "1" : "0")
            + (chkNNE.state ? "1" : "0")
            + (chkNE.state ? "1" : "0")
            + (chkENE.state ? "1" : "0")
            + (chkE.state ? "1" : "0")
            + (chkESE.state ? "1" : "0")
            + (chkSE.state ? "1" : "0")
            + (chkSSE.state ? "1" : "0")
            + (chkS.state ? "1" : "0")
            + (chkSSW.state ? "1" : "0")
            + (chkSW.state ? "1" : "0")
            + (chkWSW.state ? "1" : "0")
            + (chkW.state ? "1" : "0")
            + (chkWNW.state ? "1" : "0"));
    data.setFilterSize(
        (chkMicro.state ? "1" : "0")
            + (chkSmall.state ? "1" : "0")
            + (chkRegular.state ? "1" : "0")
            + (chkLarge.state ? "1" : "0")
            + (chkVeryLarge.state ? "1" : "0")
            + (chkOther.state ? "1" : "0"));

    // Distance: If Metric system is set to imperial units,
    //           then the entered value is meant to be miles,
    //           otherwise it's kilometer.
    double distValue = java.lang.Double.NaN;
    String rawDistance = inpDist.getText().replace(',', '.');
    String newDistance = rawDistance; // initial Value;
    if (!rawDistance.trim().equals("")) {
      distValue = java.lang.Double.valueOf(rawDistance).doubleValue();
      if (Global.getPref().metricSystem == Metrics.IMPERIAL) {
        newDistance =
            String.valueOf(Metrics.convertUnit(distValue, Metrics.MILES, Metrics.KILOMETER));
      }
    }
    if (chcDist.selectedIndex == 0) {
      data.setFilterDist("L" + newDistance);
    } else {
      data.setFilterDist("G" + newDistance);
    }

    if (chcDiff.selectedIndex == 0) {
      data.setFilterDiff("L" + inpDiff.getText());
    } else if (chcDiff.selectedIndex == 1) {
      data.setFilterDiff("=" + inpDiff.getText());
    } else {
      data.setFilterDiff("G" + inpDiff.getText());
    }

    if (chcTerr.selectedIndex == 0) {
      data.setFilterTerr("L" + inpTerr.getText());
    } else if (chcTerr.selectedIndex == 1) {
      data.setFilterTerr("=" + inpTerr.getText());
    } else {
      data.setFilterTerr("G" + inpTerr.getText());
    }
    data.setFilterAttrYes(attV.selectionMaskYes);
    data.setFilterAttrNo(attV.selectionMaskNo);
    data.setFilterAttrChoice(chcAttrib.selectedIndex);
    data.setFilterStatus(chcStatus.getText());
    data.setUseRegexp(chkUseRegexp.getState());
    return data;
  }
  public void doIt() {
    CacheHolderDetail det;
    CacheHolder ch;
    ProgressBarForm pbf = new ProgressBarForm();
    Handle h = new Handle();
    int exportErrors = 0;

    new String();
    FileChooser fc = new FileChooser(FileChooserBase.DIRECTORY_SELECT, pref.getExportPath(expName));
    fc.setTitle("Select target directory:");
    String targetDir;
    if (fc.execute() != FormBase.IDCANCEL) {
      targetDir = fc.getChosen() + "/";
      pref.setExportPath(expName, targetDir);
      Vector cache_index = new Vector();
      Vector cacheImg = new Vector();
      Vector logImg = new Vector();
      Vector mapImg = new Vector();
      Vector usrImg = new Vector();
      Vector logIcons = new Vector(15);
      String icon;

      Hashtable varParams;
      Hashtable imgParams;
      Hashtable logImgParams;
      Hashtable usrImgParams;
      Hashtable mapImgParams;

      // Generate index page
      int counter = cacheDB.countVisible();

      pbf.showMainTask = false;
      pbf.setTask(h, "Exporting ...");
      pbf.exec();

      for (int i = 0; i < counter; i++) {
        h.progress = (float) (i + 1) / (float) counter;
        h.changed();

        ch = cacheDB.get(i);
        if (ch.isVisible()) {
          if (ch.is_incomplete()) {
            exportErrors++;
            Global.getPref()
                .log("HTMLExport: skipping export of incomplete waypoint " + ch.getWayPoint());
            continue;
          }
          det = ch.getCacheDetails(false, false);
          varParams = new Hashtable();
          varParams.put("TYPE", CacheType.cw2ExportString(ch.getType()));
          varParams.put("WAYPOINT", ch.getWayPoint());
          varParams.put("NAME", ch.getCacheName());
          varParams.put("OWNER", ch.getCacheOwner());
          if (ch.isAddiWpt() || CacheType.CW_TYPE_CUSTOM == ch.getType()) {
            varParams.put("SIZE", "");
            varParams.put("DIFFICULTY", "");
            varParams.put("TERRAIN", "");
          } else {
            varParams.put(
                "SIZE",
                CacheSize.isValidSize(ch.getCacheSize())
                    ? CacheSize.cw2ExportString(ch.getCacheSize())
                    : "");
            varParams.put(
                "DIFFICULTY",
                CacheTerrDiff.isValidTD(ch.getHard()) ? CacheTerrDiff.longDT(ch.getHard()) : "");
            varParams.put(
                "TERRAIN",
                CacheTerrDiff.isValidTD(ch.getTerrain())
                    ? CacheTerrDiff.longDT(ch.getTerrain())
                    : "");
          }
          varParams.put("DISTANCE", ch.getDistance());
          varParams.put("BEARING", ch.bearing);
          varParams.put("LATLON", ch.LatLon);
          varParams.put("STATUS", ch.getCacheStatus());
          varParams.put("DATE", ch.getDateHidden());
          cache_index.add(varParams);
          // We can generate the individual page here!
          try {
            Template page_tpl = new Template(template_init_page);
            page_tpl.setParam("TYPE", varParams.get("TYPE").toString());
            page_tpl.setParam("SIZE", varParams.get("SIZE").toString());
            page_tpl.setParam("WAYPOINT", ch.getWayPoint());
            page_tpl.setParam("NAME", ch.getCacheName());
            page_tpl.setParam("OWNER", ch.getCacheOwner());
            page_tpl.setParam("DIFFICULTY", varParams.get("DIFFICULTY").toString());
            page_tpl.setParam("TERRAIN", varParams.get("TERRAIN").toString());
            page_tpl.setParam("DISTANCE", ch.getDistance());
            page_tpl.setParam("BEARING", ch.bearing);
            page_tpl.setParam("LATLON", ch.LatLon);
            page_tpl.setParam("STATUS", ch.getCacheStatus());
            page_tpl.setParam("DATE", ch.getDateHidden());
            if (det != null) {
              if (ch.is_HTML()) {
                page_tpl.setParam("DESCRIPTION", modifyLongDesc(det, targetDir));
              } else {
                page_tpl.setParam(
                    "DESCRIPTION", STRreplace.replace(det.LongDescription, "\n", "<br>"));
              }
              page_tpl.setParam("HINTS", det.Hints);
              page_tpl.setParam("DECRYPTEDHINTS", Common.rot13(det.Hints));

              StringBuffer sb = new StringBuffer(2000);
              for (int j = 0; j < det.CacheLogs.size(); j++) {
                sb.append(
                    STRreplace.replace(
                        det.CacheLogs.getLog(j).toHtml(),
                        "http://www.geocaching.com/images/icons/",
                        null));
                sb.append("<br>");
                icon = det.CacheLogs.getLog(j).getIcon();
                if (logIcons.find(icon) < 0)
                  logIcons.add(icon); // Add the icon to list of icons to copy to dest directory
              }

              page_tpl.setParam("LOGS", sb.toString());
              page_tpl.setParam("NOTES", STRreplace.replace(det.getCacheNotes(), "\n", "<br>"));

              cacheImg.clear();
              for (int j = 0; j < det.images.size(); j++) {
                imgParams = new Hashtable();
                String imgFile = new String(det.images.get(j).getFilename());
                imgParams.put("FILE", imgFile);
                imgParams.put("TEXT", det.images.get(j).getTitle());
                if (DataMover.copy(profile.dataDir + imgFile, targetDir + imgFile))
                  cacheImg.add(imgParams);
                else exportErrors++;
              }
              page_tpl.setParam("cacheImg", cacheImg);

              // Log images
              logImg.clear();
              for (int j = 0; j < det.logImages.size(); j++) {
                logImgParams = new Hashtable();
                String logImgFile = det.logImages.get(j).getFilename();
                logImgParams.put("FILE", logImgFile);
                logImgParams.put("TEXT", det.logImages.get(j).getTitle());
                if (DataMover.copy(profile.dataDir + logImgFile, targetDir + logImgFile))
                  logImg.add(logImgParams);
                else exportErrors++;
              }
              page_tpl.setParam("logImg", logImg);

              // User images
              usrImg.clear();
              for (int j = 0; j < det.userImages.size(); j++) {
                usrImgParams = new Hashtable();
                String usrImgFile = new String(det.userImages.get(j).getFilename());
                usrImgParams.put("FILE", usrImgFile);
                usrImgParams.put("TEXT", det.userImages.get(j).getTitle());
                if (DataMover.copy(profile.dataDir + usrImgFile, targetDir + usrImgFile))
                  usrImg.add(usrImgParams);
                else exportErrors++;
              }
              page_tpl.setParam("userImg", usrImg);

              // Map images
              mapImg.clear();
              mapImgParams = new Hashtable();

              String mapImgFile = new String(ch.getWayPoint() + "_map.gif");
              // check if map file exists
              File test = new File(profile.dataDir + mapImgFile);

              if (test.exists()) {
                mapImgParams.put("FILE", mapImgFile);
                mapImgParams.put("TEXT", mapImgFile);
                if (DataMover.copy(profile.dataDir + mapImgFile, targetDir + mapImgFile))
                  mapImg.add(mapImgParams);
                else exportErrors++;

                mapImgParams = new Hashtable();
                mapImgFile = ch.getWayPoint() + "_map_2.gif";
                mapImgParams.put("FILE", mapImgFile);
                mapImgParams.put("TEXT", mapImgFile);
                if (DataMover.copy(profile.dataDir + mapImgFile, targetDir + mapImgFile))
                  mapImg.add(mapImgParams);
                else exportErrors++;

                page_tpl.setParam("mapImg", mapImg);
              }
            } else {
              page_tpl.setParam("DESCRIPTION", "");
              page_tpl.setParam("HINTS", "");
              page_tpl.setParam("DECRYPTEDHINTS", "");
              page_tpl.setParam("LOGS", "");
              page_tpl.setParam("NOTES", "");
              page_tpl.setParam("cacheImg", cacheImg);
              page_tpl.setParam("logImg", ""); // ???
              page_tpl.setParam("userImg", ""); // ???
              page_tpl.setParam("mapImg", ""); // ???
              exportErrors++;
            }

            PrintWriter pagefile =
                new PrintWriter(
                    new BufferedWriter(new FileWriter(targetDir + ch.getWayPoint() + ".html")));
            pagefile.print(page_tpl.output());
            pagefile.close();
          } catch (IllegalArgumentException e) {
            exportErrors++;
            ch.setIncomplete(true);
            Global.getPref()
                .log(
                    "HTMLExport: " + ch.getWayPoint() + " is incomplete reason: ",
                    e,
                    Global.getPref().debug);
          } catch (Exception e) {
            exportErrors++;
            Global.getPref()
                .log(
                    "HTMLExport: error wehen exporting " + ch.getWayPoint() + " reason: ",
                    e,
                    Global.getPref().debug);
          }
        } // if is black, filtered
      }

      // Copy the log-icons to the destination directory
      for (int j = 0; j < logIcons.size(); j++) {
        icon = (String) logIcons.elementAt(j);
        if (!DataMover.copy(FileBase.getProgramDirectory() + "/" + icon, targetDir + icon))
          exportErrors++;
      }
      if (!DataMover.copy(
          FileBase.getProgramDirectory() + "/recommendedlog.gif", targetDir + "recommendedlog.gif"))
        exportErrors++;

      try {
        Template tpl = new Template(template_init_index);
        tpl.setParam("cache_index", cache_index);
        PrintWriter detfile;
        detfile = new PrintWriter(new BufferedWriter(new FileWriter(targetDir + "/index.html")));
        detfile.print(tpl.output());
        detfile.close();
        // sort by waypoint
        sortAndPrintIndex(tpl, cache_index, targetDir + "/index_wp.html", "WAYPOINT");
        // sort by name
        sortAndPrintIndex(tpl, cache_index, targetDir + "/index_alpha.html", "NAME", false);
        // sort by type
        sortAndPrintIndex(tpl, cache_index, targetDir + "/index_type.html", "TYPE", true);
        // sort by size
        sortAndPrintIndex(tpl, cache_index, targetDir + "/index_size.html", "SIZE", true);
        // sort by distance
        sortAndPrintIndex(tpl, cache_index, targetDir + "/index_dist.html", "DISTANCE", 10.0);
      } catch (Exception e) {
        Vm.debug("Problem writing HTML files\n");
        e.printStackTrace();
      } // try
    } // if
    pbf.exit(0);

    if (exportErrors > 0) {
      new MessageBox(
              "Export Error",
              exportErrors + " errors during export. See log for details.",
              FormBase.OKB)
          .execute();
    }
  }