public RepositoryLocationChooser(
      Dialog owner,
      RepositoryLocation resolveRelativeTo,
      String initialValue,
      final boolean allowEntries,
      final boolean allowFolders,
      boolean enforceValidRepositoryEntryName,
      final boolean onlyWriteableRepositories) {
    if (initialValue != null) {
      try {
        RepositoryLocation repositoryLocation;
        if (resolveRelativeTo != null) {
          repositoryLocation = new RepositoryLocation(resolveRelativeTo, initialValue);
        } else {
          repositoryLocation = new RepositoryLocation(initialValue);
        }
        locationField.setText(repositoryLocation.getName());
        locationFieldRepositoryEntry.setText(repositoryLocation.getName());
        resultLabel.setText(repositoryLocation.toString());
      } catch (Exception e) {
      }
    }
    this.resolveRelativeTo = resolveRelativeTo;
    this.enforceValidRepositoryEntryName = enforceValidRepositoryEntryName;
    tree = new RepositoryTree(owner, !allowEntries, onlyWriteableRepositories);

    if (initialValue != null) {
      if (tree.expandIfExists(resolveRelativeTo, initialValue)) {
        locationField.setText("");
        locationFieldRepositoryEntry.setText("");
      }
    }
    tree.getSelectionModel()
        .addTreeSelectionListener(
            new TreeSelectionListener() {

              @Override
              public void valueChanged(TreeSelectionEvent e) {
                if (e.getPath() != null) {
                  currentEntry = (Entry) e.getPath().getLastPathComponent();
                  if (currentEntry instanceof Folder) { //  && allowFolders)) {
                    //						locationField.setText("");
                  } else if ((!(currentEntry instanceof Folder)) && allowEntries) {
                    //					if (true) {
                    //							//!(currentEntry instanceof Folder)) {
                    locationField.setText(currentEntry.getLocation().getName());
                    locationFieldRepositoryEntry.setText(currentEntry.getLocation().getName());
                  }
                  updateResult();
                }
              }
            });
    KeyListener keyListener =
        new KeyListener() {
          @Override
          public void keyPressed(KeyEvent e) {}

          @Override
          public void keyReleased(KeyEvent e) {
            updateResult();
          }

          @Override
          public void keyTyped(KeyEvent e) {
            TreePath selectionPath = tree.getSelectionPath();
            if (selectionPath != null) {
              Entry selectedEntry = (Entry) selectionPath.getLastPathComponent();
              if (!(selectedEntry instanceof Folder)) {
                tree.setSelectionPath(selectionPath.getParentPath());
              }
            }
          }
        };
    locationField.addKeyListener(keyListener);
    locationFieldRepositoryEntry.addKeyListener(keyListener);
    locationFieldRepositoryEntry.addObserver(this, true);

    setLayout(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();
    c.insets = new Insets(0, 0, 0, 0);
    c.fill = GridBagConstraints.BOTH;
    c.weightx = 1;
    c.weighty = 1;
    c.anchor = GridBagConstraints.FIRST_LINE_START;
    c.gridwidth = GridBagConstraints.REMAINDER;

    JScrollPane treePane = new ExtendedJScrollPane(tree);
    treePane.setBorder(ButtonDialog.createBorder());
    add(treePane, c);

    c.insets = new Insets(ButtonDialog.GAP, 0, 0, ButtonDialog.GAP);
    c.fill = GridBagConstraints.HORIZONTAL;
    c.weightx = 0;
    c.weighty = 0;
    c.gridwidth = GridBagConstraints.RELATIVE;
    c.weightx = 0;
    locationLabel = new ResourceLabel("repository_chooser.entry_name");
    locationLabel.setLabelFor(locationField);
    add(locationLabel, c);

    c.weightx = 1;
    c.insets = new Insets(ButtonDialog.GAP, 0, 0, 0);
    c.weightx = 1;
    c.gridwidth = GridBagConstraints.REMAINDER;
    add(locationField, c);
    add(locationFieldRepositoryEntry, c);
    if (enforceValidRepositoryEntryName) {
      locationField.setVisible(false);
    } else {
      locationFieldRepositoryEntry.setVisible(false);
    }

    c.gridwidth = GridBagConstraints.RELATIVE;
    c.weightx = 0;
    c.insets = new Insets(ButtonDialog.GAP, 0, 0, ButtonDialog.GAP);
    add(new ResourceLabel("repository_chooser.location"), c);
    c.weightx = 1;
    c.insets = new Insets(ButtonDialog.GAP, 0, 0, 0);
    c.gridwidth = GridBagConstraints.REMAINDER;
    add(resultLabel, c);

    if (resolveRelativeTo != null) {
      resolveBox =
          new JCheckBox(
              new ResourceActionAdapter(
                  "repository_chooser.resolve", resolveRelativeTo.getAbsoluteLocation()));
      resolveBox.setSelected(
          ParameterService.getParameterValue(
                  RapidMinerGUI.PROPERTY_RESOLVE_RELATIVE_REPOSITORY_LOCATIONS)
              .equals("true"));
      add(resolveBox, c);
      resolveBox.addActionListener(
          new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
              updateResult();
            }
          });
    }
  }